Skip to content

Commit c28c357

Browse files
committed
defer resolution of annotations when possible.
1 parent dc38b13 commit c28c357

File tree

10 files changed

+269
-35
lines changed

10 files changed

+269
-35
lines changed

kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/AbstractKSDeclarationImpl.kt

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ import com.intellij.psi.PsiModifierListOwner
3535
import org.jetbrains.kotlin.analysis.api.symbols.*
3636
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtNamedSymbol
3737
import org.jetbrains.kotlin.analysis.utils.printer.parentOfType
38-
import org.jetbrains.kotlin.psi.KtElement
38+
import org.jetbrains.kotlin.psi.KtAnnotated
3939
import org.jetbrains.kotlin.psi.KtModifierListOwner
4040

4141
abstract class AbstractKSDeclarationImpl(val ktDeclarationSymbol: KtDeclarationSymbol) : KSDeclaration, Deferrable {
@@ -119,8 +119,10 @@ abstract class AbstractKSDeclarationImpl(val ktDeclarationSymbol: KtDeclarationS
119119
override val docString: String?
120120
get() = ktDeclarationSymbol.toDocString()
121121

122-
internal val originalAnnotations: Sequence<KSAnnotation> by lazy {
123-
if (ktDeclarationSymbol.psi is KtElement || ktDeclarationSymbol.psi == null) {
122+
internal open val originalAnnotations: Sequence<KSAnnotation> by lazy {
123+
if (ktDeclarationSymbol.psi is KtAnnotated) {
124+
(ktDeclarationSymbol.psi as KtAnnotated).annotations(ktDeclarationSymbol, this)
125+
} else if (ktDeclarationSymbol.psi == null) {
124126
ktDeclarationSymbol.annotations(this)
125127
} else {
126128
(ktDeclarationSymbol.psi as PsiJvmModifiersOwner)

kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/KSAnnotationImpl.kt

Lines changed: 23 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -23,43 +23,47 @@ import com.google.devtools.ksp.common.impl.KSNameImpl
2323
import com.google.devtools.ksp.impl.ResolverAAImpl
2424
import com.google.devtools.ksp.impl.symbol.java.KSValueArgumentLiteImpl
2525
import com.google.devtools.ksp.impl.symbol.java.calcValue
26-
import com.google.devtools.ksp.impl.symbol.kotlin.resolved.KSTypeReferenceResolvedImpl
2726
import com.google.devtools.ksp.symbol.*
2827
import com.intellij.psi.PsiAnnotationMethod
2928
import com.intellij.psi.PsiArrayInitializerMemberValue
3029
import com.intellij.psi.PsiClass
3130
import com.intellij.psi.impl.compiled.ClsClassImpl
32-
import org.jetbrains.kotlin.analysis.api.KtAnalysisApiInternals
31+
import org.jetbrains.kotlin.analysis.api.KaAnalysisApiInternals
3332
import org.jetbrains.kotlin.analysis.api.annotations.KtAnnotationApplicationWithArgumentsInfo
3433
import org.jetbrains.kotlin.analysis.api.annotations.KtNamedAnnotationValue
3534
import org.jetbrains.kotlin.analysis.api.annotations.KtUnsupportedAnnotationValue
36-
import org.jetbrains.kotlin.analysis.api.components.buildClassType
3735
import org.jetbrains.kotlin.analysis.api.platform.lifetime.KotlinAlwaysAccessibleLifetimeToken
3836
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbolOrigin
3937
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget.*
4038
import org.jetbrains.kotlin.psi.KtAnnotationEntry
4139

4240
// TODO: implement a psi based version of annotation application.
4341
class KSAnnotationImpl private constructor(
44-
private val annotationApplication: KtAnnotationApplicationWithArgumentsInfo,
45-
override val parent: KSNode?
42+
private val ktAnnotationEntry: KtAnnotationEntry,
43+
override val parent: KSNode?,
44+
private val resolveToAnnotationApplication: () -> KtAnnotationApplicationWithArgumentsInfo
4645
) : KSAnnotation {
47-
companion object : KSObjectCache<IdKeyPair<KtAnnotationApplicationWithArgumentsInfo, KSNode?>, KSAnnotationImpl>() {
48-
fun getCached(annotationApplication: KtAnnotationApplicationWithArgumentsInfo, parent: KSNode? = null) =
49-
cache.getOrPut(IdKeyPair(annotationApplication, parent)) { KSAnnotationImpl(annotationApplication, parent) }
46+
companion object : KSObjectCache<IdKeyPair<KtAnnotationEntry, KSNode?>, KSAnnotationImpl>() {
47+
fun getCached(
48+
ktAnnotationEntry: KtAnnotationEntry,
49+
parent: KSNode? = null,
50+
resolveToAnnotationApplication: () -> KtAnnotationApplicationWithArgumentsInfo
51+
) =
52+
cache.getOrPut(IdKeyPair(ktAnnotationEntry, parent)) {
53+
KSAnnotationImpl(ktAnnotationEntry, parent, resolveToAnnotationApplication)
54+
}
55+
}
56+
57+
private val annotationApplication by lazy {
58+
resolveToAnnotationApplication()
5059
}
5160

5261
override val annotationType: KSTypeReference by lazy {
5362
analyze {
54-
if (annotationApplication.psi is KtAnnotationEntry) {
63+
ktAnnotationEntry.typeReference!!.let {
5564
KSTypeReferenceImpl.getCached(
56-
(annotationApplication.psi as KtAnnotationEntry).typeReference!!,
57-
parent = this@KSAnnotationImpl
58-
)
59-
} else {
60-
KSTypeReferenceResolvedImpl.getCached(
61-
buildClassType(annotationApplication.classId!!),
62-
parent = this@KSAnnotationImpl
65+
it,
66+
this@KSAnnotationImpl
6367
)
6468
}
6569
}
@@ -74,7 +78,7 @@ class KSAnnotationImpl private constructor(
7478
presentArgs + absentArgs
7579
}
7680

77-
@OptIn(KtAnalysisApiInternals::class)
81+
@OptIn(KaAnalysisApiInternals::class)
7882
override val defaultArguments: List<KSValueArgument> by lazy {
7983
analyze {
8084
annotationApplication.classId?.toKtClassSymbol()?.let { symbol ->
@@ -120,11 +124,11 @@ class KSAnnotationImpl private constructor(
120124
}
121125

122126
override val shortName: KSName by lazy {
123-
KSNameImpl.getCached(annotationApplication.classId!!.shortClassName.asString())
127+
KSNameImpl.getCached(ktAnnotationEntry.shortName!!.asString())
124128
}
125129

126130
override val useSiteTarget: AnnotationUseSiteTarget? by lazy {
127-
when (annotationApplication.useSiteTarget) {
131+
when (ktAnnotationEntry.useSiteTarget?.getAnnotationUseSiteTarget()) {
128132
null -> null
129133
FILE -> AnnotationUseSiteTarget.FILE
130134
PROPERTY -> AnnotationUseSiteTarget.PROPERTY

kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/KSFileImpl.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ class KSFileImpl private constructor(internal val ktFileSymbol: KtFileSymbol) :
8585
}
8686

8787
override val annotations: Sequence<KSAnnotation> by lazy {
88-
ktFileSymbol.annotations(this)
88+
(ktFileSymbol.psi as? KtFile)?.annotations(ktFileSymbol) ?: ktFileSymbol.annotations(this)
8989
}
9090

9191
override fun toString(): String {

kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/KSPropertyAccessorImpl.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
package com.google.devtools.ksp.impl.symbol.kotlin
1919

2020
import com.google.devtools.ksp.common.KSObjectCache
21+
import com.google.devtools.ksp.impl.symbol.kotlin.resolved.KSAnnotationResolvedImpl
2122
import com.google.devtools.ksp.impl.symbol.kotlin.resolved.KSTypeReferenceResolvedImpl
2223
import com.google.devtools.ksp.impl.symbol.util.toKSModifiers
2324
import com.google.devtools.ksp.symbol.*
@@ -37,13 +38,15 @@ abstract class KSPropertyAccessorImpl(
3738
) : KSPropertyAccessor, Deferrable {
3839

3940
override val annotations: Sequence<KSAnnotation> by lazy {
41+
// (ktPropertyAccessorSymbol.psi as? KtPropertyAccessor)?.annotations(ktPropertyAccessorSymbol, this) ?:
4042
ktPropertyAccessorSymbol.annotations.asSequence()
4143
.filter { it.useSiteTarget != AnnotationUseSiteTarget.SETTER_PARAMETER }
42-
.map { KSAnnotationImpl.getCached(it, this) }
44+
.map { KSAnnotationResolvedImpl.getCached(it, this) }
4345
.plus(findAnnotationFromUseSiteTarget())
4446
}
4547

4648
internal val originalAnnotations: Sequence<KSAnnotation> by lazy {
49+
// (ktPropertyAccessorSymbol.psi as? KtPropertyAccessor)?.annotations(ktPropertyAccessorSymbol, this) ?:
4750
ktPropertyAccessorSymbol.annotations(this)
4851
}
4952

kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/KSPropertyDeclarationImpl.kt

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,13 @@ import com.google.devtools.ksp.common.impl.KSNameImpl
2525
import com.google.devtools.ksp.impl.ResolverAAImpl
2626
import com.google.devtools.ksp.impl.recordLookupForPropertyOrMethod
2727
import com.google.devtools.ksp.impl.recordLookupWithSupertypes
28+
import com.google.devtools.ksp.impl.symbol.kotlin.resolved.KSAnnotationResolvedImpl
2829
import com.google.devtools.ksp.impl.symbol.kotlin.resolved.KSTypeReferenceResolvedImpl
2930
import com.google.devtools.ksp.impl.symbol.util.BinaryClassInfoCache
3031
import com.google.devtools.ksp.symbol.*
3132
import com.intellij.psi.PsiClass
3233
import org.jetbrains.kotlin.analysis.api.KaConstantInitializerValue
3334
import org.jetbrains.kotlin.analysis.api.annotations.KtAnnotationApplication
34-
import org.jetbrains.kotlin.analysis.api.annotations.annotations
3535
import org.jetbrains.kotlin.analysis.api.fir.symbols.KaFirKotlinPropertySymbol
3636
import org.jetbrains.kotlin.analysis.api.symbols.KtKotlinPropertySymbol
3737
import org.jetbrains.kotlin.analysis.api.symbols.KtPropertySymbol
@@ -42,6 +42,7 @@ import org.jetbrains.kotlin.descriptors.java.JavaVisibilities
4242
import org.jetbrains.kotlin.load.java.structure.impl.JavaClassImpl
4343
import org.jetbrains.kotlin.load.kotlin.JvmPackagePartSource
4444
import org.jetbrains.kotlin.load.kotlin.KotlinJvmBinarySourceElement
45+
import org.jetbrains.kotlin.psi.KtAnnotationEntry
4546
import org.jetbrains.kotlin.psi.KtProperty
4647

4748
class KSPropertyDeclarationImpl private constructor(internal val ktPropertySymbol: KtPropertySymbol) :
@@ -53,10 +54,13 @@ class KSPropertyDeclarationImpl private constructor(internal val ktPropertySymbo
5354
cache.getOrPut(ktPropertySymbol) { KSPropertyDeclarationImpl(ktPropertySymbol) }
5455
}
5556

57+
override val originalAnnotations: Sequence<KSAnnotation>
58+
get() = annotations
59+
5660
override val annotations: Sequence<KSAnnotation> by lazy {
5761
ktPropertySymbol.annotations.asSequence()
5862
.filter { !it.isUseSiteTargetAnnotation() }
59-
.map { KSAnnotationImpl.getCached(it, this) }
63+
.map { KSAnnotationResolvedImpl.getCached(it, this) }
6064
.plus(
6165
if (ktPropertySymbol.isFromPrimaryConstructor) {
6266
(parentDeclaration as? KSClassDeclaration)?.primaryConstructor?.parameters
@@ -74,8 +78,9 @@ class KSPropertyDeclarationImpl private constructor(internal val ktPropertySymbo
7478
} ?: false
7579
}
7680
}.plus(
81+
// TODO: optimize for psi
7782
ktPropertySymbol.backingFieldSymbol?.annotations
78-
?.map { KSAnnotationImpl.getCached(it) } ?: emptyList()
83+
?.map { KSAnnotationResolvedImpl.getCached(it, this@KSPropertyDeclarationImpl) } ?: emptyList()
7984
)
8085
}
8186

@@ -181,7 +186,15 @@ internal fun KtAnnotationApplication.isUseSiteTargetAnnotation(): Boolean {
181186
it == AnnotationUseSiteTarget.CONSTRUCTOR_PARAMETER
182187
} ?: false
183188
}
184-
189+
internal fun KtAnnotationEntry.isUseSiteTargetAnnotation(): Boolean {
190+
return this.useSiteTarget?.getAnnotationUseSiteTarget()?.let {
191+
it == AnnotationUseSiteTarget.PROPERTY_GETTER ||
192+
it == AnnotationUseSiteTarget.PROPERTY_SETTER ||
193+
it == AnnotationUseSiteTarget.SETTER_PARAMETER ||
194+
it == AnnotationUseSiteTarget.CONSTRUCTOR_PARAMETER ||
195+
it == AnnotationUseSiteTarget.FIELD
196+
} ?: false
197+
}
185198
internal fun KtPropertySymbol.toModifiers(): Set<Modifier> {
186199
val result = mutableSetOf<Modifier>()
187200
if (visibility != JavaVisibilities.PackageVisibility) {

kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/KSTypeImpl.kt

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import com.google.devtools.ksp.common.KSObjectCache
2222
import com.google.devtools.ksp.common.errorTypeOnInconsistentArguments
2323
import com.google.devtools.ksp.impl.ResolverAAImpl
2424
import com.google.devtools.ksp.impl.recordLookupWithSupertypes
25+
import com.google.devtools.ksp.impl.symbol.kotlin.resolved.KSAnnotationResolvedImpl
2526
import com.google.devtools.ksp.impl.symbol.kotlin.resolved.KSTypeArgumentResolvedImpl
2627
import com.google.devtools.ksp.impl.symbol.kotlin.synthetic.getExtensionFunctionTypeAnnotation
2728
import com.google.devtools.ksp.symbol.KSAnnotation
@@ -88,9 +89,11 @@ class KSTypeImpl private constructor(internal val type: KtType) : KSType {
8889
override val annotations: Sequence<KSAnnotation>
8990
get() = type.annotations() +
9091
if (type is KtFunctionalType && type.receiverType != null) {
91-
sequenceOf(KSAnnotationImpl.getCached(getExtensionFunctionTypeAnnotation(type.annotations.size)))
92+
sequenceOf(
93+
KSAnnotationResolvedImpl.getCached(getExtensionFunctionTypeAnnotation(type.annotations.size))
94+
)
9295
} else {
93-
emptySequence<KSAnnotation>()
96+
emptySequence()
9497
}
9598

9699
override fun isAssignableFrom(that: KSType): Boolean {

kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/KSTypeReferenceImpl.kt

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import com.google.devtools.ksp.symbol.Location
3030
import com.google.devtools.ksp.symbol.Modifier
3131
import com.google.devtools.ksp.symbol.Origin
3232
import org.jetbrains.kotlin.analysis.api.types.KtType
33+
import org.jetbrains.kotlin.psi.KtAnnotationEntry
3334
import org.jetbrains.kotlin.psi.KtDynamicType
3435
import org.jetbrains.kotlin.psi.KtNullableType
3536
import org.jetbrains.kotlin.psi.KtTypeReference
@@ -70,7 +71,19 @@ class KSTypeReferenceImpl(
7071
}
7172

7273
override val annotations: Sequence<KSAnnotation> by lazy {
73-
ktType.annotations.map { KSAnnotationImpl.getCached(it) }.asSequence()
74+
val innerAnnotations = mutableListOf<Sequence<KtAnnotationEntry>>()
75+
visitNullableType {
76+
innerAnnotations.add(it.annotationEntries.asSequence())
77+
}
78+
79+
(ktTypeReference.annotationEntries.asSequence() + innerAnnotations.asSequence().flatten())
80+
.map { annotationEntry ->
81+
KSAnnotationImpl.getCached(annotationEntry, this@KSTypeReferenceImpl) {
82+
ktType.annotations.single {
83+
it.psi == annotationEntry
84+
}
85+
}
86+
}
7487
}
7588

7689
override val origin: Origin = parent?.origin ?: Origin.SYNTHETIC

kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/KSValueParameterImpl.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ import org.jetbrains.kotlin.fir.symbols.SymbolInternals
3131
import org.jetbrains.kotlin.psi.KtParameter
3232

3333
class KSValueParameterImpl private constructor(
34-
private val ktValueParameterSymbol: KtValueParameterSymbol,
34+
internal val ktValueParameterSymbol: KtValueParameterSymbol,
3535
override val parent: KSAnnotated
3636
) : KSValueParameter, Deferrable {
3737
companion object : KSObjectCache<KtValueParameterSymbol, KSValueParameterImpl>() {

0 commit comments

Comments
 (0)