From ba918d45a28b8306ad7aa7bca218bf694bc1a6d2 Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Fri, 19 Nov 2021 17:22:14 +0100 Subject: [PATCH] Analysis API: introduce KtInitializerValue for initializer of KtPropertySymbol --- .../KtFe10DescKotlinPropertySymbol.kt | 8 +- .../KtFe10DescSyntheticJavaPropertySymbol.kt | 6 +- ...cSyntheticJavaPropertySymbolForOverride.kt | 6 +- .../descriptorBased/base/Kt1DescUtils.kt | 34 ++- .../psiBased/KtFe10PsiKotlinPropertySymbol.kt | 28 +-- .../FirCompileTimeConstantEvaluator.kt | 6 + .../fir/symbols/KtFirKotlinPropertySymbol.kt | 5 +- .../KtFirSyntheticJavaPropertySymbol.kt | 6 +- .../kotlin/analysis/api/fir/utils/firUtils.kt | 14 ++ .../kotlin/analysis/api/KtInitializerValue.kt | 22 ++ .../api/symbols/DebugSymbolRenderer.kt | 27 +++ .../api/symbols/KtVariableLikeSymbol.kt | 13 +- .../scopes/fileScopeTest/simpleFileScope.txt | 2 +- .../anonymousObject.descriptors.txt | 4 +- .../symbols/symbolByPsi/anonymousObject.txt | 4 +- .../symbols/symbolByPsi/classMembes.txt | 2 +- .../symbolByPsi/delegateField.descriptors.txt | 218 ------------------ .../symbols/symbolByPsi/delegateField.txt | 4 +- .../symbolByPsi/deprecated.descriptors.txt | 16 +- .../symbols/symbolByPsi/deprecated.txt | 16 +- .../memberProperties.descriptors.txt | 2 +- .../symbols/symbolByPsi/memberProperties.txt | 2 +- .../topLevelProperties.descriptors.txt | 2 +- .../symbolByPsi/topLevelProperties.txt | 2 +- .../typeAnnotations.descriptors.txt | 2 +- .../symbols/symbolByPsi/typeAnnotations.txt | 2 +- .../fields/FirLightFieldForPropertySymbol.kt | 4 +- 27 files changed, 176 insertions(+), 281 deletions(-) create mode 100644 analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/KtInitializerValue.kt delete mode 100644 analysis/analysis-api/testData/symbols/symbolByPsi/delegateField.descriptors.txt diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/descriptorBased/KtFe10DescKotlinPropertySymbol.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/descriptorBased/KtFe10DescKotlinPropertySymbol.kt index 7ed2ac0b7f1..3c3d1813d32 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/descriptorBased/KtFe10DescKotlinPropertySymbol.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/descriptorBased/KtFe10DescKotlinPropertySymbol.kt @@ -5,6 +5,9 @@ package org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased +import com.intellij.psi.PsiElement +import org.jetbrains.kotlin.analysis.api.KtConstantInitializerValue +import org.jetbrains.kotlin.analysis.api.KtInitializerValue import org.jetbrains.kotlin.analysis.api.descriptors.Fe10AnalysisContext import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.* import org.jetbrains.kotlin.analysis.api.descriptors.symbols.pointers.KtFe10NeverRestoringSymbolPointer @@ -22,6 +25,7 @@ import org.jetbrains.kotlin.descriptors.ConstructorDescriptor import org.jetbrains.kotlin.descriptors.impl.PropertyDescriptorImpl import org.jetbrains.kotlin.name.CallableId import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.psi.KtProperty import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.descriptorUtil.isExtension @@ -66,8 +70,8 @@ internal class KtFe10DescKotlinPropertySymbol( override val callableIdIfNonLocal: CallableId? get() = withValidityAssertion { descriptor.callableIdIfNotLocal } - override val initializer: KtConstantValue? - get() = withValidityAssertion { descriptor.compileTimeInitializer?.toKtConstantValue() } + override val initializer: KtInitializerValue? + get() = withValidityAssertion { createKtInitializerValue(source as? KtProperty, descriptor, analysisContext) } override val getter: KtPropertyGetterSymbol get() = withValidityAssertion { diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/descriptorBased/KtFe10DescSyntheticJavaPropertySymbol.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/descriptorBased/KtFe10DescSyntheticJavaPropertySymbol.kt index e76e429ad85..49cb7a120da 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/descriptorBased/KtFe10DescSyntheticJavaPropertySymbol.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/descriptorBased/KtFe10DescSyntheticJavaPropertySymbol.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased +import org.jetbrains.kotlin.analysis.api.KtInitializerValue import org.jetbrains.kotlin.analysis.api.descriptors.Fe10AnalysisContext import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.* import org.jetbrains.kotlin.analysis.api.descriptors.symbols.pointers.KtFe10NeverRestoringSymbolPointer @@ -17,6 +18,7 @@ import org.jetbrains.kotlin.analysis.api.withValidityAssertion import org.jetbrains.kotlin.descriptors.ConstructorDescriptor import org.jetbrains.kotlin.name.CallableId import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.psi.KtProperty import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.descriptorUtil.isExtension import org.jetbrains.kotlin.synthetic.SyntheticJavaPropertyDescriptor @@ -71,8 +73,8 @@ internal class KtFe10DescSyntheticJavaPropertySymbol( KtFe10DescPropertySetterSymbol(setter, analysisContext) } - override val initializer: KtConstantValue? - get() = withValidityAssertion { descriptor.compileTimeInitializer?.toKtConstantValue() } + override val initializer: KtInitializerValue? + get() = withValidityAssertion { createKtInitializerValue(source as? KtProperty, descriptor, analysisContext) } override val callableIdIfNonLocal: CallableId? get() = withValidityAssertion { descriptor.callableIdIfNotLocal } diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/descriptorBased/KtFe10DescSyntheticJavaPropertySymbolForOverride.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/descriptorBased/KtFe10DescSyntheticJavaPropertySymbolForOverride.kt index e5cd5c175b4..b652582fd17 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/descriptorBased/KtFe10DescSyntheticJavaPropertySymbolForOverride.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/descriptorBased/KtFe10DescSyntheticJavaPropertySymbolForOverride.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased +import org.jetbrains.kotlin.analysis.api.KtInitializerValue import org.jetbrains.kotlin.analysis.api.descriptors.Fe10AnalysisContext import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.* import org.jetbrains.kotlin.analysis.api.descriptors.symbols.pointers.KtFe10NeverRestoringSymbolPointer @@ -18,6 +19,7 @@ import org.jetbrains.kotlin.descriptors.ConstructorDescriptor import org.jetbrains.kotlin.load.java.descriptors.JavaForKotlinOverridePropertyDescriptor import org.jetbrains.kotlin.name.CallableId import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.psi.KtProperty import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.descriptorUtil.isExtension @@ -71,8 +73,8 @@ internal class KtFe10DescSyntheticJavaPropertySymbolForOverride( KtFe10DescPropertySetterSymbol(setter, analysisContext) } - override val initializer: KtConstantValue? - get() = withValidityAssertion { descriptor.compileTimeInitializer?.toKtConstantValue() } + override val initializer: KtInitializerValue? + get() = withValidityAssertion { createKtInitializerValue(source as? KtProperty, descriptor, analysisContext) } override val callableIdIfNonLocal: CallableId? get() = withValidityAssertion { descriptor.callableIdIfNotLocal } diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/descriptorBased/base/Kt1DescUtils.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/descriptorBased/base/Kt1DescUtils.kt index 5ef25063522..88e7d96fb15 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/descriptorBased/base/Kt1DescUtils.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/descriptorBased/base/Kt1DescUtils.kt @@ -5,9 +5,7 @@ package org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base -import org.jetbrains.kotlin.analysis.api.KtStarProjectionTypeArgument -import org.jetbrains.kotlin.analysis.api.KtTypeArgument -import org.jetbrains.kotlin.analysis.api.KtTypeArgumentWithVariance +import org.jetbrains.kotlin.analysis.api.* import org.jetbrains.kotlin.analysis.api.annotations.KtNamedConstantValue import org.jetbrains.kotlin.analysis.api.components.KtDeclarationRendererOptions import org.jetbrains.kotlin.analysis.api.descriptors.Fe10AnalysisContext @@ -33,9 +31,12 @@ 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.KtExpression +import org.jetbrains.kotlin.psi.KtProperty import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.calls.inference.CapturedType 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.sam.SamConstructorDescriptor @@ -393,3 +394,30 @@ internal fun DeclarationDescriptor.render(analysisContext: Fe10AnalysisContext, internal fun CallableMemberDescriptor.getSymbolPointerSignature(analysisContext: Fe10AnalysisContext): String { return render(analysisContext, KtDeclarationRendererOptions.DEFAULT) } + +internal fun createKtInitializerValue( + ktProperty: KtProperty?, + propertyDescriptor: PropertyDescriptor?, + analysisContext: Fe10AnalysisContext, +): KtInitializerValue? { + require(ktProperty != null || propertyDescriptor != null) + if (ktProperty?.initializer == null && propertyDescriptor?.compileTimeInitializer == null) { + return null + } + val initializer = ktProperty?.initializer + + val compileTimeInitializer = propertyDescriptor?.compileTimeInitializer + if (compileTimeInitializer != null) { + return KtConstantInitializerValue(compileTimeInitializer.toKtConstantValue(), initializer) + } + if (initializer != null) { + val bindingContext = analysisContext.analyze(initializer) + val constantValue = ConstantExpressionEvaluator.getConstant(initializer, bindingContext) + if (constantValue != null) { + val evaluated = constantValue.toConstantValue(propertyDescriptor?.type ?: TypeUtils.NO_EXPECTED_TYPE).toKtConstantValue() + return KtConstantInitializerValue(evaluated, initializer) + } + } + + return KtNonConstantInitializerValue(initializer) +} \ No newline at end of file diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/psiBased/KtFe10PsiKotlinPropertySymbol.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/psiBased/KtFe10PsiKotlinPropertySymbol.kt index fb5562b5042..251f5ef07bc 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/psiBased/KtFe10PsiKotlinPropertySymbol.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/psiBased/KtFe10PsiKotlinPropertySymbol.kt @@ -5,14 +5,21 @@ package org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased +import org.jetbrains.kotlin.analysis.api.KtConstantInitializerValue +import org.jetbrains.kotlin.analysis.api.KtInitializerValue +import org.jetbrains.kotlin.analysis.api.KtNonConstantInitializerValue import org.jetbrains.kotlin.analysis.api.descriptors.Fe10AnalysisContext import org.jetbrains.kotlin.analysis.api.descriptors.Fe10AnalysisFacade.AnalysisMode +import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.* +import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.createKtInitializerValue import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.ktModality import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.ktVisibility -import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtConstantValue import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtType import org.jetbrains.kotlin.analysis.api.descriptors.symbols.pointers.KtFe10NeverRestoringSymbolPointer import org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased.base.* +import org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased.base.ktModality +import org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased.base.ktSymbolKind +import org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased.base.ktVisibility import org.jetbrains.kotlin.analysis.api.descriptors.utils.cached import org.jetbrains.kotlin.analysis.api.symbols.KtKotlinPropertySymbol import org.jetbrains.kotlin.analysis.api.symbols.KtPropertyGetterSymbol @@ -95,23 +102,8 @@ internal class KtFe10PsiKotlinPropertySymbol( override val isStatic: Boolean get() = withValidityAssertion { false } - override val initializer: KtConstantValue? - get() = withValidityAssertion { - val initializer = psi.initializer ?: return null - - val compileTimeInitializer = descriptor?.compileTimeInitializer - if (compileTimeInitializer != null) { - return compileTimeInitializer.toKtConstantValue() - } - - val bindingContext = analysisContext.analyze(initializer) - val constantValue = ConstantExpressionEvaluator.getConstant(initializer, bindingContext) - if (constantValue != null) { - return constantValue.toConstantValue(descriptor?.type ?: TypeUtils.NO_EXPECTED_TYPE).toKtConstantValue() - } - - return KtUnsupportedConstantValue - } + override val initializer: KtInitializerValue? + get() = withValidityAssertion { createKtInitializerValue(psi, descriptor, analysisContext) } override val isVal: Boolean get() = withValidityAssertion { !psi.isVar } diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/evaluate/FirCompileTimeConstantEvaluator.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/evaluate/FirCompileTimeConstantEvaluator.kt index 96b7dcccfcf..3a11f2e66e1 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/evaluate/FirCompileTimeConstantEvaluator.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/evaluate/FirCompileTimeConstantEvaluator.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.analysis.api.fir.evaluate import org.jetbrains.kotlin.KtSourceElement +import org.jetbrains.kotlin.analysis.api.symbols.markers.KtConstantValue import org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction import org.jetbrains.kotlin.fir.expressions.FirConstExpression @@ -36,6 +37,11 @@ internal object FirCompileTimeConstantEvaluator { else -> null } + fun evaluateAsKtConstantExpression(expression: FirExpression): KtConstantValue? { + val evaluated = evaluate(expression) ?: return null + return KtFirConstantValueConverter.toConstantValue(evaluated) + } + // TODO: Rework to handle nested expressions // This is no longer used during FIR2IR where an inner expression is recursively rewritten to ConstExpression if possible. // Maybe rewrite this to a recursive version with caching either here or in provider. diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirKotlinPropertySymbol.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirKotlinPropertySymbol.kt index af292d7ec47..775bbc6d041 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirKotlinPropertySymbol.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirKotlinPropertySymbol.kt @@ -13,6 +13,7 @@ import org.jetbrains.kotlin.analysis.api.fir.evaluate.KtFirConstantValueConverte import org.jetbrains.kotlin.analysis.api.fir.findPsi import org.jetbrains.kotlin.analysis.api.fir.symbols.pointers.KtFirMemberPropertySymbolPointer import org.jetbrains.kotlin.analysis.api.fir.symbols.pointers.createSignature +import org.jetbrains.kotlin.analysis.api.fir.utils.asKtInitializerValue import org.jetbrains.kotlin.analysis.api.fir.utils.cached import org.jetbrains.kotlin.analysis.api.fir.utils.firRef import org.jetbrains.kotlin.analysis.api.symbols.KtKotlinPropertySymbol @@ -68,8 +69,8 @@ internal class KtFirKotlinPropertySymbol( } override val isExtension: Boolean get() = firRef.withFir { it.receiverTypeRef != null } - override val initializer: KtConstantValue? by firRef.withFirAndCache(FirResolvePhase.BODY_RESOLVE) { fir -> - fir.initializer?.let { KtFirConstantValueConverter.toConstantValue(it, resolveState.rootModuleSession) } + override val initializer by firRef.withFirAndCache(FirResolvePhase.BODY_RESOLVE) { fir -> + fir.initializer?.asKtInitializerValue() } override val symbolKind: KtSymbolKind get() = firRef.withFir { fir -> diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirSyntheticJavaPropertySymbol.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirSyntheticJavaPropertySymbol.kt index dddf7bcf7b4..5556598fb0f 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirSyntheticJavaPropertySymbol.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirSyntheticJavaPropertySymbol.kt @@ -6,12 +6,14 @@ package org.jetbrains.kotlin.analysis.api.fir.symbols import com.intellij.psi.PsiElement +import org.jetbrains.kotlin.analysis.api.KtInitializerValue import org.jetbrains.kotlin.analysis.api.fir.KtSymbolByFirBuilder import org.jetbrains.kotlin.analysis.api.fir.annotations.KtFirAnnotationListForDeclaration import org.jetbrains.kotlin.analysis.api.fir.evaluate.KtFirConstantValueConverter import org.jetbrains.kotlin.analysis.api.fir.findPsi import org.jetbrains.kotlin.analysis.api.fir.symbols.pointers.KtFirJavaSyntheticPropertySymbolPointer +import org.jetbrains.kotlin.analysis.api.fir.utils.asKtInitializerValue import org.jetbrains.kotlin.analysis.api.fir.utils.cached import org.jetbrains.kotlin.analysis.api.fir.utils.firRef import org.jetbrains.kotlin.analysis.api.symbols.* @@ -54,8 +56,8 @@ internal class KtFirSyntheticJavaPropertySymbol( firRef.receiverType(builder) } override val isExtension: Boolean get() = firRef.withFir { it.receiverTypeRef != null } - override val initializer: KtConstantValue? by firRef.withFirAndCache(FirResolvePhase.BODY_RESOLVE) { fir -> - fir.initializer?.let { KtFirConstantValueConverter.toConstantValue(it, resolveState.rootModuleSession) } + override val initializer: KtInitializerValue? by firRef.withFirAndCache(FirResolvePhase.BODY_RESOLVE) { fir -> + fir.initializer?.asKtInitializerValue() } override val modality: Modality get() = getModality() diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/utils/firUtils.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/utils/firUtils.kt index fd0e85d8a8e..ebf5e5cd174 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/utils/firUtils.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/utils/firUtils.kt @@ -5,6 +5,10 @@ package org.jetbrains.kotlin.analysis.api.fir.utils import com.intellij.psi.PsiElement +import org.jetbrains.kotlin.analysis.api.KtConstantInitializerValue +import org.jetbrains.kotlin.analysis.api.KtInitializerValue +import org.jetbrains.kotlin.analysis.api.KtNonConstantInitializerValue +import org.jetbrains.kotlin.analysis.api.fir.evaluate.FirCompileTimeConstantEvaluator import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.analysis.checkers.classKind @@ -22,6 +26,8 @@ import org.jetbrains.kotlin.analysis.low.level.api.fir.api.withFirDeclaration import org.jetbrains.kotlin.analysis.low.level.api.fir.lazy.resolve.ResolveType import org.jetbrains.kotlin.analysis.api.types.KtTypeNullability import org.jetbrains.kotlin.fir.declarations.* +import org.jetbrains.kotlin.fir.expressions.FirExpression +import org.jetbrains.kotlin.fir.psi import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.psi.* @@ -83,3 +89,11 @@ internal fun FirCallableSymbol<*>.computeImportableName(useSiteSession: FirSessi return if (canBeImported) callableId.asSingleFqName() else null } + +internal fun FirExpression.asKtInitializerValue(): KtInitializerValue { + val ktExpression = psi as? KtExpression + return when (val evaluated = FirCompileTimeConstantEvaluator.evaluateAsKtConstantExpression(this)) { + null -> KtNonConstantInitializerValue(ktExpression) + else -> KtConstantInitializerValue(evaluated, ktExpression) + } +} \ No newline at end of file diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/KtInitializerValue.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/KtInitializerValue.kt new file mode 100644 index 00000000000..f28ec67daa6 --- /dev/null +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/KtInitializerValue.kt @@ -0,0 +1,22 @@ +/* + * 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 + +import org.jetbrains.kotlin.analysis.api.symbols.markers.KtConstantValue +import org.jetbrains.kotlin.psi.KtExpression + +public sealed class KtInitializerValue { + public abstract val initializerPsi: KtExpression? +} + +public class KtConstantInitializerValue( + public val constant: KtConstantValue, + override val initializerPsi: KtExpression? +) : KtInitializerValue() + +public class KtNonConstantInitializerValue( + override val initializerPsi: KtExpression? +) : KtInitializerValue() \ No newline at end of file diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/DebugSymbolRenderer.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/DebugSymbolRenderer.kt index eab7a4ce1c8..8653464b258 100644 --- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/DebugSymbolRenderer.kt +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/DebugSymbolRenderer.kt @@ -5,8 +5,12 @@ package org.jetbrains.kotlin.analysis.api.symbols +import com.intellij.psi.PsiElement import org.jetbrains.kotlin.resolve.deprecation.DeprecationInfo import org.jetbrains.kotlin.analysis.api.KtAnalysisSession +import org.jetbrains.kotlin.analysis.api.KtConstantInitializerValue +import org.jetbrains.kotlin.analysis.api.KtInitializerValue +import org.jetbrains.kotlin.analysis.api.KtNonConstantInitializerValue import org.jetbrains.kotlin.analysis.api.annotations.KtAnnotationApplication import org.jetbrains.kotlin.analysis.api.annotations.KtAnnotationsList import org.jetbrains.kotlin.analysis.api.annotations.KtNamedConstantValue @@ -173,6 +177,7 @@ public object DebugSymbolRenderer { is KtType -> renderType(value) is KtConstantValue -> renderConstantValue(value) is KtNamedConstantValue -> renderNamedConstantValue(value) + is KtInitializerValue -> renderKtInitializerValue(value) is KtAnnotationApplication -> renderAnnotationApplication(value) is KtAnnotationsList -> renderAnnotationsList(value) // Other custom values @@ -193,6 +198,21 @@ public object DebugSymbolRenderer { } } + private fun Block.renderKtInitializerValue(value: KtInitializerValue) { + when (value) { + is KtConstantInitializerValue -> { + append("KtConstantInitializerValue(") + renderConstantValue(value.constant) + append(")") + } + is KtNonConstantInitializerValue -> { + append("KtNonConstantInitializerValue(") + append(value.initializerPsi?.firstLineOfPsi() ?: "NO_PSI") + append(")") + } + } + } + private fun Block.renderAnnotationsList(value: KtAnnotationsList) { renderList(value.annotations) } @@ -209,6 +229,13 @@ public object DebugSymbolRenderer { } } + private fun PsiElement.firstLineOfPsi(): String { + val text = text + val lines = text.lines() + return if (lines.count() <= 1) text + else lines.first() + " ..." + } + private val ignoredPropertyNames = setOf("psi", "token") private val symbolImplementationPackageNames = listOf( diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/KtVariableLikeSymbol.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/KtVariableLikeSymbol.kt index 03333b62aee..61d30c2f003 100644 --- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/KtVariableLikeSymbol.kt +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/KtVariableLikeSymbol.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.analysis.api.symbols import com.intellij.psi.PsiElement +import org.jetbrains.kotlin.analysis.api.* import org.jetbrains.kotlin.builtins.StandardNames import org.jetbrains.kotlin.analysis.api.symbols.markers.* import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer @@ -13,6 +14,7 @@ import org.jetbrains.kotlin.analysis.api.types.KtType import org.jetbrains.kotlin.name.CallableId import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.psi.KtExpression public sealed class KtVariableLikeSymbol : KtCallableSymbol(), KtNamedSymbol, KtSymbolWithKind { abstract override fun createPointer(): KtSymbolPointer @@ -97,7 +99,16 @@ public sealed class KtPropertySymbol : KtVariableSymbol(), public abstract val isOverride: Boolean public abstract val isStatic: Boolean - public abstract val initializer: KtConstantValue? + /** + * Value which is provided for as property initializer. + * + * Possible values: + * - `null` - no initializer was provided + * - [KtConstantInitializerValue] - initializer value was provided, and it is a compile-time constant + * - [KtNonConstantInitializerValue] - initializer value was provided, and it is not a compile-time constant. In case of declaration from source it would include correponding [KtExpression] + * + */ + public abstract val initializer: KtInitializerValue? abstract override fun createPointer(): KtSymbolPointer } diff --git a/analysis/analysis-api/testData/scopes/fileScopeTest/simpleFileScope.txt b/analysis/analysis-api/testData/scopes/fileScopeTest/simpleFileScope.txt index b453ffe4248..a70be31bd7c 100644 --- a/analysis/analysis-api/testData/scopes/fileScopeTest/simpleFileScope.txt +++ b/analysis/analysis-api/testData/scopes/fileScopeTest/simpleFileScope.txt @@ -38,7 +38,7 @@ KtKotlinPropertySymbol: hasBackingField: true hasGetter: true hasSetter: false - initializer: 2 + initializer: KtConstantInitializerValue(2) isConst: false isDelegatedProperty: false isExtension: false diff --git a/analysis/analysis-api/testData/symbols/symbolByPsi/anonymousObject.descriptors.txt b/analysis/analysis-api/testData/symbols/symbolByPsi/anonymousObject.descriptors.txt index d1755ee116a..1376bd934e8 100644 --- a/analysis/analysis-api/testData/symbols/symbolByPsi/anonymousObject.descriptors.txt +++ b/analysis/analysis-api/testData/symbols/symbolByPsi/anonymousObject.descriptors.txt @@ -29,7 +29,7 @@ KtKotlinPropertySymbol: hasBackingField: true hasGetter: true hasSetter: false - initializer: 123 + initializer: KtConstantInitializerValue(123) isConst: false isDelegatedProperty: false isExtension: false @@ -73,7 +73,7 @@ KtKotlinPropertySymbol: hasBackingField: true hasGetter: true hasSetter: false - initializer: KtUnsupportedConstantValue + initializer: KtNonConstantInitializerValue(object : Runnable { ...) isConst: false isDelegatedProperty: false isExtension: false diff --git a/analysis/analysis-api/testData/symbols/symbolByPsi/anonymousObject.txt b/analysis/analysis-api/testData/symbols/symbolByPsi/anonymousObject.txt index 009b1065c44..c473f2f315e 100644 --- a/analysis/analysis-api/testData/symbols/symbolByPsi/anonymousObject.txt +++ b/analysis/analysis-api/testData/symbols/symbolByPsi/anonymousObject.txt @@ -29,7 +29,7 @@ KtKotlinPropertySymbol: hasBackingField: true hasGetter: true hasSetter: false - initializer: 123 + initializer: KtConstantInitializerValue(123) isConst: false isDelegatedProperty: false isExtension: false @@ -73,7 +73,7 @@ KtKotlinPropertySymbol: hasBackingField: true hasGetter: true hasSetter: false - initializer: KtUnsupportedConstantValue + initializer: KtNonConstantInitializerValue(object : Runnable { ...) isConst: false isDelegatedProperty: false isExtension: false diff --git a/analysis/analysis-api/testData/symbols/symbolByPsi/classMembes.txt b/analysis/analysis-api/testData/symbols/symbolByPsi/classMembes.txt index 0a21ca13ec5..ca42a107067 100644 --- a/analysis/analysis-api/testData/symbols/symbolByPsi/classMembes.txt +++ b/analysis/analysis-api/testData/symbols/symbolByPsi/classMembes.txt @@ -5,7 +5,7 @@ KtKotlinPropertySymbol: hasBackingField: true hasGetter: true hasSetter: false - initializer: 10 + initializer: KtConstantInitializerValue(10) isConst: false isDelegatedProperty: false isExtension: false diff --git a/analysis/analysis-api/testData/symbols/symbolByPsi/delegateField.descriptors.txt b/analysis/analysis-api/testData/symbols/symbolByPsi/delegateField.descriptors.txt deleted file mode 100644 index 7898591fb5d..00000000000 --- a/analysis/analysis-api/testData/symbols/symbolByPsi/delegateField.descriptors.txt +++ /dev/null @@ -1,218 +0,0 @@ -KtValueParameterSymbol: - annotationsList: [] - callableIdIfNonLocal: null - hasDefaultValue: false - isExtension: false - isVararg: false - name: x - origin: SOURCE - receiverType: null - symbolKind: LOCAL - type: kotlin/Int - deprecationStatus: null - -KtValueParameterSymbol: - annotationsList: [] - callableIdIfNonLocal: null - hasDefaultValue: false - isExtension: false - isVararg: false - name: y - origin: SOURCE - receiverType: null - symbolKind: LOCAL - type: kotlin/Int - deprecationStatus: null - -KtValueParameterSymbol: - annotationsList: [] - callableIdIfNonLocal: null - hasDefaultValue: false - isExtension: false - isVararg: false - name: z - origin: SOURCE - receiverType: null - symbolKind: LOCAL - type: kotlin/Int - deprecationStatus: null - -KtConstructorSymbol: - annotationsList: [] - callableIdIfNonLocal: null - containingClassIdIfNonLocal: MyColor - hasStableParameterNames: true - isExtension: false - isPrimary: true - origin: SOURCE - receiverType: null - symbolKind: CLASS_MEMBER - type: MyColor - typeParameters: [] - valueParameters: [ - KtValueParameterSymbol(x) - KtValueParameterSymbol(y) - KtValueParameterSymbol(z) - ] - visibility: Public - deprecationStatus: null - -KtNamedClassOrObjectSymbol: - annotationsList: [] - classIdIfNonLocal: MyColor - classKind: CLASS - companionObject: null - isData: false - isExternal: false - isFun: false - isInline: false - isInner: false - modality: FINAL - name: MyColor - origin: SOURCE - superTypes: [ - kotlin/Any - ] - symbolKind: TOP_LEVEL - typeParameters: [] - visibility: Public - deprecationStatus: null - -KtAnonymousFunctionSymbol: - callableIdIfNonLocal: null - hasStableParameterNames: true - isExtension: false - origin: SOURCE - receiverType: null - symbolKind: LOCAL - type: MyColor - valueParameters: [] - deprecationStatus: null - -KtKotlinPropertySymbol: - annotationsList: [] - callableIdIfNonLocal: /Some.delegate - getter: KtPropertyGetterSymbol() - hasBackingField: false - hasGetter: true - hasSetter: false - initializer: null - isConst: false - isDelegatedProperty: true - isExtension: false - isFromPrimaryConstructor: false - isLateInit: false - isOverride: false - isStatic: false - isVal: true - modality: FINAL - name: delegate - origin: SOURCE - receiverType: null - setter: null - symbolKind: CLASS_MEMBER - type: MyColor - typeParameters: [] - visibility: Public - getDispatchReceiver(): Some - deprecationStatus: null - getterDeprecationStatus: null - javaGetterName: getDelegate - javaSetterName: null - setterDeprecationStatus: null - -KtAnonymousFunctionSymbol: - callableIdIfNonLocal: null - hasStableParameterNames: true - isExtension: false - origin: SOURCE - receiverType: null - symbolKind: LOCAL - type: MyColor - valueParameters: [] - deprecationStatus: null - -KtKotlinPropertySymbol: - annotationsList: [] - callableIdIfNonLocal: /Some.lambda - getter: KtPropertyGetterSymbol() - hasBackingField: true - hasGetter: true - hasSetter: false - initializer: KtUnsupportedConstantValue - isConst: false - isDelegatedProperty: false - isExtension: false - isFromPrimaryConstructor: false - isLateInit: false - isOverride: false - isStatic: false - isVal: true - modality: FINAL - name: lambda - origin: SOURCE - receiverType: null - setter: null - symbolKind: CLASS_MEMBER - type: kotlin/Lazy - typeParameters: [] - visibility: Public - getDispatchReceiver(): Some - deprecationStatus: null - getterDeprecationStatus: null - javaGetterName: getLambda - javaSetterName: null - setterDeprecationStatus: null - -KtKotlinPropertySymbol: - annotationsList: [] - callableIdIfNonLocal: /Some.nonLazy - getter: KtPropertyGetterSymbol() - hasBackingField: true - hasGetter: true - hasSetter: false - initializer: KtUnsupportedConstantValue - isConst: false - isDelegatedProperty: false - isExtension: false - isFromPrimaryConstructor: false - isLateInit: false - isOverride: false - isStatic: false - isVal: true - modality: FINAL - name: nonLazy - origin: SOURCE - receiverType: null - setter: null - symbolKind: CLASS_MEMBER - type: MyColor - typeParameters: [] - visibility: Public - getDispatchReceiver(): Some - deprecationStatus: null - getterDeprecationStatus: null - javaGetterName: getNonLazy - javaSetterName: null - setterDeprecationStatus: null - -KtNamedClassOrObjectSymbol: - annotationsList: [] - classIdIfNonLocal: Some - classKind: CLASS - companionObject: null - isData: false - isExternal: false - isFun: false - isInline: false - isInner: false - modality: FINAL - name: Some - origin: SOURCE - superTypes: [ - kotlin/Any - ] - symbolKind: TOP_LEVEL - typeParameters: [] - visibility: Public - deprecationStatus: null \ No newline at end of file diff --git a/analysis/analysis-api/testData/symbols/symbolByPsi/delegateField.txt b/analysis/analysis-api/testData/symbols/symbolByPsi/delegateField.txt index 578b91f5475..c14fc816fe0 100644 --- a/analysis/analysis-api/testData/symbols/symbolByPsi/delegateField.txt +++ b/analysis/analysis-api/testData/symbols/symbolByPsi/delegateField.txt @@ -139,7 +139,7 @@ KtKotlinPropertySymbol: hasBackingField: true hasGetter: true hasSetter: false - initializer: null + initializer: KtNonConstantInitializerValue(lazy { MyColor(1, 2, 3) }) isConst: false isDelegatedProperty: false isExtension: false @@ -171,7 +171,7 @@ KtKotlinPropertySymbol: hasBackingField: true hasGetter: true hasSetter: false - initializer: null + initializer: KtNonConstantInitializerValue(MyColor(1, 2, 3)) isConst: false isDelegatedProperty: false isExtension: false diff --git a/analysis/analysis-api/testData/symbols/symbolByPsi/deprecated.descriptors.txt b/analysis/analysis-api/testData/symbols/symbolByPsi/deprecated.descriptors.txt index ddd440b8c34..ad905b6a6fe 100644 --- a/analysis/analysis-api/testData/symbols/symbolByPsi/deprecated.descriptors.txt +++ b/analysis/analysis-api/testData/symbols/symbolByPsi/deprecated.descriptors.txt @@ -8,7 +8,7 @@ KtKotlinPropertySymbol: hasBackingField: true hasGetter: true hasSetter: false - initializer: 1 + initializer: KtConstantInitializerValue(1) isConst: false isDelegatedProperty: false isExtension: false @@ -39,7 +39,7 @@ KtKotlinPropertySymbol: hasBackingField: true hasGetter: true hasSetter: false - initializer: 1 + initializer: KtConstantInitializerValue(1) isConst: false isDelegatedProperty: false isExtension: false @@ -70,7 +70,7 @@ KtKotlinPropertySymbol: hasBackingField: true hasGetter: true hasSetter: true - initializer: 1 + initializer: KtConstantInitializerValue(1) isConst: false isDelegatedProperty: false isExtension: false @@ -101,7 +101,7 @@ KtKotlinPropertySymbol: hasBackingField: true hasGetter: true hasSetter: true - initializer: 1 + initializer: KtConstantInitializerValue(1) isConst: false isDelegatedProperty: false isExtension: false @@ -185,7 +185,7 @@ KtKotlinPropertySymbol: hasBackingField: true hasGetter: true hasSetter: false - initializer: 1 + initializer: KtConstantInitializerValue(1) isConst: false isDelegatedProperty: false isExtension: false @@ -268,7 +268,7 @@ KtKotlinPropertySymbol: hasBackingField: true hasGetter: true hasSetter: false - initializer: 2 + initializer: KtConstantInitializerValue(2) isConst: false isDelegatedProperty: false isExtension: false @@ -302,7 +302,7 @@ KtKotlinPropertySymbol: hasBackingField: true hasGetter: true hasSetter: false - initializer: 2 + initializer: KtConstantInitializerValue(2) isConst: false isDelegatedProperty: false isExtension: false @@ -333,7 +333,7 @@ KtKotlinPropertySymbol: hasBackingField: true hasGetter: true hasSetter: false - initializer: 2 + initializer: KtConstantInitializerValue(2) isConst: false isDelegatedProperty: false isExtension: false diff --git a/analysis/analysis-api/testData/symbols/symbolByPsi/deprecated.txt b/analysis/analysis-api/testData/symbols/symbolByPsi/deprecated.txt index 8aba5cd0602..01b88addd66 100644 --- a/analysis/analysis-api/testData/symbols/symbolByPsi/deprecated.txt +++ b/analysis/analysis-api/testData/symbols/symbolByPsi/deprecated.txt @@ -8,7 +8,7 @@ KtKotlinPropertySymbol: hasBackingField: true hasGetter: true hasSetter: false - initializer: 1 + initializer: KtConstantInitializerValue(1) isConst: false isDelegatedProperty: false isExtension: false @@ -39,7 +39,7 @@ KtKotlinPropertySymbol: hasBackingField: true hasGetter: true hasSetter: false - initializer: 1 + initializer: KtConstantInitializerValue(1) isConst: false isDelegatedProperty: false isExtension: false @@ -70,7 +70,7 @@ KtKotlinPropertySymbol: hasBackingField: true hasGetter: true hasSetter: true - initializer: 1 + initializer: KtConstantInitializerValue(1) isConst: false isDelegatedProperty: false isExtension: false @@ -101,7 +101,7 @@ KtKotlinPropertySymbol: hasBackingField: true hasGetter: true hasSetter: true - initializer: 1 + initializer: KtConstantInitializerValue(1) isConst: false isDelegatedProperty: false isExtension: false @@ -185,7 +185,7 @@ KtKotlinPropertySymbol: hasBackingField: true hasGetter: true hasSetter: false - initializer: 1 + initializer: KtConstantInitializerValue(1) isConst: false isDelegatedProperty: false isExtension: false @@ -268,7 +268,7 @@ KtKotlinPropertySymbol: hasBackingField: true hasGetter: true hasSetter: false - initializer: 2 + initializer: KtConstantInitializerValue(2) isConst: false isDelegatedProperty: false isExtension: false @@ -302,7 +302,7 @@ KtKotlinPropertySymbol: hasBackingField: true hasGetter: true hasSetter: false - initializer: 2 + initializer: KtConstantInitializerValue(2) isConst: false isDelegatedProperty: false isExtension: false @@ -336,7 +336,7 @@ KtKotlinPropertySymbol: hasBackingField: true hasGetter: true hasSetter: false - initializer: 2 + initializer: KtConstantInitializerValue(2) isConst: false isDelegatedProperty: false isExtension: false diff --git a/analysis/analysis-api/testData/symbols/symbolByPsi/memberProperties.descriptors.txt b/analysis/analysis-api/testData/symbols/symbolByPsi/memberProperties.descriptors.txt index 439033b77fc..6af203fdfdb 100644 --- a/analysis/analysis-api/testData/symbols/symbolByPsi/memberProperties.descriptors.txt +++ b/analysis/analysis-api/testData/symbols/symbolByPsi/memberProperties.descriptors.txt @@ -5,7 +5,7 @@ KtKotlinPropertySymbol: hasBackingField: true hasGetter: true hasSetter: false - initializer: 10 + initializer: KtConstantInitializerValue(10) isConst: false isDelegatedProperty: false isExtension: false diff --git a/analysis/analysis-api/testData/symbols/symbolByPsi/memberProperties.txt b/analysis/analysis-api/testData/symbols/symbolByPsi/memberProperties.txt index 6948845b57f..50ee7fbea37 100644 --- a/analysis/analysis-api/testData/symbols/symbolByPsi/memberProperties.txt +++ b/analysis/analysis-api/testData/symbols/symbolByPsi/memberProperties.txt @@ -5,7 +5,7 @@ KtKotlinPropertySymbol: hasBackingField: true hasGetter: true hasSetter: false - initializer: 10 + initializer: KtConstantInitializerValue(10) isConst: false isDelegatedProperty: false isExtension: false diff --git a/analysis/analysis-api/testData/symbols/symbolByPsi/topLevelProperties.descriptors.txt b/analysis/analysis-api/testData/symbols/symbolByPsi/topLevelProperties.descriptors.txt index 07123a5c7ed..2ffb262c35e 100644 --- a/analysis/analysis-api/testData/symbols/symbolByPsi/topLevelProperties.descriptors.txt +++ b/analysis/analysis-api/testData/symbols/symbolByPsi/topLevelProperties.descriptors.txt @@ -5,7 +5,7 @@ KtKotlinPropertySymbol: hasBackingField: true hasGetter: true hasSetter: false - initializer: 10 + initializer: KtConstantInitializerValue(10) isConst: false isDelegatedProperty: false isExtension: false diff --git a/analysis/analysis-api/testData/symbols/symbolByPsi/topLevelProperties.txt b/analysis/analysis-api/testData/symbols/symbolByPsi/topLevelProperties.txt index daf354f2fb6..164b0ac0eb2 100644 --- a/analysis/analysis-api/testData/symbols/symbolByPsi/topLevelProperties.txt +++ b/analysis/analysis-api/testData/symbols/symbolByPsi/topLevelProperties.txt @@ -5,7 +5,7 @@ KtKotlinPropertySymbol: hasBackingField: true hasGetter: true hasSetter: false - initializer: 10 + initializer: KtConstantInitializerValue(10) isConst: false isDelegatedProperty: false isExtension: false diff --git a/analysis/analysis-api/testData/symbols/symbolByPsi/typeAnnotations.descriptors.txt b/analysis/analysis-api/testData/symbols/symbolByPsi/typeAnnotations.descriptors.txt index 9ff1b5e17a2..838f2801dc3 100644 --- a/analysis/analysis-api/testData/symbols/symbolByPsi/typeAnnotations.descriptors.txt +++ b/analysis/analysis-api/testData/symbols/symbolByPsi/typeAnnotations.descriptors.txt @@ -167,7 +167,7 @@ KtKotlinPropertySymbol: hasBackingField: true hasGetter: true hasSetter: false - initializer: KtUnsupportedConstantValue + initializer: KtNonConstantInitializerValue(this) isConst: false isDelegatedProperty: false isExtension: false diff --git a/analysis/analysis-api/testData/symbols/symbolByPsi/typeAnnotations.txt b/analysis/analysis-api/testData/symbols/symbolByPsi/typeAnnotations.txt index 3c1b900aee6..a95fa42b153 100644 --- a/analysis/analysis-api/testData/symbols/symbolByPsi/typeAnnotations.txt +++ b/analysis/analysis-api/testData/symbols/symbolByPsi/typeAnnotations.txt @@ -167,7 +167,7 @@ KtKotlinPropertySymbol: hasBackingField: true hasGetter: true hasSetter: false - initializer: KtUnsupportedConstantValue + initializer: KtNonConstantInitializerValue(this) isConst: false isDelegatedProperty: false isExtension: false diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/fields/FirLightFieldForPropertySymbol.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/fields/FirLightFieldForPropertySymbol.kt index 0e5b7768d4c..95a7c1f8ac7 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/fields/FirLightFieldForPropertySymbol.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/fields/FirLightFieldForPropertySymbol.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.light.classes.symbol import com.intellij.psi.* +import org.jetbrains.kotlin.analysis.api.KtConstantInitializerValue import org.jetbrains.kotlin.asJava.builder.LightMemberOrigin import org.jetbrains.kotlin.asJava.classes.lazyPub import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget @@ -111,7 +112,8 @@ internal class FirLightFieldForPropertySymbol( if (propertySymbol !is KtKotlinPropertySymbol) return@lazyPub null if (!propertySymbol.isConst) return@lazyPub null if (!propertySymbol.isVal) return@lazyPub null - (propertySymbol.initializer as? KtLiteralConstantValue<*>)?.createPsiLiteral(this) + val constInitializer = propertySymbol.initializer as? KtConstantInitializerValue ?: return@lazyPub null + (constInitializer.constant as? KtLiteralConstantValue<*>)?.createPsiLiteral(this) } override fun getInitializer(): PsiExpression? = _initializer