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
|
import org.jetbrains.kotlin.name.Name
|
||||||
|
|
||||||
abstract class FirProvider : FirSymbolProvider() {
|
abstract class FirProvider : FirSymbolProvider() {
|
||||||
|
|
||||||
|
open val isPhasedFirAllowed: Boolean get() = false
|
||||||
|
|
||||||
abstract fun getFirClassifierByFqName(classId: ClassId): FirClassLikeDeclaration<*>?
|
abstract fun getFirClassifierByFqName(classId: ClassId): FirClassLikeDeclaration<*>?
|
||||||
|
|
||||||
abstract override fun getClassLikeSymbolByFqName(classId: ClassId): FirClassLikeSymbol<*>?
|
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.FirDeclaration
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
||||||
import org.jetbrains.kotlin.fir.render
|
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.AbstractFirBasedSymbol
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
|
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol
|
import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol
|
||||||
@@ -21,7 +21,12 @@ fun <D> AbstractFirBasedSymbol<D>.phasedFir(
|
|||||||
val availablePhase = result.resolvePhase
|
val availablePhase = result.resolvePhase
|
||||||
if (availablePhase < requiredPhase) {
|
if (availablePhase < requiredPhase) {
|
||||||
// NB: we should use session from symbol here, not transformer session (important for IDE)
|
// 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) {
|
val containingFile = when (this) {
|
||||||
is FirCallableSymbol<*> -> provider.getFirCallableContainerFile(this)
|
is FirCallableSymbol<*> -> provider.getFirCallableContainerFile(this)
|
||||||
is FirClassLikeSymbol<*> -> provider.getFirClassifierContainerFile(this)
|
is FirClassLikeSymbol<*> -> provider.getFirClassifierContainerFile(this)
|
||||||
|
|||||||
@@ -39,6 +39,9 @@ class FirIdeProvider(
|
|||||||
|
|
||||||
private val files = mutableMapOf<KtFile, FirFileWithStamp>()
|
private val files = mutableMapOf<KtFile, FirFileWithStamp>()
|
||||||
|
|
||||||
|
override val isPhasedFirAllowed: Boolean
|
||||||
|
get() = true
|
||||||
|
|
||||||
override fun getFirClassifierByFqName(classId: ClassId): FirClassLikeDeclaration<*>? {
|
override fun getFirClassifierByFqName(classId: ClassId): FirClassLikeDeclaration<*>? {
|
||||||
return cacheProvider.getFirClassifierByFqName(classId) ?: run {
|
return cacheProvider.getFirClassifierByFqName(classId) ?: run {
|
||||||
try {
|
try {
|
||||||
|
|||||||
Reference in New Issue
Block a user