FIR: Pass scope to FirSpecificTypeResolverTransformer as data

This commit is contained in:
Denis Zharkov
2020-06-26 10:58:40 +03:00
parent cea38771f1
commit 09bb755088
7 changed files with 24 additions and 34 deletions
@@ -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()
}
}
@@ -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,
@@ -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> {
@@ -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<*> =
@@ -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> {
@@ -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)
}
}
}
}
@@ -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 }