FIR: Pass scope to FirSpecificTypeResolverTransformer as data
This commit is contained in:
+9
-11
@@ -7,9 +7,8 @@ package org.jetbrains.kotlin.fir.resolve.transformers
|
||||
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
||||
import org.jetbrains.kotlin.fir.resolve.FirTypeResolver
|
||||
import org.jetbrains.kotlin.fir.resolve.typeResolver
|
||||
import org.jetbrains.kotlin.fir.scopes.FirIterableScope
|
||||
import org.jetbrains.kotlin.fir.scopes.FirScope
|
||||
import org.jetbrains.kotlin.fir.types.*
|
||||
import org.jetbrains.kotlin.fir.types.builder.buildResolvedFunctionTypeRef
|
||||
import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef
|
||||
@@ -17,22 +16,21 @@ import org.jetbrains.kotlin.fir.visitors.CompositeTransformResult
|
||||
import org.jetbrains.kotlin.fir.visitors.compose
|
||||
|
||||
class FirSpecificTypeResolverTransformer(
|
||||
private val towerScope: FirIterableScope,
|
||||
override val session: FirSession,
|
||||
private val errorTypeAsResolved: Boolean = true
|
||||
) : FirAbstractTreeTransformer<Nothing?>(phase = FirResolvePhase.SUPER_TYPES) {
|
||||
) : FirAbstractTreeTransformer<FirScope>(phase = FirResolvePhase.SUPER_TYPES) {
|
||||
private val typeResolver = session.typeResolver
|
||||
|
||||
override fun transformTypeRef(typeRef: FirTypeRef, data: Nothing?): CompositeTransformResult<FirTypeRef> {
|
||||
typeRef.transformChildren(this, null)
|
||||
return transformType(typeRef, typeResolver.resolveType(typeRef, towerScope))
|
||||
override fun transformTypeRef(typeRef: FirTypeRef, data: FirScope): CompositeTransformResult<FirTypeRef> {
|
||||
typeRef.transformChildren(this, data)
|
||||
return transformType(typeRef, typeResolver.resolveType(typeRef, data))
|
||||
}
|
||||
|
||||
override fun transformFunctionTypeRef(functionTypeRef: FirFunctionTypeRef, data: Nothing?): CompositeTransformResult<FirTypeRef> {
|
||||
override fun transformFunctionTypeRef(functionTypeRef: FirFunctionTypeRef, data: FirScope): CompositeTransformResult<FirTypeRef> {
|
||||
functionTypeRef.transformChildren(this, data)
|
||||
return buildResolvedFunctionTypeRef {
|
||||
source = functionTypeRef.source
|
||||
type = typeResolver.resolveType(functionTypeRef, towerScope).takeIfAcceptable() ?: return functionTypeRef.compose()
|
||||
type = typeResolver.resolveType(functionTypeRef, data).takeIfAcceptable() ?: return functionTypeRef.compose()
|
||||
isMarkedNullable = functionTypeRef.isMarkedNullable
|
||||
isSuspend = functionTypeRef.isSuspend
|
||||
receiverTypeRef = functionTypeRef.receiverTypeRef
|
||||
@@ -55,11 +53,11 @@ class FirSpecificTypeResolverTransformer(
|
||||
!errorTypeAsResolved && it is ConeClassErrorType
|
||||
}
|
||||
|
||||
override fun transformResolvedTypeRef(resolvedTypeRef: FirResolvedTypeRef, data: Nothing?): CompositeTransformResult<FirTypeRef> {
|
||||
override fun transformResolvedTypeRef(resolvedTypeRef: FirResolvedTypeRef, data: FirScope): CompositeTransformResult<FirTypeRef> {
|
||||
return resolvedTypeRef.compose()
|
||||
}
|
||||
|
||||
override fun transformImplicitTypeRef(implicitTypeRef: FirImplicitTypeRef, data: Nothing?): CompositeTransformResult<FirTypeRef> {
|
||||
override fun transformImplicitTypeRef(implicitTypeRef: FirImplicitTypeRef, data: FirScope): CompositeTransformResult<FirTypeRef> {
|
||||
return implicitTypeRef.compose()
|
||||
}
|
||||
}
|
||||
|
||||
+7
-7
@@ -244,7 +244,7 @@ private class FirSupertypeResolverVisitor(
|
||||
|
||||
private fun resolveSpecificClassLikeSupertypes(
|
||||
classLikeDeclaration: FirClassLikeDeclaration<*>,
|
||||
resolveSuperTypeRefs: (FirTransformer<Nothing?>) -> List<FirTypeRef>
|
||||
resolveSuperTypeRefs: (FirTransformer<FirScope>, FirScope) -> List<FirTypeRef>
|
||||
): List<FirTypeRef> {
|
||||
when (val status = supertypeComputationSession.getSupertypesComputationStatus(classLikeDeclaration)) {
|
||||
is SupertypeComputationStatus.Computed -> return status.supertypeRefs
|
||||
@@ -256,8 +256,8 @@ private class FirSupertypeResolverVisitor(
|
||||
supertypeComputationSession.startComputingSupertypes(classLikeDeclaration)
|
||||
val scope = prepareScope(classLikeDeclaration)
|
||||
|
||||
val transformer = FirSpecificTypeResolverTransformer(scope, session)
|
||||
val resolvedTypesRefs = resolveSuperTypeRefs(transformer)
|
||||
val transformer = FirSpecificTypeResolverTransformer(session)
|
||||
val resolvedTypesRefs = resolveSuperTypeRefs(transformer, scope)
|
||||
|
||||
supertypeComputationSession.storeSupertypes(classLikeDeclaration, resolvedTypesRefs)
|
||||
return resolvedTypesRefs
|
||||
@@ -277,9 +277,9 @@ private class FirSupertypeResolverVisitor(
|
||||
classLikeDeclaration: FirClassLikeDeclaration<*>,
|
||||
supertypeRefs: List<FirTypeRef>
|
||||
): List<FirTypeRef> {
|
||||
return resolveSpecificClassLikeSupertypes(classLikeDeclaration) { transformer ->
|
||||
return resolveSpecificClassLikeSupertypes(classLikeDeclaration) { transformer, scope ->
|
||||
supertypeRefs.mapTo(mutableListOf()) {
|
||||
val superTypeRef = transformer.transformTypeRef(it, null).single
|
||||
val superTypeRef = transformer.transformTypeRef(it, scope).single
|
||||
|
||||
if (superTypeRef.coneTypeSafe<ConeTypeParameterType>() != null)
|
||||
createErrorTypeRef(
|
||||
@@ -310,9 +310,9 @@ private class FirSupertypeResolverVisitor(
|
||||
return
|
||||
}
|
||||
|
||||
resolveSpecificClassLikeSupertypes(typeAlias) { transformer ->
|
||||
resolveSpecificClassLikeSupertypes(typeAlias) { transformer, scope ->
|
||||
val resolvedTypeRef =
|
||||
transformer.transformTypeRef(typeAlias.expandedTypeRef, null).single as? FirResolvedTypeRef
|
||||
transformer.transformTypeRef(typeAlias.expandedTypeRef, scope).single as? FirResolvedTypeRef
|
||||
?: return@resolveSpecificClassLikeSupertypes listOf(
|
||||
createErrorTypeRef(
|
||||
typeAlias.expandedTypeRef,
|
||||
|
||||
+2
-2
@@ -45,7 +45,7 @@ class FirTypeResolveTransformer(
|
||||
towerScope.addScopes(initialScopes.asReversed())
|
||||
}
|
||||
|
||||
private val typeResolverTransformer: FirSpecificTypeResolverTransformer = FirSpecificTypeResolverTransformer(towerScope, session)
|
||||
private val typeResolverTransformer: FirSpecificTypeResolverTransformer = FirSpecificTypeResolverTransformer(session)
|
||||
|
||||
override fun transformFile(file: FirFile, data: Nothing?): CompositeTransformResult<FirFile> {
|
||||
checkSessionConsistency(file)
|
||||
@@ -114,7 +114,7 @@ class FirTypeResolveTransformer(
|
||||
}
|
||||
|
||||
override fun transformTypeRef(typeRef: FirTypeRef, data: Nothing?): CompositeTransformResult<FirTypeRef> {
|
||||
return typeResolverTransformer.transformTypeRef(typeRef, data)
|
||||
return typeResolverTransformer.transformTypeRef(typeRef, towerScope)
|
||||
}
|
||||
|
||||
override fun transformValueParameter(valueParameter: FirValueParameter, data: Nothing?): CompositeTransformResult<FirStatement> {
|
||||
|
||||
+1
-2
@@ -21,7 +21,6 @@ import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider
|
||||
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.scopes.impl.FirTypeResolveScopeForBodyResolve
|
||||
import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirAnonymousFunctionSymbol
|
||||
import org.jetbrains.kotlin.fir.types.FirTypeRef
|
||||
@@ -282,7 +281,7 @@ abstract class FirAbstractBodyResolveTransformer(phase: FirResolvePhase) : FirAb
|
||||
qualifiedResolver
|
||||
)
|
||||
val typeResolverTransformer = FirSpecificTypeResolverTransformer(
|
||||
FirTypeResolveScopeForBodyResolve(this), session
|
||||
session
|
||||
)
|
||||
override val callCompleter: FirCallCompleter = FirCallCompleter(transformer, this)
|
||||
override val dataFlowAnalyzer: FirDataFlowAnalyzer<*> =
|
||||
|
||||
+3
-1
@@ -16,6 +16,8 @@ import org.jetbrains.kotlin.fir.resolve.transformers.ReturnTypeCalculator
|
||||
import org.jetbrains.kotlin.fir.resolve.transformers.ReturnTypeCalculatorForFullBodyResolve
|
||||
import org.jetbrains.kotlin.fir.resolve.transformers.withScopeCleanup
|
||||
import org.jetbrains.kotlin.fir.scopes.createImportingScopes
|
||||
import org.jetbrains.kotlin.fir.scopes.impl.FirCompositeScope
|
||||
import org.jetbrains.kotlin.fir.scopes.impl.createCurrentScopeList
|
||||
import org.jetbrains.kotlin.fir.types.FirImplicitTypeRef
|
||||
import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef
|
||||
import org.jetbrains.kotlin.fir.types.FirTypeRef
|
||||
@@ -72,7 +74,7 @@ open class FirBodyResolveTransformer(
|
||||
if (typeRef is FirResolvedTypeRef) {
|
||||
return typeRef.compose()
|
||||
}
|
||||
return typeResolverTransformer.transformTypeRef(typeRef, null)
|
||||
return typeResolverTransformer.transformTypeRef(typeRef, FirCompositeScope(components.createCurrentScopeList()))
|
||||
}
|
||||
|
||||
override fun transformImplicitTypeRef(implicitTypeRef: FirImplicitTypeRef, data: ResolutionMode): CompositeTransformResult<FirTypeRef> {
|
||||
|
||||
+2
-3
@@ -87,7 +87,6 @@ private class FirAnnotationResolveTransformer(
|
||||
) : FirAbstractAnnotationResolveTransformer<Multimap<AnnotationFqn, FirRegularClass>, PersistentList<FirAnnotatedDeclaration>>(session, scopeSession) {
|
||||
var metaAnnotations: Set<AnnotationFqn> = emptySet()
|
||||
private val typeResolverTransformer: FirSpecificTypeResolverTransformer = FirSpecificTypeResolverTransformer(
|
||||
towerScope,
|
||||
session,
|
||||
errorTypeAsResolved = false
|
||||
)
|
||||
@@ -109,7 +108,7 @@ private class FirAnnotationResolveTransformer(
|
||||
annotationCall: FirAnnotationCall,
|
||||
data: Multimap<AnnotationFqn, FirRegularClass>
|
||||
): CompositeTransformResult<FirStatement> {
|
||||
return annotationCall.transformAnnotationTypeRef(typeResolverTransformer, null).compose()
|
||||
return annotationCall.transformAnnotationTypeRef(typeResolverTransformer, scope).compose()
|
||||
}
|
||||
|
||||
override fun transformRegularClass(
|
||||
@@ -134,4 +133,4 @@ private class FirAnnotationResolveTransformer(
|
||||
session.predicateBasedProvider.registerAnnotatedDeclaration(annotatedDeclaration, owners)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
-8
@@ -6,15 +6,7 @@
|
||||
package org.jetbrains.kotlin.fir.scopes.impl
|
||||
|
||||
import org.jetbrains.kotlin.fir.resolve.BodyResolveComponents
|
||||
import org.jetbrains.kotlin.fir.scopes.FirIterableScope
|
||||
import org.jetbrains.kotlin.fir.scopes.FirScope
|
||||
|
||||
class FirTypeResolveScopeForBodyResolve(
|
||||
private val components: BodyResolveComponents
|
||||
) : FirIterableScope() {
|
||||
override val scopes: Iterable<FirScope>
|
||||
get() = components.createCurrentScopeList()
|
||||
}
|
||||
|
||||
fun BodyResolveComponents.createCurrentScopeList(): List<FirScope> =
|
||||
towerDataElements.asReversed().mapNotNull { it.scope }
|
||||
|
||||
Reference in New Issue
Block a user