FIR IDE: allow KtFirPackageScope to work without providers
This commit is contained in:
@@ -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))
|
||||
|
||||
+8
-8
@@ -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<ModuleSourceInfo>()
|
||||
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<ModuleSourceInfo>()
|
||||
val searchScope = ModuleWithDependentsScope(project, dependentModules.map { it.module })
|
||||
|
||||
registerCommonComponents()
|
||||
registerResolveComponents()
|
||||
|
||||
+4
-1
@@ -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 <INDEX_KEY : Any, reified PSI : PsiElement> firstMatchingOrNull(
|
||||
|
||||
+19
@@ -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
|
||||
}
|
||||
+8
-6
@@ -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)
|
||||
|
||||
+14
@@ -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
|
||||
}
|
||||
+4
-2
@@ -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())
|
||||
}
|
||||
|
||||
+16
-7
@@ -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<Name> = withValidityAssertion {
|
||||
// TODO: KT-41048
|
||||
emptySet()
|
||||
override fun getCallableNames() = withValidityAssertion {
|
||||
hashSetOf<Name>().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<Name> = withValidityAssertion {
|
||||
// TODO: KT-41048
|
||||
emptySet()
|
||||
KotlinTopLevelClassByPackageIndex.getInstance()[fqName.asString(), project, firScope.session.searchScope]
|
||||
.mapNotNullTo(hashSetOf()) { it.nameAsName }
|
||||
}
|
||||
|
||||
override fun getCallableSymbols(): Sequence<KtCallableSymbol> = withValidityAssertion {
|
||||
|
||||
Reference in New Issue
Block a user