FIR IDE: separate KtAnnotationApplication and KtAnnotationApplicationValue
This commit is contained in:
+3
-2
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.analysis.api.descriptors.annotations
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.annotations.KtAnnotationApplication
|
||||
import org.jetbrains.kotlin.analysis.api.annotations.KtAnnotationsList
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtAnnotationApplication
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.maybeLocalClassId
|
||||
import org.jetbrains.kotlin.analysis.api.impl.base.annotations.KtEmptyAnnotationsList
|
||||
import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
|
||||
@@ -21,7 +22,7 @@ internal class KtFe10AnnotationsList private constructor(
|
||||
) : KtAnnotationsList() {
|
||||
override val annotations: List<KtAnnotationApplication>
|
||||
get() = withValidityAssertion {
|
||||
fe10Annotations.map { KtFe10DescAnnotationApplication(it, token) }
|
||||
fe10Annotations.map { it.toKtAnnotationApplication() }
|
||||
}
|
||||
|
||||
override val annotationClassIds: Collection<ClassId>
|
||||
@@ -43,7 +44,7 @@ internal class KtFe10AnnotationsList private constructor(
|
||||
override fun annotationsByClassId(classId: ClassId): List<KtAnnotationApplication> = withValidityAssertion {
|
||||
fe10Annotations.mapNotNull { annotation ->
|
||||
if (annotation.annotationClass?.maybeLocalClassId != classId) return@mapNotNull null
|
||||
KtFe10DescAnnotationApplication(annotation, token)
|
||||
annotation.toKtAnnotationApplication()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
-47
@@ -1,47 +0,0 @@
|
||||
/*
|
||||
* Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
package org.jetbrains.kotlin.analysis.api.descriptors.annotations
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.annotations.KtAnnotationApplication
|
||||
import org.jetbrains.kotlin.analysis.api.annotations.KtNamedConstantValue
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.maybeLocalClassId
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtConstantValue
|
||||
import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
|
||||
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
||||
import org.jetbrains.kotlin.descriptors.SourceElement
|
||||
import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.psi.KtAnnotationEntry
|
||||
import org.jetbrains.kotlin.psi.KtCallElement
|
||||
import org.jetbrains.kotlin.resolve.descriptorUtil.annotationClass
|
||||
import org.jetbrains.kotlin.resolve.lazy.descriptors.LazyAnnotationDescriptor
|
||||
import org.jetbrains.kotlin.resolve.source.PsiSourceElement
|
||||
|
||||
internal class KtFe10DescAnnotationApplication(
|
||||
private val descriptor: AnnotationDescriptor,
|
||||
override val token: ValidityToken
|
||||
) : KtAnnotationApplication() {
|
||||
override val classId: ClassId?
|
||||
get() = withValidityAssertion { descriptor.annotationClass?.maybeLocalClassId }
|
||||
|
||||
override val useSiteTarget: AnnotationUseSiteTarget?
|
||||
get() = withValidityAssertion {
|
||||
val psiTarget = (descriptor as? LazyAnnotationDescriptor)?.annotationEntry?.useSiteTarget ?: return null
|
||||
return psiTarget.getAnnotationUseSiteTarget()
|
||||
}
|
||||
|
||||
val source: SourceElement
|
||||
get() = withValidityAssertion { descriptor.source }
|
||||
|
||||
override val psi: KtCallElement?
|
||||
get() = withValidityAssertion { (source as? PsiSourceElement)?.psi as? KtAnnotationEntry }
|
||||
|
||||
override val arguments: List<KtNamedConstantValue>
|
||||
get() = withValidityAssertion {
|
||||
descriptor.allValueArguments.map { (name, value) -> KtNamedConstantValue(name.asString(), value.toKtConstantValue()) }
|
||||
}
|
||||
}
|
||||
+22
-2
@@ -19,6 +19,7 @@ import org.jetbrains.kotlin.analysis.api.types.KtType
|
||||
import org.jetbrains.kotlin.analysis.api.types.KtTypeNullability
|
||||
import org.jetbrains.kotlin.builtins.functions.FunctionClassDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.*
|
||||
import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.impl.*
|
||||
import org.jetbrains.kotlin.idea.KotlinLanguage
|
||||
import org.jetbrains.kotlin.load.java.descriptors.JavaCallableMemberDescriptor
|
||||
@@ -30,6 +31,7 @@ import org.jetbrains.kotlin.load.kotlin.toSourceElement
|
||||
import org.jetbrains.kotlin.name.CallableId
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
import org.jetbrains.kotlin.psi.KtAnnotationEntry
|
||||
import org.jetbrains.kotlin.psi.KtProperty
|
||||
import org.jetbrains.kotlin.resolve.DescriptorUtils
|
||||
import org.jetbrains.kotlin.resolve.calls.inference.CapturedType
|
||||
@@ -37,7 +39,9 @@ import org.jetbrains.kotlin.resolve.constants.*
|
||||
import org.jetbrains.kotlin.resolve.constants.evaluate.ConstantExpressionEvaluator
|
||||
import org.jetbrains.kotlin.resolve.descriptorUtil.annotationClass
|
||||
import org.jetbrains.kotlin.resolve.descriptorUtil.builtIns
|
||||
import org.jetbrains.kotlin.resolve.lazy.descriptors.LazyAnnotationDescriptor
|
||||
import org.jetbrains.kotlin.resolve.sam.SamConstructorDescriptor
|
||||
import org.jetbrains.kotlin.resolve.source.PsiSourceElement
|
||||
import org.jetbrains.kotlin.resolve.source.getPsi
|
||||
import org.jetbrains.kotlin.synthetic.SyntheticJavaPropertyDescriptor
|
||||
import org.jetbrains.kotlin.types.*
|
||||
@@ -281,8 +285,15 @@ internal fun ConstantValue<*>.toKtConstantValue(): KtAnnotationValue {
|
||||
is ArrayValue -> KtArrayAnnotationValue(value.map { it.toKtConstantValue() }, null)
|
||||
is EnumValue -> KtEnumEntryAnnotationValue(CallableId(enumClassId, enumEntryName), null)
|
||||
is AnnotationValue -> {
|
||||
val arguments = value.allValueArguments.map { (name, v) -> KtNamedConstantValue(name.asString(), v.toKtConstantValue()) }
|
||||
KtAnnotationAnnotationValue(value.annotationClass?.classId, arguments, null)
|
||||
val arguments = value.allValueArguments.map { (name, v) -> KtNamedAnnotationValue(name.asString(), v.toKtConstantValue()) }
|
||||
KtAnnotationApplicationValue(
|
||||
KtAnnotationApplication(
|
||||
value.annotationClass?.classId,
|
||||
psi = null,
|
||||
useSiteTarget = null,
|
||||
arguments = arguments
|
||||
)
|
||||
)
|
||||
}
|
||||
is ErrorValue -> KtErrorValue(this.toString())
|
||||
else -> KtUnsupportedAnnotationValue
|
||||
@@ -418,4 +429,13 @@ internal fun createKtInitializerValue(
|
||||
}
|
||||
|
||||
return KtNonConstantInitializerValue(initializer)
|
||||
}
|
||||
|
||||
internal fun AnnotationDescriptor.toKtAnnotationApplication(): KtAnnotationApplication {
|
||||
return KtAnnotationApplication(
|
||||
annotationClass?.maybeLocalClassId,
|
||||
(source as? PsiSourceElement)?.psi as? KtAnnotationEntry,
|
||||
(this as? LazyAnnotationDescriptor)?.annotationEntry?.useSiteTarget?.getAnnotationUseSiteTarget(),
|
||||
allValueArguments.map { (name, value) -> KtNamedAnnotationValue(name.asString(), value.toKtConstantValue()) }
|
||||
)
|
||||
}
|
||||
+3
-3
@@ -88,11 +88,11 @@ internal class KtFe10TypeRenderer(private val options: KtTypeRendererOptions, pr
|
||||
}
|
||||
|
||||
private fun KtFe10RendererConsumer.renderTypeAnnotationDebug(annotation: AnnotationDescriptor) {
|
||||
val namedValues = annotation.allValueArguments.map { KtNamedConstantValue(it.key.asString(), it.value.toKtConstantValue()) }
|
||||
val namedValues = annotation.allValueArguments.map { KtNamedAnnotationValue(it.key.asString(), it.value.toKtConstantValue()) }
|
||||
renderAnnotationDebug(annotation.annotationClass?.classId, namedValues)
|
||||
}
|
||||
|
||||
private fun KtFe10RendererConsumer.renderAnnotationDebug(classId: ClassId?, namedValues: List<KtNamedConstantValue>) {
|
||||
private fun KtFe10RendererConsumer.renderAnnotationDebug(classId: ClassId?, namedValues: List<KtNamedAnnotationValue>) {
|
||||
append("@")
|
||||
|
||||
if (classId != null) {
|
||||
@@ -111,7 +111,7 @@ internal class KtFe10TypeRenderer(private val options: KtTypeRendererOptions, pr
|
||||
|
||||
private fun KtFe10RendererConsumer.renderConstantValueDebug(value: KtAnnotationValue) {
|
||||
when (value) {
|
||||
is KtAnnotationAnnotationValue -> renderAnnotationDebug(value.classId, value.arguments)
|
||||
is KtAnnotationApplicationValue -> renderAnnotationDebug(value.annotationValue.classId, value.annotationValue.arguments)
|
||||
is KtArrayAnnotationValue ->
|
||||
renderList(value.values, separator = ", ", prefix = "[", postfix = "]") { renderConstantValueDebug(it) }
|
||||
is KtEnumEntryAnnotationValue -> append(value.callableId)
|
||||
|
||||
@@ -5,6 +5,11 @@
|
||||
|
||||
package org.jetbrains.kotlin.analysis.api.fir
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.annotations.KtAnnotationApplication
|
||||
import org.jetbrains.kotlin.analysis.api.fir.annotations.fullyExpandedClassId
|
||||
import org.jetbrains.kotlin.analysis.api.fir.annotations.mapAnnotationParameters
|
||||
import org.jetbrains.kotlin.analysis.api.fir.evaluate.KtFirConstantValueConverter
|
||||
import org.jetbrains.kotlin.analysis.api.fir.utils.cached
|
||||
import org.jetbrains.kotlin.fir.diagnostics.ConeDiagnostic
|
||||
import org.jetbrains.kotlin.fir.expressions.FirFunctionCall
|
||||
import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression
|
||||
@@ -16,7 +21,12 @@ import org.jetbrains.kotlin.fir.resolve.diagnostics.*
|
||||
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
|
||||
import org.jetbrains.kotlin.fir.expressions.FirImplicitInvokeCall
|
||||
import org.jetbrains.kotlin.fir.psi
|
||||
import org.jetbrains.kotlin.psi.KtAnnotationEntry
|
||||
import org.jetbrains.kotlin.psi.KtCallElement
|
||||
import org.jetbrains.kotlin.util.OperatorNameConventions
|
||||
|
||||
/**
|
||||
@@ -63,4 +73,16 @@ internal fun ConeDiagnostic.getCandidateSymbols(): Collection<FirBasedSymbol<*>>
|
||||
}
|
||||
is ConeDiagnosticWithCandidates -> candidateSymbols
|
||||
else -> emptyList()
|
||||
}
|
||||
}
|
||||
|
||||
internal fun FirAnnotation.toKtAnnotationApplication(useSiteSession: FirSession): KtAnnotationApplication {
|
||||
return KtAnnotationApplication(
|
||||
fullyExpandedClassId(useSiteSession),
|
||||
psi as? KtAnnotationEntry,
|
||||
useSiteTarget,
|
||||
KtFirConstantValueConverter.toNamedConstantValue(
|
||||
mapAnnotationParameters(this, useSiteSession),
|
||||
useSiteSession,
|
||||
)
|
||||
)
|
||||
}
|
||||
-57
@@ -1,57 +0,0 @@
|
||||
/*
|
||||
* Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
package org.jetbrains.kotlin.analysis.api.fir.annotations
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.annotations.KtAnnotationApplication
|
||||
import org.jetbrains.kotlin.analysis.api.annotations.KtNamedConstantValue
|
||||
import org.jetbrains.kotlin.analysis.api.fir.evaluate.KtFirConstantValueConverter
|
||||
import org.jetbrains.kotlin.analysis.api.fir.utils.FirRefWithValidityCheck
|
||||
import org.jetbrains.kotlin.analysis.api.fir.utils.cached
|
||||
import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
|
||||
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.lazy.resolve.ResolveType
|
||||
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
|
||||
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
|
||||
import org.jetbrains.kotlin.fir.psi
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.psi.KtCallElement
|
||||
|
||||
internal class KtFirAnnotationApplicationForDeclaration(
|
||||
private val containingDeclaration: FirRefWithValidityCheck<FirDeclaration>,
|
||||
private val useSiteSession: FirSession,
|
||||
private val annotation: FirAnnotation,
|
||||
override val token: ValidityToken,
|
||||
) : KtAnnotationApplication() {
|
||||
|
||||
override val psi: KtCallElement? by cached { annotation.psi as? KtCallElement }
|
||||
|
||||
override val classId: ClassId? by cached {
|
||||
containingDeclaration.withFirByType(ResolveType.AnnotationType) {
|
||||
annotation.fullyExpandedClassId(useSiteSession)
|
||||
}
|
||||
}
|
||||
|
||||
override val useSiteTarget: AnnotationUseSiteTarget? get() = withValidityAssertion { annotation.useSiteTarget }
|
||||
|
||||
override val arguments: List<KtNamedConstantValue> by containingDeclaration.withFirAndCache(ResolveType.AnnotationsArguments) {
|
||||
KtFirConstantValueConverter.toNamedConstantValue(
|
||||
mapAnnotationParameters(annotation, useSiteSession),
|
||||
useSiteSession,
|
||||
)
|
||||
}
|
||||
|
||||
override fun equals(other: Any?): Boolean {
|
||||
if (other !is KtFirAnnotationApplicationForDeclaration) return false
|
||||
if (this.token != other.token) return false
|
||||
return annotation == other.annotation
|
||||
}
|
||||
|
||||
override fun hashCode(): Int {
|
||||
return token.hashCode() * 31 + annotation.hashCode()
|
||||
}
|
||||
}
|
||||
-51
@@ -1,51 +0,0 @@
|
||||
/*
|
||||
* Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
package org.jetbrains.kotlin.analysis.api.fir.annotations
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.annotations.KtAnnotationApplication
|
||||
import org.jetbrains.kotlin.analysis.api.annotations.KtNamedConstantValue
|
||||
import org.jetbrains.kotlin.analysis.api.fir.evaluate.KtFirConstantValueConverter
|
||||
import org.jetbrains.kotlin.analysis.api.fir.utils.cached
|
||||
import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
|
||||
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
||||
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
|
||||
import org.jetbrains.kotlin.fir.psi
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.psi.KtCallElement
|
||||
|
||||
internal class KtFirAnnotationApplicationImpl(
|
||||
private val annotation: FirAnnotation,
|
||||
private val useSiteSession: FirSession,
|
||||
override val token: ValidityToken,
|
||||
) : KtAnnotationApplication() {
|
||||
|
||||
override val psi: KtCallElement? by cached { annotation.psi as? KtCallElement }
|
||||
|
||||
override val classId: ClassId?
|
||||
get() = withValidityAssertion {
|
||||
annotation.fullyExpandedClassId(useSiteSession)
|
||||
}
|
||||
|
||||
override val useSiteTarget: AnnotationUseSiteTarget? get() = annotation.useSiteTarget
|
||||
|
||||
override val arguments: List<KtNamedConstantValue> by cached {
|
||||
KtFirConstantValueConverter.toNamedConstantValue(
|
||||
mapAnnotationParameters(annotation, useSiteSession),
|
||||
useSiteSession,
|
||||
)
|
||||
}
|
||||
|
||||
override fun equals(other: Any?): Boolean {
|
||||
if (other !is KtFirAnnotationApplicationImpl) return false
|
||||
return annotation == other.annotation
|
||||
}
|
||||
|
||||
override fun hashCode(): Int {
|
||||
return annotation.hashCode()
|
||||
}
|
||||
}
|
||||
+10
-7
@@ -7,11 +7,13 @@ package org.jetbrains.kotlin.analysis.api.fir.annotations
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.annotations.KtAnnotationApplication
|
||||
import org.jetbrains.kotlin.analysis.api.annotations.KtAnnotationsList
|
||||
import org.jetbrains.kotlin.analysis.api.fir.toKtAnnotationApplication
|
||||
import org.jetbrains.kotlin.analysis.api.fir.utils.FirRefWithValidityCheck
|
||||
import org.jetbrains.kotlin.analysis.api.impl.base.annotations.KtEmptyAnnotationsList
|
||||
import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.lazy.resolve.ResolveType
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
|
||||
internal class KtFirAnnotationListForDeclaration private constructor(
|
||||
@@ -20,9 +22,9 @@ internal class KtFirAnnotationListForDeclaration private constructor(
|
||||
override val token: ValidityToken,
|
||||
) : KtAnnotationsList() {
|
||||
override val annotations: List<KtAnnotationApplication>
|
||||
get() = firRef.withFir { fir ->
|
||||
get() = firRef.withFir(FirResolvePhase.ARGUMENTS_OF_ANNOTATIONS) { fir ->
|
||||
fir.annotations.map { annotation ->
|
||||
KtFirAnnotationApplicationForDeclaration(firRef, useSiteSession, annotation, token)
|
||||
annotation.toKtAnnotationApplication(useSiteSession)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -33,12 +35,13 @@ internal class KtFirAnnotationListForDeclaration private constructor(
|
||||
}
|
||||
}
|
||||
|
||||
override fun annotationsByClassId(classId: ClassId): List<KtAnnotationApplication> = firRef.withFir { fir ->
|
||||
fir.annotations.mapNotNull { annotation ->
|
||||
if (annotation.fullyExpandedClassId(useSiteSession) != classId) return@mapNotNull null
|
||||
KtFirAnnotationApplicationForDeclaration(firRef, useSiteSession, annotation, token)
|
||||
override fun annotationsByClassId(classId: ClassId): List<KtAnnotationApplication> =
|
||||
firRef.withFir(FirResolvePhase.ARGUMENTS_OF_ANNOTATIONS) { fir ->
|
||||
fir.annotations.mapNotNull { annotation ->
|
||||
if (annotation.fullyExpandedClassId(useSiteSession) != classId) return@mapNotNull null
|
||||
annotation.toKtAnnotationApplication(useSiteSession)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override val annotationClassIds: Collection<ClassId>
|
||||
get() = firRef.withFirByType(ResolveType.AnnotationType) { fir ->
|
||||
|
||||
+3
-3
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.analysis.api.fir.annotations
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.annotations.KtAnnotationApplication
|
||||
import org.jetbrains.kotlin.analysis.api.annotations.KtAnnotationsList
|
||||
import org.jetbrains.kotlin.analysis.api.fir.toKtAnnotationApplication
|
||||
import org.jetbrains.kotlin.analysis.api.impl.base.annotations.KtEmptyAnnotationsList
|
||||
import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
|
||||
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
||||
@@ -21,7 +22,7 @@ internal class KtFirAnnotationListForType private constructor(
|
||||
override val token: ValidityToken,
|
||||
) : KtAnnotationsList() {
|
||||
override val annotations: List<KtAnnotationApplication>
|
||||
get() = withValidityAssertion { coneType.customAnnotations.map { KtFirAnnotationApplicationImpl(it, useSiteSession, token) } }
|
||||
get() = withValidityAssertion { coneType.customAnnotations.map { it.toKtAnnotationApplication(useSiteSession) } }
|
||||
|
||||
|
||||
override fun containsAnnotation(classId: ClassId): Boolean = withValidityAssertion {
|
||||
@@ -31,14 +32,13 @@ internal class KtFirAnnotationListForType private constructor(
|
||||
override fun annotationsByClassId(classId: ClassId): List<KtAnnotationApplication> = withValidityAssertion {
|
||||
coneType.customAnnotations.mapNotNull { annotation ->
|
||||
if (annotation.fullyExpandedClassId(useSiteSession) != classId) return@mapNotNull null
|
||||
KtFirAnnotationApplicationImpl(annotation, useSiteSession, token)
|
||||
annotation.toKtAnnotationApplication(useSiteSession)
|
||||
}
|
||||
}
|
||||
|
||||
override val annotationClassIds: Collection<ClassId>
|
||||
get() = withValidityAssertion { coneType.customAnnotations.mapNotNull { it.fullyExpandedClassId(useSiteSession) } }
|
||||
|
||||
|
||||
companion object {
|
||||
fun create(
|
||||
coneType: ConeKotlinType,
|
||||
|
||||
+9
-6
@@ -25,9 +25,9 @@ internal object KtFirConstantValueConverter {
|
||||
fun toNamedConstantValue(
|
||||
argumentMapping: Map<String, FirExpression>,
|
||||
session: FirSession,
|
||||
): List<KtNamedConstantValue> =
|
||||
): List<KtNamedAnnotationValue> =
|
||||
argumentMapping.map { (name, expression) ->
|
||||
KtNamedConstantValue(
|
||||
KtNamedAnnotationValue(
|
||||
name,
|
||||
expression.convertConstantExpression(session) ?: KtUnsupportedAnnotationValue
|
||||
)
|
||||
@@ -106,10 +106,13 @@ internal object KtFirConstantValueConverter {
|
||||
argumentMapping?.entries?.forEach { (arg, param) ->
|
||||
resultMap[param.name.asString()] = arg
|
||||
}
|
||||
KtAnnotationAnnotationValue(
|
||||
resolvedSymbol.callableId.classId,
|
||||
toNamedConstantValue(resultMap, session),
|
||||
psi as? KtCallElement
|
||||
KtAnnotationApplicationValue(
|
||||
KtAnnotationApplication(
|
||||
resolvedSymbol.callableId.classId,
|
||||
psi as? KtAnnotationEntry,
|
||||
useSiteTarget = null,
|
||||
toNamedConstantValue(resultMap, session),
|
||||
)
|
||||
)
|
||||
} else null
|
||||
}
|
||||
|
||||
-1
@@ -7,7 +7,6 @@ package org.jetbrains.kotlin.analysis.api.fir.symbols
|
||||
|
||||
import com.intellij.psi.PsiElement
|
||||
import org.jetbrains.kotlin.analysis.api.fir.KtSymbolByFirBuilder
|
||||
import org.jetbrains.kotlin.analysis.api.fir.annotations.KtFirAnnotationApplicationForDeclaration
|
||||
import org.jetbrains.kotlin.analysis.api.fir.annotations.KtFirAnnotationListForDeclaration
|
||||
import org.jetbrains.kotlin.analysis.api.fir.findPsi
|
||||
import org.jetbrains.kotlin.analysis.api.fir.utils.cached
|
||||
|
||||
+3
-3
@@ -44,11 +44,11 @@ abstract class AbstractCompileTimeConstantEvaluatorTest(
|
||||
appendLine(INDENT, values.joinToString(separator = "\n") { it.stringRepresentation() })
|
||||
append("]")
|
||||
}
|
||||
is KtAnnotationAnnotationValue -> buildString {
|
||||
is KtAnnotationApplicationValue -> buildString {
|
||||
append("KtAnnotationConstantValue(")
|
||||
append(classId?.relativeClassName)
|
||||
append(annotationValue.classId?.relativeClassName)
|
||||
append(", ")
|
||||
arguments.joinTo(this, separator = ", ", prefix = "(", postfix = ")") {
|
||||
annotationValue.arguments.joinTo(this, separator = ", ", prefix = "(", postfix = ")") {
|
||||
"${it.name} = ${it.expression.stringRepresentation()}"
|
||||
}
|
||||
append(")")
|
||||
|
||||
+7
-7
@@ -5,14 +5,14 @@
|
||||
|
||||
package org.jetbrains.kotlin.analysis.api.annotations
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.ValidityTokenOwner
|
||||
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.psi.KtAnnotationEntry
|
||||
import org.jetbrains.kotlin.psi.KtCallElement
|
||||
|
||||
public abstract class KtAnnotationApplication : ValidityTokenOwner {
|
||||
public abstract val classId: ClassId?
|
||||
public abstract val useSiteTarget: AnnotationUseSiteTarget?
|
||||
public abstract val psi: KtCallElement?
|
||||
public abstract val arguments: List<KtNamedConstantValue>
|
||||
}
|
||||
public class KtAnnotationApplication(
|
||||
public val classId: ClassId?,
|
||||
public val psi: KtAnnotationEntry?,
|
||||
public val useSiteTarget: AnnotationUseSiteTarget?,
|
||||
public val arguments: List<KtNamedAnnotationValue>,
|
||||
)
|
||||
+3
-7
@@ -6,8 +6,6 @@
|
||||
package org.jetbrains.kotlin.analysis.api.annotations
|
||||
|
||||
import org.jetbrains.kotlin.name.CallableId
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.psi.KtCallElement
|
||||
import org.jetbrains.kotlin.psi.KtElement
|
||||
import org.jetbrains.kotlin.types.ConstantValueKind
|
||||
|
||||
@@ -23,7 +21,7 @@ import org.jetbrains.kotlin.types.ConstantValueKind
|
||||
*
|
||||
* [KtLiteralAnnotationValue] covers first two kinds;
|
||||
* [KtEnumEntryAnnotationValue] corresponds to enum types;
|
||||
* [KtAnnotationAnnotationValue] represents annotation types (with annotation fq name and arguments); and
|
||||
* [KtAnnotationApplicationValue] represents annotation types (with annotation fq name and arguments); and
|
||||
* [KtArrayAnnotationValue] abstracts an array of [KtAnnotationValue]s.
|
||||
*/
|
||||
public sealed class KtAnnotationValue(
|
||||
@@ -47,10 +45,8 @@ public class KtArrayAnnotationValue(
|
||||
override val sourcePsi: KtElement?,
|
||||
) : KtAnnotationValue()
|
||||
|
||||
public class KtAnnotationAnnotationValue(
|
||||
public val classId: ClassId?,
|
||||
public val arguments: List<KtNamedConstantValue>,
|
||||
override val sourcePsi: KtCallElement?,
|
||||
public class KtAnnotationApplicationValue(
|
||||
public val annotationValue: KtAnnotationApplication,
|
||||
) : KtAnnotationValue()
|
||||
|
||||
public class KtEnumEntryAnnotationValue(
|
||||
|
||||
+1
-1
@@ -5,4 +5,4 @@
|
||||
|
||||
package org.jetbrains.kotlin.analysis.api.annotations
|
||||
|
||||
public data class KtNamedConstantValue(val name: String, val expression: KtAnnotationValue)
|
||||
public data class KtNamedAnnotationValue(val name: String, val expression: KtAnnotationValue)
|
||||
+2
-2
@@ -142,7 +142,7 @@ public object DebugSymbolRenderer {
|
||||
append(KtConstantValueRenderer.render(value))
|
||||
}
|
||||
|
||||
private fun Block.renderNamedConstantValue(value: KtNamedConstantValue) {
|
||||
private fun Block.renderNamedConstantValue(value: KtNamedAnnotationValue) {
|
||||
append(value.name).append(" = ")
|
||||
renderValue(value.expression)
|
||||
}
|
||||
@@ -189,7 +189,7 @@ public object DebugSymbolRenderer {
|
||||
is KtSymbol -> renderSymbolTag(value)
|
||||
is KtType -> renderType(value)
|
||||
is KtAnnotationValue -> renderConstantValue(value)
|
||||
is KtNamedConstantValue -> renderNamedConstantValue(value)
|
||||
is KtNamedAnnotationValue -> renderNamedConstantValue(value)
|
||||
is KtInitializerValue -> renderKtInitializerValue(value)
|
||||
is KtAnnotationApplication -> renderAnnotationApplication(value)
|
||||
is KtAnnotationsList -> renderAnnotationsList(value)
|
||||
|
||||
+7
-3
@@ -15,7 +15,7 @@ public object KtConstantValueRenderer {
|
||||
|
||||
private fun StringBuilder.renderConstantValue(value: KtAnnotationValue) {
|
||||
when (value) {
|
||||
is KtAnnotationAnnotationValue -> {
|
||||
is KtAnnotationApplicationValue -> {
|
||||
renderAnnotationConstantValue(value)
|
||||
}
|
||||
is KtArrayAnnotationValue -> {
|
||||
@@ -58,7 +58,11 @@ public object KtConstantValueRenderer {
|
||||
append(value.callableId?.asSingleFqName()?.asString())
|
||||
}
|
||||
|
||||
private fun StringBuilder.renderAnnotationConstantValue(value: KtAnnotationAnnotationValue) {
|
||||
private fun StringBuilder.renderAnnotationConstantValue(application: KtAnnotationApplicationValue) {
|
||||
renderAnnotationApplication(application.annotationValue)
|
||||
}
|
||||
|
||||
private fun StringBuilder.renderAnnotationApplication(value: KtAnnotationApplication) {
|
||||
append(value.classId)
|
||||
if (value.arguments.isNotEmpty()) {
|
||||
append("(")
|
||||
@@ -79,7 +83,7 @@ public object KtConstantValueRenderer {
|
||||
}
|
||||
}
|
||||
|
||||
private fun StringBuilder.renderNamedConstantValueList(list: Collection<KtNamedConstantValue>) {
|
||||
private fun StringBuilder.renderNamedConstantValueList(list: Collection<KtNamedAnnotationValue>) {
|
||||
renderWithSeparator(list, ", ") { namedValue ->
|
||||
append(namedValue.name)
|
||||
append(" = ")
|
||||
|
||||
+3
-3
@@ -7,7 +7,7 @@ package org.jetbrains.kotlin.light.classes.symbol
|
||||
|
||||
import com.intellij.psi.*
|
||||
import com.intellij.psi.impl.light.LightIdentifier
|
||||
import org.jetbrains.kotlin.analysis.api.annotations.KtNamedConstantValue
|
||||
import org.jetbrains.kotlin.analysis.api.annotations.KtNamedAnnotationValue
|
||||
import org.jetbrains.kotlin.asJava.classes.cannotModify
|
||||
import org.jetbrains.kotlin.asJava.classes.lazyPub
|
||||
import org.jetbrains.kotlin.asJava.elements.KtLightElementBase
|
||||
@@ -15,7 +15,7 @@ import org.jetbrains.kotlin.psi.KtElement
|
||||
|
||||
internal class FirAnnotationParameterList(
|
||||
parent: FirLightAbstractAnnotation,
|
||||
private val arguments: List<KtNamedConstantValue>,
|
||||
private val arguments: List<KtNamedAnnotationValue>,
|
||||
) : KtLightElementBase(parent), PsiAnnotationParameterList {
|
||||
|
||||
private val _attributes: Array<PsiNameValuePair> by lazyPub {
|
||||
@@ -32,7 +32,7 @@ internal class FirAnnotationParameterList(
|
||||
}
|
||||
|
||||
private class FirNameValuePairForAnnotationArgument(
|
||||
private val constantValue: KtNamedConstantValue,
|
||||
private val constantValue: KtNamedAnnotationValue,
|
||||
parent: PsiElement
|
||||
) : KtLightElementBase(parent), PsiNameValuePair {
|
||||
|
||||
|
||||
+2
-2
@@ -9,14 +9,14 @@ import com.intellij.psi.PsiAnnotationMemberValue
|
||||
import com.intellij.psi.PsiAnnotationParameterList
|
||||
import com.intellij.psi.PsiElement
|
||||
import com.intellij.psi.impl.PsiImplUtil
|
||||
import org.jetbrains.kotlin.analysis.api.annotations.KtNamedConstantValue
|
||||
import org.jetbrains.kotlin.analysis.api.annotations.KtNamedAnnotationValue
|
||||
import org.jetbrains.kotlin.asJava.classes.lazyPub
|
||||
import org.jetbrains.kotlin.psi.KtCallElement
|
||||
|
||||
internal class FirLightSimpleAnnotation(
|
||||
private val fqName: String?,
|
||||
parent: PsiElement,
|
||||
private val arguments: List<KtNamedConstantValue> = listOf(),
|
||||
private val arguments: List<KtNamedAnnotationValue> = listOf(),
|
||||
override val kotlinOrigin: KtCallElement? = null,
|
||||
) : FirLightAbstractAnnotation(parent) {
|
||||
|
||||
|
||||
+7
-2
@@ -177,8 +177,13 @@ internal fun KtAnnotationValue.toAnnotationMemberValue(parent: PsiElement): PsiA
|
||||
FirPsiArrayInitializerMemberValue(sourcePsi, parent) { arrayLiteralParent ->
|
||||
values.mapNotNull { element -> element.toAnnotationMemberValue(arrayLiteralParent) }
|
||||
}
|
||||
is KtAnnotationAnnotationValue ->
|
||||
FirLightSimpleAnnotation(classId?.relativeClassName?.asString(), parent, arguments, sourcePsi)
|
||||
is KtAnnotationApplicationValue ->
|
||||
FirLightSimpleAnnotation(
|
||||
annotationValue.classId?.relativeClassName?.asString(),
|
||||
parent,
|
||||
annotationValue.arguments,
|
||||
annotationValue.psi
|
||||
)
|
||||
else ->
|
||||
createPsiLiteral(parent)?.let {
|
||||
when (it) {
|
||||
|
||||
Reference in New Issue
Block a user