[FIR IDE] Correct in-body supertype resolve of fake nodes
This commit is contained in:
committed by
TeamCityServer
parent
959ff50fa7
commit
2e7eedd3f2
+21
-8
@@ -35,10 +35,19 @@ import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.utils.addIfNotNull
|
||||
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
|
||||
|
||||
class FirSupertypeResolverProcessor(session: FirSession, scopeSession: ScopeSession) : FirTransformerBasedResolveProcessor(session, scopeSession) {
|
||||
class FirSupertypeResolverProcessor(session: FirSession, scopeSession: ScopeSession) :
|
||||
FirTransformerBasedResolveProcessor(session, scopeSession) {
|
||||
override val transformer = FirSupertypeResolverTransformer(session, scopeSession)
|
||||
}
|
||||
|
||||
/**
|
||||
* Interceptor needed by IDE to resolve in-air created declarations.
|
||||
*/
|
||||
interface FirProviderInterceptorForSupertypeResolver {
|
||||
fun getFirClassifierContainerFile(symbol: FirClassLikeSymbol<*>): FirFile
|
||||
fun getFirClassifierByFqName(classId: ClassId): FirClassLikeDeclaration<*>?
|
||||
}
|
||||
|
||||
open class FirSupertypeResolverTransformer(
|
||||
final override val session: FirSession,
|
||||
scopeSession: ScopeSession
|
||||
@@ -65,12 +74,14 @@ fun <F : FirClassLikeDeclaration<F>> F.runSupertypeResolvePhaseForLocalClass(
|
||||
scopeSession: ScopeSession,
|
||||
currentScopeList: List<FirScope>,
|
||||
localClassesNavigationInfo: LocalClassesNavigationInfo,
|
||||
firProviderInterceptor: FirProviderInterceptorForSupertypeResolver?,
|
||||
): F {
|
||||
val supertypeComputationSession = SupertypeComputationSession()
|
||||
val supertypeResolverVisitor = FirSupertypeResolverVisitor(
|
||||
session, supertypeComputationSession, scopeSession,
|
||||
currentScopeList.toPersistentList(),
|
||||
localClassesNavigationInfo
|
||||
localClassesNavigationInfo,
|
||||
firProviderInterceptor
|
||||
)
|
||||
|
||||
this.accept(supertypeResolverVisitor, null)
|
||||
@@ -172,20 +183,22 @@ fun FirRegularClass.resolveSupertypesInTheAir(session: FirSession): List<FirType
|
||||
.resolveSpecificClassLikeSupertypes(this, superTypeRefs)
|
||||
}
|
||||
|
||||
open class FirSupertypeResolverVisitor(
|
||||
class FirSupertypeResolverVisitor(
|
||||
private val session: FirSession,
|
||||
private val supertypeComputationSession: SupertypeComputationSession,
|
||||
private val scopeSession: ScopeSession,
|
||||
private val scopeForLocalClass: PersistentList<FirScope>? = null,
|
||||
private val localClassesNavigationInfo: LocalClassesNavigationInfo? = null
|
||||
private val localClassesNavigationInfo: LocalClassesNavigationInfo? = null,
|
||||
private val firProviderInterceptor: FirProviderInterceptorForSupertypeResolver? = null,
|
||||
) : FirDefaultVisitor<Unit, Any?>() {
|
||||
private val supertypeGenerationExtensions = session.extensionService.supertypeGenerators
|
||||
|
||||
open fun getFirClassifierContainerFile(symbol: FirClassLikeSymbol<*>): FirFile =
|
||||
session.firProvider.getFirClassifierContainerFile(symbol.classId)
|
||||
private fun getFirClassifierContainerFile(symbol: FirClassLikeSymbol<*>): FirFile =
|
||||
firProviderInterceptor?.getFirClassifierContainerFile(symbol) ?: session.firProvider.getFirClassifierContainerFile(symbol.classId)
|
||||
|
||||
open fun getFirClassifierByFqName(classId: ClassId): FirClassLikeDeclaration<*>? =
|
||||
session.firProvider.getFirClassifierByFqName(classId)
|
||||
private fun getFirClassifierByFqName(classId: ClassId): FirClassLikeDeclaration<*>? =
|
||||
if (firProviderInterceptor != null) firProviderInterceptor.getFirClassifierByFqName(classId)
|
||||
else session.firProvider.getFirClassifierByFqName(classId)
|
||||
|
||||
override fun visitElement(element: FirElement, data: Any?) {}
|
||||
|
||||
|
||||
+3
-1
@@ -15,6 +15,7 @@ import org.jetbrains.kotlin.fir.resolve.ResolutionMode
|
||||
import org.jetbrains.kotlin.fir.resolve.ScopeSession
|
||||
import org.jetbrains.kotlin.fir.resolve.calls.ResolutionContext
|
||||
import org.jetbrains.kotlin.fir.resolve.dfa.DataFlowAnalyzerContext
|
||||
import org.jetbrains.kotlin.fir.resolve.transformers.FirProviderInterceptorForSupertypeResolver
|
||||
import org.jetbrains.kotlin.fir.resolve.transformers.ReturnTypeCalculator
|
||||
import org.jetbrains.kotlin.fir.resolve.transformers.ReturnTypeCalculatorForFullBodyResolve
|
||||
import org.jetbrains.kotlin.fir.scopes.FirCompositeScope
|
||||
@@ -31,7 +32,8 @@ open class FirBodyResolveTransformer(
|
||||
scopeSession: ScopeSession,
|
||||
val returnTypeCalculator: ReturnTypeCalculator = ReturnTypeCalculatorForFullBodyResolve(),
|
||||
outerBodyResolveContext: BodyResolveContext? = null,
|
||||
val firTowerDataContextCollector: FirTowerDataContextCollector? = null
|
||||
val firTowerDataContextCollector: FirTowerDataContextCollector? = null,
|
||||
val firProviderInterceptor: FirProviderInterceptorForSupertypeResolver? = null,
|
||||
) : FirAbstractBodyResolveTransformer(phase) {
|
||||
|
||||
final override val context: BodyResolveContext =
|
||||
|
||||
+27
-4
@@ -351,7 +351,13 @@ open class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransfor
|
||||
|
||||
override fun transformRegularClass(regularClass: FirRegularClass, data: ResolutionMode): FirStatement {
|
||||
if (regularClass.isLocal && regularClass !in context.targetedLocalClasses) {
|
||||
return regularClass.runAllPhasesForLocalClass(transformer, components, data, transformer.firTowerDataContextCollector)
|
||||
return regularClass.runAllPhasesForLocalClass(
|
||||
transformer,
|
||||
components,
|
||||
data,
|
||||
transformer.firTowerDataContextCollector,
|
||||
transformer.firProviderInterceptor
|
||||
)
|
||||
}
|
||||
|
||||
doTransformTypeParameters(regularClass)
|
||||
@@ -360,7 +366,13 @@ open class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransfor
|
||||
|
||||
override fun transformTypeAlias(typeAlias: FirTypeAlias, data: ResolutionMode): FirDeclaration {
|
||||
if (typeAlias.isLocal && typeAlias !in context.targetedLocalClasses) {
|
||||
return typeAlias.runAllPhasesForLocalClass(transformer, components, data, transformer.firTowerDataContextCollector)
|
||||
return typeAlias.runAllPhasesForLocalClass(
|
||||
transformer,
|
||||
components,
|
||||
data,
|
||||
transformer.firTowerDataContextCollector,
|
||||
transformer.firProviderInterceptor
|
||||
)
|
||||
}
|
||||
doTransformTypeParameters(typeAlias)
|
||||
typeAlias.transformAnnotations(transformer, data)
|
||||
@@ -400,7 +412,13 @@ open class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransfor
|
||||
data: ResolutionMode
|
||||
): FirStatement {
|
||||
if (anonymousObject !in context.targetedLocalClasses) {
|
||||
return anonymousObject.runAllPhasesForLocalClass(transformer, components, data, transformer.firTowerDataContextCollector)
|
||||
return anonymousObject.runAllPhasesForLocalClass(
|
||||
transformer,
|
||||
components,
|
||||
data,
|
||||
transformer.firTowerDataContextCollector,
|
||||
transformer.firProviderInterceptor
|
||||
)
|
||||
}
|
||||
dataFlowAnalyzer.enterClass()
|
||||
if (anonymousObject.typeRef !is FirResolvedTypeRef) {
|
||||
@@ -858,7 +876,12 @@ open class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransfor
|
||||
valueParameter.transformReturnTypeRef(
|
||||
StoreType,
|
||||
valueParameter.returnTypeRef.resolvedTypeFromPrototype(
|
||||
ConeKotlinErrorType(ConeSimpleDiagnostic("No type for parameter", DiagnosticKind.ValueParameterWithNoTypeAnnotation))
|
||||
ConeKotlinErrorType(
|
||||
ConeSimpleDiagnostic(
|
||||
"No type for parameter",
|
||||
DiagnosticKind.ValueParameterWithNoTypeAnnotation
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
+3
@@ -10,6 +10,9 @@ import org.jetbrains.kotlin.fir.declarations.FirFile
|
||||
import org.jetbrains.kotlin.fir.expressions.FirStatement
|
||||
import org.jetbrains.kotlin.fir.resolve.FirTowerDataContext
|
||||
|
||||
/**
|
||||
* Collector needed to collect TowerDataContext in IDE for in-air resolved fir elements.
|
||||
*/
|
||||
interface FirTowerDataContextCollector {
|
||||
fun addFileContext(file: FirFile, context: FirTowerDataContext)
|
||||
fun addStatementContext(statement: FirStatement, context: FirTowerDataContext)
|
||||
|
||||
+5
-2
@@ -9,6 +9,7 @@ import org.jetbrains.kotlin.fir.declarations.FirClassLikeDeclaration
|
||||
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
|
||||
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
||||
import org.jetbrains.kotlin.fir.resolve.ResolutionMode
|
||||
import org.jetbrains.kotlin.fir.resolve.transformers.FirProviderInterceptorForSupertypeResolver
|
||||
import org.jetbrains.kotlin.fir.resolve.transformers.runStatusResolveForLocalClass
|
||||
import org.jetbrains.kotlin.fir.resolve.transformers.runSupertypeResolvePhaseForLocalClass
|
||||
import org.jetbrains.kotlin.fir.resolve.transformers.runTypeResolvePhaseForLocalClass
|
||||
@@ -18,7 +19,8 @@ fun <F : FirClassLikeDeclaration<F>> F.runAllPhasesForLocalClass(
|
||||
transformer: FirAbstractBodyResolveTransformer,
|
||||
components: FirAbstractBodyResolveTransformer.BodyResolveTransformerComponents,
|
||||
resolutionMode: ResolutionMode,
|
||||
firTowerDataContextCollector: FirTowerDataContextCollector?
|
||||
firTowerDataContextCollector: FirTowerDataContextCollector?,
|
||||
firProviderInterceptor: FirProviderInterceptorForSupertypeResolver?,
|
||||
): F {
|
||||
if (this.resolvePhase > FirResolvePhase.RAW_FIR) return this
|
||||
if (this is FirRegularClass) {
|
||||
@@ -36,7 +38,8 @@ fun <F : FirClassLikeDeclaration<F>> F.runAllPhasesForLocalClass(
|
||||
components.session,
|
||||
components.scopeSession,
|
||||
components.createCurrentScopeList(),
|
||||
localClassesNavigationInfo
|
||||
localClassesNavigationInfo,
|
||||
firProviderInterceptor
|
||||
)
|
||||
runTypeResolvePhaseForLocalClass(
|
||||
components.session,
|
||||
|
||||
Reference in New Issue
Block a user