diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirModuleBasedSession.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirModuleBasedSession.kt index a58edf9aa42..28d35d22ff5 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirModuleBasedSession.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirModuleBasedSession.kt @@ -16,7 +16,7 @@ abstract class FirModuleBasedSession( sessionProvider: FirSessionProvider? ) : FirSession(sessionProvider) -fun FirModuleBasedSession.registerResolveComponents() { +fun FirSession.registerResolveComponents() { register(FirQualifierResolver::class, FirQualifierResolverImpl(this)) register(FirTypeResolver::class, FirTypeResolverImpl(this)) register(FirEffectiveVisibilityResolver::class, FirEffectiveVisibilityResolverImpl(this)) diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/FirIdeJavaModuleBasedSession.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/FirIdeJavaModuleBasedSession.kt index e1f977da614..83df7325b7d 100644 --- a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/FirIdeJavaModuleBasedSession.kt +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/FirIdeJavaModuleBasedSession.kt @@ -7,7 +7,7 @@ package org.jetbrains.kotlin.idea.fir.low.level.api import com.intellij.openapi.module.impl.scopes.ModuleWithDependentsScope import com.intellij.openapi.project.Project -import org.jetbrains.kotlin.analyzer.ModuleInfo +import com.intellij.psi.search.GlobalSearchScope import org.jetbrains.kotlin.fir.* import org.jetbrains.kotlin.fir.analysis.registerCheckersComponent import org.jetbrains.kotlin.fir.extensions.BunchOfRegisteredExtensions @@ -16,7 +16,6 @@ import org.jetbrains.kotlin.fir.extensions.registerExtensions import org.jetbrains.kotlin.fir.java.JavaSymbolProvider import org.jetbrains.kotlin.fir.java.registerJavaVisibilityChecker import org.jetbrains.kotlin.fir.resolve.calls.jvm.registerJvmCallConflictResolverFactory -import org.jetbrains.kotlin.fir.resolve.firProvider import org.jetbrains.kotlin.fir.resolve.firSymbolProvider import org.jetbrains.kotlin.fir.resolve.providers.FirProvider import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider @@ -30,14 +29,15 @@ import org.jetbrains.kotlin.idea.fir.low.level.api.file.builder.ModuleFileCacheI import org.jetbrains.kotlin.idea.fir.low.level.api.providers.FirIdeProvider import org.jetbrains.kotlin.idea.fir.low.level.api.providers.firIdeProvider import org.jetbrains.kotlin.idea.fir.low.level.api.sessions.FirIdeModuleLibraryDependenciesSession +import org.jetbrains.kotlin.idea.fir.low.level.api.sessions.FirIdeSession import org.jetbrains.kotlin.idea.fir.low.level.api.util.collectTransitiveDependenciesWithSelf internal class FirIdeJavaModuleBasedSession private constructor( - moduleInfo: ModuleInfo, - sessionProvider: FirSessionProvider, + sessionProvider: FirIdeSessionProvider, + override val scope: GlobalSearchScope, val firFileBuilder: FirFileBuilder, -) : FirModuleBasedSession(moduleInfo, sessionProvider) { +) : FirIdeSession(sessionProvider) { val cache get() = firIdeProvider.cache companion object { @@ -53,11 +53,11 @@ internal class FirIdeJavaModuleBasedSession private constructor( ): FirIdeJavaModuleBasedSession { val scopeProvider = KotlinScopeProvider(::wrapScopeWithJvmMapped) val firBuilder = FirFileBuilder(sessionProvider as FirIdeSessionProvider, scopeProvider, firPhaseRunner) - return FirIdeJavaModuleBasedSession(moduleInfo, sessionProvider, firBuilder).apply { + val dependentModules = moduleInfo.collectTransitiveDependenciesWithSelf().filterIsInstance() + val searchScope = ModuleWithDependentsScope(project, dependentModules.map { it.module }) + return FirIdeJavaModuleBasedSession(sessionProvider, searchScope, firBuilder).apply { val cache = ModuleFileCacheImpl(this) val phasedFirFileResolver = IdePhasedFirFileResolver(firBuilder, cache) - val dependentModules = moduleInfo.collectTransitiveDependenciesWithSelf().filterIsInstance() - val searchScope = ModuleWithDependentsScope(project, dependentModules.map { it.module }) registerCommonComponents() registerResolveComponents() diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/IndexHelper.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/IndexHelper.kt index dc4992d4606..304945e335d 100644 --- a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/IndexHelper.kt +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/IndexHelper.kt @@ -19,7 +19,10 @@ import org.jetbrains.kotlin.psi.KtFunction import org.jetbrains.kotlin.psi.KtNamedFunction import org.jetbrains.kotlin.psi.KtProperty -internal class IndexHelper(val project: Project, private val scope: GlobalSearchScope) { +/* +* Move to another module +*/ +public class IndexHelper(val project: Project, private val scope: GlobalSearchScope) { private val stubIndex: StubIndex = StubIndex.getInstance() private inline fun firstMatchingOrNull( diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/public/firSessionUtils.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/public/firSessionUtils.kt new file mode 100644 index 00000000000..9e29c5c3375 --- /dev/null +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/public/firSessionUtils.kt @@ -0,0 +1,19 @@ +/* + * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.idea.fir.low.level.api.public + +import com.intellij.psi.search.GlobalSearchScope +import org.jetbrains.kotlin.fir.FirSession +import org.jetbrains.kotlin.idea.fir.low.level.api.sessions.FirIdeSession + +/** + * Returns a [GlobalSearchScope] declarations from which [FirSession] knows about + */ +val FirSession.searchScope: GlobalSearchScope + get() { + check(this is FirIdeSession) + return scope + } \ No newline at end of file diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/sessions/FirIdeLibrarySession.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/sessions/FirIdeLibrarySession.kt index b52efa8cdfd..565d85b90b5 100644 --- a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/sessions/FirIdeLibrarySession.kt +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/sessions/FirIdeLibrarySession.kt @@ -6,7 +6,7 @@ package org.jetbrains.kotlin.idea.fir.low.level.api.sessions import com.intellij.openapi.project.Project -import org.jetbrains.kotlin.fir.FirSession +import com.intellij.psi.search.GlobalSearchScope import org.jetbrains.kotlin.fir.java.FirProjectSessionProvider import org.jetbrains.kotlin.fir.java.JavaSymbolProvider import org.jetbrains.kotlin.fir.java.deserialization.KotlinDeserializedJvmSymbolsProvider @@ -19,17 +19,19 @@ import org.jetbrains.kotlin.fir.resolve.scopes.wrapScopeWithJvmMapped import org.jetbrains.kotlin.fir.scopes.KotlinScopeProvider import org.jetbrains.kotlin.idea.caches.project.ModuleSourceInfo import org.jetbrains.kotlin.idea.caches.resolve.IDEPackagePartProvider +import org.jetbrains.kotlin.idea.fir.low.level.api.FirIdeSessionProvider import org.jetbrains.kotlin.idea.fir.low.level.api.IdeSessionComponents import org.jetbrains.kotlin.load.java.JavaClassFinderImpl import org.jetbrains.kotlin.load.kotlin.VirtualFileFinderFactory -class FirIdeModuleLibraryDependenciesSession private constructor( - sessionProvider: FirProjectSessionProvider, -) : FirSession(sessionProvider) { +internal class FirIdeModuleLibraryDependenciesSession private constructor( + sessionProvider: FirIdeSessionProvider, + override val scope: GlobalSearchScope +) : FirIdeSession(sessionProvider) { companion object { fun create( moduleInfo: ModuleSourceInfo, - sessionProvider: FirProjectSessionProvider, + sessionProvider: FirIdeSessionProvider, project: Project, ): FirIdeModuleLibraryDependenciesSession { val searchScope = moduleInfo.module.moduleWithLibrariesScope @@ -40,7 +42,7 @@ class FirIdeModuleLibraryDependenciesSession private constructor( val packagePartProvider = IDEPackagePartProvider(searchScope) val kotlinClassFinder = VirtualFileFinderFactory.getInstance(project).create(searchScope) - return FirIdeModuleLibraryDependenciesSession(sessionProvider).apply { + return FirIdeModuleLibraryDependenciesSession(sessionProvider, searchScope).apply { registerCommonComponents() val javaSymbolProvider = JavaSymbolProvider(this, sessionProvider.project, searchScope) diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/sessions/FirIdeSession.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/sessions/FirIdeSession.kt new file mode 100644 index 00000000000..b6c8c8c9d4d --- /dev/null +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/sessions/FirIdeSession.kt @@ -0,0 +1,14 @@ +/* + * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.idea.fir.low.level.api.sessions + +import com.intellij.psi.search.GlobalSearchScope +import org.jetbrains.kotlin.fir.FirSession +import org.jetbrains.kotlin.idea.fir.low.level.api.FirIdeSessionProvider + +internal abstract class FirIdeSession(sessionProvider: FirIdeSessionProvider) : FirSession(sessionProvider) { + abstract val scope: GlobalSearchScope +} \ No newline at end of file diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirScopeProvider.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirScopeProvider.kt index 795d08e2fd3..63bbbbec23c 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirScopeProvider.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirScopeProvider.kt @@ -39,6 +39,8 @@ import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.KtFirClassOrObjectSymb import org.jetbrains.kotlin.idea.frontend.api.fir.types.KtFirType import org.jetbrains.kotlin.idea.frontend.api.fir.utils.weakRef import org.jetbrains.kotlin.idea.frontend.api.scopes.* +import org.jetbrains.kotlin.idea.frontend.api.symbols.KtCallableSymbol +import org.jetbrains.kotlin.idea.frontend.api.symbols.KtClassLikeSymbol import org.jetbrains.kotlin.idea.frontend.api.symbols.KtClassOrObjectSymbol import org.jetbrains.kotlin.idea.frontend.api.symbols.KtPackageSymbol import org.jetbrains.kotlin.idea.frontend.api.types.KtType @@ -92,7 +94,7 @@ internal class KtFirScopeProvider( packageSymbol.fqName, firResolveState.firIdeSourcesSession/*TODO use correct session here*/ ).also(firScopeStorage::register) - KtFirPackageScope(firPackageScope, builder, token) + KtFirPackageScope(firPackageScope, project, builder, token) } } @@ -149,7 +151,7 @@ internal class KtFirScopeProvider( return when (firScope) { is FirAbstractSimpleImportingScope -> KtFirNonStarImportingScope(firScope, builder, token) is FirAbstractStarImportingScope -> KtFirStarImportingScope(firScope, builder, project, token) - is FirPackageMemberScope -> KtFirPackageScope(firScope, builder, token) + is FirPackageMemberScope -> KtFirPackageScope(firScope, project, builder, token) is FirContainingNamesAwareScope -> KtFirDelegatingScopeImpl(firScope, builder, token) else -> TODO(firScope::class.toString()) } diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/scopes/KtFirPackageScope.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/scopes/KtFirPackageScope.kt index 2ff1ffc51f8..b3ca5bb076a 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/scopes/KtFirPackageScope.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/scopes/KtFirPackageScope.kt @@ -5,34 +5,43 @@ package org.jetbrains.kotlin.idea.frontend.api.fir.scopes +import com.intellij.openapi.project.Project import org.jetbrains.kotlin.fir.scopes.impl.FirPackageMemberScope +import org.jetbrains.kotlin.idea.fir.low.level.api.public.searchScope import org.jetbrains.kotlin.idea.frontend.api.ValidityToken -import org.jetbrains.kotlin.idea.frontend.api.ValidityTokenOwner import org.jetbrains.kotlin.idea.frontend.api.fir.KtSymbolByFirBuilder import org.jetbrains.kotlin.idea.frontend.api.fir.utils.weakRef import org.jetbrains.kotlin.idea.frontend.api.scopes.KtPackageScope import org.jetbrains.kotlin.idea.frontend.api.symbols.KtCallableSymbol import org.jetbrains.kotlin.idea.frontend.api.symbols.KtClassLikeSymbol import org.jetbrains.kotlin.idea.frontend.api.withValidityAssertion +import org.jetbrains.kotlin.idea.stubindex.KotlinTopLevelClassByPackageIndex +import org.jetbrains.kotlin.idea.stubindex.KotlinTopLevelFunctionByPackageIndex +import org.jetbrains.kotlin.idea.stubindex.KotlinTopLevelPropertyFqnNameIndex import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name internal class KtFirPackageScope( firScope: FirPackageMemberScope, + private val project: Project, private val builder: KtSymbolByFirBuilder, override val token: ValidityToken, -) : KtPackageScope, ValidityTokenOwner { +) : KtPackageScope { private val firScope by weakRef(firScope) override val fqName: FqName get() = firScope.fqName - override fun getCallableNames(): Set = withValidityAssertion { - // TODO: KT-41048 - emptySet() + override fun getCallableNames() = withValidityAssertion { + hashSetOf().apply { + KotlinTopLevelPropertyFqnNameIndex.getInstance()[fqName.asString(), project, firScope.session.searchScope] + .mapNotNullTo(this) { it.nameAsName } + KotlinTopLevelFunctionByPackageIndex.getInstance()[fqName.asString(), project, firScope.session.searchScope] + .mapNotNullTo(this) { it.nameAsName } + } } override fun getClassLikeSymbolNames(): Set = withValidityAssertion { - // TODO: KT-41048 - emptySet() + KotlinTopLevelClassByPackageIndex.getInstance()[fqName.asString(), project, firScope.session.searchScope] + .mapNotNullTo(hashSetOf()) { it.nameAsName } } override fun getCallableSymbols(): Sequence = withValidityAssertion {