Analysis API: introduce KtInitializerValue for initializer of KtPropertySymbol
This commit is contained in:
+6
-2
@@ -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 {
|
||||
|
||||
+4
-2
@@ -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 }
|
||||
|
||||
+4
-2
@@ -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 }
|
||||
|
||||
+31
-3
@@ -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)
|
||||
}
|
||||
+10
-18
@@ -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 }
|
||||
|
||||
Reference in New Issue
Block a user