From fea224749bb3d9f7f03fad36820520a5cd7ab985 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Thu, 12 Dec 2019 13:48:20 +0300 Subject: [PATCH] FIR: introduce symbolProvider.getNestedClassifierScope to choose lazy/non-lazy For some reason this breaks two old FE based tests with member type aliases. It's not very interesting because member aliases aren't supported. --- .../kotlin/fir/java/JavaSymbolProvider.kt | 16 ++++++++++++++++ .../KotlinDeserializedJvmSymbolsProvider.kt | 7 +++++++ .../kotlin/fir/resolve/FirSymbolProvider.kt | 2 ++ .../resolve/impl/FirCompositeSymbolProvider.kt | 4 ++++ .../impl/FirDependenciesSymbolProviderImpl.kt | 4 ++++ .../resolve/impl/FirLibrarySymbolProviderImpl.kt | 7 +++++++ .../kotlin/fir/resolve/impl/FirProviderImpl.kt | 7 +++++++ .../FirAbstractTreeTransformerWithSuperTypes.kt | 5 +++-- .../transformers/FirSupertypesResolution.kt | 4 ++-- .../implicitArguments/fromSuperClasses.fir.kt | 4 ++-- .../fromSuperClassesTransitive.fir.kt | 2 +- .../jetbrains/kotlin/idea/fir/IdeFirProvider.kt | 5 +++++ 12 files changed, 60 insertions(+), 7 deletions(-) diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaSymbolProvider.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaSymbolProvider.kt index 2146d6dfb18..31bf2061f8f 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaSymbolProvider.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaSymbolProvider.kt @@ -30,6 +30,7 @@ import org.jetbrains.kotlin.fir.resolve.* import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.fir.scopes.impl.FirSuperTypeScope import org.jetbrains.kotlin.fir.scopes.impl.declaredMemberScope +import org.jetbrains.kotlin.fir.scopes.impl.nestedClassifierScope import org.jetbrains.kotlin.fir.symbols.CallableId import org.jetbrains.kotlin.fir.symbols.impl.* import org.jetbrains.kotlin.fir.toFirSourceElement @@ -64,6 +65,21 @@ class JavaSymbolProvider( override fun getTopLevelCallableSymbols(packageFqName: FqName, name: Name): List> = emptyList() + override fun getNestedClassifierScope(classId: ClassId): FirScope? { + val symbol = this.getClassLikeSymbolByFqName(classId) ?: return null + val regularClass = symbol.fir + return if (regularClass is FirJavaClass) { + nestedClassifierScope( + classId, + session, + existingNames = regularClass.existingNestedClassifierNames, + symbolProvider = this + ) + } else { + nestedClassifierScope(regularClass) + } + } + override fun getClassUseSiteMemberScope( classId: ClassId, useSiteSession: FirSession, diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/deserialization/KotlinDeserializedJvmSymbolsProvider.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/deserialization/KotlinDeserializedJvmSymbolsProvider.kt index 6470d316fda..40e4eaab083 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/deserialization/KotlinDeserializedJvmSymbolsProvider.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/deserialization/KotlinDeserializedJvmSymbolsProvider.kt @@ -29,6 +29,7 @@ import org.jetbrains.kotlin.fir.references.impl.FirErrorNamedReferenceImpl import org.jetbrains.kotlin.fir.references.impl.FirResolvedNamedReferenceImpl import org.jetbrains.kotlin.fir.resolve.* import org.jetbrains.kotlin.fir.scopes.FirScope +import org.jetbrains.kotlin.fir.scopes.impl.nestedClassifierScope import org.jetbrains.kotlin.fir.symbols.impl.* import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef import org.jetbrains.kotlin.fir.types.impl.FirErrorTypeRefImpl @@ -392,6 +393,12 @@ class KotlinDeserializedJvmSymbolsProvider( } } + override fun getNestedClassifierScope(classId: ClassId): FirScope? { + return findRegularClass(classId)?.let { + nestedClassifierScope(it) + } + } + private fun getPackageParts(packageFqName: FqName): Collection { return packagePartsCache.getOrPut(packageFqName) { try { 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 8884ea30e88..7ce0bc46579 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 @@ -53,6 +53,8 @@ abstract class FirSymbolProvider : FirSessionComponent { abstract fun getTopLevelCallableSymbols(packageFqName: FqName, name: Name): List> + abstract fun getNestedClassifierScope(classId: ClassId): FirScope? + abstract fun getClassUseSiteMemberScope( classId: ClassId, useSiteSession: FirSession, diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/impl/FirCompositeSymbolProvider.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/impl/FirCompositeSymbolProvider.kt index 2f7e39d4336..f4ecafefd71 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/impl/FirCompositeSymbolProvider.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/impl/FirCompositeSymbolProvider.kt @@ -29,6 +29,10 @@ class FirCompositeSymbolProvider(val providers: List) : FirSy return providers.flatMap { it.getTopLevelCallableSymbols(packageFqName, name) } } + override fun getNestedClassifierScope(classId: ClassId): FirScope? { + return providers.firstNotNullResult { it.getNestedClassifierScope(classId) } + } + override fun getPackage(fqName: FqName): FqName? { return providers.firstNotNullResult { it.getPackage(fqName) } } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/impl/FirDependenciesSymbolProviderImpl.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/impl/FirDependenciesSymbolProviderImpl.kt index 2511aeb3d0d..46c1a4b12d5 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/impl/FirDependenciesSymbolProviderImpl.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/impl/FirDependenciesSymbolProviderImpl.kt @@ -33,6 +33,10 @@ class FirDependenciesSymbolProviderImpl(val session: FirSession) : AbstractFirSy } ?: emptyList() } + override fun getNestedClassifierScope(classId: ClassId): FirScope? { + return dependencyProviders.firstNotNullResult { it.getNestedClassifierScope(classId) } + } + override fun getClassLikeSymbolByFqName(classId: ClassId): FirClassLikeSymbol<*>? { return classCache.lookupCacheOrCalculate(classId) { for (provider in dependencyProviders) { diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/impl/FirLibrarySymbolProviderImpl.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/impl/FirLibrarySymbolProviderImpl.kt index 0a3b636fc6e..c09eafeb960 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/impl/FirLibrarySymbolProviderImpl.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/impl/FirLibrarySymbolProviderImpl.kt @@ -21,6 +21,7 @@ import org.jetbrains.kotlin.fir.resolve.FirSymbolProvider import org.jetbrains.kotlin.fir.resolve.ScopeSession import org.jetbrains.kotlin.fir.resolve.getOrPut import org.jetbrains.kotlin.fir.scopes.FirScope +import org.jetbrains.kotlin.fir.scopes.impl.nestedClassifierScope import org.jetbrains.kotlin.fir.symbols.CallableId import org.jetbrains.kotlin.fir.symbols.impl.* import org.jetbrains.kotlin.fir.types.impl.ConeTypeParameterTypeImpl @@ -264,6 +265,12 @@ class FirLibrarySymbolProviderImpl(val session: FirSession) : FirSymbolProvider( } ?: emptyList() } + override fun getNestedClassifierScope(classId: ClassId): FirScope? { + return findRegularClass(classId)?.let { + nestedClassifierScope(it) + } + } + override fun getAllCallableNamesInPackage(fqName: FqName): Set { return allPackageFragments[fqName]?.flatMapTo(mutableSetOf()) { it.getAllCallableNames() diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/impl/FirProviderImpl.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/impl/FirProviderImpl.kt index d271dd011b0..c06442dcd36 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/impl/FirProviderImpl.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/impl/FirProviderImpl.kt @@ -12,6 +12,7 @@ import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.resolve.FirProvider import org.jetbrains.kotlin.fir.resolve.ScopeSession import org.jetbrains.kotlin.fir.scopes.FirScope +import org.jetbrains.kotlin.fir.scopes.impl.nestedClassifierScope import org.jetbrains.kotlin.fir.symbols.CallableId import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag import org.jetbrains.kotlin.fir.symbols.impl.* @@ -38,6 +39,12 @@ class FirProviderImpl(val session: FirSession) : FirProvider() { return (state.callableMap[CallableId(packageFqName, null, name)] ?: emptyList()) } + override fun getNestedClassifierScope(classId: ClassId): FirScope? { + return (getFirClassifierByFqName(classId) as? FirRegularClass)?.let { + nestedClassifierScope(it) + } + } + override fun getFirClassifierContainerFile(fqName: ClassId): FirFile { return state.classifierContainerFileMap[fqName] ?: error("Couldn't find container for $fqName") } 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 87468f64aa6..3f6f42b2ba8 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 @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.fir.resolve.transformers import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.expressions.FirStatement +import org.jetbrains.kotlin.fir.resolve.firSymbolProvider import org.jetbrains.kotlin.fir.resolve.lookupSuperTypes import org.jetbrains.kotlin.fir.scopes.impl.FirCompositeScope import org.jetbrains.kotlin.fir.scopes.impl.FirMemberTypeParameterScope @@ -37,8 +38,8 @@ abstract class FirAbstractTreeTransformerWithSuperTypes( return withScopeCleanup { // ? Is it Ok to use original file session here ? lookupSuperTypes(regularClass, lookupInterfaces = false, deep = true, useSiteSession = session) - .asReversed().mapTo(towerScope.scopes) { - nestedClassifierScope(it.lookupTag.classId, session) + .asReversed().mapNotNullTo(towerScope.scopes) { + session.firSymbolProvider.getNestedClassifierScope(it.lookupTag.classId) } regularClass.addTypeParametersScope() val companionObject = regularClass.companionObject 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 3920520980b..76909f4b287 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 @@ -108,8 +108,8 @@ private fun createScopesForNestedClasses( regularClass, lookupInterfaces = false, deep = true, useSiteSession = session, supertypeSupplier = supertypeComputationSession.supertypesSupplier - ).asReversed().mapTo(this) { - nestedClassifierScope(it.lookupTag.classId, session) + ).asReversed().mapNotNullTo(this) { + session.firSymbolProvider.getNestedClassifierScope(it.lookupTag.classId) } addIfNotNull(regularClass.typeParametersScope()) val companionObjects = regularClass.declarations.filterIsInstance().filter { it.isCompanion } diff --git a/compiler/testData/diagnostics/tests/generics/innerClasses/implicitArguments/fromSuperClasses.fir.kt b/compiler/testData/diagnostics/tests/generics/innerClasses/implicitArguments/fromSuperClasses.fir.kt index 671cdf3cf64..581059db154 100644 --- a/compiler/testData/diagnostics/tests/generics/innerClasses/implicitArguments/fromSuperClasses.fir.kt +++ b/compiler/testData/diagnostics/tests/generics/innerClasses/implicitArguments/fromSuperClasses.fir.kt @@ -20,7 +20,7 @@ class A : Outer() { fun foo() { Derived().foo() checkType { _.Inner>() } - Derived().baz() checkType { _>() } + Derived().baz() checkType { _>() } A.B().bar() checkType { _.Inner>() } - A.B().x() checkType { _>() } + A.B().x() checkType { _>() } } diff --git a/compiler/testData/diagnostics/tests/generics/innerClasses/implicitArguments/fromSuperClassesTransitive.fir.kt b/compiler/testData/diagnostics/tests/generics/innerClasses/implicitArguments/fromSuperClassesTransitive.fir.kt index 0086dbfa03e..56cb5e609c8 100644 --- a/compiler/testData/diagnostics/tests/generics/innerClasses/implicitArguments/fromSuperClassesTransitive.fir.kt +++ b/compiler/testData/diagnostics/tests/generics/innerClasses/implicitArguments/fromSuperClassesTransitive.fir.kt @@ -15,5 +15,5 @@ class Derived : BaseDerived2() { fun foo() { Derived().foo() checkType { _.Inner>() } - Derived().baz() checkType { _>() } + Derived().baz() checkType { _>() } } diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/fir/IdeFirProvider.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/fir/IdeFirProvider.kt index db27fa1c05d..fe1714fb52f 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/fir/IdeFirProvider.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/fir/IdeFirProvider.kt @@ -141,6 +141,11 @@ class IdeFirProvider( } } + override fun getNestedClassifierScope(classId: ClassId): FirScope? { + getFirClassifierByFqName(classId) + return cacheProvider.getNestedClassifierScope(classId) + } + override fun getClassUseSiteMemberScope(classId: ClassId, useSiteSession: FirSession, scopeSession: ScopeSession): FirScope? { getFirClassifierByFqName(classId) return cacheProvider.getClassUseSiteMemberScope(classId, useSiteSession, scopeSession)