[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:
Dmitrii Gridin
2023-01-04 15:51:51 +01:00
committed by Space Team
parent d52c8b6793
commit a172439f2a
2 changed files with 14 additions and 9 deletions
@@ -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
@@ -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)
}
}