aboutsummaryrefslogtreecommitdiff
path: root/test-utils/src/main/kotlin/com
diff options
context:
space:
mode:
authorJiaxiang Chen <jiaxiang@google.com>2022-03-31 15:20:07 -0700
committerJiaxiang Chen <roaringacw@gmail.com>2022-04-04 10:20:31 -0700
commita693cd2445059cfe4a613a67e5a696bda4014ec3 (patch)
treeddc147a3058c1c3e4e362ce8692715d73562fe79 /test-utils/src/main/kotlin/com
parentf64dce61a7850841c6e9c272d74a93c5f7702421 (diff)
downloadksp-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.kt72
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()
+ }
+}