From 8ea888a111de4d6a8fefdf6afc959f25be526a3a Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Tue, 24 Mar 2020 12:19:11 +0300 Subject: [PATCH] FIR: Fix getNestedClassifierScope for local classes --- .../jetbrains/kotlin/fir/resolve/FirSymbolProvider.kt | 7 +++++++ .../FirAbstractTreeTransformerWithSuperTypes.kt | 9 ++++++--- .../fir/resolve/transformers/FirSupertypesResolution.kt | 2 +- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/FirSymbolProvider.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/FirSymbolProvider.kt index ee95176bd10..e7b47d90ff2 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/FirSymbolProvider.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/FirSymbolProvider.kt @@ -9,6 +9,7 @@ import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSessionComponent import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.fir.scopes.impl.declaredMemberScope +import org.jetbrains.kotlin.fir.scopes.impl.nestedClassifierScope import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag import org.jetbrains.kotlin.fir.symbols.ConeClassifierLookupTag import org.jetbrains.kotlin.fir.symbols.ConeClassifierLookupTagWithFixedSymbol @@ -59,6 +60,12 @@ abstract class FirSymbolProvider : FirSessionComponent { } } +fun FirSession.getNestedClassifierScope(lookupTag: ConeClassLikeLookupTag): FirScope? = + when (lookupTag) { + is ConeClassLookupTagWithFixedSymbol -> nestedClassifierScope(lookupTag.symbol.fir) + else -> firSymbolProvider.getNestedClassifierScope(lookupTag.classId) + } + fun FirSymbolProvider.getClassDeclaredCallableSymbols(classId: ClassId, name: Name): List> { val classSymbol = getClassLikeSymbolByFqName(classId) as? FirRegularClassSymbol ?: return emptyList() val declaredMemberScope = declaredMemberScope(classSymbol.fir) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirAbstractTreeTransformerWithSuperTypes.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirAbstractTreeTransformerWithSuperTypes.kt index ad77a4e1797..744b75c9f43 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirAbstractTreeTransformerWithSuperTypes.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirAbstractTreeTransformerWithSuperTypes.kt @@ -5,9 +5,12 @@ package org.jetbrains.kotlin.fir.resolve.transformers -import org.jetbrains.kotlin.fir.declarations.* +import org.jetbrains.kotlin.fir.declarations.FirMemberDeclaration +import org.jetbrains.kotlin.fir.declarations.FirRegularClass +import org.jetbrains.kotlin.fir.declarations.FirResolvePhase import org.jetbrains.kotlin.fir.expressions.FirStatement -import org.jetbrains.kotlin.fir.resolve.* +import org.jetbrains.kotlin.fir.resolve.getNestedClassifierScope +import org.jetbrains.kotlin.fir.resolve.lookupSuperTypes import org.jetbrains.kotlin.fir.scopes.impl.FirCompositeScope import org.jetbrains.kotlin.fir.scopes.impl.FirMemberTypeParameterScope import org.jetbrains.kotlin.fir.scopes.impl.nestedClassifierScope @@ -36,7 +39,7 @@ abstract class FirAbstractTreeTransformerWithSuperTypes( // ? Is it Ok to use original file session here ? val superTypes = lookupSuperTypes(regularClass, lookupInterfaces = false, deep = true, useSiteSession = session).asReversed() for (superType in superTypes) { - session.firSymbolProvider.getNestedClassifierScope(superType.lookupTag.classId)?.let { + session.getNestedClassifierScope(superType.lookupTag)?.let { towerScope.addScope(it) } } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirSupertypesResolution.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirSupertypesResolution.kt index d9d001b0883..74464b0c33f 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirSupertypesResolution.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirSupertypesResolution.kt @@ -107,7 +107,7 @@ private fun createScopesForNestedClasses( lookupInterfaces = false, deep = true, useSiteSession = session, supertypeSupplier = supertypeComputationSession.supertypesSupplier ).asReversed().mapNotNullTo(this) { - session.firSymbolProvider.getNestedClassifierScope(it.lookupTag.classId) + session.getNestedClassifierScope(it.lookupTag) } addIfNotNull(klass.typeParametersScope()) val companionObjects = klass.declarations.filterIsInstance().filter { it.isCompanion }