From 1506cc1f4ff08628ef9fe90f2e9cb97d1cc42d13 Mon Sep 17 00:00:00 2001 From: Nicklas Ansman Date: Thu, 22 Aug 2024 20:06:46 -0400 Subject: [PATCH] Implement KSValueArgument.parent for the analysis API This fixes #2049 (cherry picked from commit f84a7f00166d9f2596aba7811065f8fdcaf3bce3) --- .../impl/symbol/java/KSAnnotationJavaImpl.kt | 1 + .../impl/symbol/kotlin/KSAnnotationImpl.kt | 5 ++++- .../impl/symbol/kotlin/KSValueArgumentImpl.kt | 12 ++++++------ .../resolved/KSAnnotationResolvedImpl.kt | 5 ++++- kotlin-analysis-api/testData/parent.kt | 19 ++++++++++++++++--- test-utils/testData/api/parent.kt | 14 +++++++++++--- 6 files changed, 42 insertions(+), 14 deletions(-) diff --git a/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/java/KSAnnotationJavaImpl.kt b/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/java/KSAnnotationJavaImpl.kt index 27f7ebb1de..237ccd97b2 100644 --- a/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/java/KSAnnotationJavaImpl.kt +++ b/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/java/KSAnnotationJavaImpl.kt @@ -133,6 +133,7 @@ class KSAnnotationJavaImpl private constructor(private val psi: PsiAnnotation, o KotlinAlwaysAccessibleLifetimeToken(ResolverAAImpl.ktModule.project) ) ), + this@KSAnnotationJavaImpl, Origin.SYNTHETIC ) } diff --git a/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/KSAnnotationImpl.kt b/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/KSAnnotationImpl.kt index acf8649bef..fef57c8c2c 100644 --- a/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/KSAnnotationImpl.kt +++ b/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/KSAnnotationImpl.kt @@ -70,7 +70,9 @@ class KSAnnotationImpl private constructor( } override val arguments: List by lazy { - val presentArgs = annotationApplication.arguments.map { KSValueArgumentImpl.getCached(it, Origin.KOTLIN) } + val presentArgs = annotationApplication.arguments.map { + KSValueArgumentImpl.getCached(it, this, Origin.KOTLIN) + } val presentNames = presentArgs.mapNotNull { it.name?.asString() } val absentArgs = defaultArguments.filter { it.name?.asString() !in presentNames @@ -112,6 +114,7 @@ class KSAnnotationImpl private constructor( KotlinAlwaysAccessibleLifetimeToken(ResolverAAImpl.ktModule.project) ) ), + this@KSAnnotationImpl, Origin.SYNTHETIC ) } diff --git a/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/KSValueArgumentImpl.kt b/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/KSValueArgumentImpl.kt index f07636784e..8df0b52625 100644 --- a/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/KSValueArgumentImpl.kt +++ b/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/KSValueArgumentImpl.kt @@ -24,11 +24,14 @@ import org.jetbrains.kotlin.analysis.api.annotations.KtNamedAnnotationValue class KSValueArgumentImpl private constructor( private val namedAnnotationValue: KtNamedAnnotationValue, + override val parent: KSNode, override val origin: Origin ) : KSValueArgument, Deferrable { companion object : KSObjectCache() { - fun getCached(namedAnnotationValue: KtNamedAnnotationValue, origin: Origin) = - cache.getOrPut(namedAnnotationValue) { KSValueArgumentImpl(namedAnnotationValue, origin) } + fun getCached(namedAnnotationValue: KtNamedAnnotationValue, parent: KSNode, origin: Origin) = + cache.getOrPut(namedAnnotationValue) { + KSValueArgumentImpl(namedAnnotationValue, parent, origin) + } } override val name: KSName? by lazy { @@ -45,9 +48,6 @@ class KSValueArgumentImpl private constructor( namedAnnotationValue.expression.sourcePsi?.toLocation() ?: NonExistLocation } - override val parent: KSNode? - get() = TODO("Not yet implemented") - override fun accept(visitor: KSVisitor, data: D): R { return visitor.visitValueArgument(this, data) } @@ -56,5 +56,5 @@ class KSValueArgumentImpl private constructor( return "${name?.asString() ?: ""}:$value" } - override fun defer(): Restorable = Restorable { getCached(namedAnnotationValue, origin) } + override fun defer(): Restorable = Restorable { getCached(namedAnnotationValue, parent, origin) } } diff --git a/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/resolved/KSAnnotationResolvedImpl.kt b/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/resolved/KSAnnotationResolvedImpl.kt index cc6d273af0..15531ab17b 100644 --- a/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/resolved/KSAnnotationResolvedImpl.kt +++ b/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/resolved/KSAnnotationResolvedImpl.kt @@ -52,7 +52,9 @@ class KSAnnotationResolvedImpl private constructor( } } override val arguments: List by lazy { - val presentArgs = annotationApplication.arguments.map { KSValueArgumentImpl.getCached(it, Origin.KOTLIN) } + val presentArgs = annotationApplication.arguments.map { + KSValueArgumentImpl.getCached(it, this, Origin.KOTLIN) + } val presentNames = presentArgs.mapNotNull { it.name?.asString() } val absentArgs = defaultArguments.filter { it.name?.asString() !in presentNames @@ -94,6 +96,7 @@ class KSAnnotationResolvedImpl private constructor( KotlinAlwaysAccessibleLifetimeToken(ResolverAAImpl.ktModule.project) ) ), + this@KSAnnotationResolvedImpl, Origin.SYNTHETIC ) } diff --git a/kotlin-analysis-api/testData/parent.kt b/kotlin-analysis-api/testData/parent.kt index b84b04480e..b1ccab2b46 100644 --- a/kotlin-analysis-api/testData/parent.kt +++ b/kotlin-analysis-api/testData/parent.kt @@ -25,6 +25,7 @@ // parent of T: B // parent of Anno: Anno // parent of Anno: @Anno +// parent of param:: @Anno // parent of @Anno: B // parent of Bnno: Bnno // parent of Bnno: @Bnno @@ -78,6 +79,7 @@ // parent of topProp.getter(): topProp // parent of Anno: Anno // parent of Anno: @Anno +// parent of param:: @Anno // parent of @Anno: topProp // parent of topProp: File: a.kt // parent of T: T @@ -86,13 +88,23 @@ // parent of T: topFun // parent of Anno: Anno // parent of Anno: @Anno +// parent of param:: @Anno // parent of @Anno: topFun // parent of topFun: File: a.kt // parent of Annotation: Annotation // parent of Annotation: Anno // parent of Anno: File: a.kt -// parent of Anno: synthetic constructor for Anno -// parent of synthetic constructor for Anno: Anno +// parent of String: String +// parent of String: param +// parent of String: param.getter() +// parent of param.getter(): param +// parent of param: Anno +// parent of String: String +// parent of String: param +// parent of param: +// parent of Anno: Anno +// parent of Anno: +// parent of : Anno // parent of Int: Int // parent of Int: INVARIANT Int // parent of INVARIANT Int: Map @@ -110,6 +122,7 @@ // parent of ITF: topClass // parent of Anno: Anno // parent of Anno: @Anno +// parent of param:: @Anno // parent of @Anno: topClass // parent of topClass: File: a.kt // parent of Int: Int @@ -243,7 +256,7 @@ enum HSV { // MODULE: main(lib) // FILE: a.kt -annotation class Anno +annotation class Anno(val param: String = "") typealias Alias = Map diff --git a/test-utils/testData/api/parent.kt b/test-utils/testData/api/parent.kt index 5e9786fdc1..97829b3bb9 100644 --- a/test-utils/testData/api/parent.kt +++ b/test-utils/testData/api/parent.kt @@ -23,6 +23,7 @@ // parent of T: B // parent of Anno: Anno // parent of Anno: @Anno +// parent of param:: @Anno // parent of @Anno: B // parent of p: Bnno // parent of p.Bnno: Bnno @@ -74,8 +75,15 @@ // parent of File: a.kt: null // parent of Any: Anno // parent of Anno: File: a.kt -// parent of Anno: synthetic constructor for Anno -// parent of synthetic constructor for Anno: Anno +// parent of String: String +// parent of String: param +// parent of param: +// parent of Anno: +// parent of : Anno +// parent of String: String +// parent of String: param.getter() +// parent of param.getter(): param +// parent of param: // parent of Int: Int // parent of Int: INVARIANT Int // parent of INVARIANT Int: Map @@ -246,7 +254,7 @@ enum HSV { // MODULE: main(lib) // FILE: a.kt -annotation class Anno +annotation class Anno(val param: String = "") typealias Alias = Map