[FIR] Get rid of all conditional reads of FirDeclaration.resolvePhase
This commit is contained in:
@@ -96,7 +96,7 @@ class FirJavaElementFinder(
|
||||
)
|
||||
|
||||
val superTypeRefs = when {
|
||||
firClass.resolvePhase > FirResolvePhase.SUPER_TYPES -> firClass.superTypeRefs
|
||||
firClass.superTypeRefs.all { it is FirResolvedTypeRef } -> firClass.superTypeRefs
|
||||
else -> firClass.resolveSupertypesInTheAir(session)
|
||||
}
|
||||
|
||||
|
||||
+4
-1
@@ -13,6 +13,7 @@ import org.jetbrains.kotlin.fir.contracts.description.ConeConditionalEffectDecla
|
||||
import org.jetbrains.kotlin.fir.contracts.description.ConeConstantReference
|
||||
import org.jetbrains.kotlin.fir.contracts.description.ConeReturnsEffectDeclaration
|
||||
import org.jetbrains.kotlin.fir.declarations.*
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyAccessor
|
||||
import org.jetbrains.kotlin.fir.declarations.utils.isLocal
|
||||
import org.jetbrains.kotlin.fir.expressions.*
|
||||
import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference
|
||||
@@ -214,6 +215,7 @@ abstract class FirDataFlowAnalyzer<FLOW : Flow>(
|
||||
// ----------------------------------- Named function -----------------------------------
|
||||
|
||||
fun enterFunction(function: FirFunction) {
|
||||
if (function is FirDefaultPropertyAccessor) return
|
||||
if (function is FirAnonymousFunction) {
|
||||
enterAnonymousFunction(function)
|
||||
return
|
||||
@@ -226,7 +228,8 @@ abstract class FirDataFlowAnalyzer<FLOW : Flow>(
|
||||
functionEnterNode.mergeIncomingFlow(shouldForkFlow = previousNode != null)
|
||||
}
|
||||
|
||||
fun exitFunction(function: FirFunction): FirControlFlowGraphReference {
|
||||
fun exitFunction(function: FirFunction): FirControlFlowGraphReference? {
|
||||
if (function is FirDefaultPropertyAccessor) return null
|
||||
if (function is FirAnonymousFunction) {
|
||||
return exitAnonymousFunction(function)
|
||||
}
|
||||
|
||||
+2
-2
@@ -407,8 +407,7 @@ abstract class AbstractFirStatusResolveTransformer(
|
||||
forceResolveStatusesOfSupertypes(regularClass)
|
||||
return
|
||||
}
|
||||
if (regularClass.resolvePhase > FirResolvePhase.STATUS) return
|
||||
val firProvider = session.firProvider
|
||||
if (regularClass.origin != FirDeclarationOrigin.Source) return
|
||||
val statusComputationStatus = statusComputationSession[regularClass]
|
||||
if (!statusComputationStatus.requiresComputation) return
|
||||
|
||||
@@ -425,6 +424,7 @@ abstract class AbstractFirStatusResolveTransformer(
|
||||
}
|
||||
reverse()
|
||||
} else buildList<FirDeclaration> {
|
||||
val firProvider = regularClass.moduleData.session.firProvider
|
||||
val outerClasses = generateSequence(symbol.classId) { classId ->
|
||||
classId.outerClassId
|
||||
}.mapTo(mutableListOf()) { firProvider.getFirClassifierByFqName(it) }
|
||||
|
||||
+2
-2
@@ -436,14 +436,14 @@ class SupertypeComputationSession {
|
||||
|
||||
val supertypesSupplier: SupertypeSupplier = object : SupertypeSupplier() {
|
||||
override fun forClass(firClass: FirClass, useSiteSession: FirSession): List<ConeClassLikeType> {
|
||||
if (firClass.resolvePhase > FirResolvePhase.SUPER_TYPES) return firClass.superConeTypes
|
||||
if (firClass.superTypeRefs.all { it is FirResolvedTypeRef }) return firClass.superConeTypes
|
||||
return (getSupertypesComputationStatus(firClass) as? SupertypeComputationStatus.Computed)?.supertypeRefs?.mapNotNull {
|
||||
it.coneTypeSafe<ConeClassLikeType>()
|
||||
}.orEmpty()
|
||||
}
|
||||
|
||||
override fun expansionForTypeAlias(typeAlias: FirTypeAlias, useSiteSession: FirSession): ConeClassLikeType? {
|
||||
if (typeAlias.resolvePhase > FirResolvePhase.SUPER_TYPES) return typeAlias.expandedConeType
|
||||
if (typeAlias.expandedTypeRef is FirResolvedTypeRef) return typeAlias.expandedConeType
|
||||
return (getSupertypesComputationStatus(typeAlias) as? SupertypeComputationStatus.Computed)
|
||||
?.supertypeRefs
|
||||
?.getOrNull(0)?.coneTypeSafe()
|
||||
|
||||
+19
-22
@@ -107,7 +107,7 @@ open class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransfor
|
||||
}
|
||||
|
||||
override fun transformEnumEntry(enumEntry: FirEnumEntry, data: ResolutionMode): FirEnumEntry {
|
||||
if (enumEntry.resolvePhase == transformerPhase) return enumEntry
|
||||
if (implicitTypeOnly || enumEntry.initializerResolved) return enumEntry
|
||||
transformer.replaceDeclarationResolvePhaseIfNeeded(enumEntry, transformerPhase)
|
||||
return context.forEnumEntry {
|
||||
(enumEntry.transformChildren(this, data) as FirEnumEntry)
|
||||
@@ -126,11 +126,8 @@ open class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransfor
|
||||
}
|
||||
|
||||
val returnTypeRef = property.returnTypeRef
|
||||
if (property.initializerAndAccessorsAreResolved) return property
|
||||
if (returnTypeRef !is FirImplicitTypeRef && implicitTypeOnly) return property
|
||||
if (property.resolvePhase == transformerPhase) return property
|
||||
if (property.resolvePhase == FirResolvePhase.BODY_RESOLVE || property.resolvePhase == transformerPhase) {
|
||||
return property
|
||||
}
|
||||
|
||||
property.transformReceiverTypeRef(transformer, ResolutionMode.ContextIndependent)
|
||||
dataFlowAnalyzer.enterProperty(property)
|
||||
@@ -158,6 +155,7 @@ open class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransfor
|
||||
dataFlowAnalyzer.exitProperty(property)?.let {
|
||||
property.replaceControlFlowGraphReference(FirControlFlowGraphReferenceImpl(it))
|
||||
}
|
||||
property.replaceInitializerAndAccessorsAreResolved(true)
|
||||
property
|
||||
}
|
||||
}
|
||||
@@ -165,9 +163,8 @@ open class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransfor
|
||||
override fun transformField(field: FirField, data: ResolutionMode): FirField {
|
||||
val returnTypeRef = field.returnTypeRef
|
||||
if (implicitTypeOnly) return field
|
||||
if (field.resolvePhase == FirResolvePhase.BODY_RESOLVE || field.resolvePhase == transformerPhase) {
|
||||
return field
|
||||
}
|
||||
if (field.initializerResolved) return field
|
||||
|
||||
dataFlowAnalyzer.enterField(field)
|
||||
return withFullBodyResolve {
|
||||
context.withField(field) {
|
||||
@@ -394,23 +391,17 @@ open class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransfor
|
||||
regularClass: FirRegularClass,
|
||||
data: ResolutionMode
|
||||
): FirRegularClass {
|
||||
val notAnalyzed = regularClass.resolvePhase < transformerPhase
|
||||
|
||||
if (notAnalyzed) {
|
||||
dataFlowAnalyzer.enterClass()
|
||||
}
|
||||
dataFlowAnalyzer.enterClass()
|
||||
|
||||
val result = context.withRegularClass(regularClass, components) {
|
||||
transformDeclarationContent(regularClass, data) as FirRegularClass
|
||||
}
|
||||
|
||||
if (notAnalyzed) {
|
||||
if (!implicitTypeOnly) {
|
||||
val controlFlowGraph = dataFlowAnalyzer.exitRegularClass(result)
|
||||
result.replaceControlFlowGraphReference(FirControlFlowGraphReferenceImpl(controlFlowGraph))
|
||||
} else {
|
||||
dataFlowAnalyzer.exitClass()
|
||||
}
|
||||
if (!implicitTypeOnly) {
|
||||
val controlFlowGraph = dataFlowAnalyzer.exitRegularClass(result)
|
||||
result.replaceControlFlowGraphReference(FirControlFlowGraphReferenceImpl(controlFlowGraph))
|
||||
} else {
|
||||
dataFlowAnalyzer.exitClass()
|
||||
}
|
||||
|
||||
return result
|
||||
@@ -476,7 +467,7 @@ open class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransfor
|
||||
simpleFunction: FirSimpleFunction,
|
||||
data: ResolutionMode
|
||||
): FirSimpleFunction {
|
||||
if (simpleFunction.resolvePhase == FirResolvePhase.BODY_RESOLVE || simpleFunction.resolvePhase == transformerPhase) {
|
||||
if (simpleFunction.bodyResolved) {
|
||||
return simpleFunction
|
||||
}
|
||||
val returnTypeRef = simpleFunction.returnTypeRef
|
||||
@@ -540,7 +531,7 @@ open class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransfor
|
||||
function: FirFunction,
|
||||
data: ResolutionMode
|
||||
): FirStatement {
|
||||
val functionIsNotAnalyzed = transformerPhase != function.resolvePhase
|
||||
val functionIsNotAnalyzed = !function.bodyResolved
|
||||
if (functionIsNotAnalyzed) {
|
||||
dataFlowAnalyzer.enterFunction(function)
|
||||
}
|
||||
@@ -892,4 +883,10 @@ open class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransfor
|
||||
return valueParameter
|
||||
}
|
||||
}
|
||||
|
||||
private val FirVariable.initializerResolved: Boolean
|
||||
get() = initializer?.typeRef is FirResolvedTypeRef
|
||||
|
||||
private val FirFunction.bodyResolved: Boolean
|
||||
get() = body?.typeRef is FirResolvedTypeRef
|
||||
}
|
||||
|
||||
@@ -49,6 +49,7 @@ abstract class FirProperty : FirVariable(), FirTypeParametersOwner, FirControlFl
|
||||
abstract val backingFieldSymbol: FirBackingFieldSymbol
|
||||
abstract val delegateFieldSymbol: FirDelegateFieldSymbol?
|
||||
abstract val isLocal: Boolean
|
||||
abstract val initializerAndAccessorsAreResolved: Boolean
|
||||
abstract override val typeParameters: List<FirTypeParameter>
|
||||
|
||||
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitProperty(this, data)
|
||||
@@ -67,6 +68,8 @@ abstract class FirProperty : FirVariable(), FirTypeParametersOwner, FirControlFl
|
||||
|
||||
abstract override fun replaceControlFlowGraphReference(newControlFlowGraphReference: FirControlFlowGraphReference?)
|
||||
|
||||
abstract fun replaceInitializerAndAccessorsAreResolved(newInitializerAndAccessorsAreResolved: Boolean)
|
||||
|
||||
abstract override fun <D> transformReturnTypeRef(transformer: FirTransformer<D>, data: D): FirProperty
|
||||
|
||||
abstract override fun <D> transformReceiverTypeRef(transformer: FirTransformer<D>, data: D): FirProperty
|
||||
|
||||
+3
@@ -59,6 +59,7 @@ class FirPropertyBuilder : FirDeclarationBuilder, FirTypeParametersOwnerBuilder,
|
||||
lateinit var symbol: FirPropertySymbol
|
||||
var delegateFieldSymbol: FirDelegateFieldSymbol? = null
|
||||
var isLocal: Boolean by kotlin.properties.Delegates.notNull<Boolean>()
|
||||
var initializerAndAccessorsAreResolved: Boolean = false
|
||||
override val typeParameters: MutableList<FirTypeParameter> = mutableListOf()
|
||||
|
||||
override fun build(): FirProperty {
|
||||
@@ -83,6 +84,7 @@ class FirPropertyBuilder : FirDeclarationBuilder, FirTypeParametersOwnerBuilder,
|
||||
symbol,
|
||||
delegateFieldSymbol,
|
||||
isLocal,
|
||||
initializerAndAccessorsAreResolved,
|
||||
typeParameters,
|
||||
)
|
||||
}
|
||||
@@ -123,6 +125,7 @@ inline fun buildPropertyCopy(original: FirProperty, init: FirPropertyBuilder.()
|
||||
copyBuilder.symbol = original.symbol
|
||||
copyBuilder.delegateFieldSymbol = original.delegateFieldSymbol
|
||||
copyBuilder.isLocal = original.isLocal
|
||||
copyBuilder.initializerAndAccessorsAreResolved = original.initializerAndAccessorsAreResolved
|
||||
copyBuilder.typeParameters.addAll(original.typeParameters)
|
||||
return copyBuilder.apply(init).build()
|
||||
}
|
||||
|
||||
@@ -52,6 +52,7 @@ internal class FirPropertyImpl(
|
||||
override val symbol: FirPropertySymbol,
|
||||
override val delegateFieldSymbol: FirDelegateFieldSymbol?,
|
||||
override val isLocal: Boolean,
|
||||
override var initializerAndAccessorsAreResolved: Boolean,
|
||||
override val typeParameters: MutableList<FirTypeParameter>,
|
||||
) : FirProperty() {
|
||||
override val isVal: Boolean get() = !isVar
|
||||
@@ -160,4 +161,8 @@ internal class FirPropertyImpl(
|
||||
override fun replaceControlFlowGraphReference(newControlFlowGraphReference: FirControlFlowGraphReference?) {
|
||||
controlFlowGraphReference = newControlFlowGraphReference
|
||||
}
|
||||
|
||||
override fun replaceInitializerAndAccessorsAreResolved(newInitializerAndAccessorsAreResolved: Boolean) {
|
||||
initializerAndAccessorsAreResolved = newInitializerAndAccessorsAreResolved
|
||||
}
|
||||
}
|
||||
|
||||
-3
@@ -17,11 +17,8 @@ import org.jetbrains.kotlin.fir.declarations.builder.buildDefaultSetterValuePara
|
||||
import org.jetbrains.kotlin.fir.expressions.FirBlock
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirPropertyAccessorSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirValueParameterSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol
|
||||
import org.jetbrains.kotlin.fir.types.FirTypeRef
|
||||
import org.jetbrains.kotlin.fir.types.impl.FirImplicitUnitTypeRef
|
||||
import org.jetbrains.kotlin.name.CallableId
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
|
||||
@OptIn(FirImplementationDetail::class)
|
||||
|
||||
+7
@@ -81,6 +81,9 @@ class FirSyntheticProperty(
|
||||
// ???
|
||||
override val backingFieldSymbol: FirBackingFieldSymbol = FirBackingFieldSymbol(symbol.callableId)
|
||||
|
||||
override val initializerAndAccessorsAreResolved: Boolean
|
||||
get() = true
|
||||
|
||||
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
|
||||
returnTypeRef.accept(visitor, data)
|
||||
status.accept(visitor, data)
|
||||
@@ -149,4 +152,8 @@ class FirSyntheticProperty(
|
||||
override fun replaceInitializer(newInitializer: FirExpression?) {
|
||||
throw AssertionError("Mutation of synthetic property isn't supported")
|
||||
}
|
||||
|
||||
override fun replaceInitializerAndAccessorsAreResolved(newInitializerAndAccessorsAreResolved: Boolean) {
|
||||
throw AssertionError("Mutation of synthetic property isn't supported")
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,7 +8,10 @@ package org.jetbrains.kotlin.fir.declarations.utils
|
||||
import org.jetbrains.kotlin.descriptors.*
|
||||
import org.jetbrains.kotlin.fir.FirRenderer
|
||||
import org.jetbrains.kotlin.fir.declarations.*
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirResolvedDeclarationStatusImpl
|
||||
import org.jetbrains.kotlin.fir.render
|
||||
import kotlin.contracts.ExperimentalContracts
|
||||
import kotlin.contracts.contract
|
||||
|
||||
inline val FirMemberDeclaration.modality: Modality? get() = status.modality
|
||||
inline val FirMemberDeclaration.isAbstract: Boolean get() = status.modality == Modality.ABSTRACT
|
||||
|
||||
+1
@@ -202,6 +202,7 @@ object BuilderConfigurator : AbstractBuilderConfigurator<FirTreeBuilder>(FirTree
|
||||
parents += typeParametersOwnerBuilder
|
||||
defaultNull("getter", "setter", "containerSource", "delegateFieldSymbol")
|
||||
default("resolvePhase", "FirResolvePhase.RAW_FIR")
|
||||
defaultFalse("initializerAndAccessorsAreResolved")
|
||||
withCopy()
|
||||
}
|
||||
|
||||
|
||||
+1
@@ -311,6 +311,7 @@ object NodeConfigurator : AbstractFieldConfigurator<FirTreeBuilder>(FirTreeBuild
|
||||
+field("backingFieldSymbol", backingFieldSymbolType)
|
||||
+field("delegateFieldSymbol", delegateFieldSymbolType, nullable = true)
|
||||
+booleanField("isLocal")
|
||||
+booleanField("initializerAndAccessorsAreResolved", withReplace = true)
|
||||
+typeParameters
|
||||
}
|
||||
|
||||
|
||||
+4
@@ -59,6 +59,10 @@ internal object DeclarationCopyBuilder {
|
||||
getter = propertyWithBody.getter
|
||||
setter = copySetter
|
||||
|
||||
if (propertyResolvePhase < FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE) {
|
||||
initializerAndAccessorsAreResolved = false
|
||||
}
|
||||
|
||||
initDeclaration(this@withBodyFrom, propertyWithBody)
|
||||
resolvePhase = propertyResolvePhase
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user