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