[LL FIR] avoid redundant pass through the entire super type hierarchy for nested classes

We can omit this step in LL FIR because, according to the contract,
an outer class must be resolved before nested class
Also, it drops unsafe access to superTypeRefs from FIR transformer

^KT-56550
This commit is contained in:
Dmitrii Gridin
2023-05-07 16:11:28 +02:00
committed by Space Team
parent ee74e10f28
commit 873c7d63ed
6 changed files with 454 additions and 7 deletions
@@ -237,7 +237,7 @@ private fun createOtherScopesForNestedClassesOrCompanion(
// See: prepareScopes()
}
class FirSupertypeResolverVisitor(
open class FirSupertypeResolverVisitor(
private val session: FirSession,
private val supertypeComputationSession: SupertypeComputationSession,
private val scopeSession: ScopeSession,
@@ -300,15 +300,28 @@ class FirSupertypeResolverVisitor(
}
private fun calculateScopes(
klass: FirClass,
outerClass: FirClass,
withCompanionScopes: Boolean,
): PersistentList<FirScope> {
resolveAllSupertypes(klass, klass.superTypeRefs)
return prepareScopes(klass).pushAll(
createOtherScopesForNestedClassesOrCompanion(klass, session, scopeSession, supertypeComputationSession, withCompanionScopes)
resolveAllSupertypesForOuterClass(outerClass)
return prepareScopes(outerClass).pushAll(
createOtherScopesForNestedClassesOrCompanion(
klass = outerClass,
session = session,
scopeSession = scopeSession,
supertypeComputationSession = supertypeComputationSession,
withCompanionScopes = withCompanionScopes,
)
)
}
/**
* Resolve all super types. [outerClass] is used as an outer scope for nested class or companion
*/
protected open fun resolveAllSupertypesForOuterClass(outerClass: FirClass) {
resolveAllSupertypes(outerClass, outerClass.superTypeRefs)
}
private fun resolveAllSupertypes(
classLikeDeclaration: FirClassLikeDeclaration,
supertypeRefs: List<FirTypeRef>,