[FIR] Set targets of annotation classes in FirJavaElementFinder
#KT-60504 Fixed
This commit is contained in:
committed by
Space Team
parent
daa02813c2
commit
81517a3d29
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user