[LL API] Encapsulate on-air class provider logic in LLFirProvider
The old 'FirProviderInterceptor' is too invasive, ad-hoc, and only a few places in the compiler are aware of it. This fixes the test 'FirOnAirResolveTestGenerated#testOnAirTypesResolve' which started failing after the designation path collection refactoring. The newly appeared class existence check started to fail: ``` val declaration = firProvider.getFirClassifierByFqName(classId) check(declaration != null) ```
This commit is contained in:
+6
-17
@@ -50,14 +50,6 @@ class FirSupertypeResolverProcessor(session: FirSession, scopeSession: ScopeSess
|
||||
override val transformer = FirSupertypeResolverTransformer(session, scopeSession)
|
||||
}
|
||||
|
||||
/**
|
||||
* Interceptor needed by IDE to resolve in-air created declarations.
|
||||
*/
|
||||
interface FirProviderInterceptor {
|
||||
fun getFirClassifierContainerFileIfAny(symbol: FirClassLikeSymbol<*>): FirFile?
|
||||
fun getFirClassifierByFqName(classId: ClassId): FirClassLikeDeclaration?
|
||||
}
|
||||
|
||||
open class FirSupertypeResolverTransformer(
|
||||
final override val session: FirSession,
|
||||
scopeSession: ScopeSession
|
||||
@@ -84,7 +76,6 @@ fun <F : FirClassLikeDeclaration> F.runSupertypeResolvePhaseForLocalClass(
|
||||
scopeSession: ScopeSession,
|
||||
currentScopeList: List<FirScope>,
|
||||
localClassesNavigationInfo: LocalClassesNavigationInfo,
|
||||
firProviderInterceptor: FirProviderInterceptor?,
|
||||
useSiteFile: FirFile,
|
||||
containingDeclarations: List<FirDeclaration>,
|
||||
): F {
|
||||
@@ -93,7 +84,6 @@ fun <F : FirClassLikeDeclaration> F.runSupertypeResolvePhaseForLocalClass(
|
||||
session, supertypeComputationSession, scopeSession,
|
||||
currentScopeList.toPersistentList(),
|
||||
localClassesNavigationInfo,
|
||||
firProviderInterceptor,
|
||||
useSiteFile,
|
||||
containingDeclarations,
|
||||
)
|
||||
@@ -220,7 +210,6 @@ open class FirSupertypeResolverVisitor(
|
||||
private val scopeSession: ScopeSession,
|
||||
private val scopeForLocalClass: PersistentList<FirScope>? = null,
|
||||
private val localClassesNavigationInfo: LocalClassesNavigationInfo? = null,
|
||||
private val firProviderInterceptor: FirProviderInterceptor? = null,
|
||||
@property:PrivateForInline var useSiteFile: FirFile? = null,
|
||||
containingDeclarations: List<FirDeclaration> = emptyList(),
|
||||
) : FirDefaultVisitor<Unit, Any?>() {
|
||||
@@ -246,13 +235,13 @@ open class FirSupertypeResolverVisitor(
|
||||
}
|
||||
}
|
||||
|
||||
private fun getFirClassifierContainerFileIfAny(symbol: FirClassLikeSymbol<*>): FirFile? =
|
||||
if (firProviderInterceptor != null) firProviderInterceptor.getFirClassifierContainerFileIfAny(symbol)
|
||||
else symbol.moduleData.session.firProvider.getFirClassifierContainerFileIfAny(symbol.classId)
|
||||
private fun getFirClassifierContainerFileIfAny(symbol: FirClassLikeSymbol<*>): FirFile? {
|
||||
return symbol.moduleData.session.firProvider.getFirClassifierContainerFileIfAny(symbol.classId)
|
||||
}
|
||||
|
||||
private fun getFirClassifierByFqName(moduleSession: FirSession, classId: ClassId): FirClassLikeDeclaration? =
|
||||
if (firProviderInterceptor != null) firProviderInterceptor.getFirClassifierByFqName(classId)
|
||||
else moduleSession.firProvider.getFirClassifierByFqName(classId)
|
||||
private fun getFirClassifierByFqName(moduleSession: FirSession, classId: ClassId): FirClassLikeDeclaration? {
|
||||
return moduleSession.firProvider.getFirClassifierByFqName(classId)
|
||||
}
|
||||
|
||||
override fun visitElement(element: FirElement, data: Any?) {}
|
||||
|
||||
|
||||
-11
@@ -10,19 +10,9 @@ import org.jetbrains.kotlin.fir.declarations.*
|
||||
import org.jetbrains.kotlin.fir.expressions.*
|
||||
import org.jetbrains.kotlin.fir.resolve.*
|
||||
import org.jetbrains.kotlin.fir.resolve.calls.ResolutionContext
|
||||
import org.jetbrains.kotlin.fir.resolve.calls.ResolutionStageRunner
|
||||
import org.jetbrains.kotlin.fir.resolve.dfa.DataFlowAnalyzerContext
|
||||
import org.jetbrains.kotlin.fir.resolve.dfa.FirDataFlowAnalyzer
|
||||
import org.jetbrains.kotlin.fir.resolve.inference.FirCallCompleter
|
||||
import org.jetbrains.kotlin.fir.resolve.inference.InferenceComponents
|
||||
import org.jetbrains.kotlin.fir.resolve.inference.inferenceComponents
|
||||
import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider
|
||||
import org.jetbrains.kotlin.fir.resolve.providers.symbolProvider
|
||||
import org.jetbrains.kotlin.fir.resolve.transformers.*
|
||||
import org.jetbrains.kotlin.fir.scopes.FirScope
|
||||
import org.jetbrains.kotlin.fir.scopes.impl.FirLocalScope
|
||||
import org.jetbrains.kotlin.fir.types.*
|
||||
import org.jetbrains.kotlin.fir.types.builder.buildImplicitTypeRef
|
||||
import org.jetbrains.kotlin.fir.visitors.FirTransformer
|
||||
|
||||
abstract class FirAbstractBodyResolveTransformerDispatcher(
|
||||
@@ -33,7 +23,6 @@ abstract class FirAbstractBodyResolveTransformerDispatcher(
|
||||
val returnTypeCalculator: ReturnTypeCalculator = ReturnTypeCalculatorForFullBodyResolve,
|
||||
outerBodyResolveContext: BodyResolveContext? = null,
|
||||
val firTowerDataContextCollector: FirTowerDataContextCollector? = null,
|
||||
val firProviderInterceptor: FirProviderInterceptor? = null,
|
||||
) : FirAbstractBodyResolveTransformer(phase) {
|
||||
|
||||
final override val context: BodyResolveContext =
|
||||
|
||||
+2
-5
@@ -8,7 +8,6 @@ package org.jetbrains.kotlin.fir.resolve.transformers.body.resolve
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.declarations.*
|
||||
import org.jetbrains.kotlin.fir.resolve.ScopeSession
|
||||
import org.jetbrains.kotlin.fir.resolve.transformers.FirProviderInterceptor
|
||||
import org.jetbrains.kotlin.fir.resolve.transformers.ReturnTypeCalculator
|
||||
import org.jetbrains.kotlin.fir.resolve.transformers.ReturnTypeCalculatorForFullBodyResolve
|
||||
|
||||
@@ -19,8 +18,7 @@ open class FirBodyResolveTransformer(
|
||||
scopeSession: ScopeSession,
|
||||
returnTypeCalculator: ReturnTypeCalculator = ReturnTypeCalculatorForFullBodyResolve,
|
||||
outerBodyResolveContext: BodyResolveContext? = null,
|
||||
firTowerDataContextCollector: FirTowerDataContextCollector? = null,
|
||||
firProviderInterceptor: FirProviderInterceptor? = null,
|
||||
firTowerDataContextCollector: FirTowerDataContextCollector? = null
|
||||
) : FirAbstractBodyResolveTransformerDispatcher(
|
||||
session,
|
||||
phase,
|
||||
@@ -28,8 +26,7 @@ open class FirBodyResolveTransformer(
|
||||
scopeSession,
|
||||
returnTypeCalculator,
|
||||
outerBodyResolveContext,
|
||||
firTowerDataContextCollector,
|
||||
firProviderInterceptor,
|
||||
firTowerDataContextCollector
|
||||
) {
|
||||
final override val expressionsTransformer = FirExpressionsResolveTransformer(this)
|
||||
final override val declarationsTransformer = FirDeclarationsResolveTransformer(this)
|
||||
|
||||
+3
-21
@@ -493,13 +493,7 @@ open class FirDeclarationsResolveTransformer(transformer: FirAbstractBodyResolve
|
||||
override fun transformRegularClass(regularClass: FirRegularClass, data: ResolutionMode): FirStatement = whileAnalysing(session, regularClass) {
|
||||
return context.withContainingClass(regularClass) {
|
||||
if (regularClass.isLocal && regularClass !in context.targetedLocalClasses) {
|
||||
return regularClass.runAllPhasesForLocalClass(
|
||||
transformer,
|
||||
components,
|
||||
data,
|
||||
transformer.firTowerDataContextCollector,
|
||||
transformer.firProviderInterceptor
|
||||
)
|
||||
return regularClass.runAllPhasesForLocalClass(transformer, components, data, transformer.firTowerDataContextCollector)
|
||||
}
|
||||
|
||||
doTransformTypeParameters(regularClass)
|
||||
@@ -519,13 +513,7 @@ open class FirDeclarationsResolveTransformer(transformer: FirAbstractBodyResolve
|
||||
|
||||
override fun transformTypeAlias(typeAlias: FirTypeAlias, data: ResolutionMode): FirTypeAlias = whileAnalysing(session, typeAlias) {
|
||||
if (typeAlias.isLocal && typeAlias !in context.targetedLocalClasses) {
|
||||
return typeAlias.runAllPhasesForLocalClass(
|
||||
transformer,
|
||||
components,
|
||||
data,
|
||||
transformer.firTowerDataContextCollector,
|
||||
transformer.firProviderInterceptor
|
||||
)
|
||||
return typeAlias.runAllPhasesForLocalClass(transformer, components, data, transformer.firTowerDataContextCollector)
|
||||
}
|
||||
doTransformTypeParameters(typeAlias)
|
||||
typeAlias.transformAnnotations(transformer, data)
|
||||
@@ -554,13 +542,7 @@ open class FirDeclarationsResolveTransformer(transformer: FirAbstractBodyResolve
|
||||
data: ResolutionMode
|
||||
): FirStatement = whileAnalysing(session, anonymousObject) {
|
||||
if (anonymousObject !in context.targetedLocalClasses) {
|
||||
return anonymousObject.runAllPhasesForLocalClass(
|
||||
transformer,
|
||||
components,
|
||||
data,
|
||||
transformer.firTowerDataContextCollector,
|
||||
transformer.firProviderInterceptor
|
||||
)
|
||||
return anonymousObject.runAllPhasesForLocalClass(transformer, components, data, transformer.firTowerDataContextCollector)
|
||||
}
|
||||
// TODO: why would there be a graph already?
|
||||
val buildGraph = !implicitTypeOnly && anonymousObject.controlFlowGraphReference == null
|
||||
|
||||
+1
-4
@@ -8,7 +8,6 @@ package org.jetbrains.kotlin.fir.resolve.transformers.body.resolve
|
||||
import org.jetbrains.kotlin.fir.declarations.*
|
||||
import org.jetbrains.kotlin.fir.resolve.ResolutionMode
|
||||
import org.jetbrains.kotlin.fir.resolve.createCurrentScopeList
|
||||
import org.jetbrains.kotlin.fir.resolve.transformers.FirProviderInterceptor
|
||||
import org.jetbrains.kotlin.fir.resolve.transformers.plugin.runCompilerRequiredAnnotationsResolvePhaseForLocalClass
|
||||
import org.jetbrains.kotlin.fir.resolve.transformers.plugin.runCompanionGenerationPhaseForLocalClass
|
||||
import org.jetbrains.kotlin.fir.resolve.transformers.runStatusResolveForLocalClass
|
||||
@@ -19,8 +18,7 @@ fun <F : FirClassLikeDeclaration> F.runAllPhasesForLocalClass(
|
||||
transformer: FirAbstractBodyResolveTransformer,
|
||||
components: FirAbstractBodyResolveTransformer.BodyResolveTransformerComponents,
|
||||
resolutionMode: ResolutionMode,
|
||||
firTowerDataContextCollector: FirTowerDataContextCollector?,
|
||||
firProviderInterceptor: FirProviderInterceptor?,
|
||||
firTowerDataContextCollector: FirTowerDataContextCollector?
|
||||
): F {
|
||||
if (status is FirResolvedDeclarationStatus) return this
|
||||
if (this is FirRegularClass) {
|
||||
@@ -47,7 +45,6 @@ fun <F : FirClassLikeDeclaration> F.runAllPhasesForLocalClass(
|
||||
components.scopeSession,
|
||||
components.createCurrentScopeList(),
|
||||
localClassesNavigationInfo,
|
||||
firProviderInterceptor,
|
||||
components.file,
|
||||
components.containingDeclarations,
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user