[FIR] PsiRawFirBuilder: cleanup code

^KT-63042
This commit is contained in:
Dmitrii Gridin
2023-11-14 15:19:31 +01:00
committed by Space Team
parent 580c2a490d
commit 41998ae8ae
@@ -56,7 +56,7 @@ import org.jetbrains.kotlin.utils.exceptions.withPsiEntry
open class PsiRawFirBuilder( open class PsiRawFirBuilder(
session: FirSession, session: FirSession,
val baseScopeProvider: FirScopeProvider, val baseScopeProvider: FirScopeProvider,
bodyBuildingMode: BodyBuildingMode = BodyBuildingMode.NORMAL bodyBuildingMode: BodyBuildingMode = BodyBuildingMode.NORMAL,
) : AbstractRawFirBuilder<PsiElement>(session) { ) : AbstractRawFirBuilder<PsiElement>(session) {
protected open fun bindFunctionTarget(target: FirFunctionTarget, function: FirFunction) = target.bind(function) protected open fun bindFunctionTarget(target: FirFunctionTarget, function: FirFunction) = target.bind(function)
protected open fun FirFunctionBuilder.additionalFunctionInit() {} protected open fun FirFunctionBuilder.additionalFunctionInit() {}
@@ -139,7 +139,7 @@ open class PsiRawFirBuilder(
get() = (this as? KtArrayAccessExpression)?.indexExpressions get() = (this as? KtArrayAccessExpression)?.indexExpressions
override val PsiElement.isVararg: Boolean override val PsiElement.isVararg: Boolean
get() = (this as? KtParameter)?.isVarArg ?: false get() = (this as? KtParameter)?.isVarArg == true
private val KtModifierListOwner.visibility: Visibility private val KtModifierListOwner.visibility: Visibility
get() = with(modifierList) { get() = with(modifierList) {
@@ -184,7 +184,7 @@ open class PsiRawFirBuilder(
} }
private inline fun <reified R : FirElement> KtElement?.convertSafe(): R? = private inline fun <reified R : FirElement> KtElement?.convertSafe(): R? =
this?.let { convertElement(it, null)} as? R this?.let { convertElement(it, null) } as? R
private inline fun <reified R : FirElement> KtElement.convert(): R = private inline fun <reified R : FirElement> KtElement.convert(): R =
convertElement(this, null) as R convertElement(this, null) as R
@@ -200,11 +200,11 @@ open class PsiRawFirBuilder(
sourceElement: KtSourceElement?, sourceElement: KtSourceElement?,
buildExpression: () -> FirExpression, buildExpression: () -> FirExpression,
): FirExpression { ): FirExpression {
return buildOrLazy(buildExpression, { return buildOrLazy(buildExpression) {
buildLazyExpression { buildLazyExpression {
source = sourceElement source = sourceElement
} }
}) }
} }
private inline fun buildOrLazyBlock(buildBlock: () -> FirBlock): FirBlock { private inline fun buildOrLazyBlock(buildBlock: () -> FirBlock): FirBlock {
@@ -214,9 +214,9 @@ open class PsiRawFirBuilder(
private inline fun buildOrLazyDelegatedConstructorCall( private inline fun buildOrLazyDelegatedConstructorCall(
isThis: Boolean, isThis: Boolean,
constructedTypeRef: FirTypeRef, constructedTypeRef: FirTypeRef,
buildCall: () -> FirDelegatedConstructorCall buildCall: () -> FirDelegatedConstructorCall,
): FirDelegatedConstructorCall { ): FirDelegatedConstructorCall {
return buildOrLazy(buildCall, { return buildOrLazy(buildCall) {
buildLazyDelegatedConstructorCall { buildLazyDelegatedConstructorCall {
this.isThis = isThis this.isThis = isThis
this.constructedTypeRef = constructedTypeRef this.constructedTypeRef = constructedTypeRef
@@ -231,7 +231,7 @@ open class PsiRawFirBuilder(
} }
} }
} }
}) }
} }
open fun convertElement(element: KtElement, original: FirElement? = null): FirElement? = open fun convertElement(element: KtElement, original: FirElement? = null): FirElement? =
@@ -239,7 +239,7 @@ open class PsiRawFirBuilder(
open fun convertProperty( open fun convertProperty(
property: KtProperty, ownerRegularOrAnonymousObjectSymbol: FirClassSymbol<*>?, property: KtProperty, ownerRegularOrAnonymousObjectSymbol: FirClassSymbol<*>?,
ownerRegularClassTypeParametersCount: Int? ownerRegularClassTypeParametersCount: Int?,
): FirProperty = property.toFirProperty( ): FirProperty = property.toFirProperty(
ownerRegularOrAnonymousObjectSymbol, ownerRegularOrAnonymousObjectSymbol,
context context
@@ -267,7 +267,7 @@ open class PsiRawFirBuilder(
functionSymbol: FirFunctionSymbol<*>, functionSymbol: FirFunctionSymbol<*>,
defaultTypeRef: FirTypeRef? = null, defaultTypeRef: FirTypeRef? = null,
valueParameterDeclaration: ValueParameterDeclaration, valueParameterDeclaration: ValueParameterDeclaration,
additionalAnnotations: List<FirAnnotation> = emptyList() additionalAnnotations: List<FirAnnotation> = emptyList(),
): FirValueParameter = ): FirValueParameter =
valueParameter.toFirValueParameter(defaultTypeRef, functionSymbol, valueParameterDeclaration, additionalAnnotations) valueParameter.toFirValueParameter(defaultTypeRef, functionSymbol, valueParameterDeclaration, additionalAnnotations)
@@ -292,7 +292,7 @@ open class PsiRawFirBuilder(
private fun KtElement?.toFirExpression( private fun KtElement?.toFirExpression(
errorReason: String, errorReason: String,
kind: DiagnosticKind = DiagnosticKind.ExpressionExpected kind: DiagnosticKind = DiagnosticKind.ExpressionExpected,
): FirExpression = toFirExpression { ConeSimpleDiagnostic(errorReason, kind) } ): FirExpression = toFirExpression { ConeSimpleDiagnostic(errorReason, kind) }
private inline fun KtElement?.toFirExpression( private inline fun KtElement?.toFirExpression(
@@ -362,7 +362,7 @@ open class PsiRawFirBuilder(
delegatedSelfType: FirResolvedTypeRef, delegatedSelfType: FirResolvedTypeRef,
owner: KtClassOrObject, owner: KtClassOrObject,
ownerClassBuilder: FirClassBuilder, ownerClassBuilder: FirClassBuilder,
ownerTypeParameters: List<FirTypeParameterRef> ownerTypeParameters: List<FirTypeParameterRef>,
): FirDeclaration { ): FirDeclaration {
return when (this) { return when (this) {
is KtSecondaryConstructor -> { is KtSecondaryConstructor -> {
@@ -668,7 +668,7 @@ open class PsiRawFirBuilder(
this.name = name this.name = name
symbol = FirValueParameterSymbol(name) symbol = FirValueParameterSymbol(name)
defaultValue = if (hasDefaultValue()) { defaultValue = if (hasDefaultValue()) {
buildOrLazyExpression(null, { { this@toFirValueParameter.defaultValue }.toFirExpression("Should have default value") }) buildOrLazyExpression(null) { { this@toFirValueParameter.defaultValue }.toFirExpression("Should have default value") }
} else null } else null
isCrossinline = hasModifier(CROSSINLINE_KEYWORD) isCrossinline = hasModifier(CROSSINLINE_KEYWORD)
isNoinline = hasModifier(NOINLINE_KEYWORD) isNoinline = hasModifier(NOINLINE_KEYWORD)
@@ -810,7 +810,7 @@ open class PsiRawFirBuilder(
private fun KtTypeParameterListOwner.extractTypeParametersTo( private fun KtTypeParameterListOwner.extractTypeParametersTo(
container: FirTypeParameterRefsOwnerBuilder, container: FirTypeParameterRefsOwnerBuilder,
declarationSymbol: FirBasedSymbol<*> declarationSymbol: FirBasedSymbol<*>,
) { ) {
for (typeParameter in typeParameters) { for (typeParameter in typeParameters) {
container.typeParameters += extractTypeParameter(typeParameter, declarationSymbol) container.typeParameters += extractTypeParameter(typeParameter, declarationSymbol)
@@ -819,7 +819,7 @@ open class PsiRawFirBuilder(
private fun KtTypeParameterListOwner.extractTypeParametersTo( private fun KtTypeParameterListOwner.extractTypeParametersTo(
container: FirTypeParametersOwnerBuilder, container: FirTypeParametersOwnerBuilder,
declarationSymbol: FirBasedSymbol<*> declarationSymbol: FirBasedSymbol<*>,
) { ) {
for (typeParameter in typeParameters) { for (typeParameter in typeParameters) {
container.typeParameters += extractTypeParameter(typeParameter, declarationSymbol) container.typeParameters += extractTypeParameter(typeParameter, declarationSymbol)
@@ -953,7 +953,7 @@ open class PsiRawFirBuilder(
delegatedEnumSuperTypeRef: FirTypeRef?, delegatedEnumSuperTypeRef: FirTypeRef?,
classKind: ClassKind, classKind: ClassKind,
containerTypeParameters: List<FirTypeParameterRef>, containerTypeParameters: List<FirTypeParameterRef>,
containingClassIsExpectClass: Boolean containingClassIsExpectClass: Boolean,
): Pair<FirTypeRef, Map<Int, FirFieldSymbol>?> { ): Pair<FirTypeRef, Map<Int, FirFieldSymbol>?> {
var superTypeCallEntry: KtSuperTypeCallEntry? = null var superTypeCallEntry: KtSuperTypeCallEntry? = null
val allSuperTypeCallEntries = mutableListOf<Pair<KtSuperTypeCallEntry, FirTypeRef>>() val allSuperTypeCallEntries = mutableListOf<Pair<KtSuperTypeCallEntry, FirTypeRef>>()
@@ -1022,12 +1022,10 @@ open class PsiRawFirBuilder(
// We are never here as part of enum entry // We are never here as part of enum entry
val shouldGenerateImplicitPrimaryConstructor = val shouldGenerateImplicitPrimaryConstructor =
!hasSecondaryConstructors() && !hasSecondaryConstructors() &&
!(containingClassIsExpectClass && classKind != ClassKind.ENUM_CLASS) && !(containingClassIsExpectClass && classKind != ClassKind.ENUM_CLASS) &&
(this !is KtClass || !this.isInterface()) (this !is KtClass || !this.isInterface())
val hasPrimaryConstructor = primaryConstructor != null || shouldGenerateImplicitPrimaryConstructor val hasPrimaryConstructor = primaryConstructor != null || shouldGenerateImplicitPrimaryConstructor
if (hasPrimaryConstructor || superTypeCallEntry != null) { if (hasPrimaryConstructor || superTypeCallEntry != null) {
val firPrimaryConstructor = primaryConstructor.toFirConstructor( val firPrimaryConstructor = primaryConstructor.toFirConstructor(
superTypeCallEntry, superTypeCallEntry,
@@ -1043,6 +1041,7 @@ open class PsiRawFirBuilder(
) )
container.declarations += firPrimaryConstructor container.declarations += firPrimaryConstructor
} }
delegateFieldsMap.values.mapTo(container.declarations) { it.fir } delegateFieldsMap.values.mapTo(container.declarations) { it.fir }
return delegatedSuperTypeRef!! to delegateFieldsMap.takeIf { it.isNotEmpty() } return delegatedSuperTypeRef!! to delegateFieldsMap.takeIf { it.isNotEmpty() }
} }
@@ -1064,6 +1063,7 @@ open class PsiRawFirBuilder(
): FirConstructor { ): FirConstructor {
val constructorSource = this?.toFirSourceElement() val constructorSource = this?.toFirSourceElement()
?: owner.toKtPsiSourceElement(KtFakeSourceElementKind.ImplicitConstructor) ?: owner.toKtPsiSourceElement(KtFakeSourceElementKind.ImplicitConstructor)
fun buildDelegatedCall(superTypeCallEntry: KtSuperTypeCallEntry?, delegatedTypeRef: FirTypeRef): FirDelegatedConstructorCall? { fun buildDelegatedCall(superTypeCallEntry: KtSuperTypeCallEntry?, delegatedTypeRef: FirTypeRef): FirDelegatedConstructorCall? {
val constructorCall = superTypeCallEntry?.toFirSourceElement() val constructorCall = superTypeCallEntry?.toFirSourceElement()
val constructedTypeRef = if (copyConstructedTypeRefWithImplicitSource) { val constructedTypeRef = if (copyConstructedTypeRefWithImplicitSource) {
@@ -1086,6 +1086,7 @@ open class PsiRawFirBuilder(
} }
} }
} }
val firDelegatedCall = runUnless(containingClassIsExpectClass) { val firDelegatedCall = runUnless(containingClassIsExpectClass) {
if (allSuperTypeCallEntries.size <= 1) { if (allSuperTypeCallEntries.size <= 1) {
buildDelegatedCall(superTypeCallEntry, delegatedSuperTypeRef!!) buildDelegatedCall(superTypeCallEntry, delegatedSuperTypeRef!!)
@@ -1109,7 +1110,9 @@ open class PsiRawFirBuilder(
val status = FirDeclarationStatusImpl(explicitVisibility ?: defaultVisibility(), Modality.FINAL).apply { val status = FirDeclarationStatusImpl(explicitVisibility ?: defaultVisibility(), Modality.FINAL).apply {
isExpect = this@toFirConstructor?.hasExpectModifier() == true || this@PsiRawFirBuilder.context.containerIsExpect isExpect = this@toFirConstructor?.hasExpectModifier() == true || this@PsiRawFirBuilder.context.containerIsExpect
isActual = this@toFirConstructor?.hasActualModifier() == true || isImplicitlyActual isActual = this@toFirConstructor?.hasActualModifier() == true || isImplicitlyActual
isInner = owner.parent.parent !is KtScript && owner.hasModifier(INNER_KEYWORD) // a warning about inner script class is reported on the class itself
// a warning about inner script class is reported on the class itself
isInner = owner.parent.parent !is KtScript && owner.hasModifier(INNER_KEYWORD)
isFromSealedClass = owner.hasModifier(SEALED_KEYWORD) && explicitVisibility !== Visibilities.Private isFromSealedClass = owner.hasModifier(SEALED_KEYWORD) && explicitVisibility !== Visibilities.Private
isFromEnumClass = owner.hasModifier(ENUM_KEYWORD) isFromEnumClass = owner.hasModifier(ENUM_KEYWORD)
} }
@@ -1293,7 +1296,7 @@ open class PsiRawFirBuilder(
protected fun KtEnumEntry.toFirEnumEntry( protected fun KtEnumEntry.toFirEnumEntry(
delegatedEnumSelfTypeRef: FirResolvedTypeRef, delegatedEnumSelfTypeRef: FirResolvedTypeRef,
ownerClassHasDefaultConstructor: Boolean ownerClassHasDefaultConstructor: Boolean,
): FirDeclaration { ): FirDeclaration {
val ktEnumEntry = this@toFirEnumEntry val ktEnumEntry = this@toFirEnumEntry
val containingClassIsExpectClass = hasExpectModifier() || this@PsiRawFirBuilder.context.containerIsExpect val containingClassIsExpectClass = hasExpectModifier() || this@PsiRawFirBuilder.context.containerIsExpect
@@ -1865,7 +1868,7 @@ open class PsiRawFirBuilder(
delegatedTypeRef: FirTypeRef, delegatedTypeRef: FirTypeRef,
selfTypeRef: FirTypeRef, selfTypeRef: FirTypeRef,
owner: KtClassOrObject, owner: KtClassOrObject,
ownerTypeParameters: List<FirTypeParameterRef> ownerTypeParameters: List<FirTypeParameterRef>,
): FirConstructor { ): FirConstructor {
val target = FirFunctionTarget(labelName = null, isLambda = false) val target = FirFunctionTarget(labelName = null, isLambda = false)
return buildConstructor { return buildConstructor {
@@ -1952,7 +1955,7 @@ open class PsiRawFirBuilder(
private fun <T> KtProperty.toFirProperty( private fun <T> KtProperty.toFirProperty(
ownerRegularOrAnonymousObjectSymbol: FirClassSymbol<*>?, ownerRegularOrAnonymousObjectSymbol: FirClassSymbol<*>?,
context: Context<T> context: Context<T>,
): FirProperty { ): FirProperty {
val propertyType = typeReference.toFirOrImplicitType() val propertyType = typeReference.toFirOrImplicitType()
val propertyName = nameAsSafeName val propertyName = nameAsSafeName
@@ -2504,10 +2507,10 @@ open class PsiRawFirBuilder(
source = entrySource source = entrySource
condition = condition =
if (entry.conditions.size == 1 && ktCondition is KtWhenConditionWithExpression) { if (entry.conditions.size == 1 && ktCondition is KtWhenConditionWithExpression) {
(ktCondition.expression ?: ktCondition).toFirExpression( (ktCondition.expression ?: ktCondition).toFirExpression(
"No expression in condition with expression", "No expression in condition with expression",
DiagnosticKind.ExpressionExpected, DiagnosticKind.ExpressionExpected,
) )
} else { } else {
buildBalancedOrExpressionTree(entry.conditions.map { condition -> buildBalancedOrExpressionTree(entry.conditions.map { condition ->
if (condition is KtWhenConditionWithExpression) { if (condition is KtWhenConditionWithExpression) {
@@ -2561,7 +2564,7 @@ open class PsiRawFirBuilder(
if (parent is KtBlockExpression) return false if (parent is KtBlockExpression) return false
when (parent.elementType) { when (parent.elementType) {
KtNodeTypes.THEN, KtNodeTypes.ELSE, KtNodeTypes.WHEN_ENTRY -> { KtNodeTypes.THEN, KtNodeTypes.ELSE, KtNodeTypes.WHEN_ENTRY -> {
return (parent.parent as? KtExpression)?.usedAsExpression ?: true return (parent.parent as? KtExpression)?.usedAsExpression != false
} }
} }
if (parent is KtScriptInitializer) return false if (parent is KtScriptInitializer) return false
@@ -3092,13 +3095,12 @@ enum class BodyBuildingMode {
NORMAL, NORMAL,
/** /**
* Build [org.jetbrains.kotlin.fir.expressions.impl.FirLazyBlock] for function bodies, constructors & getters/setters * Build [FirLazyBlock] for function bodies, constructors & getters/setters
* Build [org.jetbrains.kotlin.fir.expressions.impl.FirLazyExpression] for property initializers * Build [FirLazyExpression] for property initializers
*/ */
LAZY_BODIES; LAZY_BODIES;
companion object { companion object {
fun lazyBodies(lazyBodies: Boolean): BodyBuildingMode = fun lazyBodies(lazyBodies: Boolean): BodyBuildingMode = if (lazyBodies) LAZY_BODIES else NORMAL
if (lazyBodies) LAZY_BODIES else NORMAL
} }
} }