[AA LC] Implement default values for methods of annotations
This commit is contained in:
+3
-1
@@ -28,6 +28,7 @@ import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken
|
||||
import org.jetbrains.kotlin.analysis.api.types.KtType
|
||||
import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.LLFirResolveSession
|
||||
import org.jetbrains.kotlin.descriptors.ClassKind
|
||||
import org.jetbrains.kotlin.descriptors.Modality
|
||||
import org.jetbrains.kotlin.descriptors.Visibility
|
||||
import org.jetbrains.kotlin.fir.containingClass
|
||||
@@ -39,6 +40,7 @@ import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirSyntheticPropertySymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.isExtension
|
||||
import org.jetbrains.kotlin.fir.types.toRegularClassSymbol
|
||||
import org.jetbrains.kotlin.name.CallableId
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
|
||||
@@ -68,7 +70,7 @@ internal class KtFirKotlinPropertySymbol(
|
||||
override val contextReceivers: List<KtContextReceiver> by cached { firSymbol.createContextReceivers(builder) }
|
||||
|
||||
override val isExtension: Boolean get() = withValidityAssertion { firSymbol.isExtension }
|
||||
override val initializer: KtInitializerValue? by cached { firSymbol.getKtConstantInitializer() }
|
||||
override val initializer: KtInitializerValue? by cached { firSymbol.getKtConstantInitializer(firResolveSession) }
|
||||
|
||||
override val symbolKind: KtSymbolKind
|
||||
get() = withValidityAssertion {
|
||||
|
||||
+1
-1
@@ -51,7 +51,7 @@ internal class KtFirSyntheticJavaPropertySymbol(
|
||||
|
||||
override val isExtension: Boolean get() = withValidityAssertion { firSymbol.isExtension }
|
||||
|
||||
override val initializer: KtInitializerValue? by cached { firSymbol.getKtConstantInitializer() }
|
||||
override val initializer: KtInitializerValue? by cached { firSymbol.getKtConstantInitializer(firResolveSession) }
|
||||
|
||||
override val modality: Modality get() = withValidityAssertion { firSymbol.modality ?: firSymbol.invalidModalityError() }
|
||||
override val visibility: Visibility get() = withValidityAssertion { firSymbol.visibility }
|
||||
|
||||
+23
-8
@@ -15,16 +15,18 @@ import org.jetbrains.kotlin.analysis.api.fir.utils.asKtInitializerValue
|
||||
import org.jetbrains.kotlin.analysis.api.impl.base.KtContextReceiverImpl
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtValueParameterSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.types.KtType
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.LLFirResolveSession
|
||||
import org.jetbrains.kotlin.analysis.utils.printer.getElementTextInContext
|
||||
import org.jetbrains.kotlin.fir.declarations.FirContextReceiver
|
||||
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
|
||||
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
||||
import org.jetbrains.kotlin.fir.declarations.FirTypeParameterRefsOwner
|
||||
import org.jetbrains.kotlin.descriptors.ClassKind
|
||||
import org.jetbrains.kotlin.fir.declarations.*
|
||||
import org.jetbrains.kotlin.fir.expressions.FirPropertyAccessExpression
|
||||
import org.jetbrains.kotlin.fir.psi
|
||||
import org.jetbrains.kotlin.fir.references.impl.FirPropertyFromParameterResolvedNamedReference
|
||||
import org.jetbrains.kotlin.fir.renderer.FirRenderer
|
||||
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.*
|
||||
import org.jetbrains.kotlin.fir.types.toRegularClassSymbol
|
||||
import org.jetbrains.kotlin.name.CallableId
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.psi.KtDeclaration
|
||||
@@ -89,8 +91,21 @@ internal fun FirCallableSymbol<*>.dispatchReceiverType(
|
||||
return dispatchReceiverType?.let { builder.typeBuilder.buildKtType(it) }
|
||||
}
|
||||
|
||||
internal fun FirVariableSymbol<*>.getKtConstantInitializer(): KtInitializerValue? {
|
||||
internal fun FirVariableSymbol<*>.getKtConstantInitializer(resolveSession: LLFirResolveSession): KtInitializerValue? {
|
||||
lazyResolveToPhase(FirResolvePhase.BODY_RESOLVE)
|
||||
val firInitializer = fir.initializer ?: return null
|
||||
return firInitializer.asKtInitializerValue()
|
||||
}
|
||||
var firInitializer = fir.initializer ?: return null
|
||||
if (firInitializer is FirPropertyAccessExpression) {
|
||||
val calleeReference = firInitializer.calleeReference
|
||||
if (calleeReference is FirPropertyFromParameterResolvedNamedReference) {
|
||||
val valueParameterSymbol = calleeReference.resolvedSymbol as? FirValueParameterSymbol
|
||||
if (valueParameterSymbol != null) {
|
||||
valueParameterSymbol.lazyResolveToPhase(FirResolvePhase.BODY_RESOLVE)
|
||||
firInitializer = valueParameterSymbol.fir.defaultValue ?: firInitializer
|
||||
}
|
||||
}
|
||||
}
|
||||
val parentIsAnnotation = dispatchReceiverType
|
||||
?.toRegularClassSymbol(resolveSession.useSiteFirSession)
|
||||
?.classKind == ClassKind.ANNOTATION_CLASS
|
||||
return firInitializer.asKtInitializerValue(moduleData.session, parentIsAnnotation)
|
||||
}
|
||||
|
||||
+16
-2
@@ -6,9 +6,11 @@ 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.KtConstantValueForAnnotation
|
||||
import org.jetbrains.kotlin.analysis.api.KtInitializerValue
|
||||
import org.jetbrains.kotlin.analysis.api.KtNonConstantInitializerValue
|
||||
import org.jetbrains.kotlin.analysis.api.components.KtConstantEvaluationMode
|
||||
import org.jetbrains.kotlin.analysis.api.fir.evaluate.FirAnnotationValueConverter
|
||||
import org.jetbrains.kotlin.analysis.api.fir.evaluate.FirCompileTimeConstantEvaluator
|
||||
import org.jetbrains.kotlin.analysis.api.fir.getCandidateSymbols
|
||||
import org.jetbrains.kotlin.analysis.api.types.KtTypeNullability
|
||||
@@ -89,12 +91,24 @@ internal fun FirCallableSymbol<*>.computeImportableName(useSiteSession: FirSessi
|
||||
return if (canBeImported) callableId.asSingleFqName() else null
|
||||
}
|
||||
|
||||
internal fun FirExpression.asKtInitializerValue(): KtInitializerValue {
|
||||
internal fun FirExpression.asKtInitializerValue(
|
||||
session: FirSession,
|
||||
forAnnotationDefaultValue: Boolean
|
||||
): KtInitializerValue {
|
||||
val ktExpression = psi as? KtExpression
|
||||
val evaluated =
|
||||
FirCompileTimeConstantEvaluator.evaluateAsKtConstantValue(this, KtConstantEvaluationMode.CONSTANT_EXPRESSION_EVALUATION)
|
||||
return when (evaluated) {
|
||||
null -> KtNonConstantInitializerValue(ktExpression)
|
||||
null -> if (forAnnotationDefaultValue) {
|
||||
val annotationConstantValue = FirAnnotationValueConverter.toConstantValue(this, session)
|
||||
if (annotationConstantValue != null) {
|
||||
KtConstantValueForAnnotation(annotationConstantValue, ktExpression)
|
||||
} else {
|
||||
KtNonConstantInitializerValue(ktExpression)
|
||||
}
|
||||
} else {
|
||||
KtNonConstantInitializerValue(ktExpression)
|
||||
}
|
||||
else -> KtConstantInitializerValue(evaluated, ktExpression)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user