aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJiaxiang Chen <jiaxiang@google.com>2023-01-25 13:25:24 -0800
committerKSP Auto Pick <kotlin-symbol-processing@google.com>2023-01-26 00:39:26 +0000
commitd6661bdd2a28db44696399a826107bd29dcac316 (patch)
tree6120209cbbca19574ab435ec67a04b98c2988335
parent354e861d5837a16a780f6beb17f902b77c4aff18 (diff)
downloadksp-d6661bdd2a28db44696399a826107bd29dcac316.tar.gz
add to unbounded type parameters
(cherry picked from commit 8bd44ea0fd4d66cf6f1e6965fd428fb6b2773cd5)
-rw-r--r--compiler-plugin/src/main/kotlin/com/google/devtools/ksp/symbol/impl/kotlin/KSTypeParameterImpl.kt8
-rw-r--r--test-utils/testData/api/equivalentJavaWildcards.kt3
-rw-r--r--test-utils/testData/api/javaWildcards2.kt1
-rw-r--r--test-utils/testData/api/libOrigins.kt1
-rw-r--r--test-utils/testData/api/parent.kt3
-rw-r--r--test-utils/testData/api/varianceTypeCheck.kt13
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