Forbid manual phase updates during FIR compilation (non-IDE mode)

This commit is contained in:
Mikhail Glukhikh
2019-12-30 18:28:57 +03:00
parent 961037506a
commit 7e946c6f5b
3 changed files with 13 additions and 2 deletions
@@ -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<*>?
@@ -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 <D> AbstractFirBasedSymbol<D>.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)
@@ -39,6 +39,9 @@ class FirIdeProvider(
private val files = mutableMapOf<KtFile, FirFileWithStamp>()
override val isPhasedFirAllowed: Boolean
get() = true
override fun getFirClassifierByFqName(classId: ClassId): FirClassLikeDeclaration<*>? {
return cacheProvider.getFirClassifierByFqName(classId) ?: run {
try {