FIR: Prepare supertypes computation to anonymous objects

This commit is contained in:
Denis Zharkov
2020-03-23 17:57:41 +03:00
parent 30c8a529a2
commit b8fb83e34c
@@ -97,24 +97,24 @@ private fun FirClassLikeDeclaration<*>.typeParametersScope(): FirScope? {
} }
private fun createScopesForNestedClasses( private fun createScopesForNestedClasses(
regularClass: FirRegularClass, klass: FirClass<*>,
session: FirSession, session: FirSession,
supertypeComputationSession: SupertypeComputationSession supertypeComputationSession: SupertypeComputationSession
): Collection<FirScope> = ): Collection<FirScope> =
mutableListOf<FirScope>().apply { mutableListOf<FirScope>().apply {
lookupSuperTypes( lookupSuperTypes(
regularClass, klass,
lookupInterfaces = false, deep = true, useSiteSession = session, lookupInterfaces = false, deep = true, useSiteSession = session,
supertypeSupplier = supertypeComputationSession.supertypesSupplier supertypeSupplier = supertypeComputationSession.supertypesSupplier
).asReversed().mapNotNullTo(this) { ).asReversed().mapNotNullTo(this) {
session.firSymbolProvider.getNestedClassifierScope(it.lookupTag.classId) session.firSymbolProvider.getNestedClassifierScope(it.lookupTag.classId)
} }
addIfNotNull(regularClass.typeParametersScope()) addIfNotNull(klass.typeParametersScope())
val companionObjects = regularClass.declarations.filterIsInstance<FirRegularClass>().filter { it.isCompanion } val companionObjects = klass.declarations.filterIsInstance<FirRegularClass>().filter { it.isCompanion }
for (companionObject in companionObjects) { for (companionObject in companionObjects) {
add(nestedClassifierScope(companionObject)) add(nestedClassifierScope(companionObject))
} }
add(nestedClassifierScope(regularClass)) add(nestedClassifierScope(klass))
} }
fun FirRegularClass.resolveSupertypesInTheAir(session: FirSession): List<FirTypeRef> { fun FirRegularClass.resolveSupertypesInTheAir(session: FirSession): List<FirTypeRef> {
@@ -135,13 +135,13 @@ private class FirSupertypeResolverVisitor(
} }
} }
private fun prepareScopeForNestedClasses(regularClass: FirRegularClass): FirImmutableCompositeScope { private fun prepareScopeForNestedClasses(klass: FirClass<*>): FirImmutableCompositeScope {
return supertypeComputationSession.getOrPutScopeForNestedClasses(regularClass) { return supertypeComputationSession.getOrPutScopeForNestedClasses(klass) {
val scope = prepareScope(regularClass) val scope = prepareScope(klass)
resolveAllSupertypes(regularClass, regularClass.superTypeRefs) resolveAllSupertypes(klass, klass.superTypeRefs)
scope.childScope(createScopesForNestedClasses(regularClass, session, supertypeComputationSession)) scope.childScope(createScopesForNestedClasses(klass, session, supertypeComputationSession))
} }
} }
@@ -271,7 +271,7 @@ private fun createErrorTypeRef(fir: FirElement, message: String) = buildErrorTyp
private class SupertypeComputationSession { private class SupertypeComputationSession {
private val fileScopesMap = hashMapOf<FirFile, FirImmutableCompositeScope>() private val fileScopesMap = hashMapOf<FirFile, FirImmutableCompositeScope>()
private val scopesForNestedClassesMap = hashMapOf<FirRegularClass, FirImmutableCompositeScope>() private val scopesForNestedClassesMap = hashMapOf<FirClass<*>, FirImmutableCompositeScope>()
private val supertypeStatusMap = linkedMapOf<FirClassLikeDeclaration<*>, SupertypeComputationStatus>() private val supertypeStatusMap = linkedMapOf<FirClassLikeDeclaration<*>, SupertypeComputationStatus>()
val supertypesSupplier = object : SupertypeSupplier() { val supertypesSupplier = object : SupertypeSupplier() {
@@ -296,8 +296,8 @@ private class SupertypeComputationSession {
fun getOrPutFileScope(file: FirFile, scope: () -> FirImmutableCompositeScope): FirImmutableCompositeScope = fun getOrPutFileScope(file: FirFile, scope: () -> FirImmutableCompositeScope): FirImmutableCompositeScope =
fileScopesMap.getOrPut(file) { scope() } fileScopesMap.getOrPut(file) { scope() }
fun getOrPutScopeForNestedClasses(regularClass: FirRegularClass, scope: () -> FirImmutableCompositeScope): FirImmutableCompositeScope = fun getOrPutScopeForNestedClasses(klass: FirClass<*>, scope: () -> FirImmutableCompositeScope): FirImmutableCompositeScope =
scopesForNestedClassesMap.getOrPut(regularClass) { scope() } scopesForNestedClassesMap.getOrPut(klass) { scope() }
fun startComputingSupertypes(classLikeDeclaration: FirClassLikeDeclaration<*>) { fun startComputingSupertypes(classLikeDeclaration: FirClassLikeDeclaration<*>) {
require(supertypeStatusMap[classLikeDeclaration] == null) { require(supertypeStatusMap[classLikeDeclaration] == null) {