Skip to content

Commit

Permalink
fix type resolution scopes for nested local class.
Browse files Browse the repository at this point in the history
  • Loading branch information
neetopia committed Jul 14, 2023
1 parent 5b3ee92 commit a4258bd
Show file tree
Hide file tree
Showing 3 changed files with 53 additions and 29 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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.*
Expand All @@ -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
Expand All @@ -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
Expand All @@ -111,7 +98,7 @@ import org.jetbrains.kotlin.types.typeUtil.supertypes
import org.jetbrains.kotlin.util.containingNonLocalDeclaration
import org.jetbrains.org.objectweb.asm.Opcodes
import java.io.File
import java.util.Stack
import java.util.*

class ResolverImpl(
val module: ModuleDescriptor,
Expand Down Expand Up @@ -790,9 +777,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? {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand All @@ -30,10 +31,22 @@ class NestedAnnotationProcessor : AbstractTestProcessor() {

override fun process(resolver: Resolver): List<KSAnnotated> {
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()
}
}
9 changes: 8 additions & 1 deletion test-utils/testData/api/nestedAnnotations.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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
}

0 comments on commit a4258bd

Please sign in to comment.