[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,
|
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
|
||||||
|
|||||||
+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.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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user