[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, updateForLocalDeclarations: Boolean,
) { ) {
if (updateForLocalDeclarations) { if (updateForLocalDeclarations) {
PhaseUpdatingTransformer.visitElement(target, newPhase) target.acceptChildren(PhaseUpdatingTransformer, newPhase)
} else { } 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 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) { if (element is FirTypeParameterRefsOwner) {
element.typeParameters.forEach { typeParameter -> element.typeParameters.forEach { typeParameter ->
// if it is not a type parameter of outer declaration // if it is not a type parameter of outer declaration
if (typeParameter is FirTypeParameter) { if (typeParameter is FirTypeParameter) {
updatePhaseForNonLocals(typeParameter, newPhase) updatePhaseForNonLocals(typeParameter, newPhase, isTargetDeclaration = false)
} }
} }
} }
when (element) { when (element) {
is FirFunction -> { is FirFunction -> {
element.valueParameters.forEach { updatePhaseForNonLocals(it, newPhase) } element.valueParameters.forEach { updatePhaseForNonLocals(it, newPhase, isTargetDeclaration = false) }
} }
is FirProperty -> { is FirProperty -> {
element.getter?.let { updatePhaseForNonLocals(it, newPhase) } element.getter?.let { updatePhaseForNonLocals(it, newPhase, isTargetDeclaration = false) }
element.setter?.let { updatePhaseForNonLocals(it, newPhase) } element.setter?.let { updatePhaseForNonLocals(it, newPhase, isTargetDeclaration = false) }
} }
is FirClass -> { is FirClass -> {
element.declarations.forEach { element.declarations.forEach {
updatePhaseForNonLocals(it, newPhase) updatePhaseForNonLocals(it, newPhase, isTargetDeclaration = false)
} }
} }
else -> Unit 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.api.FirDesignationWithFile
import org.jetbrains.kotlin.analysis.low.level.api.fir.file.builder.LLFirLockProvider 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.FirResolvePhase
import org.jetbrains.kotlin.fir.declarations.asResolveState
import org.jetbrains.kotlin.fir.resolve.ScopeSession import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirTowerDataContextCollector import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirTowerDataContextCollector
@@ -33,6 +34,7 @@ internal class LLFirLazyTransformerExecutor {
lockProvider.withLock(designation.firFile) { lockProvider.withLock(designation.firFile) {
lazyTransformer.transformDeclaration(phaseRunner) lazyTransformer.transformDeclaration(phaseRunner)
lazyTransformer.updatePhaseForDeclarationInternals(designation.target) lazyTransformer.updatePhaseForDeclarationInternals(designation.target)
designation.target.replaceResolveState(phase.asResolveState())
lazyTransformer.checkIsResolved(designation.target) lazyTransformer.checkIsResolved(designation.target)
} }
} }