diff options
author | Jiaxiang Chen <jiaxiang@google.com> | 2022-03-31 15:20:07 -0700 |
---|---|---|
committer | Jiaxiang Chen <roaringacw@gmail.com> | 2022-04-04 10:20:31 -0700 |
commit | a693cd2445059cfe4a613a67e5a696bda4014ec3 (patch) | |
tree | ddc147a3058c1c3e4e362ce8692715d73562fe79 /test-utils/src/main/kotlin/com | |
parent | f64dce61a7850841c6e9c272d74a93c5f7702421 (diff) | |
download | ksp-a693cd2445059cfe4a613a67e5a696bda4014ec3.tar.gz |
Fix subtype checking for Java types.
Compiler subtype checking does not convert Java types to Kotlin types, while getting super types from a java type does the conversion, therefore resulting in subtype checking for Java types to fail.
Check if candidate super type is a Java type, convert to Kotlin type for subtype checking.
Potentially needs an ultimate fix in compiler for subtype checking.
Diffstat (limited to 'test-utils/src/main/kotlin/com')
-rw-r--r-- | test-utils/src/main/kotlin/com/google/devtools/ksp/processor/JavaSubtypeProcessor.kt | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/test-utils/src/main/kotlin/com/google/devtools/ksp/processor/JavaSubtypeProcessor.kt b/test-utils/src/main/kotlin/com/google/devtools/ksp/processor/JavaSubtypeProcessor.kt new file mode 100644 index 00000000..6f220897 --- /dev/null +++ b/test-utils/src/main/kotlin/com/google/devtools/ksp/processor/JavaSubtypeProcessor.kt @@ -0,0 +1,72 @@ +package com.google.devtools.ksp.processor + +import com.google.devtools.ksp.KspExperimental +import com.google.devtools.ksp.getClassDeclarationByName +import com.google.devtools.ksp.getJavaClassByName +import com.google.devtools.ksp.processing.Resolver +import com.google.devtools.ksp.symbol.KSAnnotated +import com.google.devtools.ksp.symbol.KSPropertyDeclaration +import com.google.devtools.ksp.symbol.Variance + +class JavaSubtypeProcessor : AbstractTestProcessor() { + var isOk = true + override fun toResult(): List<String> { + return listOf(isOk.toString()) + } + + @OptIn(KspExperimental::class) + override fun process(resolver: Resolver): List<KSAnnotated> { + val javaCollection = resolver.getJavaClassByName("kotlin.collections.Collection")!!.asStarProjectedType() + val javaSet = resolver.getJavaClassByName("kotlin.collections.Set")!!.asStarProjectedType() + val ktCollection = resolver.getClassDeclarationByName("kotlin.collections.Collection")!!.asStarProjectedType() + val ktSet = resolver.getClassDeclarationByName("kotlin.collections.Set")!!.asStarProjectedType() + val javaCollectionRef = resolver.createKSTypeReferenceFromKSType(javaCollection) + val ktCollectionRef = resolver.createKSTypeReferenceFromKSType(ktCollection) + val javaSetRef = resolver.createKSTypeReferenceFromKSType(javaSet) + val ktSetRef = resolver.createKSTypeReferenceFromKSType(ktSet) + val javaSetOfJavaSet = javaSet.replace(listOf(resolver.getTypeArgument(javaSetRef, Variance.INVARIANT))) + val javaSetOfKtSet = javaSet.replace(listOf(resolver.getTypeArgument(ktSetRef, Variance.INVARIANT))) + val ktSetOfJavaSet = ktSet.replace(listOf(resolver.getTypeArgument(javaSetRef, Variance.INVARIANT))) + val ktSetOfKtSet = ktSet.replace(listOf(resolver.getTypeArgument(ktSetRef, Variance.INVARIANT))) + val javaCollectionOfJavaSet = javaCollection + .replace(listOf(resolver.getTypeArgument(javaSetRef, Variance.INVARIANT))) + val javaCollectionOfKtSet = javaCollection + .replace(listOf(resolver.getTypeArgument(ktSetRef, Variance.INVARIANT))) + val ktCollectionOfJavaSet = ktCollection + .replace(listOf(resolver.getTypeArgument(javaSetRef, Variance.INVARIANT))) + val ktCollectionOfKtSet = ktCollection + .replace(listOf(resolver.getTypeArgument(ktSetRef, Variance.INVARIANT))) + val ktCollectionOfJavaCollection = ktCollection + .replace(listOf(resolver.getTypeArgument(javaCollectionRef, Variance.INVARIANT))) + val javaSetOfKtCollection = javaSet + .replace(listOf(resolver.getTypeArgument(ktCollectionRef, Variance.INVARIANT))) + val container = resolver.getClassDeclarationByName("Container")!! + val strRef = resolver.getTypeArgument( + (container.declarations.single { it.simpleName.asString() == "str" } as KSPropertyDeclaration).type, + Variance.INVARIANT + ) + val javaStrCollection = javaCollection.replace(listOf(strRef)) + val javaStrSet = javaSet.replace(listOf(strRef)) + isOk = isOk && javaCollection.isAssignableFrom(javaSet) + isOk = isOk && javaCollection.isAssignableFrom(javaStrCollection) + isOk = isOk && !javaStrCollection.isAssignableFrom(javaCollection) + isOk = isOk && !javaStrSet.isAssignableFrom(javaStrCollection) + isOk = isOk && javaStrCollection.isAssignableFrom(javaStrSet) + isOk = isOk && javaSet.isAssignableFrom(javaStrSet) + isOk = isOk && javaCollection.isAssignableFrom(ktCollection) + isOk = isOk && ktCollection.isAssignableFrom(javaCollection) + isOk = isOk && javaSetOfJavaSet.isAssignableFrom(ktSetOfJavaSet) + isOk = isOk && ktSetOfJavaSet.isAssignableFrom(javaSetOfJavaSet) + isOk = isOk && javaSetOfJavaSet.isAssignableFrom(javaSetOfKtSet) + isOk = isOk && javaSetOfKtSet.isAssignableFrom(javaSetOfJavaSet) + isOk = isOk && ktSetOfKtSet.isAssignableFrom(ktSetOfJavaSet) + isOk = isOk && ktSetOfJavaSet.isAssignableFrom(ktSetOfKtSet) + isOk = isOk && javaCollectionOfJavaSet.isAssignableFrom(ktCollectionOfJavaSet) + isOk = isOk && ktCollectionOfJavaSet.isAssignableFrom(javaCollectionOfJavaSet) + isOk = isOk && javaCollectionOfKtSet.isAssignableFrom(ktCollectionOfKtSet) + isOk = isOk && javaCollectionOfKtSet.isAssignableFrom(ktCollectionOfJavaSet) + isOk = isOk && ktCollectionOfJavaCollection.isAssignableFrom(javaSetOfKtCollection) + isOk = isOk && !javaSetOfKtCollection.isAssignableFrom(ktCollectionOfJavaCollection) + return emptyList() + } +} |