FIR IDE: do not mark declaration with some lazy resolve phase if only some children are resolved to that phase
Otherwise, we will not be able to resolve parent one
This commit is contained in:
+8
@@ -60,6 +60,14 @@ abstract class FirAbstractBodyResolveTransformer(phase: FirResolvePhase) : FirAb
|
||||
context.addLocalScope(localScope)
|
||||
}
|
||||
|
||||
protected open fun needReplacePhase(firDeclaration: FirDeclaration) = true
|
||||
|
||||
fun replaceDeclarationResolvePhaseIfNeeded(firDeclaration: FirDeclaration, newResolvePhase: FirResolvePhase) {
|
||||
if (needReplacePhase(firDeclaration)) {
|
||||
firDeclaration.replaceResolvePhase(newResolvePhase)
|
||||
}
|
||||
}
|
||||
|
||||
@OptIn(PrivateForInline::class)
|
||||
internal inline fun <T> withFullBodyResolve(crossinline l: () -> T): T {
|
||||
val shouldSwitchMode = implicitTypeOnly
|
||||
|
||||
+8
-8
@@ -57,7 +57,7 @@ open class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransfor
|
||||
): CompositeTransformResult<FirDeclaration> {
|
||||
transformer.onBeforeDeclarationContentResolve(declaration)
|
||||
return context.withContainer(declaration) {
|
||||
declaration.replaceResolvePhase(transformerPhase)
|
||||
transformer.replaceDeclarationResolvePhaseIfNeeded(declaration, transformerPhase)
|
||||
transformer.transformDeclarationContent(declaration, data)
|
||||
}
|
||||
}
|
||||
@@ -84,7 +84,7 @@ open class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransfor
|
||||
if (declaration.typeParameters.isEmpty()) return null
|
||||
|
||||
for (typeParameter in declaration.typeParameters) {
|
||||
(typeParameter as? FirTypeParameter)?.replaceResolvePhase(FirResolvePhase.STATUS)
|
||||
(typeParameter as? FirTypeParameter)?.let { transformer.replaceDeclarationResolvePhaseIfNeeded(it, FirResolvePhase.STATUS) }
|
||||
typeParameter.transformChildren(transformer, ResolutionMode.ContextIndependent)
|
||||
}
|
||||
|
||||
@@ -115,7 +115,7 @@ open class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransfor
|
||||
if (returnTypeRef !is FirImplicitTypeRef && implicitTypeOnly) return@withTypeParametersOf property.compose()
|
||||
if (property.resolvePhase == transformerPhase) return@withTypeParametersOf property.compose()
|
||||
if (property.resolvePhase == FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE && transformerPhase == FirResolvePhase.BODY_RESOLVE) {
|
||||
property.replaceResolvePhase(transformerPhase)
|
||||
transformer.replaceDeclarationResolvePhaseIfNeeded(property, transformerPhase)
|
||||
return@withTypeParametersOf property.compose()
|
||||
}
|
||||
dataFlowAnalyzer.enterProperty(property)
|
||||
@@ -142,7 +142,7 @@ open class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransfor
|
||||
}
|
||||
}
|
||||
}
|
||||
property.replaceResolvePhase(transformerPhase)
|
||||
transformer.replaceDeclarationResolvePhaseIfNeeded(property, transformerPhase)
|
||||
dataFlowAnalyzer.exitProperty(property)?.let {
|
||||
property.replaceControlFlowGraphReference(FirControlFlowGraphReferenceImpl(it))
|
||||
}
|
||||
@@ -267,7 +267,7 @@ open class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransfor
|
||||
variable.transformAccessors()
|
||||
}
|
||||
context.storeVariable(variable)
|
||||
variable.replaceResolvePhase(transformerPhase)
|
||||
transformer.replaceDeclarationResolvePhaseIfNeeded(variable, transformerPhase)
|
||||
dataFlowAnalyzer.exitLocalVariableDeclaration(variable)
|
||||
return variable.compose()
|
||||
}
|
||||
@@ -449,7 +449,7 @@ open class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransfor
|
||||
): CompositeTransformResult<FirSimpleFunction> {
|
||||
if (simpleFunction.resolvePhase == transformerPhase) return simpleFunction.compose()
|
||||
if (simpleFunction.resolvePhase == FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE && transformerPhase == FirResolvePhase.BODY_RESOLVE) {
|
||||
simpleFunction.replaceResolvePhase(transformerPhase)
|
||||
transformer.replaceDeclarationResolvePhaseIfNeeded(simpleFunction, transformerPhase)
|
||||
return simpleFunction.compose()
|
||||
}
|
||||
val returnTypeRef = simpleFunction.returnTypeRef
|
||||
@@ -546,7 +546,7 @@ open class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransfor
|
||||
|
||||
private fun doTransformConstructor(constructor: FirConstructor, data: ResolutionMode): CompositeTransformResult<FirConstructor> {
|
||||
return context.withContainer(constructor) {
|
||||
constructor.replaceResolvePhase(transformerPhase)
|
||||
transformer.replaceDeclarationResolvePhaseIfNeeded(constructor, transformerPhase)
|
||||
dataFlowAnalyzer.enterFunction(constructor)
|
||||
|
||||
constructor.transformTypeParameters(transformer, data)
|
||||
@@ -640,7 +640,7 @@ open class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransfor
|
||||
override fun transformValueParameter(valueParameter: FirValueParameter, data: ResolutionMode): CompositeTransformResult<FirStatement> {
|
||||
context.storeVariable(valueParameter)
|
||||
if (valueParameter.returnTypeRef is FirImplicitTypeRef) {
|
||||
valueParameter.replaceResolvePhase(transformerPhase)
|
||||
transformer.replaceDeclarationResolvePhaseIfNeeded(valueParameter, transformerPhase)
|
||||
return valueParameter.compose()
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -275,7 +275,7 @@ open class FirContractResolveTransformer(
|
||||
get() = contractDescription is FirLegacyRawContractDescription || contractDescription is FirRawContractDescription
|
||||
|
||||
private fun FirDeclaration.updatePhase() {
|
||||
replaceResolvePhase(FirResolvePhase.CONTRACTS)
|
||||
replaceDeclarationResolvePhaseIfNeeded(this, FirResolvePhase.CONTRACTS)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user