[FIR] PsiRawFirBuilder: cleanup code
^KT-63042
This commit is contained in:
committed by
Space Team
parent
580c2a490d
commit
41998ae8ae
+35
-33
@@ -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
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user