FIR override resolve: lookup also interfaces

This commit is contained in:
Mikhail Glukhikh
2019-01-30 13:38:38 +03:00
parent b3c8e83c58
commit 6ea2abfc46
5 changed files with 33 additions and 15 deletions
@@ -29,8 +29,11 @@ abstract class FirAbstractTreeTransformerWithSuperTypes(reversedScopePriority: B
return result return result
} }
protected fun lookupSuperTypes(klass: FirRegularClass): List<ConeClassLikeType> { protected fun lookupSuperTypes(klass: FirRegularClass, lookupInterfaces: Boolean): List<ConeClassLikeType> {
return mutableListOf<ConeClassLikeType>().also { klass.symbol.collectSuperTypes(it) } return mutableListOf<ConeClassLikeType>().also {
if (lookupInterfaces) klass.symbol.collectSuperTypes(it)
else klass.symbol.collectSuperClasses(it)
}
} }
private tailrec fun ConeClassLikeType.computePartialExpansion(): ConeClassLikeType? { private tailrec fun ConeClassLikeType.computePartialExpansion(): ConeClassLikeType? {
@@ -40,7 +43,7 @@ abstract class FirAbstractTreeTransformerWithSuperTypes(reversedScopePriority: B
} }
} }
private tailrec fun ConeClassLikeSymbol.collectSuperTypes(list: MutableList<ConeClassLikeType>) { private tailrec fun ConeClassLikeSymbol.collectSuperClasses(list: MutableList<ConeClassLikeType>) {
when (this) { when (this) {
is ConeClassSymbol -> { is ConeClassSymbol -> {
val superClassType = val superClassType =
@@ -50,7 +53,27 @@ abstract class FirAbstractTreeTransformerWithSuperTypes(reversedScopePriority: B
it !is ConeClassErrorType && (it?.symbol as? ConeClassSymbol)?.kind == ClassKind.CLASS it !is ConeClassErrorType && (it?.symbol as? ConeClassSymbol)?.kind == ClassKind.CLASS
} ?: return } ?: return
list += superClassType list += superClassType
superClassType.symbol.collectSuperTypes(list) superClassType.symbol.collectSuperClasses(list)
}
is ConeTypeAliasSymbol -> {
val expansion = expansionType?.computePartialExpansion() ?: return
expansion.symbol.collectSuperClasses(list)
}
else -> error("?!id:1")
}
}
private fun ConeClassLikeSymbol.collectSuperTypes(list: MutableList<ConeClassLikeType>) {
when (this) {
is ConeClassSymbol -> {
val superClassTypes =
this.superTypes.mapNotNull { it.computePartialExpansion() }
list += superClassTypes
superClassTypes.forEach {
if (it !is ConeClassErrorType) {
it.symbol.collectSuperTypes(list)
}
}
} }
is ConeTypeAliasSymbol -> { is ConeTypeAliasSymbol -> {
val expansion = expansionType?.computePartialExpansion() ?: return val expansion = expansionType?.computePartialExpansion() ?: return
@@ -12,16 +12,12 @@ import org.jetbrains.kotlin.fir.declarations.FirFile
import org.jetbrains.kotlin.fir.declarations.FirRegularClass import org.jetbrains.kotlin.fir.declarations.FirRegularClass
import org.jetbrains.kotlin.fir.references.FirErrorNamedReference import org.jetbrains.kotlin.fir.references.FirErrorNamedReference
import org.jetbrains.kotlin.fir.references.FirResolvedCallableReferenceImpl import org.jetbrains.kotlin.fir.references.FirResolvedCallableReferenceImpl
import org.jetbrains.kotlin.fir.resolve.FirSymbolProvider
import org.jetbrains.kotlin.fir.scopes.FirPosition import org.jetbrains.kotlin.fir.scopes.FirPosition
import org.jetbrains.kotlin.fir.scopes.impl.FirClassDeclaredMemberScope import org.jetbrains.kotlin.fir.scopes.impl.FirClassDeclaredMemberScope
import org.jetbrains.kotlin.fir.scopes.impl.FirTopLevelDeclaredMemberScope import org.jetbrains.kotlin.fir.scopes.impl.FirTopLevelDeclaredMemberScope
import org.jetbrains.kotlin.fir.symbols.ConeCallableSymbol import org.jetbrains.kotlin.fir.symbols.ConeCallableSymbol
import org.jetbrains.kotlin.fir.symbols.ConeClassLikeSymbol
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol
import org.jetbrains.kotlin.fir.types.impl.ConeAbbreviatedTypeImpl import org.jetbrains.kotlin.fir.types.ConeClassErrorType
import org.jetbrains.kotlin.fir.types.impl.ConeClassTypeImpl
import org.jetbrains.kotlin.fir.visitors.CompositeTransformResult import org.jetbrains.kotlin.fir.visitors.CompositeTransformResult
import org.jetbrains.kotlin.fir.visitors.compose import org.jetbrains.kotlin.fir.visitors.compose
@@ -37,8 +33,9 @@ class FirAccessResolveTransformer : FirAbstractTreeTransformerWithSuperTypes(rev
override fun transformRegularClass(regularClass: FirRegularClass, data: Nothing?): CompositeTransformResult<FirDeclaration> { override fun transformRegularClass(regularClass: FirRegularClass, data: Nothing?): CompositeTransformResult<FirDeclaration> {
return withScopeCleanup { return withScopeCleanup {
val useSiteSession = regularClass.session val useSiteSession = regularClass.session
lookupSuperTypes(regularClass).asReversed() lookupSuperTypes(regularClass, lookupInterfaces = true).asReversed()
.mapNotNullTo(towerScope.scopes) { useSiteSuperType -> .mapNotNullTo(towerScope.scopes) { useSiteSuperType ->
if (useSiteSuperType is ConeClassErrorType) return@mapNotNullTo null
val symbol = useSiteSuperType.symbol val symbol = useSiteSuperType.symbol
if (symbol is FirClassSymbol) { if (symbol is FirClassSymbol) {
FirClassDeclaredMemberScope(symbol.fir, useSiteSession) FirClassDeclaredMemberScope(symbol.fir, useSiteSession)
@@ -63,7 +63,7 @@ open class FirTypeResolveTransformer(
return withScopeCleanup { return withScopeCleanup {
val firProvider = FirProvider.getInstance(regularClass.session) val firProvider = FirProvider.getInstance(regularClass.session)
val classId = regularClass.symbol.classId val classId = regularClass.symbol.classId
lookupSuperTypes(regularClass).asReversed().mapTo(towerScope.scopes) { lookupSuperTypes(regularClass, lookupInterfaces = false).asReversed().mapTo(towerScope.scopes) {
val symbol = it.symbol val symbol = it.symbol
if (symbol is FirBasedSymbol<*>) { if (symbol is FirBasedSymbol<*>) {
FirNestedClassifierScope(symbol.classId, FirProvider.getInstance(symbol.fir.session)) FirNestedClassifierScope(symbol.classId, FirProvider.getInstance(symbol.fir.session))
+1 -3
View File
@@ -13,9 +13,8 @@ actual open class A : X(), Y {
class C : B() { class C : B() {
fun test() { fun test() {
foo() foo()
// This cannot be resolved yet due to lack of search symbols / projections // This and next cannot be resolved yet due to lack of search symbols / projections
bar() bar()
// This cannot be resolved yet due to lack of interface lookup
baz() baz()
} }
} }
@@ -24,7 +23,6 @@ class D : A() {
fun test() { fun test() {
foo() foo()
bar() bar()
// This cannot be resolved yet due to lack of interface lookup
baz() baz()
} }
} }
+1 -1
View File
@@ -34,7 +34,7 @@ FILE: jvm.kt
public final function test(): R|kotlin/Unit| { public final function test(): R|kotlin/Unit| {
R|/A.foo|() R|/A.foo|()
R|/X.bar|() R|/X.bar|()
<Unresolved name: baz>#() R|/Y.baz|()
} }
} }