[FIR] Get rid of all conditional reads of FirDeclaration.resolvePhase

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