SLC: implement PsiVariable#computeConstantValue for light field

This commit is contained in:
Jinseong Jeon
2022-09-22 23:03:49 -07:00
committed by Ilya Kirillov
parent a58e0803fb
commit fc1eb02590
7 changed files with 38 additions and 49 deletions
@@ -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<PsiVariable>?): Any? = computeConstantValue()
@@ -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 &&