Forbid manual phase updates during FIR compilation (non-IDE mode)
This commit is contained in:
@@ -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<*>?
|
||||
|
||||
+7
-2
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user