diff --git a/compiler-plugin/src/main/kotlin/com/google/devtools/ksp/symbol/impl/kotlin/KSTypeParameterImpl.kt b/compiler-plugin/src/main/kotlin/com/google/devtools/ksp/symbol/impl/kotlin/KSTypeParameterImpl.kt index 2d04a7d8a4..340833a4a7 100644 --- a/compiler-plugin/src/main/kotlin/com/google/devtools/ksp/symbol/impl/kotlin/KSTypeParameterImpl.kt +++ b/compiler-plugin/src/main/kotlin/com/google/devtools/ksp/symbol/impl/kotlin/KSTypeParameterImpl.kt @@ -20,12 +20,14 @@ package com.google.devtools.ksp.symbol.impl.kotlin import com.google.devtools.ksp.KSObjectCache import com.google.devtools.ksp.memoized import com.google.devtools.ksp.processing.impl.KSNameImpl +import com.google.devtools.ksp.processing.impl.ResolverImpl import com.google.devtools.ksp.symbol.KSExpectActual import com.google.devtools.ksp.symbol.KSName import com.google.devtools.ksp.symbol.KSTypeParameter import com.google.devtools.ksp.symbol.KSTypeReference import com.google.devtools.ksp.symbol.KSVisitor import com.google.devtools.ksp.symbol.Variance +import com.google.devtools.ksp.symbol.impl.synthetic.KSTypeReferenceSyntheticImpl import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.KtTypeParameter import org.jetbrains.kotlin.psi.KtTypeParameterListOwner @@ -68,7 +70,11 @@ class KSTypeParameterImpl private constructor(val ktTypeParameter: KtTypeParamet it.subjectTypeParameterName!!.getReferencedName() == ktTypeParameter.nameAsSafeName.asString() } .map { it.boundTypeReference } - ).filterNotNull().map { KSTypeReferenceImpl.getCached(it) }.memoized() + ).filterNotNull().map { KSTypeReferenceImpl.getCached(it) }.ifEmpty { + sequenceOf( + KSTypeReferenceSyntheticImpl.getCached(ResolverImpl.instance!!.builtIns.anyType.makeNullable(), this) + ) + }.memoized() } override val qualifiedName: KSName? by lazy { diff --git a/test-utils/testData/api/equivalentJavaWildcards.kt b/test-utils/testData/api/equivalentJavaWildcards.kt index 6ea4cd297f..c4f3ecf092 100644 --- a/test-utils/testData/api/equivalentJavaWildcards.kt +++ b/test-utils/testData/api/equivalentJavaWildcards.kt @@ -23,8 +23,11 @@ // Y : X -> X // : Y -> Y // A : Any -> Any +// T1 : Any? -> Any? +// T2 : Any? -> Any? // : A -> A // B : Any -> Any +// T : Any? -> Any? // synthetic constructor for B : B<*> -> B // bar1 : [@kotlin.jvm.JvmSuppressWildcards] A -> [@kotlin.jvm.JvmSuppressWildcards] A // - INVARIANT X : X -> X diff --git a/test-utils/testData/api/javaWildcards2.kt b/test-utils/testData/api/javaWildcards2.kt index 3ea9a2ea18..f84e274a69 100644 --- a/test-utils/testData/api/javaWildcards2.kt +++ b/test-utils/testData/api/javaWildcards2.kt @@ -21,6 +21,7 @@ // MyEnum : Any // : MyEnum // VarianceSubjectSuppressed : Any +// R : Any? // starList : List // typeArgList : List // numberList : List diff --git a/test-utils/testData/api/libOrigins.kt b/test-utils/testData/api/libOrigins.kt index 91141a30bd..719b481002 100644 --- a/test-utils/testData/api/libOrigins.kt +++ b/test-utils/testData/api/libOrigins.kt @@ -181,6 +181,7 @@ // reference: Any: KOTLIN_LIB // reference: Any: KOTLIN_LIB // reference: Any: SYNTHETIC +// reference: Any?: SYNTHETIC // reference: ArrayList<(T2..T2?)>: JAVA_LIB // reference: Byte: JAVA_LIB // reference: Byte: JAVA_LIB diff --git a/test-utils/testData/api/parent.kt b/test-utils/testData/api/parent.kt index c095c8a4e6..5237289b67 100644 --- a/test-utils/testData/api/parent.kt +++ b/test-utils/testData/api/parent.kt @@ -30,6 +30,7 @@ // parent of INVARIANT T: Map // parent of Map: Map // parent of Map: Alias +// parent of Any?: T // parent of T: Alias // parent of Alias: File: a.kt // parent of Int: Int @@ -49,6 +50,7 @@ // parent of topProp: File: a.kt // parent of T: T // parent of T: topFun +// parent of Any?: T // parent of T: topFun // parent of Anno: Anno // parent of Anno: @Anno @@ -68,6 +70,7 @@ // parent of Int: memberFun // parent of memberFun: topClass // parent of Any: InnerClass +// parent of Any?: P // parent of P: InnerClass // parent of InnerClass: topClass // parent of P: P diff --git a/test-utils/testData/api/varianceTypeCheck.kt b/test-utils/testData/api/varianceTypeCheck.kt index f64bc557ea..a644570b5f 100644 --- a/test-utils/testData/api/varianceTypeCheck.kt +++ b/test-utils/testData/api/varianceTypeCheck.kt @@ -19,36 +19,49 @@ // TEST PROCESSOR: TypeComparisonProcessor // EXPECTED: // Any ?= Any : true +// Any ?= Any? : false // Any ?= Foo<*> : true // Any ?= Foo : true // Any ?= Foo : true // Any ?= Foo : true // Any ?= Foo : true +// Any? ?= Any : true +// Any? ?= Any? : true +// Any? ?= Foo<*> : true +// Any? ?= Foo : true +// Any? ?= Foo : true +// Any? ?= Foo : true +// Any? ?= Foo : true // Foo<*> ?= Any : false +// Foo<*> ?= Any? : false // Foo<*> ?= Foo<*> : true // Foo<*> ?= Foo : true // Foo<*> ?= Foo : true // Foo<*> ?= Foo : true // Foo<*> ?= Foo : true // Foo ?= Any : false +// Foo ?= Any? : false // Foo ?= Foo<*> : false // Foo ?= Foo : true // Foo ?= Foo : false // Foo ?= Foo : false // Foo ?= Foo : false // Foo ?= Any : false +// Foo ?= Any? : false // Foo ?= Foo<*> : false // Foo ?= Foo : false // Foo ?= Foo : true // Foo ?= Foo : false // Foo ?= Foo : false // Foo ?= Any : false +// Foo ?= Any? : false // Foo ?= Foo<*> : false // Foo ?= Foo : true // Foo ?= Foo : false // Foo ?= Foo : true // Foo ?= Foo : false // Foo ?= Any : false +// Foo ?= Any? : false // Foo ?= Foo<*> : false // Foo ?= Foo : false // Foo ?= Foo : true