FIR: Optimize supertypes scope structure

This commit is contained in:
Denis Zharkov
2019-12-04 14:48:43 +03:00
parent 91fce215d2
commit 43aa1f87df
3 changed files with 19 additions and 5 deletions
@@ -121,7 +121,7 @@ class JavaSymbolProvider(
}
JavaClassUseSiteMemberScope(
regularClass, useSiteSession,
FirSuperTypeScope(
FirSuperTypeScope.prepareSupertypeScope(
useSiteSession,
JavaOverrideChecker(
useSiteSession, if (regularClass is FirJavaClass) regularClass
@@ -18,7 +18,9 @@ import org.jetbrains.kotlin.fir.scopes.impl.FirStandardOverrideChecker
import org.jetbrains.kotlin.fir.scopes.impl.FirSuperTypeScope
import org.jetbrains.kotlin.fir.scopes.impl.declaredMemberScope
import org.jetbrains.kotlin.fir.scopes.jvm.JvmMappedScope
import org.jetbrains.kotlin.fir.symbols.*
import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag
import org.jetbrains.kotlin.fir.symbols.ConeClassifierLookupTag
import org.jetbrains.kotlin.fir.symbols.ConeClassifierLookupTagWithFixedSymbol
import org.jetbrains.kotlin.fir.symbols.impl.*
import org.jetbrains.kotlin.fir.types.ConeClassErrorType
import org.jetbrains.kotlin.fir.types.ConeClassLikeType
@@ -110,7 +112,7 @@ abstract class FirSymbolProvider : FirSessionComponent {
}
FirClassUseSiteMemberScope(
useSiteSession,
FirSuperTypeScope(useSiteSession, FirStandardOverrideChecker(useSiteSession), scopes),
FirSuperTypeScope.prepareSupertypeScope(useSiteSession, FirStandardOverrideChecker(useSiteSession), scopes),
wrappedDeclaredScope
)
}
@@ -14,7 +14,7 @@ import org.jetbrains.kotlin.fir.symbols.impl.FirClassifierSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
import org.jetbrains.kotlin.name.Name
class FirSuperTypeScope(
class FirSuperTypeScope private constructor(
session: FirSession,
overrideChecker: FirOverrideChecker,
val scopes: List<FirScope>
@@ -112,4 +112,16 @@ class FirSuperTypeScope(
}
return super.processClassifiersByName(name, processor)
}
}
companion object {
fun prepareSupertypeScope(
session: FirSession,
overrideChecker: FirOverrideChecker,
scopes: List<FirScope>
): FirScope {
scopes.singleOrNull()?.let { return it }
return FirSuperTypeScope(session, overrideChecker, scopes)
}
}
}