FIR IDE: allow KtFirPackageScope to work without providers

This commit is contained in:
Ilya Kirillov
2020-08-24 13:15:12 +03:00
parent f4c17dadb3
commit f76b5bbf1b
8 changed files with 74 additions and 25 deletions
@@ -16,7 +16,7 @@ abstract class FirModuleBasedSession(
sessionProvider: FirSessionProvider? sessionProvider: FirSessionProvider?
) : FirSession(sessionProvider) ) : FirSession(sessionProvider)
fun FirModuleBasedSession.registerResolveComponents() { fun FirSession.registerResolveComponents() {
register(FirQualifierResolver::class, FirQualifierResolverImpl(this)) register(FirQualifierResolver::class, FirQualifierResolverImpl(this))
register(FirTypeResolver::class, FirTypeResolverImpl(this)) register(FirTypeResolver::class, FirTypeResolverImpl(this))
register(FirEffectiveVisibilityResolver::class, FirEffectiveVisibilityResolverImpl(this)) register(FirEffectiveVisibilityResolver::class, FirEffectiveVisibilityResolverImpl(this))
@@ -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.module.impl.scopes.ModuleWithDependentsScope
import com.intellij.openapi.project.Project 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.*
import org.jetbrains.kotlin.fir.analysis.registerCheckersComponent import org.jetbrains.kotlin.fir.analysis.registerCheckersComponent
import org.jetbrains.kotlin.fir.extensions.BunchOfRegisteredExtensions 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.JavaSymbolProvider
import org.jetbrains.kotlin.fir.java.registerJavaVisibilityChecker import org.jetbrains.kotlin.fir.java.registerJavaVisibilityChecker
import org.jetbrains.kotlin.fir.resolve.calls.jvm.registerJvmCallConflictResolverFactory 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.firSymbolProvider
import org.jetbrains.kotlin.fir.resolve.providers.FirProvider import org.jetbrains.kotlin.fir.resolve.providers.FirProvider
import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider 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.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.FirIdeModuleLibraryDependenciesSession
import org.jetbrains.kotlin.idea.fir.low.level.api.sessions.FirIdeSession
import org.jetbrains.kotlin.idea.fir.low.level.api.util.collectTransitiveDependenciesWithSelf import org.jetbrains.kotlin.idea.fir.low.level.api.util.collectTransitiveDependenciesWithSelf
internal class FirIdeJavaModuleBasedSession private constructor( internal class FirIdeJavaModuleBasedSession private constructor(
moduleInfo: ModuleInfo, sessionProvider: FirIdeSessionProvider,
sessionProvider: FirSessionProvider, override val scope: GlobalSearchScope,
val firFileBuilder: FirFileBuilder, val firFileBuilder: FirFileBuilder,
) : FirModuleBasedSession(moduleInfo, sessionProvider) { ) : FirIdeSession(sessionProvider) {
val cache get() = firIdeProvider.cache val cache get() = firIdeProvider.cache
companion object { companion object {
@@ -53,11 +53,11 @@ internal class FirIdeJavaModuleBasedSession private constructor(
): FirIdeJavaModuleBasedSession { ): FirIdeJavaModuleBasedSession {
val scopeProvider = KotlinScopeProvider(::wrapScopeWithJvmMapped) val scopeProvider = KotlinScopeProvider(::wrapScopeWithJvmMapped)
val firBuilder = FirFileBuilder(sessionProvider as FirIdeSessionProvider, scopeProvider, firPhaseRunner) val firBuilder = FirFileBuilder(sessionProvider as FirIdeSessionProvider, scopeProvider, firPhaseRunner)
return FirIdeJavaModuleBasedSession(moduleInfo, sessionProvider, firBuilder).apply { val dependentModules = moduleInfo.collectTransitiveDependenciesWithSelf().filterIsInstance<ModuleSourceInfo>()
val searchScope = ModuleWithDependentsScope(project, dependentModules.map { it.module })
return FirIdeJavaModuleBasedSession(sessionProvider, searchScope, firBuilder).apply {
val cache = ModuleFileCacheImpl(this) val cache = ModuleFileCacheImpl(this)
val phasedFirFileResolver = IdePhasedFirFileResolver(firBuilder, cache) val phasedFirFileResolver = IdePhasedFirFileResolver(firBuilder, cache)
val dependentModules = moduleInfo.collectTransitiveDependenciesWithSelf().filterIsInstance<ModuleSourceInfo>()
val searchScope = ModuleWithDependentsScope(project, dependentModules.map { it.module })
registerCommonComponents() registerCommonComponents()
registerResolveComponents() registerResolveComponents()
@@ -19,7 +19,10 @@ import org.jetbrains.kotlin.psi.KtFunction
import org.jetbrains.kotlin.psi.KtNamedFunction import org.jetbrains.kotlin.psi.KtNamedFunction
import org.jetbrains.kotlin.psi.KtProperty 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 val stubIndex: StubIndex = StubIndex.getInstance()
private inline fun <INDEX_KEY : Any, reified PSI : PsiElement> firstMatchingOrNull( private inline fun <INDEX_KEY : Any, reified PSI : PsiElement> firstMatchingOrNull(
@@ -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
}
@@ -6,7 +6,7 @@
package org.jetbrains.kotlin.idea.fir.low.level.api.sessions package org.jetbrains.kotlin.idea.fir.low.level.api.sessions
import com.intellij.openapi.project.Project 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.FirProjectSessionProvider
import org.jetbrains.kotlin.fir.java.JavaSymbolProvider import org.jetbrains.kotlin.fir.java.JavaSymbolProvider
import org.jetbrains.kotlin.fir.java.deserialization.KotlinDeserializedJvmSymbolsProvider 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.fir.scopes.KotlinScopeProvider
import org.jetbrains.kotlin.idea.caches.project.ModuleSourceInfo import org.jetbrains.kotlin.idea.caches.project.ModuleSourceInfo
import org.jetbrains.kotlin.idea.caches.resolve.IDEPackagePartProvider 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.idea.fir.low.level.api.IdeSessionComponents
import org.jetbrains.kotlin.load.java.JavaClassFinderImpl import org.jetbrains.kotlin.load.java.JavaClassFinderImpl
import org.jetbrains.kotlin.load.kotlin.VirtualFileFinderFactory import org.jetbrains.kotlin.load.kotlin.VirtualFileFinderFactory
class FirIdeModuleLibraryDependenciesSession private constructor( internal class FirIdeModuleLibraryDependenciesSession private constructor(
sessionProvider: FirProjectSessionProvider, sessionProvider: FirIdeSessionProvider,
) : FirSession(sessionProvider) { override val scope: GlobalSearchScope
) : FirIdeSession(sessionProvider) {
companion object { companion object {
fun create( fun create(
moduleInfo: ModuleSourceInfo, moduleInfo: ModuleSourceInfo,
sessionProvider: FirProjectSessionProvider, sessionProvider: FirIdeSessionProvider,
project: Project, project: Project,
): FirIdeModuleLibraryDependenciesSession { ): FirIdeModuleLibraryDependenciesSession {
val searchScope = moduleInfo.module.moduleWithLibrariesScope val searchScope = moduleInfo.module.moduleWithLibrariesScope
@@ -40,7 +42,7 @@ class FirIdeModuleLibraryDependenciesSession private constructor(
val packagePartProvider = IDEPackagePartProvider(searchScope) val packagePartProvider = IDEPackagePartProvider(searchScope)
val kotlinClassFinder = VirtualFileFinderFactory.getInstance(project).create(searchScope) val kotlinClassFinder = VirtualFileFinderFactory.getInstance(project).create(searchScope)
return FirIdeModuleLibraryDependenciesSession(sessionProvider).apply { return FirIdeModuleLibraryDependenciesSession(sessionProvider, searchScope).apply {
registerCommonComponents() registerCommonComponents()
val javaSymbolProvider = JavaSymbolProvider(this, sessionProvider.project, searchScope) val javaSymbolProvider = JavaSymbolProvider(this, sessionProvider.project, searchScope)
@@ -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
}
@@ -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.types.KtFirType
import org.jetbrains.kotlin.idea.frontend.api.fir.utils.weakRef 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.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.KtClassOrObjectSymbol
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtPackageSymbol import org.jetbrains.kotlin.idea.frontend.api.symbols.KtPackageSymbol
import org.jetbrains.kotlin.idea.frontend.api.types.KtType import org.jetbrains.kotlin.idea.frontend.api.types.KtType
@@ -92,7 +94,7 @@ internal class KtFirScopeProvider(
packageSymbol.fqName, packageSymbol.fqName,
firResolveState.firIdeSourcesSession/*TODO use correct session here*/ firResolveState.firIdeSourcesSession/*TODO use correct session here*/
).also(firScopeStorage::register) ).also(firScopeStorage::register)
KtFirPackageScope(firPackageScope, builder, token) KtFirPackageScope(firPackageScope, project, builder, token)
} }
} }
@@ -149,7 +151,7 @@ internal class KtFirScopeProvider(
return when (firScope) { return when (firScope) {
is FirAbstractSimpleImportingScope -> KtFirNonStarImportingScope(firScope, builder, token) is FirAbstractSimpleImportingScope -> KtFirNonStarImportingScope(firScope, builder, token)
is FirAbstractStarImportingScope -> KtFirStarImportingScope(firScope, builder, project, 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) is FirContainingNamesAwareScope -> KtFirDelegatingScopeImpl(firScope, builder, token)
else -> TODO(firScope::class.toString()) else -> TODO(firScope::class.toString())
} }
@@ -5,34 +5,43 @@
package org.jetbrains.kotlin.idea.frontend.api.fir.scopes 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.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.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.KtSymbolByFirBuilder
import org.jetbrains.kotlin.idea.frontend.api.fir.utils.weakRef 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.scopes.KtPackageScope
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtCallableSymbol 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.KtClassLikeSymbol
import org.jetbrains.kotlin.idea.frontend.api.withValidityAssertion 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.FqName
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
internal class KtFirPackageScope( internal class KtFirPackageScope(
firScope: FirPackageMemberScope, firScope: FirPackageMemberScope,
private val project: Project,
private val builder: KtSymbolByFirBuilder, private val builder: KtSymbolByFirBuilder,
override val token: ValidityToken, override val token: ValidityToken,
) : KtPackageScope, ValidityTokenOwner { ) : KtPackageScope {
private val firScope by weakRef(firScope) private val firScope by weakRef(firScope)
override val fqName: FqName get() = firScope.fqName override val fqName: FqName get() = firScope.fqName
override fun getCallableNames(): Set<Name> = withValidityAssertion { override fun getCallableNames() = withValidityAssertion {
// TODO: KT-41048 hashSetOf<Name>().apply {
emptySet() 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<Name> = withValidityAssertion { override fun getClassLikeSymbolNames(): Set<Name> = withValidityAssertion {
// TODO: KT-41048 KotlinTopLevelClassByPackageIndex.getInstance()[fqName.asString(), project, firScope.session.searchScope]
emptySet() .mapNotNullTo(hashSetOf()) { it.nameAsName }
} }
override fun getCallableSymbols(): Sequence<KtCallableSymbol> = withValidityAssertion { override fun getCallableSymbols(): Sequence<KtCallableSymbol> = withValidityAssertion {