From 7e946c6f5b9dcdd0f55d3f11f5674596a52a151e Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Mon, 30 Dec 2019 18:28:57 +0300 Subject: [PATCH] Forbid manual phase updates during FIR compilation (non-IDE mode) --- .../src/org/jetbrains/kotlin/fir/resolve/FirProvider.kt | 3 +++ .../kotlin/fir/resolve/transformers/PhaseUtils.kt | 9 +++++++-- .../src/org/jetbrains/kotlin/idea/fir/FirIdeProvider.kt | 3 +++ 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/FirProvider.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/FirProvider.kt index 900c75ff535..f73c10b2988 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/FirProvider.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/FirProvider.kt @@ -15,6 +15,9 @@ import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name abstract class FirProvider : FirSymbolProvider() { + + open val isPhasedFirAllowed: Boolean get() = false + abstract fun getFirClassifierByFqName(classId: ClassId): FirClassLikeDeclaration<*>? abstract override fun getClassLikeSymbolByFqName(classId: ClassId): FirClassLikeSymbol<*>? diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/PhaseUtils.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/PhaseUtils.kt index d2a24af117a..5cd2e1f9f30 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/PhaseUtils.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/PhaseUtils.kt @@ -9,7 +9,7 @@ import org.jetbrains.kotlin.fir.FirSymbolOwner import org.jetbrains.kotlin.fir.declarations.FirDeclaration import org.jetbrains.kotlin.fir.declarations.FirResolvePhase import org.jetbrains.kotlin.fir.render -import org.jetbrains.kotlin.fir.resolve.FirProvider +import org.jetbrains.kotlin.fir.resolve.firProvider import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol @@ -21,7 +21,12 @@ fun AbstractFirBasedSymbol.phasedFir( val availablePhase = result.resolvePhase if (availablePhase < requiredPhase) { // NB: we should use session from symbol here, not transformer session (important for IDE) - val provider = FirProvider.getInstance(fir.session) + val provider = fir.session.firProvider + + require(provider.isPhasedFirAllowed) { + "Incorrect resolvePhase: actual: $availablePhase, expected: $requiredPhase\n For: ${fir.render()}" + } + val containingFile = when (this) { is FirCallableSymbol<*> -> provider.getFirCallableContainerFile(this) is FirClassLikeSymbol<*> -> provider.getFirClassifierContainerFile(this) diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/fir/FirIdeProvider.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/fir/FirIdeProvider.kt index ea48d891d20..7700751a818 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/fir/FirIdeProvider.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/fir/FirIdeProvider.kt @@ -39,6 +39,9 @@ class FirIdeProvider( private val files = mutableMapOf() + override val isPhasedFirAllowed: Boolean + get() = true + override fun getFirClassifierByFqName(classId: ClassId): FirClassLikeDeclaration<*>? { return cacheProvider.getFirClassifierByFqName(classId) ?: run { try {