From fc1eb0259044dc60793b44b44e6acd1ed419e378 Mon Sep 17 00:00:00 2001 From: Jinseong Jeon Date: Thu, 22 Sep 2022 23:03:49 -0700 Subject: [PATCH] SLC: implement PsiVariable#computeConstantValue for light field --- .../classes/symbol/fields/SymbolLightField.kt | 2 +- .../fields/SymbolLightFieldForProperty.kt | 23 ++++++++++++--- .../TraitClassObjectField.fir.java | 4 +-- .../lightClasses/object/SimpleObject.fir.java | 26 ----------------- .../asJava/ultraLightClasses/objects.fir.java | 28 +++++++++---------- .../multifileFacade.fir.java | 2 +- .../ultraLightFacades/properties.fir.java | 2 +- 7 files changed, 38 insertions(+), 49 deletions(-) delete mode 100644 compiler/testData/asJava/lightClasses/object/SimpleObject.fir.java diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/fields/SymbolLightField.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/fields/SymbolLightField.kt index c0fd7c409ad..cf6a609ea26 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/fields/SymbolLightField.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/fields/SymbolLightField.kt @@ -38,7 +38,7 @@ internal abstract class SymbolLightField protected constructor( override fun getContainingFile(): PsiFile? = containingClass.containingFile override fun hasInitializer(): Boolean = initializer !== null - override fun computeConstantValue(): Any? = null //TODO _constantInitializer?.value + override fun computeConstantValue(): Any? = null override fun computeConstantValue(visitedVars: MutableSet?): Any? = computeConstantValue() diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/fields/SymbolLightFieldForProperty.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/fields/SymbolLightFieldForProperty.kt index ddef038c86b..0235bb4cbc7 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/fields/SymbolLightFieldForProperty.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/fields/SymbolLightFieldForProperty.kt @@ -8,7 +8,6 @@ package org.jetbrains.kotlin.light.classes.symbol.fields import com.intellij.psi.* import org.jetbrains.kotlin.analysis.api.KtAnalysisSession import org.jetbrains.kotlin.analysis.api.KtConstantInitializerValue -import org.jetbrains.kotlin.analysis.api.base.KtConstantValue import org.jetbrains.kotlin.analysis.api.lifetime.isValid import org.jetbrains.kotlin.analysis.api.symbols.KtKotlinPropertySymbol import org.jetbrains.kotlin.analysis.api.symbols.KtPropertySymbol @@ -115,14 +114,30 @@ internal class SymbolLightFieldForProperty( override fun getModifierList(): PsiModifierList = _modifierList - private val _initializer by lazyPub { + private val _initializerValue by lazyPub { if (propertySymbol !is KtKotlinPropertySymbol) return@lazyPub null - val constInitializer = propertySymbol.initializer as? KtConstantInitializerValue ?: return@lazyPub null - (constInitializer.constant as? KtConstantValue)?.createPsiLiteral(this) + (propertySymbol.initializer as? KtConstantInitializerValue)?.constant + } + + private val _initializer by lazyPub { + _initializerValue?.createPsiLiteral(this) } override fun getInitializer(): PsiExpression? = _initializer + private val _constantValue by lazyPub { + _initializerValue?.value?.takeIf { + // val => final + propertySymbol.isVal && + // NB: not as?, since _initializerValue already checks that + (propertySymbol as KtKotlinPropertySymbol).isConst && + // javac rejects all non-primitive and non String constants + (propertySymbol.returnType.isPrimitive || propertySymbol.returnType.isString) + } + } + + override fun computeConstantValue(): Any? = _constantValue + override fun equals(other: Any?): Boolean = this === other || (other is SymbolLightFieldForProperty && diff --git a/compiler/testData/asJava/lightClasses/compilationErrors/TraitClassObjectField.fir.java b/compiler/testData/asJava/lightClasses/compilationErrors/TraitClassObjectField.fir.java index 0a3b24f1877..cdddaa4f148 100644 --- a/compiler/testData/asJava/lightClasses/compilationErrors/TraitClassObjectField.fir.java +++ b/compiler/testData/asJava/lightClasses/compilationErrors/TraitClassObjectField.fir.java @@ -3,12 +3,12 @@ public abstract interface TraitClassObjectField /* TraitClassObjectField*/ { public static final TraitClassObjectField.Companion Companion; @org.jetbrains.annotations.Nullable() - public static final java.lang.String x = "" /* initializer type: java.lang.String */; + public static final java.lang.String x = "" /* initializer type: java.lang.String */ /* constant value */; public static final class Companion /* TraitClassObjectField.Companion*/ { @org.jetbrains.annotations.Nullable() - private final java.lang.String x = "" /* initializer type: java.lang.String */; + private final java.lang.String x = "" /* initializer type: java.lang.String */ /* constant value */; @org.jetbrains.annotations.Nullable() private final java.lang.String y; diff --git a/compiler/testData/asJava/lightClasses/object/SimpleObject.fir.java b/compiler/testData/asJava/lightClasses/object/SimpleObject.fir.java deleted file mode 100644 index 61d8c601e9b..00000000000 --- a/compiler/testData/asJava/lightClasses/object/SimpleObject.fir.java +++ /dev/null @@ -1,26 +0,0 @@ -public final class A /* pack.A*/ { - @org.jetbrains.annotations.NotNull() - private static java.lang.String v; - - @org.jetbrains.annotations.NotNull() - public static final java.lang.String cv = "A" /* initializer type: java.lang.String */; - - @org.jetbrains.annotations.NotNull() - public static final pack.A INSTANCE; - - private static final int c; - - public static final int cc = 1 /* initializer type: int */; - - @org.jetbrains.annotations.NotNull() - public final java.lang.String getV();// getV() - - private A();// .ctor() - - public final int f();// f() - - public final int getC();// getC() - - public final void setV(@org.jetbrains.annotations.NotNull() java.lang.String);// setV(java.lang.String) - -} diff --git a/compiler/testData/asJava/ultraLightClasses/objects.fir.java b/compiler/testData/asJava/ultraLightClasses/objects.fir.java index c07f735f276..9c49b56c7eb 100644 --- a/compiler/testData/asJava/ultraLightClasses/objects.fir.java +++ b/compiler/testData/asJava/ultraLightClasses/objects.fir.java @@ -121,19 +121,19 @@ public final class ConstContainer /* ConstContainer*/ { public static final ConstContainer INSTANCE; @org.jetbrains.annotations.NotNull() - public static final java.lang.String str = "one" /* initializer type: java.lang.String */; + public static final java.lang.String str = "one" /* initializer type: java.lang.String */ /* constant value one */; - public static final double complexFloat = 5.118281745910645 /* initializer type: double */; + public static final double complexFloat = 5.118281745910645 /* initializer type: double */ /* constant value 5.118281745910645 */; - public static final double e = 2.7182818284 /* initializer type: double */; + public static final double e = 2.7182818284 /* initializer type: double */ /* constant value 2.7182818284 */; - public static final float eFloat = 2.7182817f /* initializer type: float */; + public static final float eFloat = 2.7182817f /* initializer type: float */ /* constant value 2.7182817 */; - public static final int one = 1 /* initializer type: int */; + public static final int one = 1 /* initializer type: int */ /* constant value 1 */; - public static final long complexLong = 2L /* initializer type: long */; + public static final long complexLong = 2L /* initializer type: long */ /* constant value 2 */; - public static final long oneLong = 1L /* initializer type: long */; + public static final long oneLong = 1L /* initializer type: long */ /* constant value 1 */; private ConstContainer();// .ctor() @@ -144,19 +144,19 @@ public final class ClassWithConstContainer /* ClassWithConstContainer*/ { public static final ClassWithConstContainer.Companion Companion; @org.jetbrains.annotations.NotNull() - public static final java.lang.String str = "one" /* initializer type: java.lang.String */; + public static final java.lang.String str = "one" /* initializer type: java.lang.String */ /* constant value one */; - public static final double complexFloat = 5.118281745910645 /* initializer type: double */; + public static final double complexFloat = 5.118281745910645 /* initializer type: double */ /* constant value 5.118281745910645 */; - public static final double e = 2.7182818284 /* initializer type: double */; + public static final double e = 2.7182818284 /* initializer type: double */ /* constant value 2.7182818284 */; - public static final float eFloat = 2.7182817f /* initializer type: float */; + public static final float eFloat = 2.7182817f /* initializer type: float */ /* constant value 2.7182817 */; - public static final int one = 1 /* initializer type: int */; + public static final int one = 1 /* initializer type: int */ /* constant value 1 */; - public static final long complexLong = 2L /* initializer type: long */; + public static final long complexLong = 2L /* initializer type: long */ /* constant value 2 */; - public static final long oneLong = 1L /* initializer type: long */; + public static final long oneLong = 1L /* initializer type: long */ /* constant value 1 */; public ClassWithConstContainer();// .ctor() diff --git a/compiler/testData/asJava/ultraLightFacades/multifileFacade.fir.java b/compiler/testData/asJava/ultraLightFacades/multifileFacade.fir.java index fc228761279..557a4ef9262 100644 --- a/compiler/testData/asJava/ultraLightFacades/multifileFacade.fir.java +++ b/compiler/testData/asJava/ultraLightFacades/multifileFacade.fir.java @@ -1,5 +1,5 @@ public final class multifileFacade /* multifileFacade*/ { - public static final int x1 = 42 /* initializer type: int */; + public static final int x1 = 42 /* initializer type: int */ /* constant value 42 */; public static final int foo();// foo() diff --git a/compiler/testData/asJava/ultraLightFacades/properties.fir.java b/compiler/testData/asJava/ultraLightFacades/properties.fir.java index ab09a66815e..9d416ff8f1c 100644 --- a/compiler/testData/asJava/ultraLightFacades/properties.fir.java +++ b/compiler/testData/asJava/ultraLightFacades/properties.fir.java @@ -24,7 +24,7 @@ public final class PropertiesKt /* PropertiesKt*/ { private static java.lang.String x$1 = "" /* initializer type: java.lang.String */; @org.jetbrains.annotations.NotNull() - public static final java.lang.String SUBSYSTEM_DEPRECATED = "This subsystem is deprecated" /* initializer type: java.lang.String */; + public static final java.lang.String SUBSYSTEM_DEPRECATED = "This subsystem is deprecated" /* initializer type: java.lang.String */ /* constant value This subsystem is deprecated */; @org.jetbrains.annotations.Nullable() private static java.lang.Boolean isEmptyMutable;