FIR: make override resolve in use-site session (and module)

Related to KT-24078
This commit is contained in:
Mikhail Glukhikh
2019-01-30 10:54:27 +03:00
parent 84b3a17e2b
commit b3c8e83c58
11 changed files with 191 additions and 9 deletions
@@ -12,11 +12,16 @@ import org.jetbrains.kotlin.fir.declarations.FirFile
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
import org.jetbrains.kotlin.fir.references.FirErrorNamedReference
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.impl.FirClassDeclaredMemberScope
import org.jetbrains.kotlin.fir.scopes.impl.FirTopLevelDeclaredMemberScope
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.types.impl.ConeAbbreviatedTypeImpl
import org.jetbrains.kotlin.fir.types.impl.ConeClassTypeImpl
import org.jetbrains.kotlin.fir.visitors.CompositeTransformResult
import org.jetbrains.kotlin.fir.visitors.compose
@@ -31,15 +36,17 @@ class FirAccessResolveTransformer : FirAbstractTreeTransformerWithSuperTypes(rev
override fun transformRegularClass(regularClass: FirRegularClass, data: Nothing?): CompositeTransformResult<FirDeclaration> {
return withScopeCleanup {
lookupSuperTypes(regularClass).asReversed().mapNotNullTo(towerScope.scopes) {
val symbol = it.symbol
if (symbol is FirClassSymbol) {
FirClassDeclaredMemberScope(symbol.fir, symbol.fir.session)
} else {
null
val useSiteSession = regularClass.session
lookupSuperTypes(regularClass).asReversed()
.mapNotNullTo(towerScope.scopes) { useSiteSuperType ->
val symbol = useSiteSuperType.symbol
if (symbol is FirClassSymbol) {
FirClassDeclaredMemberScope(symbol.fir, useSiteSession)
} else {
null
}
}
}
towerScope.scopes += FirClassDeclaredMemberScope(regularClass, regularClass.session)
towerScope.scopes += FirClassDeclaredMemberScope(regularClass, useSiteSession)
super.transformRegularClass(regularClass, data)
}
}