[LL FIR] move update declaration resolve phase out of updatePhaseForDeclarationInternals
needed for further safe publication of phase update ^KT-56543
This commit is contained in:
committed by
Space Team
parent
d52c8b6793
commit
a172439f2a
+12
-9
@@ -18,37 +18,40 @@ internal object LLFirPhaseUpdater {
|
||||
updateForLocalDeclarations: Boolean,
|
||||
) {
|
||||
if (updateForLocalDeclarations) {
|
||||
PhaseUpdatingTransformer.visitElement(target, newPhase)
|
||||
target.acceptChildren(PhaseUpdatingTransformer, newPhase)
|
||||
} else {
|
||||
updatePhaseForNonLocals(target, newPhase)
|
||||
updatePhaseForNonLocals(target, newPhase, isTargetDeclaration = true)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private fun updatePhaseForNonLocals(element: FirElementWithResolveState, newPhase: FirResolvePhase) {
|
||||
private fun updatePhaseForNonLocals(element: FirElementWithResolveState, newPhase: FirResolvePhase, isTargetDeclaration: Boolean) {
|
||||
if (element.resolvePhase >= newPhase) return
|
||||
element.replaceResolveState(newPhase.asResolveState())
|
||||
if (!isTargetDeclaration) {
|
||||
// phase update for target declaration happens as a declaration publication event after resolve is finished
|
||||
element.replaceResolveState(newPhase.asResolveState())
|
||||
}
|
||||
|
||||
if (element is FirTypeParameterRefsOwner) {
|
||||
element.typeParameters.forEach { typeParameter ->
|
||||
// if it is not a type parameter of outer declaration
|
||||
if (typeParameter is FirTypeParameter) {
|
||||
updatePhaseForNonLocals(typeParameter, newPhase)
|
||||
updatePhaseForNonLocals(typeParameter, newPhase, isTargetDeclaration = false)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
when (element) {
|
||||
is FirFunction -> {
|
||||
element.valueParameters.forEach { updatePhaseForNonLocals(it, newPhase) }
|
||||
element.valueParameters.forEach { updatePhaseForNonLocals(it, newPhase, isTargetDeclaration = false) }
|
||||
}
|
||||
is FirProperty -> {
|
||||
element.getter?.let { updatePhaseForNonLocals(it, newPhase) }
|
||||
element.setter?.let { updatePhaseForNonLocals(it, newPhase) }
|
||||
element.getter?.let { updatePhaseForNonLocals(it, newPhase, isTargetDeclaration = false) }
|
||||
element.setter?.let { updatePhaseForNonLocals(it, newPhase, isTargetDeclaration = false) }
|
||||
}
|
||||
is FirClass -> {
|
||||
element.declarations.forEach {
|
||||
updatePhaseForNonLocals(it, newPhase)
|
||||
updatePhaseForNonLocals(it, newPhase, isTargetDeclaration = false)
|
||||
}
|
||||
}
|
||||
else -> Unit
|
||||
|
||||
+2
@@ -9,6 +9,7 @@ import org.jetbrains.kotlin.analysis.low.level.api.fir.LLFirPhaseRunner
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirDesignationWithFile
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.file.builder.LLFirLockProvider
|
||||
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
||||
import org.jetbrains.kotlin.fir.declarations.asResolveState
|
||||
import org.jetbrains.kotlin.fir.resolve.ScopeSession
|
||||
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirTowerDataContextCollector
|
||||
|
||||
@@ -33,6 +34,7 @@ internal class LLFirLazyTransformerExecutor {
|
||||
lockProvider.withLock(designation.firFile) {
|
||||
lazyTransformer.transformDeclaration(phaseRunner)
|
||||
lazyTransformer.updatePhaseForDeclarationInternals(designation.target)
|
||||
designation.target.replaceResolveState(phase.asResolveState())
|
||||
lazyTransformer.checkIsResolved(designation.target)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user