From e010a96055776bf8d83d860892097cdcfc7cc315 Mon Sep 17 00:00:00 2001 From: Simon Ogorodnik Date: Tue, 10 Apr 2018 17:44:38 +0300 Subject: [PATCH] FIR: Fix super-type nested qualifier resolution --- .../fir/resolve/impl/FirTypeResolverImpl.kt | 6 +++++- .../transformers/FirTypeResolveTransformer.kt | 20 ++++++++++++++----- .../scopes/impl/FirNestedClassifierScope.kt | 13 ++++++------ 3 files changed, 26 insertions(+), 13 deletions(-) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/impl/FirTypeResolverImpl.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/impl/FirTypeResolverImpl.kt index fa7a8ea0a05..c185e517987 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/impl/FirTypeResolverImpl.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/impl/FirTypeResolverImpl.kt @@ -73,7 +73,11 @@ class FirTypeResolverImpl : FirTypeResolver { scope.processClassifiersByName(type.qualifier.first().name, position) { symbol -> resolvedSymbol = when (symbol) { is ConeClassLikeSymbol -> { - qualifierResolver.resolveSymbolWithPrefix(type.qualifier, symbol.classId) + if (type.qualifier.size == 1) { + symbol + } else { + qualifierResolver.resolveSymbolWithPrefix(type.qualifier, symbol.classId) + } } is ConeTypeParameterSymbol -> { assert(type.qualifier.size == 1) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirTypeResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirTypeResolveTransformer.kt index 60b158ec4eb..1ae417ca44d 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirTypeResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirTypeResolveTransformer.kt @@ -11,6 +11,7 @@ import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall import org.jetbrains.kotlin.fir.render import org.jetbrains.kotlin.fir.resolve.FirProvider +import org.jetbrains.kotlin.fir.resolve.FirSymbolProvider import org.jetbrains.kotlin.fir.resolve.FirTypeResolver import org.jetbrains.kotlin.fir.scopes.FirPosition import org.jetbrains.kotlin.fir.scopes.impl.* @@ -49,8 +50,8 @@ open class FirTypeResolveTransformer : FirTransformer() { return super.transformFile(file, data) } - private fun lookupSuperTypes(klass: FirClass): List { - return mutableListOf().also { klass.symbol.collectSuperTypes(it) }.map { it.symbol.classId } + private fun lookupSuperTypes(klass: FirClass): List { + return mutableListOf().also { klass.symbol.collectSuperTypes(it) } } private fun resolveSuperTypesAndExpansions(element: FirMemberDeclaration) { @@ -69,14 +70,23 @@ open class FirTypeResolveTransformer : FirTransformer() { scope.scopes += FirClassLikeTypeParameterScope(klass) resolveSuperTypesAndExpansions(klass) - scope.scopes += FirNestedClassifierScope(classId, klass.session) + + val firProvider = FirProvider.getInstance(klass.session) + scope.scopes += FirNestedClassifierScope(classId, firProvider) val companionObjects = klass.declarations.filterIsInstance().filter { it.isCompanion } for (companionObject in companionObjects) { val companionId = ClassId(packageFqName, classLikeName.child(companionObject.name), false) - scope.scopes += FirNestedClassifierScope(companionId, klass.session) + scope.scopes += FirNestedClassifierScope(companionId, firProvider) } - val superTypeScopes = lookupSuperTypes(klass).map { FirNestedClassifierScope(it, klass.session) } + val superTypeScopes = lookupSuperTypes(klass).map { + val symbol = it.symbol + if (symbol is FirBasedSymbol<*>) { + FirNestedClassifierScope(symbol.classId, FirProvider.getInstance(symbol.fir.session)) + } else { + FirNestedClassifierScope(symbol.classId, FirSymbolProvider.getInstance(klass.session)) + } + } scope.scopes.addAll(superTypeScopes) val result = super.transformClass(klass, data) scope = scope.scopes[0] as FirCompositeScope diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirNestedClassifierScope.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirNestedClassifierScope.kt index 27fa3435694..f08f6d099a4 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirNestedClassifierScope.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirNestedClassifierScope.kt @@ -5,18 +5,17 @@ package org.jetbrains.kotlin.fir.scopes.impl -import org.jetbrains.kotlin.fir.FirSession -import org.jetbrains.kotlin.fir.resolve.FirProvider +import org.jetbrains.kotlin.fir.resolve.FirSymbolProvider import org.jetbrains.kotlin.fir.scopes.FirPosition import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.fir.symbols.ConeSymbol import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.Name -class FirNestedClassifierScope(val classId: ClassId, val session: FirSession) : FirScope { - - private val firProvider = FirProvider.getInstance(session) - +class FirNestedClassifierScope( + val classId: ClassId, + private val symbolProvider: FirSymbolProvider +) : FirScope { override fun processClassifiersByName( name: Name, @@ -24,7 +23,7 @@ class FirNestedClassifierScope(val classId: ClassId, val session: FirSession) : processor: (ConeSymbol) -> Boolean ): Boolean { val child = classId.createNestedClassId(name) - val symbol = firProvider.getSymbolByFqName(child) + val symbol = symbolProvider.getSymbolByFqName(child) return symbol == null || processor(symbol) }