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 2fbbd7a037..d06d1cf86a 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 @@ -29,10 +29,11 @@ import com.google.devtools.ksp.symbol.impl.binary.* import com.google.devtools.ksp.symbol.impl.declarationsInSourceOrder import com.google.devtools.ksp.symbol.impl.getInstanceForCurrentRound import com.google.devtools.ksp.symbol.impl.java.* -import com.google.devtools.ksp.symbol.impl.jvmAccessFlag import com.google.devtools.ksp.symbol.impl.kotlin.* -import com.google.devtools.ksp.symbol.impl.resolveContainingClass -import com.google.devtools.ksp.symbol.impl.synthetic.* +import com.google.devtools.ksp.symbol.impl.synthetic.KSConstructorSyntheticImpl +import com.google.devtools.ksp.symbol.impl.synthetic.KSPropertyGetterSyntheticImpl +import com.google.devtools.ksp.symbol.impl.synthetic.KSPropertySetterSyntheticImpl +import com.google.devtools.ksp.symbol.impl.synthetic.KSValueParameterSyntheticImpl import com.google.devtools.ksp.visitor.CollectAnnotatedSymbolsVisitor import com.intellij.openapi.project.Project import com.intellij.psi.* @@ -54,31 +55,16 @@ import org.jetbrains.kotlin.descriptors.annotations.Annotations import org.jetbrains.kotlin.incremental.components.NoLookupLocation import org.jetbrains.kotlin.load.java.components.TypeUsage import org.jetbrains.kotlin.load.java.descriptors.JavaForKotlinOverridePropertyDescriptor -import org.jetbrains.kotlin.load.java.lazy.JavaResolverComponents -import org.jetbrains.kotlin.load.java.lazy.LazyJavaResolverContext -import org.jetbrains.kotlin.load.java.lazy.ModuleClassResolver -import org.jetbrains.kotlin.load.java.lazy.TypeParameterResolver -import org.jetbrains.kotlin.load.java.lazy.childForClassOrPackage -import org.jetbrains.kotlin.load.java.lazy.childForMethod +import org.jetbrains.kotlin.load.java.lazy.* import org.jetbrains.kotlin.load.java.lazy.descriptors.LazyJavaTypeParameterDescriptor import org.jetbrains.kotlin.load.java.lazy.types.JavaTypeResolver import org.jetbrains.kotlin.load.java.lazy.types.toAttributes import org.jetbrains.kotlin.load.java.sources.JavaSourceElement -import org.jetbrains.kotlin.load.java.structure.impl.JavaArrayTypeImpl -import org.jetbrains.kotlin.load.java.structure.impl.JavaClassImpl -import org.jetbrains.kotlin.load.java.structure.impl.JavaConstructorImpl -import org.jetbrains.kotlin.load.java.structure.impl.JavaFieldImpl -import org.jetbrains.kotlin.load.java.structure.impl.JavaMethodImpl -import org.jetbrains.kotlin.load.java.structure.impl.JavaTypeImpl -import org.jetbrains.kotlin.load.java.structure.impl.JavaTypeParameterImpl +import org.jetbrains.kotlin.load.java.structure.impl.* import org.jetbrains.kotlin.load.java.structure.impl.classFiles.BinaryJavaClass import org.jetbrains.kotlin.load.java.structure.impl.classFiles.BinaryJavaMethod import org.jetbrains.kotlin.load.java.structure.impl.classFiles.BinaryJavaMethodBase -import org.jetbrains.kotlin.load.kotlin.TypeMappingMode -import org.jetbrains.kotlin.load.kotlin.VirtualFileKotlinClass -import org.jetbrains.kotlin.load.kotlin.getContainingKotlinJvmBinaryClass -import org.jetbrains.kotlin.load.kotlin.getOptimalModeForReturnType -import org.jetbrains.kotlin.load.kotlin.getOptimalModeForValueParameter +import org.jetbrains.kotlin.load.kotlin.* import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqNameUnsafe import org.jetbrains.kotlin.name.Name @@ -89,7 +75,8 @@ import org.jetbrains.kotlin.resolve.calls.inference.components.NewTypeSubstituto import org.jetbrains.kotlin.resolve.calls.inference.components.composeWith import org.jetbrains.kotlin.resolve.calls.inference.substitute import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowInfo -import org.jetbrains.kotlin.resolve.constants.* +import org.jetbrains.kotlin.resolve.constants.ConstantValue +import org.jetbrains.kotlin.resolve.constants.KClassValue import org.jetbrains.kotlin.resolve.constants.evaluate.ConstantExpressionEvaluator import org.jetbrains.kotlin.resolve.descriptorUtil.classId import org.jetbrains.kotlin.resolve.descriptorUtil.getAllSuperClassifiers @@ -115,7 +102,7 @@ import org.jetbrains.org.objectweb.asm.MethodVisitor import org.jetbrains.org.objectweb.asm.Opcodes import org.jetbrains.org.objectweb.asm.Opcodes.API_VERSION import java.io.File -import java.util.Stack +import java.util.* class ResolverImpl( val module: ModuleDescriptor, @@ -794,9 +781,26 @@ class ResolverImpl( // Finds closest non-local scope. fun KtElement.findLexicalScope(): LexicalScope { - return containingNonLocalDeclaration()?.let { - resolveSession.declarationScopeProvider.getResolutionScopeForDeclaration(it) - } ?: resolveSession.fileScopeProvider.getFileResolutionScope(this.containingKtFile) + val ktDeclaration = KtStubbedPsiUtil.getPsiOrStubParent(this, KtDeclaration::class.java, false) + ?: return resolveSession.fileScopeProvider.getFileResolutionScope(this.containingKtFile) + var parentDeclaration = KtStubbedPsiUtil.getContainingDeclaration(ktDeclaration) + + if (ktDeclaration is KtPropertyAccessor && parentDeclaration != null) { + parentDeclaration = KtStubbedPsiUtil.getContainingDeclaration( + parentDeclaration, + KtDeclaration::class.java + ) + } + if (parentDeclaration == null) { + return resolveSession.fileScopeProvider.getFileResolutionScope(this.containingKtFile) + } + return if (parentDeclaration is KtClassOrObject) { + resolveSession.declarationScopeProvider.getResolutionScopeForDeclaration(this) + } else { + containingNonLocalDeclaration()?.let { + resolveSession.declarationScopeProvider.getResolutionScopeForDeclaration(it) + } ?: resolveSession.fileScopeProvider.getFileResolutionScope(this.containingKtFile) + } } fun resolveAnnotationEntry(ktAnnotationEntry: KtAnnotationEntry): AnnotationDescriptor? { diff --git a/test-utils/src/main/kotlin/com/google/devtools/ksp/processor/NestedAnnotationProcessor.kt b/test-utils/src/main/kotlin/com/google/devtools/ksp/processor/NestedAnnotationProcessor.kt index e74befe739..62720645b1 100644 --- a/test-utils/src/main/kotlin/com/google/devtools/ksp/processor/NestedAnnotationProcessor.kt +++ b/test-utils/src/main/kotlin/com/google/devtools/ksp/processor/NestedAnnotationProcessor.kt @@ -18,6 +18,7 @@ package com.google.devtools.ksp.processor import com.google.devtools.ksp.getClassDeclarationByName +import com.google.devtools.ksp.getDeclaredProperties import com.google.devtools.ksp.processing.Resolver import com.google.devtools.ksp.symbol.KSAnnotated @@ -30,10 +31,22 @@ class NestedAnnotationProcessor : AbstractTestProcessor() { override fun process(resolver: Resolver): List { val myClass = resolver.getClassDeclarationByName("MyClass")!! - val param = myClass.primaryConstructor!!.parameters.single() + val param = myClass.primaryConstructor!!.parameters.single { it.name?.asString() == "param" } param.annotations.forEach { annotation -> - result.add("$annotation: ${annotation.annotationType.resolve()}") + result.add("@param: $annotation: ${annotation.annotationType.resolve()}") } + val field = myClass.getDeclaredProperties().single { it.simpleName.asString() == "field" } + field.annotations.forEach { annotation -> + result.add("@field $annotation: ${annotation.annotationType.resolve()}") + } + val property = myClass.getDeclaredProperties().single { it.simpleName.asString() == "property" } + property.annotations.forEach { annotation -> + result.add("@property: $annotation: ${annotation.annotationType.resolve()}") + } + property.setter!!.parameter.annotations.forEach { annotation -> + result.add("@setparam: $annotation: ${annotation.annotationType.resolve()}") + } + return emptyList() } } diff --git a/test-utils/testData/api/nestedAnnotations.kt b/test-utils/testData/api/nestedAnnotations.kt index 073d76a8f8..c347c71235 100644 --- a/test-utils/testData/api/nestedAnnotations.kt +++ b/test-utils/testData/api/nestedAnnotations.kt @@ -17,10 +17,17 @@ // TEST PROCESSOR: NestedAnnotationProcessor // EXPECTED: -// @MyNestedAnnotation: MyNestedAnnotation +// @param: @MyNestedAnnotation: MyNestedAnnotation +// @field @MyNestedAnnotation: MyNestedAnnotation +// @property: @MyNestedAnnotation: MyNestedAnnotation +// @setparam: @MyNestedAnnotation: MyNestedAnnotation // END class MyClass(@param:MyNestedAnnotation param: String) { + @field:MyNestedAnnotation val field: String = TODO() + @property:MyNestedAnnotation val property: String = TODO() + @setparam:MyNestedAnnotation + set(value) {} annotation class MyNestedAnnotation }