From 35335417029cdb7b0ee8a15acfe36d9a7ff109c9 Mon Sep 17 00:00:00 2001 From: Simon Ogorodnik Date: Thu, 4 Apr 2019 17:51:29 +0300 Subject: [PATCH] Provide class use-site scopes from FirSymbolProviders --- .../kotlin/fir/backend/Fir2IrVisitor.kt | 20 +++++++++++++------ .../kotlin/fir/java/JavaSymbolProvider.kt | 7 +++++++ .../KotlinDeserializedJvmSymbolsProvider.kt | 8 ++++++++ .../kotlin/fir/resolve/FirSymbolProvider.kt | 8 +------- .../impl/FirCompositeSymbolProvider.kt | 6 ++++++ .../impl/FirDependenciesSymbolProviderImpl.kt | 9 +++++++++ .../impl/FirLibrarySymbolProviderImpl.kt | 7 +++++++ .../fir/resolve/impl/FirProviderImpl.kt | 8 ++++++++ .../fir/IdeFirDependenciesSymbolProvider.kt | 4 ++++ 9 files changed, 64 insertions(+), 13 deletions(-) diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrVisitor.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrVisitor.kt index ecb2b61de16..5e6fcd149c0 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrVisitor.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrVisitor.kt @@ -19,11 +19,10 @@ import org.jetbrains.kotlin.fir.expressions.impl.FirWhenSubjectExpression import org.jetbrains.kotlin.fir.references.FirPropertyFromParameterCallableReference import org.jetbrains.kotlin.fir.resolve.FirSymbolProvider import org.jetbrains.kotlin.fir.resolve.buildUseSiteScope -import org.jetbrains.kotlin.fir.resolve.getCallableSymbols import org.jetbrains.kotlin.fir.resolve.toSymbol import org.jetbrains.kotlin.fir.scopes.ProcessorAction import org.jetbrains.kotlin.fir.scopes.impl.FirClassSubstitutionScope -import org.jetbrains.kotlin.fir.symbols.CallableId +import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirTypeAliasSymbol @@ -393,10 +392,19 @@ internal class Fir2IrVisitor( val constructedIrType = constructedTypeRef.toIrType(this@Fir2IrVisitor.session, declarationStorage) // TODO: find delegated constructor correctly val classId = constructedClassSymbol.classId - val constructorId = CallableId(classId.packageFqName, classId.relativeClassName, classId.shortClassName) - val constructorSymbol = this@Fir2IrVisitor.session.service().getCallableSymbols(constructorId).firstOrNull { - arguments.size <= ((it as FirFunctionSymbol).fir as FirFunction).valueParameters.size - } ?: return null + val provider = this@Fir2IrVisitor.session.service() + var constructorSymbol: FirCallableSymbol? = null + provider.getClassUseSiteMemberScope(classId, this@Fir2IrVisitor.session)!!.processFunctionsByName( + classId.shortClassName + ) { + if (arguments.size <= ((it as FirFunctionSymbol).fir as FirFunction).valueParameters.size) { + constructorSymbol = it + ProcessorAction.STOP + } else { + ProcessorAction.NEXT + } + } + if (constructorSymbol == null) return null return convertWithOffsets { startOffset, endOffset -> IrDelegatingConstructorCallImpl( startOffset, endOffset, 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 a7715f36e97..ce49693502f 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 @@ -14,7 +14,9 @@ import org.jetbrains.kotlin.fir.java.declarations.FirJavaConstructor import org.jetbrains.kotlin.fir.java.declarations.FirJavaField import org.jetbrains.kotlin.fir.java.declarations.FirJavaMethod import org.jetbrains.kotlin.fir.resolve.AbstractFirSymbolProvider +import org.jetbrains.kotlin.fir.resolve.buildUseSiteScope import org.jetbrains.kotlin.fir.resolve.constructType +import org.jetbrains.kotlin.fir.resolve.transformers.firUnsafe import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.fir.scopes.impl.FirClassDeclaredMemberScope import org.jetbrains.kotlin.fir.symbols.CallableId @@ -50,6 +52,11 @@ class JavaSymbolProvider( return FirClassDeclaredMemberScope(classSymbol.fir) } + override fun getClassUseSiteMemberScope(classId: ClassId, useSiteSession: FirSession): FirScope? { + val symbol = this.getClassLikeSymbolByFqName(classId) ?: return null + return symbol.firUnsafe().buildUseSiteScope(useSiteSession) + } + override fun getClassLikeSymbolByFqName(classId: ClassId): ConeClassLikeSymbol? { if (!hasTopLevelClassOf(classId)) return null return classCache.lookupCacheOrCalculateWithPostCompute(classId, { 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 01d7447ff73..1a8ceb4f0af 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 @@ -13,7 +13,10 @@ import org.jetbrains.kotlin.fir.declarations.FirRegularClass import org.jetbrains.kotlin.fir.deserialization.FirDeserializationContext import org.jetbrains.kotlin.fir.deserialization.deserializeClassToSymbol import org.jetbrains.kotlin.fir.resolve.AbstractFirSymbolProvider +import org.jetbrains.kotlin.fir.resolve.buildUseSiteScope import org.jetbrains.kotlin.fir.resolve.getOrPut +import org.jetbrains.kotlin.fir.resolve.transformers.firUnsafe +import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.fir.scopes.impl.FirClassDeclaredMemberScope import org.jetbrains.kotlin.fir.symbols.ConeCallableSymbol import org.jetbrains.kotlin.fir.symbols.ConeClassLikeSymbol @@ -57,6 +60,11 @@ class KotlinDeserializedJvmSymbolsProvider( } } + override fun getClassUseSiteMemberScope(classId: ClassId, useSiteSession: FirSession): FirScope? { + val symbol = this.getClassLikeSymbolByFqName(classId) ?: return null + return symbol.firUnsafe().buildUseSiteScope(session) + } + override fun getClassLikeSymbolByFqName(classId: ClassId): ConeClassLikeSymbol? { return findAndDeserializeClass(classId) } 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 b5020d4efb2..11dc37ae962 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 @@ -30,6 +30,7 @@ interface FirSymbolProvider { fun getTopLevelCallableSymbols(packageFqName: FqName, name: Name): List fun getClassDeclaredMemberScope(classId: ClassId): FirScope? + fun getClassUseSiteMemberScope(classId: ClassId, useSiteSession: FirSession): FirScope? fun getAllCallableNamesInPackage(fqName: FqName): Set = emptySet() fun getClassNamesInPackage(fqName: FqName): Set = emptySet() @@ -61,10 +62,3 @@ fun FirSymbolProvider.getClassDeclaredCallableSymbols(classId: ClassId, name: Na return result } -fun FirSymbolProvider.getCallableSymbols(callableId: CallableId): List { - if (callableId.classId != null) { - return getClassDeclaredCallableSymbols(callableId.classId!!, callableId.callableName) - } - - return getTopLevelCallableSymbols(callableId.packageName, callableId.callableName) -} 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 395e0880710..9be4a1fb165 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 @@ -5,7 +5,9 @@ package org.jetbrains.kotlin.fir.resolve.impl +import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.resolve.FirSymbolProvider +import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.fir.symbols.ConeCallableSymbol import org.jetbrains.kotlin.fir.symbols.ConeClassLikeSymbol import org.jetbrains.kotlin.name.ClassId @@ -14,6 +16,10 @@ import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.utils.addToStdlib.firstNotNullResult class FirCompositeSymbolProvider(val providers: List) : FirSymbolProvider { + override fun getClassUseSiteMemberScope(classId: ClassId, useSiteSession: FirSession): FirScope? { + return providers.firstNotNullResult { it.getClassUseSiteMemberScope(classId, useSiteSession) } + } + override fun getTopLevelCallableSymbols(packageFqName: FqName, name: Name): List { return providers.flatMap { it.getTopLevelCallableSymbols(packageFqName, name) } } 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 9913ebc2881..24b769873a8 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 @@ -6,9 +6,13 @@ package org.jetbrains.kotlin.fir.resolve.impl import org.jetbrains.kotlin.fir.FirSession +import org.jetbrains.kotlin.fir.declarations.FirRegularClass import org.jetbrains.kotlin.fir.dependenciesWithoutSelf import org.jetbrains.kotlin.fir.resolve.AbstractFirSymbolProvider import org.jetbrains.kotlin.fir.resolve.FirSymbolProvider +import org.jetbrains.kotlin.fir.resolve.buildUseSiteScope +import org.jetbrains.kotlin.fir.resolve.transformers.firUnsafe +import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.fir.service import org.jetbrains.kotlin.fir.symbols.CallableId import org.jetbrains.kotlin.fir.symbols.ConeCallableSymbol @@ -46,6 +50,11 @@ class FirDependenciesSymbolProviderImpl(val session: FirSession) : AbstractFirSy } } + override fun getClassUseSiteMemberScope(classId: ClassId, useSiteSession: FirSession): FirScope? { + val symbol = this.getClassLikeSymbolByFqName(classId) ?: return null + return symbol.firUnsafe().buildUseSiteScope(useSiteSession) + } + override fun getPackage(fqName: FqName): FqName? { return packageCache.lookupCacheOrCalculate(fqName) { 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 fcbe7337f73..f5f718f0ec3 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 @@ -19,7 +19,9 @@ import org.jetbrains.kotlin.fir.declarations.impl.FirClassImpl import org.jetbrains.kotlin.fir.deserialization.FirDeserializationContext import org.jetbrains.kotlin.fir.deserialization.deserializeClassToSymbol import org.jetbrains.kotlin.fir.resolve.FirSymbolProvider +import org.jetbrains.kotlin.fir.resolve.buildUseSiteScope import org.jetbrains.kotlin.fir.resolve.getOrPut +import org.jetbrains.kotlin.fir.resolve.transformers.firUnsafe import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.fir.scopes.impl.FirClassDeclaredMemberScope import org.jetbrains.kotlin.fir.symbols.ConeCallableSymbol @@ -104,6 +106,11 @@ class FirLibrarySymbolProviderImpl(val session: FirSession) : FirSymbolProvider } } + override fun getClassUseSiteMemberScope(classId: ClassId, useSiteSession: FirSession): FirScope? { + val symbol = this.getClassLikeSymbolByFqName(classId) ?: return null + return symbol.firUnsafe().buildUseSiteScope(useSiteSession) + } + override fun getPackage(fqName: FqName): FqName? { if (allPackageFragments.containsKey(fqName)) return fqName return null 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 11a743e6b39..680af878250 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 @@ -9,6 +9,9 @@ import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.resolve.FirProvider +import org.jetbrains.kotlin.fir.resolve.buildUseSiteScope +import org.jetbrains.kotlin.fir.resolve.transformers.firUnsafe +import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.fir.scopes.impl.FirClassDeclaredMemberScope import org.jetbrains.kotlin.fir.symbols.CallableId import org.jetbrains.kotlin.fir.symbols.ConeCallableSymbol @@ -101,4 +104,9 @@ class FirProviderImpl(val session: FirSession) : FirProvider { return classifierMap[fqName] } + override fun getClassUseSiteMemberScope(classId: ClassId, useSiteSession: FirSession): FirScope? { + val symbol = this.getClassLikeSymbolByFqName(classId) ?: return null + return symbol.firUnsafe().buildUseSiteScope(useSiteSession) + } + } diff --git a/idea/src/org/jetbrains/kotlin/idea/fir/IdeFirDependenciesSymbolProvider.kt b/idea/src/org/jetbrains/kotlin/idea/fir/IdeFirDependenciesSymbolProvider.kt index 83d192a9613..a9c87fb6e27 100644 --- a/idea/src/org/jetbrains/kotlin/idea/fir/IdeFirDependenciesSymbolProvider.kt +++ b/idea/src/org/jetbrains/kotlin/idea/fir/IdeFirDependenciesSymbolProvider.kt @@ -64,6 +64,10 @@ class IdeFirDependenciesSymbolProvider( } } + override fun getClassUseSiteMemberScope(classId: ClassId, useSiteSession: FirSession): FirScope? { + TODO("not implemented") + } + private fun tryKotlin(classId: ClassId): ConeClassLikeSymbol? { return classCache.lookupCacheOrCalculate(classId) { val index = KotlinFullClassNameIndex.getInstance()