diff options
author | Jiaxiang Chen <jiaxiang@google.com> | 2023-01-25 13:25:24 -0800 |
---|---|---|
committer | KSP Auto Pick <kotlin-symbol-processing@google.com> | 2023-01-26 00:39:26 +0000 |
commit | d6661bdd2a28db44696399a826107bd29dcac316 (patch) | |
tree | 6120209cbbca19574ab435ec67a04b98c2988335 | |
parent | 354e861d5837a16a780f6beb17f902b77c4aff18 (diff) | |
download | ksp-d6661bdd2a28db44696399a826107bd29dcac316.tar.gz |
add to unbounded type parameters
(cherry picked from commit 8bd44ea0fd4d66cf6f1e6965fd428fb6b2773cd5)
6 files changed, 28 insertions, 1 deletions
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 2d04a7d8..340833a4 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 6ea4cd29..c4f3ecf0 100644 --- a/test-utils/testData/api/equivalentJavaWildcards.kt +++ b/test-utils/testData/api/equivalentJavaWildcards.kt @@ -23,8 +23,11 @@ // Y : X -> X // <init> : Y -> Y // A : Any -> Any +// T1 : Any? -> Any? +// T2 : Any? -> Any? // <init> : A<T1, T2> -> A<T1, T2> // B : Any -> Any +// T : Any? -> Any? // synthetic constructor for B : B<*> -> B<out Any?> // bar1 : [@kotlin.jvm.JvmSuppressWildcards] A<X, X> -> [@kotlin.jvm.JvmSuppressWildcards] A<X, X> // - INVARIANT X : X -> X diff --git a/test-utils/testData/api/javaWildcards2.kt b/test-utils/testData/api/javaWildcards2.kt index 3ea9a2ea..f84e274a 100644 --- a/test-utils/testData/api/javaWildcards2.kt +++ b/test-utils/testData/api/javaWildcards2.kt @@ -21,6 +21,7 @@ // MyEnum : Any // <init> : MyEnum // VarianceSubjectSuppressed : Any +// R : Any? // starList : List<Any?> // typeArgList : List<R> // numberList : List<Number> diff --git a/test-utils/testData/api/libOrigins.kt b/test-utils/testData/api/libOrigins.kt index 91141a30..719b4810 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 c095c8a4..5237289b 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 f64bc557..a644570b 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<A> : true // Any ?= Foo<C> : true // Any ?= Foo<in B> : true // Any ?= Foo<out B> : true +// Any? ?= Any : true +// Any? ?= Any? : true +// Any? ?= Foo<*> : true +// Any? ?= Foo<A> : true +// Any? ?= Foo<C> : true +// Any? ?= Foo<in B> : true +// Any? ?= Foo<out B> : true // Foo<*> ?= Any : false +// Foo<*> ?= Any? : false // Foo<*> ?= Foo<*> : true // Foo<*> ?= Foo<A> : true // Foo<*> ?= Foo<C> : true // Foo<*> ?= Foo<in B> : true // Foo<*> ?= Foo<out B> : true // Foo<A> ?= Any : false +// Foo<A> ?= Any? : false // Foo<A> ?= Foo<*> : false // Foo<A> ?= Foo<A> : true // Foo<A> ?= Foo<C> : false // Foo<A> ?= Foo<in B> : false // Foo<A> ?= Foo<out B> : false // Foo<C> ?= Any : false +// Foo<C> ?= Any? : false // Foo<C> ?= Foo<*> : false // Foo<C> ?= Foo<A> : false // Foo<C> ?= Foo<C> : true // Foo<C> ?= Foo<in B> : false // Foo<C> ?= Foo<out B> : false // Foo<in B> ?= Any : false +// Foo<in B> ?= Any? : false // Foo<in B> ?= Foo<*> : false // Foo<in B> ?= Foo<A> : true // Foo<in B> ?= Foo<C> : false // Foo<in B> ?= Foo<in B> : true // Foo<in B> ?= Foo<out B> : false // Foo<out B> ?= Any : false +// Foo<out B> ?= Any? : false // Foo<out B> ?= Foo<*> : false // Foo<out B> ?= Foo<A> : false // Foo<out B> ?= Foo<C> : true |