[FIR] Set targets of annotation classes in FirJavaElementFinder

#KT-60504 Fixed
This commit is contained in:
Kirill Rakhman
2023-11-29 10:01:54 +01:00
committed by Space Team
parent daa02813c2
commit 81517a3d29
9 changed files with 162 additions and 67 deletions
@@ -27,11 +27,13 @@ import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.fir.FirModuleData
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.FirSessionComponent
import org.jetbrains.kotlin.fir.analysis.checkers.getTargetAnnotation
import org.jetbrains.kotlin.fir.caches.FirCache
import org.jetbrains.kotlin.fir.caches.firCachesFactory
import org.jetbrains.kotlin.fir.caches.getValue
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.utils.*
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
import org.jetbrains.kotlin.fir.expressions.FirConstExpression
import org.jetbrains.kotlin.fir.moduleData
import org.jetbrains.kotlin.fir.resolve.ScopeSession
@@ -44,12 +46,14 @@ import org.jetbrains.kotlin.fir.resolve.transformers.SupertypeComputationSession
import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol
import org.jetbrains.kotlin.fir.types.*
import org.jetbrains.kotlin.fir.utils.exceptions.withConeTypeEntry
import org.jetbrains.kotlin.load.java.JvmAnnotationNames
import org.jetbrains.kotlin.load.java.structure.impl.NotEvaluatedConstAware
import org.jetbrains.kotlin.name.*
import org.jetbrains.kotlin.resolve.jvm.JvmPrimitiveType
import org.jetbrains.kotlin.resolve.jvm.KotlinFinderMarker
import org.jetbrains.kotlin.util.capitalizeDecapitalize.capitalizeAsciiOnly
import org.jetbrains.kotlin.util.capitalizeDecapitalize.toLowerCaseAsciiOnly
import org.jetbrains.kotlin.utils.KOTLIN_TO_JAVA_ANNOTATION_TARGETS
import org.jetbrains.kotlin.utils.exceptions.errorWithAttachment
val FirSession.javaElementFinder: FirJavaElementFinder? by FirSession.nullableSessionComponentAccessor<FirJavaElementFinder>()
@@ -166,7 +170,20 @@ class FirJavaElementFinder(
buildFieldStubForConst(it, stub)
}
PsiModifierListStubImpl(stub, firClass.packFlags())
val modifierListStub = PsiModifierListStubImpl(stub, firClass.packFlags())
if (firClass.classKind == ClassKind.ANNOTATION_CLASS) {
val targets = firClass.getTargetAnnotation(session)?.findTargets()
if (targets != null) {
val annotationString = buildString {
append("@${JvmAnnotationNames.TARGET_ANNOTATION}({")
targets.mapNotNull { KOTLIN_TO_JAVA_ANNOTATION_TARGETS[it] }
.joinTo(this) { "${JvmAnnotationNames.ELEMENT_TYPE_ENUM}.$it" }
append("})")
}
PsiAnnotationStubImpl(modifierListStub, annotationString)
}
}
newTypeParameterList(
stub,
@@ -187,6 +204,10 @@ class FirJavaElementFinder(
return stub
}
private fun FirAnnotation.findTargets(): List<String> = buildList {
forEachAnnotationTarget { add(it.identifier) }
}
private fun buildFieldStubForConst(firProperty: FirProperty, classStub: PsiClassStubImpl<ClsClassImpl>) {
if (!firProperty.isConst) return