From cd9ad2de7b6face04a4c3aa693bb5b45d3097082 Mon Sep 17 00:00:00 2001 From: Jiaxiang Chen Date: Fri, 5 Mar 2021 16:22:01 -0800 Subject: [PATCH] remove findAnnotationFromUseSiteTarget public function, integrate related logic into KSPropertyAccessor and KSPropertyDeclaration --- .../main/kotlin/com/google/devtools/ksp/utils.kt | 8 -------- .../devtools/ksp/processing/impl/ResolverImpl.kt | 8 ++++++++ .../ksp/processor/ImplicitElementProcessor.kt | 8 +++----- .../ksp/symbol/impl/kotlin/KSDeclarationImpl.kt | 4 ++++ .../symbol/impl/kotlin/KSPropertyAccessorImpl.kt | 3 ++- .../impl/kotlin/KSPropertyDeclarationImpl.kt | 15 +++++++++++++++ .../kotlin/KSPropertyDeclarationParameterImpl.kt | 5 +++++ .../synthetic/KSPropertyAccessorSyntheticImpl.kt | 5 ++++- .../testData/api/annotationInDependencies.kt | 6 ++---- 9 files changed, 43 insertions(+), 19 deletions(-) diff --git a/api/src/main/kotlin/com/google/devtools/ksp/utils.kt b/api/src/main/kotlin/com/google/devtools/ksp/utils.kt index e36f203043..55af02a8f3 100644 --- a/api/src/main/kotlin/com/google/devtools/ksp/utils.kt +++ b/api/src/main/kotlin/com/google/devtools/ksp/utils.kt @@ -193,14 +193,6 @@ fun KSDeclaration.closestClassDeclaration(): KSClassDeclaration? { } } -fun KSAnnotated.findAnnotationFromUseSiteTarget(): Collection { - return when (this) { - is KSPropertyGetter -> this.receiver.annotations.filter { it.useSiteTarget == AnnotationUseSiteTarget.GET } - is KSPropertySetter -> this.receiver.annotations.filter { it.useSiteTarget == AnnotationUseSiteTarget.SET } - else -> emptyList() - } -} - // TODO: cross module visibility is not handled fun KSDeclaration.isVisibleFrom(other: KSDeclaration): Boolean { diff --git a/compiler-plugin/src/main/kotlin/com/google/devtools/ksp/processing/impl/ResolverImpl.kt b/compiler-plugin/src/main/kotlin/com/google/devtools/ksp/processing/impl/ResolverImpl.kt index 2209cfef4a..f54f5a7ad7 100644 --- a/compiler-plugin/src/main/kotlin/com/google/devtools/ksp/processing/impl/ResolverImpl.kt +++ b/compiler-plugin/src/main/kotlin/com/google/devtools/ksp/processing/impl/ResolverImpl.kt @@ -789,3 +789,11 @@ private inline fun ClassDescriptor.findEnclosedDescriptor( kindFilter.accepts(it) && filter(it) } } + +internal fun KSAnnotated.findAnnotationFromUseSiteTarget(): Collection { + return when (this) { + is KSPropertyGetter -> (this.receiver as? KSDeclarationImpl)?.let { it.originalAnnotations.filter { it.useSiteTarget == AnnotationUseSiteTarget.GET } } + is KSPropertySetter -> (this.receiver as? KSDeclarationImpl)?.let { it.originalAnnotations.filter { it.useSiteTarget == AnnotationUseSiteTarget.SET } } + else -> emptyList() + } ?: emptyList() +} \ No newline at end of file diff --git a/compiler-plugin/src/main/kotlin/com/google/devtools/ksp/processor/ImplicitElementProcessor.kt b/compiler-plugin/src/main/kotlin/com/google/devtools/ksp/processor/ImplicitElementProcessor.kt index 278cb85713..29d132f939 100644 --- a/compiler-plugin/src/main/kotlin/com/google/devtools/ksp/processor/ImplicitElementProcessor.kt +++ b/compiler-plugin/src/main/kotlin/com/google/devtools/ksp/processor/ImplicitElementProcessor.kt @@ -18,7 +18,6 @@ package com.google.devtools.ksp.processor -import com.google.devtools.ksp.findAnnotationFromUseSiteTarget import com.google.devtools.ksp.getClassDeclarationByName import com.google.devtools.ksp.getConstructors import com.google.devtools.ksp.getDeclaredFunctions @@ -46,13 +45,13 @@ class ImplicitElementProcessor : AbstractTestProcessor() { result.add(JavaClass.primaryConstructor?.simpleName?.asString() ?: "") result.add(JavaClass.getDeclaredFunctions().map { it.simpleName.asString() }.joinToString(",")) val readOnly = ClsClass.declarations.single { it.simpleName.asString() == "readOnly" } as KSPropertyDeclaration - readOnly.getter?.let { result.add("readOnly.get(): ${it.origin} annotations from property: ${it.findAnnotationFromUseSiteTarget().map { it.shortName.asString() }.joinToString(",")}") } + readOnly.getter?.let { result.add("readOnly.get(): ${it.origin} annotations from property: ${it.annotations.map { it.shortName.asString() }.joinToString(",")}") } readOnly.getter?.receiver?.let { result.add("readOnly.getter.owner: " + nameAndOrigin(it)) } readOnly.setter?.let { result.add("readOnly.set(): ${it.origin}") } readOnly.setter?.receiver?.let { result.add("readOnly.setter.owner: " + nameAndOrigin(it)) } val readWrite = ClsClass.declarations.single { it.simpleName.asString() == "readWrite" } as KSPropertyDeclaration readWrite.getter?.let { result.add("readWrite.get(): ${it.origin}") } - readWrite.setter?.let { result.add("readWrite.set(): ${it.origin} annotations from property: ${it.findAnnotationFromUseSiteTarget().map { it.shortName.asString() }.joinToString(",")}") } + readWrite.setter?.let { result.add("readWrite.set(): ${it.origin} annotations from property: ${it.annotations.map { it.shortName.asString() }.joinToString(",")}") } val dataClass = resolver.getClassDeclarationByName(resolver.getKSNameFromString("Data"))!! result.add(dataClass.getConstructors().map { it.toString() }.joinToString(",")) val comp1 = dataClass.declarations.single { it.simpleName.asString() == "comp1" } as KSPropertyDeclaration @@ -61,8 +60,7 @@ class ImplicitElementProcessor : AbstractTestProcessor() { val comp2 = dataClass.declarations.single { it.simpleName.asString() == "comp2" } as KSPropertyDeclaration comp2.getter?.let { result.add("comp2.get(): ${it.origin}") } comp2.setter?.let { result.add("comp2.set(): ${it.origin}") } - val annotationType = comp1.annotations[0].annotationType.resolve().declaration.qualifiedName!!.asString() - result.add(annotationType) + val annotationType = comp1.getter?.let { result.add(it.annotations[0].annotationType.resolve().declaration.qualifiedName!!.asString()) } val ClassWithoutImplicitPrimaryConstructor = resolver.getClassDeclarationByName("ClassWithoutImplicitPrimaryConstructor")!! result.add(ClassWithoutImplicitPrimaryConstructor.getConstructors().map { it.toString() }.joinToString(",")) val ImplictConstructorJava = resolver.getClassDeclarationByName("ImplictConstructorJava")!! diff --git a/compiler-plugin/src/main/kotlin/com/google/devtools/ksp/symbol/impl/kotlin/KSDeclarationImpl.kt b/compiler-plugin/src/main/kotlin/com/google/devtools/ksp/symbol/impl/kotlin/KSDeclarationImpl.kt index 03d2af3c3d..f2e70ce480 100644 --- a/compiler-plugin/src/main/kotlin/com/google/devtools/ksp/symbol/impl/kotlin/KSDeclarationImpl.kt +++ b/compiler-plugin/src/main/kotlin/com/google/devtools/ksp/symbol/impl/kotlin/KSDeclarationImpl.kt @@ -67,4 +67,8 @@ abstract class KSDeclarationImpl(ktDeclaration: KtDeclaration) : KSDeclaration { override fun toString(): String { return this.simpleName.asString() } + + internal val originalAnnotations: List by lazy { + ktDeclaration.annotationEntries.map { KSAnnotationImpl.getCached(it) } + } } \ No newline at end of file diff --git a/compiler-plugin/src/main/kotlin/com/google/devtools/ksp/symbol/impl/kotlin/KSPropertyAccessorImpl.kt b/compiler-plugin/src/main/kotlin/com/google/devtools/ksp/symbol/impl/kotlin/KSPropertyAccessorImpl.kt index 7286f0e086..9237f3cad8 100644 --- a/compiler-plugin/src/main/kotlin/com/google/devtools/ksp/symbol/impl/kotlin/KSPropertyAccessorImpl.kt +++ b/compiler-plugin/src/main/kotlin/com/google/devtools/ksp/symbol/impl/kotlin/KSPropertyAccessorImpl.kt @@ -18,6 +18,7 @@ package com.google.devtools.ksp.symbol.impl.kotlin +import com.google.devtools.ksp.processing.impl.findAnnotationFromUseSiteTarget import com.google.devtools.ksp.symbol.* import com.google.devtools.ksp.symbol.impl.toKSModifiers import com.google.devtools.ksp.symbol.impl.toLocation @@ -29,7 +30,7 @@ abstract class KSPropertyAccessorImpl(val ktPropertyAccessor: KtPropertyAccessor KSPropertyDeclarationImpl.getCached(ktPropertyAccessor.property as KtProperty) } override val annotations: List by lazy { - ktPropertyAccessor.annotationEntries.map { KSAnnotationImpl.getCached(it) } + ktPropertyAccessor.annotationEntries.map { KSAnnotationImpl.getCached(it) }.plus(this.findAnnotationFromUseSiteTarget()) } override val location: Location by lazy { diff --git a/compiler-plugin/src/main/kotlin/com/google/devtools/ksp/symbol/impl/kotlin/KSPropertyDeclarationImpl.kt b/compiler-plugin/src/main/kotlin/com/google/devtools/ksp/symbol/impl/kotlin/KSPropertyDeclarationImpl.kt index 5f75b47d59..e30e4c4356 100644 --- a/compiler-plugin/src/main/kotlin/com/google/devtools/ksp/symbol/impl/kotlin/KSPropertyDeclarationImpl.kt +++ b/compiler-plugin/src/main/kotlin/com/google/devtools/ksp/symbol/impl/kotlin/KSPropertyDeclarationImpl.kt @@ -29,6 +29,9 @@ import com.google.devtools.ksp.symbol.impl.synthetic.KSPropertyGetterSyntheticIm import com.google.devtools.ksp.symbol.impl.synthetic.KSPropertySetterSyntheticImpl import org.jetbrains.kotlin.descriptors.PropertyDescriptor import org.jetbrains.kotlin.descriptors.VariableDescriptorWithAccessors +import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget +import org.jetbrains.kotlin.psi.KtAnnotated +import org.jetbrains.kotlin.psi.KtAnnotationEntry import org.jetbrains.kotlin.psi.KtProperty import org.jetbrains.kotlin.psi.psiUtil.isExtensionDeclaration @@ -42,6 +45,10 @@ class KSPropertyDeclarationImpl private constructor(val ktProperty: KtProperty) ResolverImpl.instance.resolveDeclaration(ktProperty) as? PropertyDescriptor } + override val annotations: List by lazy { + ktProperty.filterAccessorAnnotation().map { KSAnnotationImpl.getCached(it) } + } + override val extensionReceiver: KSTypeReference? by lazy { if (ktProperty.isExtensionDeclaration()) { KSTypeReferenceImpl.getCached(ktProperty.receiverTypeReference!!) @@ -96,4 +103,12 @@ class KSPropertyDeclarationImpl private constructor(val ktProperty: KtProperty) override fun accept(visitor: KSVisitor, data: D): R { return visitor.visitPropertyDeclaration(this, data) } +} + +internal fun KtAnnotated.filterAccessorAnnotation(): List { + return this.annotationEntries.filter { property -> + property.useSiteTarget?.getAnnotationUseSiteTarget()?.let { + it != AnnotationUseSiteTarget.PROPERTY_GETTER && it != AnnotationUseSiteTarget.PROPERTY_SETTER + } ?: true + } } \ No newline at end of file diff --git a/compiler-plugin/src/main/kotlin/com/google/devtools/ksp/symbol/impl/kotlin/KSPropertyDeclarationParameterImpl.kt b/compiler-plugin/src/main/kotlin/com/google/devtools/ksp/symbol/impl/kotlin/KSPropertyDeclarationParameterImpl.kt index e7b6276b8f..81e3698bca 100644 --- a/compiler-plugin/src/main/kotlin/com/google/devtools/ksp/symbol/impl/kotlin/KSPropertyDeclarationParameterImpl.kt +++ b/compiler-plugin/src/main/kotlin/com/google/devtools/ksp/symbol/impl/kotlin/KSPropertyDeclarationParameterImpl.kt @@ -29,6 +29,7 @@ import com.google.devtools.ksp.symbol.impl.binary.KSPropertyGetterDescriptorImpl import com.google.devtools.ksp.symbol.impl.binary.KSPropertySetterDescriptorImpl import com.google.devtools.ksp.symbol.impl.synthetic.KSPropertyGetterSyntheticImpl import com.google.devtools.ksp.symbol.impl.synthetic.KSPropertySetterSyntheticImpl +import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget import org.jetbrains.kotlin.psi.KtClassOrObject import org.jetbrains.kotlin.psi.KtParameter import org.jetbrains.kotlin.psi.KtStubbedPsiUtil @@ -41,6 +42,10 @@ class KSPropertyDeclarationParameterImpl private constructor(val ktParameter: Kt fun getCached(ktParameter: KtParameter) = cache.getOrPut(ktParameter) { KSPropertyDeclarationParameterImpl(ktParameter) } } + override val annotations: List by lazy { + ktParameter.filterAccessorAnnotation().map { KSAnnotationImpl.getCached(it) } + } + override val parentDeclaration: KSDeclaration? by lazy { ktParameter.findParentDeclaration()!!.parentDeclaration } diff --git a/compiler-plugin/src/main/kotlin/com/google/devtools/ksp/symbol/impl/synthetic/KSPropertyAccessorSyntheticImpl.kt b/compiler-plugin/src/main/kotlin/com/google/devtools/ksp/symbol/impl/synthetic/KSPropertyAccessorSyntheticImpl.kt index 320c665a2b..96dd624a12 100644 --- a/compiler-plugin/src/main/kotlin/com/google/devtools/ksp/symbol/impl/synthetic/KSPropertyAccessorSyntheticImpl.kt +++ b/compiler-plugin/src/main/kotlin/com/google/devtools/ksp/symbol/impl/synthetic/KSPropertyAccessorSyntheticImpl.kt @@ -18,10 +18,13 @@ package com.google.devtools.ksp.symbol.impl.synthetic +import com.google.devtools.ksp.processing.impl.findAnnotationFromUseSiteTarget import com.google.devtools.ksp.symbol.* abstract class KSPropertyAccessorSyntheticImpl(ksPropertyDeclaration: KSPropertyDeclaration) : KSPropertyAccessor { - override val annotations: List = emptyList() + override val annotations: List by lazy { + this.findAnnotationFromUseSiteTarget().toList() + } override val location: Location by lazy { ksPropertyDeclaration.location diff --git a/compiler-plugin/testData/api/annotationInDependencies.kt b/compiler-plugin/testData/api/annotationInDependencies.kt index 5715c9a302..041534a43b 100644 --- a/compiler-plugin/testData/api/annotationInDependencies.kt +++ b/compiler-plugin/testData/api/annotationInDependencies.kt @@ -31,8 +31,6 @@ // property prop : annotations.FieldTarget2{[value = field:]} // property prop : annotations.FieldTarget{[value = onProp]} // property prop : annotations.NoTargetAnnotation{[value = onProp]} -// property prop : annotations.PropertyGetterTarget{[value = get:]} -// property prop : annotations.PropertySetterTarget{[value = set:]} // property prop : annotations.PropertyTarget{[value = onProp]} // setter of property prop : annotations.PropertySetterTarget{[value = set:]} // lib.KotlinClass -> @@ -53,6 +51,7 @@ // main.DataClass -> // class main.DataClass : annotations.ClassTarget{[value = onDataClass]} // class main.DataClass : annotations.NoTargetAnnotation{[value = onDataClass]} +// getter of property constructorParam : annotations.PropertyGetterTarget{[value = get:]} // parameter constructorParam : annotations.FieldTarget2{[value = field:]} // parameter constructorParam : annotations.FieldTarget{[value = onConstructorParam]} // parameter constructorParam : annotations.NoTargetAnnotation{[value = onConstructorParam]} @@ -62,9 +61,8 @@ // property constructorParam : annotations.FieldTarget2{[value = field:]} // property constructorParam : annotations.FieldTarget{[value = onConstructorParam]} // property constructorParam : annotations.NoTargetAnnotation{[value = onConstructorParam]} -// property constructorParam : annotations.PropertyGetterTarget{[value = get:]} -// property constructorParam : annotations.PropertySetterTarget{[value = set:]} // property constructorParam : annotations.PropertyTarget{[value = onConstructorParam]} +// setter of property constructorParam : annotations.PropertySetterTarget{[value = set:]} // lib.DataClass -> // class lib.DataClass : annotations.ClassTarget{[value = onDataClass]} // class lib.DataClass : annotations.NoTargetAnnotation{[value = onDataClass]}