FIR IDE: make constant values symbol-free
This commit is contained in:
committed by
Ilya Kirillov
parent
f94dad7005
commit
ffd0a5ed14
+1
-1
@@ -109,7 +109,7 @@ internal class KtSymbolByFirBuilder private constructor(
|
|||||||
|
|
||||||
fun buildEnumEntrySymbol(fir: FirEnumEntry) = symbolsCache.cache(fir) { KtFirEnumEntrySymbol(fir, resolveState, token, this) }
|
fun buildEnumEntrySymbol(fir: FirEnumEntry) = symbolsCache.cache(fir) { KtFirEnumEntrySymbol(fir, resolveState, token, this) }
|
||||||
|
|
||||||
fun buildFileSymbol(fir: FirFile) = filesCache.cache(fir) { KtFirFileSymbol(fir, resolveState, token, this) }
|
fun buildFileSymbol(fir: FirFile) = filesCache.cache(fir) { KtFirFileSymbol(fir, resolveState, token) }
|
||||||
|
|
||||||
private val packageProvider = project.createPackageProvider(GlobalSearchScope.allScope(project))//todo scope
|
private val packageProvider = project.createPackageProvider(GlobalSearchScope.allScope(project))//todo scope
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -26,7 +26,7 @@ internal class KtFirCompileTimeConstantProvider(
|
|||||||
when (val fir = expression.getOrBuildFir(firResolveState)) {
|
when (val fir = expression.getOrBuildFir(firResolveState)) {
|
||||||
is FirExpression -> {
|
is FirExpression -> {
|
||||||
FirCompileTimeConstantEvaluator().evaluate(fir)?.let { KtFirConstantValueConverter.toConstantValue(it) }
|
FirCompileTimeConstantEvaluator().evaluate(fir)?.let { KtFirConstantValueConverter.toConstantValue(it) }
|
||||||
?: KtFirConstantValueConverter.toConstantValue(fir, firResolveState.rootModuleSession, firSymbolBuilder)
|
?: KtFirConstantValueConverter.toConstantValue(fir, firResolveState.rootModuleSession)
|
||||||
}
|
}
|
||||||
else -> throwUnexpectedFirElementError(fir, expression)
|
else -> throwUnexpectedFirElementError(fir, expression)
|
||||||
}
|
}
|
||||||
|
|||||||
+10
-20
@@ -5,9 +5,6 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.analysis.api.fir.evaluate
|
package org.jetbrains.kotlin.analysis.api.fir.evaluate
|
||||||
|
|
||||||
import org.jetbrains.kotlin.analysis.api.fir.KtSymbolByFirBuilder
|
|
||||||
import org.jetbrains.kotlin.analysis.api.fir.buildSymbol
|
|
||||||
import org.jetbrains.kotlin.analysis.api.symbols.KtEnumEntrySymbol
|
|
||||||
import org.jetbrains.kotlin.analysis.api.symbols.markers.*
|
import org.jetbrains.kotlin.analysis.api.symbols.markers.*
|
||||||
import org.jetbrains.kotlin.descriptors.ClassKind
|
import org.jetbrains.kotlin.descriptors.ClassKind
|
||||||
import org.jetbrains.kotlin.fir.FirSession
|
import org.jetbrains.kotlin.fir.FirSession
|
||||||
@@ -28,12 +25,11 @@ internal object KtFirConstantValueConverter {
|
|||||||
fun toNamedConstantValue(
|
fun toNamedConstantValue(
|
||||||
argumentMapping: Map<String, FirExpression>,
|
argumentMapping: Map<String, FirExpression>,
|
||||||
session: FirSession,
|
session: FirSession,
|
||||||
firSymbolBuilder: KtSymbolByFirBuilder
|
|
||||||
): List<KtNamedConstantValue> =
|
): List<KtNamedConstantValue> =
|
||||||
argumentMapping.map { (name, expression) ->
|
argumentMapping.map { (name, expression) ->
|
||||||
KtNamedConstantValue(
|
KtNamedConstantValue(
|
||||||
name,
|
name,
|
||||||
expression.convertConstantExpression(session, firSymbolBuilder) ?: KtUnsupportedConstantValue
|
expression.convertConstantExpression(session) ?: KtUnsupportedConstantValue
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -47,9 +43,8 @@ internal object KtFirConstantValueConverter {
|
|||||||
|
|
||||||
private fun Collection<FirExpression>.convertConstantExpression(
|
private fun Collection<FirExpression>.convertConstantExpression(
|
||||||
session: FirSession,
|
session: FirSession,
|
||||||
firSymbolBuilder: KtSymbolByFirBuilder
|
|
||||||
): Collection<KtConstantValue> =
|
): Collection<KtConstantValue> =
|
||||||
mapNotNull { it.convertConstantExpression(session, firSymbolBuilder) }
|
mapNotNull { it.convertConstantExpression(session) }
|
||||||
|
|
||||||
private fun Collection<KtConstantValue>.toArrayConstantValueIfNecessary(kotlinOrigin: KtElement?): KtConstantValue {
|
private fun Collection<KtConstantValue>.toArrayConstantValueIfNecessary(kotlinOrigin: KtElement?): KtConstantValue {
|
||||||
return if (size == 1)
|
return if (size == 1)
|
||||||
@@ -61,25 +56,23 @@ internal object KtFirConstantValueConverter {
|
|||||||
fun toConstantValue(
|
fun toConstantValue(
|
||||||
firExpression: FirExpression,
|
firExpression: FirExpression,
|
||||||
session: FirSession,
|
session: FirSession,
|
||||||
firSymbolBuilder: KtSymbolByFirBuilder
|
|
||||||
): KtConstantValue? =
|
): KtConstantValue? =
|
||||||
firExpression.convertConstantExpression(session, firSymbolBuilder)
|
firExpression.convertConstantExpression(session)
|
||||||
|
|
||||||
private fun FirExpression.convertConstantExpression(
|
private fun FirExpression.convertConstantExpression(
|
||||||
session: FirSession,
|
session: FirSession,
|
||||||
firSymbolBuilder: KtSymbolByFirBuilder
|
|
||||||
): KtConstantValue? {
|
): KtConstantValue? {
|
||||||
return when (this) {
|
return when (this) {
|
||||||
is FirConstExpression<*> -> convertConstantExpression()
|
is FirConstExpression<*> -> convertConstantExpression()
|
||||||
is FirNamedArgumentExpression -> {
|
is FirNamedArgumentExpression -> {
|
||||||
expression.convertConstantExpression(session, firSymbolBuilder)
|
expression.convertConstantExpression(session)
|
||||||
}
|
}
|
||||||
is FirVarargArgumentsExpression -> {
|
is FirVarargArgumentsExpression -> {
|
||||||
arguments.convertConstantExpression(session, firSymbolBuilder)
|
arguments.convertConstantExpression(session)
|
||||||
.toArrayConstantValueIfNecessary(realPsi as? KtElement)
|
.toArrayConstantValueIfNecessary(realPsi as? KtElement)
|
||||||
}
|
}
|
||||||
is FirArrayOfCall -> {
|
is FirArrayOfCall -> {
|
||||||
argumentList.arguments.convertConstantExpression(session, firSymbolBuilder)
|
argumentList.arguments.convertConstantExpression(session)
|
||||||
.toArrayConstantValueIfNecessary(realPsi as? KtElement)
|
.toArrayConstantValueIfNecessary(realPsi as? KtElement)
|
||||||
}
|
}
|
||||||
is FirFunctionCall -> {
|
is FirFunctionCall -> {
|
||||||
@@ -93,15 +86,15 @@ internal object KtFirConstantValueConverter {
|
|||||||
resultMap[param.name.asString()] = arg
|
resultMap[param.name.asString()] = arg
|
||||||
}
|
}
|
||||||
KtAnnotationConstantValue(
|
KtAnnotationConstantValue(
|
||||||
resolvedSymbol.callableId.className?.asString(),
|
resolvedSymbol.callableId.classId,
|
||||||
toNamedConstantValue(resultMap, session, firSymbolBuilder),
|
toNamedConstantValue(resultMap, session),
|
||||||
this.realPsi as? KtCallElement
|
this.realPsi as? KtCallElement
|
||||||
)
|
)
|
||||||
} else null
|
} else null
|
||||||
}
|
}
|
||||||
is FirNamedFunctionSymbol -> {
|
is FirNamedFunctionSymbol -> {
|
||||||
if (resolvedSymbol.callableId.asSingleFqName() in ArrayFqNames.ARRAY_CALL_FQ_NAMES)
|
if (resolvedSymbol.callableId.asSingleFqName() in ArrayFqNames.ARRAY_CALL_FQ_NAMES)
|
||||||
argumentList.arguments.convertConstantExpression(session, firSymbolBuilder)
|
argumentList.arguments.convertConstantExpression(session)
|
||||||
.toArrayConstantValueIfNecessary(realPsi as? KtElement)
|
.toArrayConstantValueIfNecessary(realPsi as? KtElement)
|
||||||
else null
|
else null
|
||||||
}
|
}
|
||||||
@@ -112,10 +105,7 @@ internal object KtFirConstantValueConverter {
|
|||||||
val reference = calleeReference as? FirResolvedNamedReference ?: return null
|
val reference = calleeReference as? FirResolvedNamedReference ?: return null
|
||||||
when (val resolvedSymbol = reference.resolvedSymbol) {
|
when (val resolvedSymbol = reference.resolvedSymbol) {
|
||||||
is FirEnumEntrySymbol -> {
|
is FirEnumEntrySymbol -> {
|
||||||
KtEnumEntryConstantValue(
|
KtEnumEntryConstantValue(resolvedSymbol.callableId, realPsi as? KtElement)
|
||||||
resolvedSymbol.fir.buildSymbol(firSymbolBuilder) as KtEnumEntrySymbol,
|
|
||||||
realPsi as? KtElement
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
else -> null
|
else -> null
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -35,7 +35,7 @@ internal class KtFirAnonymousObjectSymbol(
|
|||||||
override val firRef = firRef(fir, resolveState)
|
override val firRef = firRef(fir, resolveState)
|
||||||
override val psi: PsiElement? by firRef.withFirAndCache { fir -> fir.findPsi(fir.moduleData.session) }
|
override val psi: PsiElement? by firRef.withFirAndCache { fir -> fir.findPsi(fir.moduleData.session) }
|
||||||
|
|
||||||
override val annotations: List<KtAnnotationCall> by cached { firRef.toAnnotationsList(_builder) }
|
override val annotations: List<KtAnnotationCall> by cached { firRef.toAnnotationsList() }
|
||||||
override fun containsAnnotation(classId: ClassId): Boolean = firRef.containsAnnotation(classId)
|
override fun containsAnnotation(classId: ClassId): Boolean = firRef.containsAnnotation(classId)
|
||||||
override val annotationClassIds: Collection<ClassId> by cached { firRef.getAnnotationClassIds() }
|
override val annotationClassIds: Collection<ClassId> by cached { firRef.getAnnotationClassIds() }
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -59,7 +59,7 @@ internal class KtFirConstructorSymbol(
|
|||||||
|
|
||||||
override val visibility: Visibility get() = getVisibility()
|
override val visibility: Visibility get() = getVisibility()
|
||||||
|
|
||||||
override val annotations: List<KtAnnotationCall> by cached { firRef.toAnnotationsList(_builder) }
|
override val annotations: List<KtAnnotationCall> by cached { firRef.toAnnotationsList() }
|
||||||
override fun containsAnnotation(classId: ClassId): Boolean = firRef.containsAnnotation(classId)
|
override fun containsAnnotation(classId: ClassId): Boolean = firRef.containsAnnotation(classId)
|
||||||
override val annotationClassIds: Collection<ClassId> by cached { firRef.getAnnotationClassIds() }
|
override val annotationClassIds: Collection<ClassId> by cached { firRef.getAnnotationClassIds() }
|
||||||
|
|
||||||
|
|||||||
+1
-2
@@ -27,7 +27,6 @@ internal class KtFirFileSymbol(
|
|||||||
fir: FirFile,
|
fir: FirFile,
|
||||||
resolveState: FirModuleResolveState,
|
resolveState: FirModuleResolveState,
|
||||||
override val token: ValidityToken,
|
override val token: ValidityToken,
|
||||||
_builder: KtSymbolByFirBuilder,
|
|
||||||
) : KtFileSymbol(), KtSymbolWithDeclarations, KtFirSymbol<FirFile> {
|
) : KtFileSymbol(), KtSymbolWithDeclarations, KtFirSymbol<FirFile> {
|
||||||
override val firRef = firRef(fir, resolveState)
|
override val firRef = firRef(fir, resolveState)
|
||||||
override val psi: PsiElement? by firRef.withFirAndCache { fir -> fir.findPsi(fir.moduleData.session) }
|
override val psi: PsiElement? by firRef.withFirAndCache { fir -> fir.findPsi(fir.moduleData.session) }
|
||||||
@@ -37,7 +36,7 @@ internal class KtFirFileSymbol(
|
|||||||
TODO("Creating pointers for files from library is not supported yet")
|
TODO("Creating pointers for files from library is not supported yet")
|
||||||
}
|
}
|
||||||
|
|
||||||
override val annotations: List<KtAnnotationCall> by cached { firRef.toAnnotationsList(_builder) }
|
override val annotations: List<KtAnnotationCall> by cached { firRef.toAnnotationsList() }
|
||||||
override fun containsAnnotation(classId: ClassId): Boolean = firRef.containsAnnotation(classId)
|
override fun containsAnnotation(classId: ClassId): Boolean = firRef.containsAnnotation(classId)
|
||||||
override val annotationClassIds: Collection<ClassId> by cached { firRef.getAnnotationClassIds() }
|
override val annotationClassIds: Collection<ClassId> by cached { firRef.getAnnotationClassIds() }
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -64,7 +64,7 @@ internal class KtFirFunctionSymbol(
|
|||||||
|
|
||||||
override val hasStableParameterNames: Boolean = firRef.withFir { it.getHasStableParameterNames(it.moduleData.session) }
|
override val hasStableParameterNames: Boolean = firRef.withFir { it.getHasStableParameterNames(it.moduleData.session) }
|
||||||
|
|
||||||
override val annotations: List<KtAnnotationCall> by cached { firRef.toAnnotationsList(_builder) }
|
override val annotations: List<KtAnnotationCall> by cached { firRef.toAnnotationsList() }
|
||||||
override fun containsAnnotation(classId: ClassId): Boolean = firRef.containsAnnotation(classId)
|
override fun containsAnnotation(classId: ClassId): Boolean = firRef.containsAnnotation(classId)
|
||||||
override val annotationClassIds: Collection<ClassId> by cached { firRef.getAnnotationClassIds() }
|
override val annotationClassIds: Collection<ClassId> by cached { firRef.getAnnotationClassIds() }
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -72,7 +72,7 @@ internal class KtFirKotlinPropertySymbol(
|
|||||||
|
|
||||||
override val isExtension: Boolean get() = firRef.withFir { it.receiverTypeRef != null }
|
override val isExtension: Boolean get() = firRef.withFir { it.receiverTypeRef != null }
|
||||||
override val initializer: KtConstantValue? by firRef.withFirAndCache(FirResolvePhase.BODY_RESOLVE) { fir ->
|
override val initializer: KtConstantValue? by firRef.withFirAndCache(FirResolvePhase.BODY_RESOLVE) { fir ->
|
||||||
fir.initializer?.let { KtFirConstantValueConverter.toConstantValue(it, resolveState.rootModuleSession, _builder) }
|
fir.initializer?.let { KtFirConstantValueConverter.toConstantValue(it, resolveState.rootModuleSession) }
|
||||||
}
|
}
|
||||||
override val symbolKind: KtSymbolKind
|
override val symbolKind: KtSymbolKind
|
||||||
get() = firRef.withFir { fir ->
|
get() = firRef.withFir { fir ->
|
||||||
@@ -85,7 +85,7 @@ internal class KtFirKotlinPropertySymbol(
|
|||||||
|
|
||||||
override val visibility: Visibility get() = getVisibility()
|
override val visibility: Visibility get() = getVisibility()
|
||||||
|
|
||||||
override val annotations: List<KtAnnotationCall> by cached { firRef.toAnnotationsList(_builder) }
|
override val annotations: List<KtAnnotationCall> by cached { firRef.toAnnotationsList() }
|
||||||
override fun containsAnnotation(classId: ClassId): Boolean = firRef.containsAnnotation(classId)
|
override fun containsAnnotation(classId: ClassId): Boolean = firRef.containsAnnotation(classId)
|
||||||
override val annotationClassIds: Collection<ClassId> by cached { firRef.getAnnotationClassIds() }
|
override val annotationClassIds: Collection<ClassId> by cached { firRef.getAnnotationClassIds() }
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -69,7 +69,7 @@ internal class KtFirNamedClassOrObjectSymbol(
|
|||||||
else -> possiblyRawVisibility
|
else -> possiblyRawVisibility
|
||||||
}
|
}
|
||||||
|
|
||||||
override val annotations: List<KtAnnotationCall> by cached { firRef.toAnnotationsList(_builder) }
|
override val annotations: List<KtAnnotationCall> by cached { firRef.toAnnotationsList() }
|
||||||
override fun containsAnnotation(classId: ClassId): Boolean = firRef.containsAnnotation(classId)
|
override fun containsAnnotation(classId: ClassId): Boolean = firRef.containsAnnotation(classId)
|
||||||
override val annotationClassIds: Collection<ClassId> by cached { firRef.getAnnotationClassIds() }
|
override val annotationClassIds: Collection<ClassId> by cached { firRef.getAnnotationClassIds() }
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -59,7 +59,7 @@ internal class KtFirPropertyGetterSymbol(
|
|||||||
}
|
}
|
||||||
override val modality: Modality get() = getModality()
|
override val modality: Modality get() = getModality()
|
||||||
override val visibility: Visibility get() = getVisibility()
|
override val visibility: Visibility get() = getVisibility()
|
||||||
override val annotations: List<KtAnnotationCall> by cached { firRef.toAnnotationsList(_builder) }
|
override val annotations: List<KtAnnotationCall> by cached { firRef.toAnnotationsList() }
|
||||||
override fun containsAnnotation(classId: ClassId): Boolean = firRef.containsAnnotation(classId)
|
override fun containsAnnotation(classId: ClassId): Boolean = firRef.containsAnnotation(classId)
|
||||||
override val annotationClassIds: Collection<ClassId> by cached { firRef.getAnnotationClassIds() }
|
override val annotationClassIds: Collection<ClassId> by cached { firRef.getAnnotationClassIds() }
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -57,7 +57,7 @@ internal class KtFirPropertySetterSymbol(
|
|||||||
override val modality: Modality get() = getModality()
|
override val modality: Modality get() = getModality()
|
||||||
override val visibility: Visibility get() = getVisibility()
|
override val visibility: Visibility get() = getVisibility()
|
||||||
|
|
||||||
override val annotations: List<KtAnnotationCall> by cached { firRef.toAnnotationsList(_builder) }
|
override val annotations: List<KtAnnotationCall> by cached { firRef.toAnnotationsList() }
|
||||||
override fun containsAnnotation(classId: ClassId): Boolean = firRef.containsAnnotation(classId)
|
override fun containsAnnotation(classId: ClassId): Boolean = firRef.containsAnnotation(classId)
|
||||||
override val annotationClassIds: Collection<ClassId> by cached { firRef.getAnnotationClassIds() }
|
override val annotationClassIds: Collection<ClassId> by cached { firRef.getAnnotationClassIds() }
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -60,13 +60,13 @@ internal class KtFirSyntheticJavaPropertySymbol(
|
|||||||
}
|
}
|
||||||
override val isExtension: Boolean get() = firRef.withFir { it.receiverTypeRef != null }
|
override val isExtension: Boolean get() = firRef.withFir { it.receiverTypeRef != null }
|
||||||
override val initializer: KtConstantValue? by firRef.withFirAndCache(FirResolvePhase.BODY_RESOLVE) { fir ->
|
override val initializer: KtConstantValue? by firRef.withFirAndCache(FirResolvePhase.BODY_RESOLVE) { fir ->
|
||||||
fir.initializer?.let { KtFirConstantValueConverter.toConstantValue(it, resolveState.rootModuleSession, _builder) }
|
fir.initializer?.let { KtFirConstantValueConverter.toConstantValue(it, resolveState.rootModuleSession) }
|
||||||
}
|
}
|
||||||
|
|
||||||
override val modality: Modality get() = getModality()
|
override val modality: Modality get() = getModality()
|
||||||
override val visibility: Visibility get() = getVisibility()
|
override val visibility: Visibility get() = getVisibility()
|
||||||
|
|
||||||
override val annotations: List<KtAnnotationCall> by cached { firRef.toAnnotationsList(_builder) }
|
override val annotations: List<KtAnnotationCall> by cached { firRef.toAnnotationsList() }
|
||||||
override fun containsAnnotation(classId: ClassId): Boolean = firRef.containsAnnotation(classId)
|
override fun containsAnnotation(classId: ClassId): Boolean = firRef.containsAnnotation(classId)
|
||||||
override val annotationClassIds: Collection<ClassId> by cached { firRef.getAnnotationClassIds() }
|
override val annotationClassIds: Collection<ClassId> by cached { firRef.getAnnotationClassIds() }
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -37,7 +37,7 @@ internal class KtFirTypeAndAnnotations<T : FirDeclaration>(
|
|||||||
|
|
||||||
override val annotations: List<KtAnnotationCall> by containingDeclaration.withFirAndCache { fir ->
|
override val annotations: List<KtAnnotationCall> by containingDeclaration.withFirAndCache { fir ->
|
||||||
typeRef(fir).annotations.map {
|
typeRef(fir).annotations.map {
|
||||||
KtFirAnnotationCall(containingDeclaration, it, _builder)
|
KtFirAnnotationCall(containingDeclaration, it)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -79,7 +79,7 @@ private fun List<FirTypeRef>.mapToTypeAndAnnotations(
|
|||||||
builder: KtSymbolByFirBuilder,
|
builder: KtSymbolByFirBuilder,
|
||||||
) = map { typeRef ->
|
) = map { typeRef ->
|
||||||
val annotations = typeRef.annotations.map { annotation ->
|
val annotations = typeRef.annotations.map { annotation ->
|
||||||
KtFirAnnotationCall(containingDeclaration, annotation, builder)
|
KtFirAnnotationCall(containingDeclaration, annotation)
|
||||||
}
|
}
|
||||||
KtSimpleFirTypeAndAnnotations(typeRef.coneType, annotations, builder, containingDeclaration.token)
|
KtSimpleFirTypeAndAnnotations(typeRef.coneType, annotations, builder, containingDeclaration.token)
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -45,7 +45,7 @@ internal class KtFirValueParameterSymbol(
|
|||||||
override val annotatedType: KtTypeAndAnnotations by firRef.withFirAndCache(FirResolvePhase.TYPES) { fir ->
|
override val annotatedType: KtTypeAndAnnotations by firRef.withFirAndCache(FirResolvePhase.TYPES) { fir ->
|
||||||
if (fir.isVararg) {
|
if (fir.isVararg) {
|
||||||
val annotations = fir.returnTypeRef.annotations.map { annotation ->
|
val annotations = fir.returnTypeRef.annotations.map { annotation ->
|
||||||
KtFirAnnotationCall(firRef, annotation, _builder)
|
KtFirAnnotationCall(firRef, annotation)
|
||||||
}
|
}
|
||||||
// There SHOULD always be an array element type (even if it is an error type, e.g., unresolved).
|
// There SHOULD always be an array element type (even if it is an error type, e.g., unresolved).
|
||||||
val arrayElementType = fir.returnTypeRef.coneType.arrayElementType()
|
val arrayElementType = fir.returnTypeRef.coneType.arrayElementType()
|
||||||
@@ -58,7 +58,7 @@ internal class KtFirValueParameterSymbol(
|
|||||||
|
|
||||||
override val hasDefaultValue: Boolean get() = firRef.withFir { it.defaultValue != null }
|
override val hasDefaultValue: Boolean get() = firRef.withFir { it.defaultValue != null }
|
||||||
|
|
||||||
override val annotations: List<KtAnnotationCall> by cached { firRef.toAnnotationsList(_builder) }
|
override val annotations: List<KtAnnotationCall> by cached { firRef.toAnnotationsList() }
|
||||||
override fun containsAnnotation(classId: ClassId): Boolean = firRef.containsAnnotation(classId)
|
override fun containsAnnotation(classId: ClassId): Boolean = firRef.containsAnnotation(classId)
|
||||||
override val annotationClassIds: Collection<ClassId> by cached { firRef.getAnnotationClassIds() }
|
override val annotationClassIds: Collection<ClassId> by cached { firRef.getAnnotationClassIds() }
|
||||||
|
|
||||||
|
|||||||
-2
@@ -22,7 +22,6 @@ import org.jetbrains.kotlin.psi.KtCallElement
|
|||||||
internal class KtFirAnnotationCall(
|
internal class KtFirAnnotationCall(
|
||||||
private val containingDeclaration: FirRefWithValidityCheck<FirDeclaration>,
|
private val containingDeclaration: FirRefWithValidityCheck<FirDeclaration>,
|
||||||
annotation: FirAnnotation,
|
annotation: FirAnnotation,
|
||||||
_builder: KtSymbolByFirBuilder,
|
|
||||||
) : KtAnnotationCall() {
|
) : KtAnnotationCall() {
|
||||||
|
|
||||||
private val annotationCallRef by weakRef(annotation)
|
private val annotationCallRef by weakRef(annotation)
|
||||||
@@ -45,7 +44,6 @@ internal class KtFirAnnotationCall(
|
|||||||
KtFirConstantValueConverter.toNamedConstantValue(
|
KtFirConstantValueConverter.toNamedConstantValue(
|
||||||
mapAnnotationParameters(annotationCallRef, fir.moduleData.session),
|
mapAnnotationParameters(annotationCallRef, fir.moduleData.session),
|
||||||
fir.moduleData.session,
|
fir.moduleData.session,
|
||||||
_builder
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+2
-5
@@ -5,7 +5,6 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.analysis.api.fir.symbols.annotations
|
package org.jetbrains.kotlin.analysis.api.fir.symbols.annotations
|
||||||
|
|
||||||
import org.jetbrains.kotlin.analysis.api.fir.KtSymbolByFirBuilder
|
|
||||||
import org.jetbrains.kotlin.analysis.api.fir.utils.FirRefWithValidityCheck
|
import org.jetbrains.kotlin.analysis.api.fir.utils.FirRefWithValidityCheck
|
||||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.lazy.resolve.ResolveType
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.lazy.resolve.ResolveType
|
||||||
import org.jetbrains.kotlin.fir.FirSession
|
import org.jetbrains.kotlin.fir.FirSession
|
||||||
@@ -24,10 +23,8 @@ import org.jetbrains.kotlin.name.ClassId
|
|||||||
internal fun FirAnnotation.getClassId(session: FirSession): ClassId? =
|
internal fun FirAnnotation.getClassId(session: FirSession): ClassId? =
|
||||||
coneClassLikeType?.fullyExpandedType(session)?.classId
|
coneClassLikeType?.fullyExpandedType(session)?.classId
|
||||||
|
|
||||||
internal fun FirRefWithValidityCheck<FirAnnotatedDeclaration>.toAnnotationsList(
|
internal fun FirRefWithValidityCheck<FirAnnotatedDeclaration>.toAnnotationsList() = withFir { fir ->
|
||||||
builder: KtSymbolByFirBuilder
|
fir.annotations.map { KtFirAnnotationCall(this, it) }
|
||||||
) = withFir { fir ->
|
|
||||||
fir.annotations.map { KtFirAnnotationCall(this, it, builder) }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
internal fun FirRefWithValidityCheck<FirAnnotatedDeclaration>.containsAnnotation(classId: ClassId): Boolean =
|
internal fun FirRefWithValidityCheck<FirAnnotatedDeclaration>.containsAnnotation(classId: ClassId): Boolean =
|
||||||
|
|||||||
+2
-2
@@ -45,7 +45,7 @@ abstract class AbstractCompileTimeConstantEvaluatorTest : AbstractHLApiSingleFil
|
|||||||
}
|
}
|
||||||
is KtAnnotationConstantValue -> buildString {
|
is KtAnnotationConstantValue -> buildString {
|
||||||
append("KtAnnotationConstantValue(")
|
append("KtAnnotationConstantValue(")
|
||||||
append(fqName)
|
append(classId?.relativeClassName)
|
||||||
append(", ")
|
append(", ")
|
||||||
arguments.joinTo(this, separator = ", ", prefix = "(", postfix = ")") {
|
arguments.joinTo(this, separator = ", ", prefix = "(", postfix = ")") {
|
||||||
"${it.name} = ${it.expression.stringRepresentation()}"
|
"${it.name} = ${it.expression.stringRepresentation()}"
|
||||||
@@ -54,7 +54,7 @@ abstract class AbstractCompileTimeConstantEvaluatorTest : AbstractHLApiSingleFil
|
|||||||
}
|
}
|
||||||
is KtEnumEntryConstantValue -> buildString {
|
is KtEnumEntryConstantValue -> buildString {
|
||||||
append("KtEnumEntryConstantValue(")
|
append("KtEnumEntryConstantValue(")
|
||||||
append(enumEntrySymbol.callableIdIfNonLocal ?: enumEntrySymbol.name)
|
append("$callableId")
|
||||||
append(")")
|
append(")")
|
||||||
}
|
}
|
||||||
is KtLiteralConstantValue<*> -> buildString {
|
is KtLiteralConstantValue<*> -> buildString {
|
||||||
|
|||||||
+1
-1
@@ -96,7 +96,7 @@ public object DebugSymbolRenderer {
|
|||||||
"${value::class.simpleName!!}($symbolTag)"
|
"${value::class.simpleName!!}($symbolTag)"
|
||||||
}
|
}
|
||||||
is KtLiteralConstantValue<*> -> renderValue(value.value)
|
is KtLiteralConstantValue<*> -> renderValue(value.value)
|
||||||
is KtEnumEntryConstantValue -> "KtEnumEntryConstantValue(${renderValue(value.enumEntrySymbol)})"
|
is KtEnumEntryConstantValue -> "KtEnumEntryConstantValue(${renderValue(value.callableId)})"
|
||||||
is KtNamedConstantValue -> "${renderValue(value.name)} = ${renderValue(value.expression)}"
|
is KtNamedConstantValue -> "${renderValue(value.name)} = ${renderValue(value.expression)}"
|
||||||
is KtAnnotationCall -> buildString {
|
is KtAnnotationCall -> buildString {
|
||||||
append(renderValue(value.classId))
|
append(renderValue(value.classId))
|
||||||
|
|||||||
+4
-3
@@ -5,7 +5,8 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.analysis.api.symbols.markers
|
package org.jetbrains.kotlin.analysis.api.symbols.markers
|
||||||
|
|
||||||
import org.jetbrains.kotlin.analysis.api.symbols.KtEnumEntrySymbol
|
import org.jetbrains.kotlin.name.CallableId
|
||||||
|
import org.jetbrains.kotlin.name.ClassId
|
||||||
import org.jetbrains.kotlin.psi.KtCallElement
|
import org.jetbrains.kotlin.psi.KtCallElement
|
||||||
import org.jetbrains.kotlin.psi.KtElement
|
import org.jetbrains.kotlin.psi.KtElement
|
||||||
import org.jetbrains.kotlin.types.ConstantValueKind
|
import org.jetbrains.kotlin.types.ConstantValueKind
|
||||||
@@ -36,13 +37,13 @@ public class KtArrayConstantValue(
|
|||||||
) : KtConstantValue()
|
) : KtConstantValue()
|
||||||
|
|
||||||
public class KtAnnotationConstantValue(
|
public class KtAnnotationConstantValue(
|
||||||
public val fqName: String?,
|
public val classId: ClassId?,
|
||||||
public val arguments: List<KtNamedConstantValue>,
|
public val arguments: List<KtNamedConstantValue>,
|
||||||
override val kotlinOrigin: KtCallElement?,
|
override val kotlinOrigin: KtCallElement?,
|
||||||
) : KtConstantValue()
|
) : KtConstantValue()
|
||||||
|
|
||||||
public class KtEnumEntryConstantValue(
|
public class KtEnumEntryConstantValue(
|
||||||
public val enumEntrySymbol: KtEnumEntrySymbol,
|
public val callableId: CallableId?,
|
||||||
override val kotlinOrigin: KtElement?,
|
override val kotlinOrigin: KtElement?,
|
||||||
) : KtConstantValue()
|
) : KtConstantValue()
|
||||||
|
|
||||||
|
|||||||
@@ -296,7 +296,7 @@ KtFirKotlinPropertySymbol:
|
|||||||
kotlin/Deprecated
|
kotlin/Deprecated
|
||||||
]
|
]
|
||||||
annotations: [
|
annotations: [
|
||||||
kotlin/Deprecated(level = KtEnumEntryConstantValue(KtFirEnumEntrySymbol(kotlin/DeprecationLevel.ERROR)), message = don't use j)
|
kotlin/Deprecated(level = KtEnumEntryConstantValue(kotlin/DeprecationLevel.ERROR), message = don't use j)
|
||||||
psi: KtAnnotationEntry
|
psi: KtAnnotationEntry
|
||||||
]
|
]
|
||||||
callableIdIfNonLocal: /j
|
callableIdIfNonLocal: /j
|
||||||
@@ -332,7 +332,7 @@ KtFirKotlinPropertySymbol:
|
|||||||
kotlin/Deprecated
|
kotlin/Deprecated
|
||||||
]
|
]
|
||||||
annotations: [
|
annotations: [
|
||||||
kotlin/Deprecated(level = KtEnumEntryConstantValue(KtFirEnumEntrySymbol(kotlin/DeprecationLevel.HIDDEN)), message = don't use j2)
|
kotlin/Deprecated(level = KtEnumEntryConstantValue(kotlin/DeprecationLevel.HIDDEN), message = don't use j2)
|
||||||
psi: KtAnnotationEntry
|
psi: KtAnnotationEntry
|
||||||
]
|
]
|
||||||
callableIdIfNonLocal: /j2
|
callableIdIfNonLocal: /j2
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ KtFirNamedClassOrObjectSymbol:
|
|||||||
kotlin/annotation/Target
|
kotlin/annotation/Target
|
||||||
]
|
]
|
||||||
annotations: [
|
annotations: [
|
||||||
kotlin/annotation/Target(allowedTargets = KtEnumEntryConstantValue(KtFirEnumEntrySymbol(kotlin/annotation/AnnotationTarget.TYPE)))
|
kotlin/annotation/Target(allowedTargets = KtEnumEntryConstantValue(kotlin/annotation/AnnotationTarget.TYPE))
|
||||||
psi: KtAnnotationEntry
|
psi: KtAnnotationEntry
|
||||||
]
|
]
|
||||||
classIdIfNonLocal: Anno1
|
classIdIfNonLocal: Anno1
|
||||||
@@ -30,7 +30,7 @@ KtFirNamedClassOrObjectSymbol:
|
|||||||
kotlin/annotation/Target
|
kotlin/annotation/Target
|
||||||
]
|
]
|
||||||
annotations: [
|
annotations: [
|
||||||
kotlin/annotation/Target(allowedTargets = KtEnumEntryConstantValue(KtFirEnumEntrySymbol(kotlin/annotation/AnnotationTarget.TYPE)))
|
kotlin/annotation/Target(allowedTargets = KtEnumEntryConstantValue(kotlin/annotation/AnnotationTarget.TYPE))
|
||||||
psi: KtAnnotationEntry
|
psi: KtAnnotationEntry
|
||||||
]
|
]
|
||||||
classIdIfNonLocal: Anno2
|
classIdIfNonLocal: Anno2
|
||||||
@@ -57,7 +57,7 @@ KtFirNamedClassOrObjectSymbol:
|
|||||||
kotlin/annotation/Target
|
kotlin/annotation/Target
|
||||||
]
|
]
|
||||||
annotations: [
|
annotations: [
|
||||||
kotlin/annotation/Target(allowedTargets = KtEnumEntryConstantValue(KtFirEnumEntrySymbol(kotlin/annotation/AnnotationTarget.TYPE)))
|
kotlin/annotation/Target(allowedTargets = KtEnumEntryConstantValue(kotlin/annotation/AnnotationTarget.TYPE))
|
||||||
psi: KtAnnotationEntry
|
psi: KtAnnotationEntry
|
||||||
]
|
]
|
||||||
classIdIfNonLocal: Anno3
|
classIdIfNonLocal: Anno3
|
||||||
@@ -84,7 +84,7 @@ KtFirNamedClassOrObjectSymbol:
|
|||||||
kotlin/annotation/Target
|
kotlin/annotation/Target
|
||||||
]
|
]
|
||||||
annotations: [
|
annotations: [
|
||||||
kotlin/annotation/Target(allowedTargets = KtEnumEntryConstantValue(KtFirEnumEntrySymbol(kotlin/annotation/AnnotationTarget.TYPE)))
|
kotlin/annotation/Target(allowedTargets = KtEnumEntryConstantValue(kotlin/annotation/AnnotationTarget.TYPE))
|
||||||
psi: KtAnnotationEntry
|
psi: KtAnnotationEntry
|
||||||
]
|
]
|
||||||
classIdIfNonLocal: Anno4
|
classIdIfNonLocal: Anno4
|
||||||
|
|||||||
+2
-2
@@ -186,7 +186,7 @@ internal fun KtConstantValue.toAnnotationMemberValue(parent: PsiElement): PsiAnn
|
|||||||
values.mapNotNull { element -> element.toAnnotationMemberValue(arrayLiteralParent) }
|
values.mapNotNull { element -> element.toAnnotationMemberValue(arrayLiteralParent) }
|
||||||
}
|
}
|
||||||
is KtAnnotationConstantValue ->
|
is KtAnnotationConstantValue ->
|
||||||
FirLightSimpleAnnotation(fqName, parent, arguments, kotlinOrigin)
|
FirLightSimpleAnnotation(classId?.relativeClassName?.asString(), parent, arguments, kotlinOrigin)
|
||||||
else ->
|
else ->
|
||||||
createPsiLiteral(parent)?.let {
|
createPsiLiteral(parent)?.let {
|
||||||
when (it) {
|
when (it) {
|
||||||
@@ -200,7 +200,7 @@ internal fun KtConstantValue.toAnnotationMemberValue(parent: PsiElement): PsiAnn
|
|||||||
private fun KtConstantValue.asStringForPsiLiteral(): String? =
|
private fun KtConstantValue.asStringForPsiLiteral(): String? =
|
||||||
when (this) {
|
when (this) {
|
||||||
is KtEnumEntryConstantValue ->
|
is KtEnumEntryConstantValue ->
|
||||||
"${enumEntrySymbol.containingEnumClassIdIfNonLocal?.asSingleFqName()?.asString() ?: ""}.${enumEntrySymbol.name}"
|
"${callableId?.classId?.asSingleFqName()?.asString() ?: ""}.${callableId?.callableName}"
|
||||||
is KtLiteralConstantValue<*> -> {
|
is KtLiteralConstantValue<*> -> {
|
||||||
when (val value = this.value) {
|
when (val value = this.value) {
|
||||||
is String -> "\"${escapeString(value)}\""
|
is String -> "\"${escapeString(value)}\""
|
||||||
|
|||||||
Reference in New Issue
Block a user