rr/darthorimar/paaaackage wip
diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/KaFirSession.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/KaFirSession.kt
index 084aabb..573d729 100644
--- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/KaFirSession.kt
+++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/KaFirSession.kt
@@ -24,9 +24,9 @@
import org.jetbrains.kotlin.analysis.api.platform.declarations.KotlinDeclarationProvider
import org.jetbrains.kotlin.analysis.api.platform.packages.KotlinPackageProvider
import org.jetbrains.kotlin.analysis.api.platform.declarations.createDeclarationProvider
-import org.jetbrains.kotlin.analysis.api.platform.packages.createPackageProvider
import org.jetbrains.kotlin.analysis.api.platform.declarations.KotlinCompositeDeclarationProvider
import org.jetbrains.kotlin.analysis.api.platform.packages.KotlinCompositePackageProvider
+import org.jetbrains.kotlin.analysis.api.platform.packages.createPackageProvider
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.moduleData
import org.jetbrains.kotlin.fir.resolve.ScopeSession
diff --git a/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/configurators/AnalysisApiBaseTestServiceRegistrar.kt b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/configurators/AnalysisApiBaseTestServiceRegistrar.kt
index 26f1632..adc2d08 100644
--- a/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/configurators/AnalysisApiBaseTestServiceRegistrar.kt
+++ b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/configurators/AnalysisApiBaseTestServiceRegistrar.kt
@@ -17,8 +17,10 @@
import org.jetbrains.kotlin.analysis.api.platform.declarations.KotlinDeclarationProviderMerger
import org.jetbrains.kotlin.analysis.api.platform.modification.KotlinGlobalModificationService
import org.jetbrains.kotlin.analysis.api.platform.modification.KotlinModificationTrackerFactory
+import org.jetbrains.kotlin.analysis.api.platform.packages.KotlinPackageExistenceChecker
+import org.jetbrains.kotlin.analysis.api.platform.packages.KotlinPackageExistenceCheckerFactory
+import org.jetbrains.kotlin.analysis.api.platform.packages.KotlinPackageExistenceCheckerMerger
import org.jetbrains.kotlin.analysis.api.platform.packages.KotlinPackageProviderFactory
-import org.jetbrains.kotlin.analysis.api.platform.packages.KotlinPackageProviderMerger
import org.jetbrains.kotlin.analysis.api.platform.projectStructure.KotlinByModulesResolutionScopeProvider
import org.jetbrains.kotlin.analysis.api.platform.projectStructure.KotlinResolutionScopeProvider
import org.jetbrains.kotlin.analysis.api.projectStructure.KaLibraryModule
@@ -27,8 +29,9 @@
import org.jetbrains.kotlin.analysis.api.standalone.base.declarations.KotlinStandaloneDeclarationProviderMerger
import org.jetbrains.kotlin.analysis.api.standalone.base.modification.KotlinStandaloneGlobalModificationService
import org.jetbrains.kotlin.analysis.api.standalone.base.modification.KotlinStandaloneModificationTrackerFactory
+import org.jetbrains.kotlin.analysis.api.standalone.base.packages.KotlinStandalonePackageExistenceCheckerFactory
+import org.jetbrains.kotlin.analysis.api.standalone.base.packages.KotlinStandalonePackageExistenceCheckerMerger
import org.jetbrains.kotlin.analysis.api.standalone.base.packages.KotlinStandalonePackageProviderFactory
-import org.jetbrains.kotlin.analysis.api.standalone.base.packages.KotlinStandalonePackageProviderMerger
import org.jetbrains.kotlin.analysis.api.standalone.base.projectStructure.StandaloneProjectFactory
import org.jetbrains.kotlin.analysis.decompiled.light.classes.ClsJavaStubByVirtualFileCache
import org.jetbrains.kotlin.analysis.decompiled.light.classes.DecompiledLightClassesFactory
@@ -165,7 +168,11 @@
KotlinPackageProviderFactory::class.java,
KotlinStandalonePackageProviderFactory(project, testKtFiles + ktFilesForBinaries)
)
- registerService(KotlinPackageProviderMerger::class.java, KotlinStandalonePackageProviderMerger(project))
+ registerService(
+ KotlinPackageExistenceCheckerFactory::class.java,
+ KotlinStandalonePackageExistenceCheckerFactory(project, testKtFiles + ktFilesForBinaries)
+ )
+ registerService(KotlinPackageExistenceCheckerMerger::class.java, KotlinStandalonePackageExistenceCheckerMerger(project))
registerService(KotlinResolutionScopeProvider::class.java, KotlinByModulesResolutionScopeProvider::class.java)
}
}
diff --git a/analysis/analysis-api-platform-interface/src/org/jetbrains/kotlin/analysis/api/platform/declarations/KotlinForwardDeclarationProviderFactory.kt b/analysis/analysis-api-platform-interface/src/org/jetbrains/kotlin/analysis/api/platform/declarations/KotlinForwardDeclarationProviderFactory.kt
index 9be7bc2..f6f002c 100644
--- a/analysis/analysis-api-platform-interface/src/org/jetbrains/kotlin/analysis/api/platform/declarations/KotlinForwardDeclarationProviderFactory.kt
+++ b/analysis/analysis-api-platform-interface/src/org/jetbrains/kotlin/analysis/api/platform/declarations/KotlinForwardDeclarationProviderFactory.kt
@@ -18,7 +18,7 @@
* It is a responsibility of the implementor to make the source representation correct.
* Symbol's properties are not affected by its source representation.
*
- * Implementations should be consistent with their corresponding [KotlinForwardDeclarationsPackageProviderFactory][org.jetbrains.kotlin.analysis.api.platform.packages.KotlinForwardDeclarationsPackageProviderFactory]
+ * Implementations should be consistent with their corresponding [KotlinForwardDeclarationsPackageProviderFactory][org.jetbrains.kotlin.analysis.api.platform.packages.KotlinForwardDeclarationsPackageExistenceCheckerFactory]
* implementation.
*/
public interface KotlinForwardDeclarationProviderFactory : KotlinOptionalPlatformComponent {
diff --git a/analysis/analysis-api-platform-interface/src/org/jetbrains/kotlin/analysis/api/platform/packages/KotlinForwardDeclarationsPackageProviderFactory.kt b/analysis/analysis-api-platform-interface/src/org/jetbrains/kotlin/analysis/api/platform/packages/KotlinForwardDeclarationsPackageExistenceCheckerFactory.kt
similarity index 62%
rename from analysis/analysis-api-platform-interface/src/org/jetbrains/kotlin/analysis/api/platform/packages/KotlinForwardDeclarationsPackageProviderFactory.kt
rename to analysis/analysis-api-platform-interface/src/org/jetbrains/kotlin/analysis/api/platform/packages/KotlinForwardDeclarationsPackageExistenceCheckerFactory.kt
index 23f3503..4b1b3aac 100644
--- a/analysis/analysis-api-platform-interface/src/org/jetbrains/kotlin/analysis/api/platform/packages/KotlinForwardDeclarationsPackageProviderFactory.kt
+++ b/analysis/analysis-api-platform-interface/src/org/jetbrains/kotlin/analysis/api/platform/packages/KotlinForwardDeclarationsPackageExistenceCheckerFactory.kt
@@ -11,20 +11,20 @@
import org.jetbrains.kotlin.analysis.api.projectStructure.KaModule
/**
- * [KotlinForwardDeclarationsPackageProviderFactory] creates [KotlinPackageProvider]s for Kotlin/Native forward declarations.
+ * [KotlinForwardDeclarationsPackageExistenceCheckerFactory] creates [KotlinPackageProvider]s for Kotlin/Native forward declarations.
*
* Implementations should be consistent with their corresponding [KotlinForwardDeclarationProviderFactory][org.jetbrains.kotlin.analysis.api.platform.declarations.KotlinForwardDeclarationProviderFactory]
* implementation.
*/
-public interface KotlinForwardDeclarationsPackageProviderFactory : KotlinOptionalPlatformComponent {
+public interface KotlinForwardDeclarationsPackageExistenceCheckerFactory : KotlinOptionalPlatformComponent {
/**
* Creates a package provider for Kotlin/Native forward declaration packages in [module], or `null` if the module cannot contain forward
* declarations.
*/
- public fun createPackageProvider(module: KaModule): KotlinPackageProvider?
+ public fun createPackageExistenceChecker(module: KaModule): KotlinPackageExistenceChecker?
public companion object {
- public fun getInstance(project: Project): KotlinForwardDeclarationsPackageProviderFactory? = project.serviceOrNull()
+ public fun getInstance(project: Project): KotlinForwardDeclarationsPackageExistenceCheckerFactory? = project.serviceOrNull()
}
}
@@ -32,7 +32,7 @@
* Creates a package provider for Kotlin/Native forward declaration packages in [module], or `null` if the module cannot contain forward
* declarations.
*
- * @see KotlinForwardDeclarationsPackageProviderFactory
+ * @see KotlinForwardDeclarationsPackageExistenceCheckerFactory
*/
-public fun Project.createForwardDeclarationsPackageProvider(module: KaModule): KotlinPackageProvider? =
- KotlinForwardDeclarationsPackageProviderFactory.getInstance(this)?.createPackageProvider(module)
+public fun Project.createForwardDeclarationsPackageExistenceChecker(module: KaModule): KotlinPackageExistenceChecker? =
+ KotlinForwardDeclarationsPackageExistenceCheckerFactory.getInstance(this)?.createPackageExistenceChecker(module)
diff --git a/analysis/analysis-api-platform-interface/src/org/jetbrains/kotlin/analysis/api/platform/packages/KotlinPackageExistenceChecker.kt b/analysis/analysis-api-platform-interface/src/org/jetbrains/kotlin/analysis/api/platform/packages/KotlinPackageExistenceChecker.kt
new file mode 100644
index 0000000..db57b5d
--- /dev/null
+++ b/analysis/analysis-api-platform-interface/src/org/jetbrains/kotlin/analysis/api/platform/packages/KotlinPackageExistenceChecker.kt
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2010-2024 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.analysis.api.platform.packages
+
+import com.intellij.openapi.components.service
+import com.intellij.openapi.project.Project
+import com.intellij.psi.search.GlobalSearchScope
+import org.jetbrains.kotlin.analysis.api.platform.KotlinComposableProvider
+import org.jetbrains.kotlin.analysis.api.platform.KotlinComposableProviderMerger
+import org.jetbrains.kotlin.analysis.api.platform.KotlinCompositeProvider
+import org.jetbrains.kotlin.analysis.api.platform.KotlinCompositeProviderFactory
+import org.jetbrains.kotlin.analysis.api.platform.KotlinPlatformComponent
+import org.jetbrains.kotlin.analysis.api.projectStructure.KaModule
+import org.jetbrains.kotlin.name.FqName
+import org.jetbrains.kotlin.platform.TargetPlatform
+
+
+public interface KotlinPackageExistenceChecker : KotlinComposableProvider {
+ public fun doesKotlinOnlyPackageExist(packageFqName: FqName): Boolean
+}
+
+public class KotlinCompositePackageExistenceChecker private constructor(
+ override val providers: List<KotlinPackageExistenceChecker>,
+) : KotlinPackageExistenceChecker, KotlinCompositeProvider<KotlinPackageExistenceChecker> {
+ override fun doesKotlinOnlyPackageExist(packageFqName: FqName): Boolean {
+ return providers.any { it.doesKotlinOnlyPackageExist(packageFqName) }
+ }
+
+ public companion object {
+ public val factory: KotlinCompositeProviderFactory<KotlinPackageExistenceChecker> = KotlinCompositeProviderFactory(
+ KotlinEmptyPackageExistenceChecker,
+ ::KotlinCompositePackageExistenceChecker,
+ )
+
+ public fun create(providers: List<KotlinPackageExistenceChecker>): KotlinPackageExistenceChecker = factory.create(providers)
+ }
+}
+
+public object KotlinEmptyPackageExistenceChecker : KotlinPackageExistenceChecker {
+ override fun doesKotlinOnlyPackageExist(packageFqName: FqName): Boolean {
+ return false
+ }
+}
+
+public interface KotlinPackageExistenceCheckerFactory {
+ public fun createPackageExistenceChecker(modules: List<KaModule>): KotlinPackageExistenceChecker
+ public fun createPackageExistenceChecker(module: KaModule): KotlinPackageExistenceChecker =
+ createPackageExistenceChecker(listOf(module))
+
+ public companion object {
+ public fun getInstance(project: Project): KotlinPackageExistenceCheckerFactory = project.service()
+ }
+}
+
+public interface KotlinPackageExistenceCheckerMerger : KotlinComposableProviderMerger<KotlinPackageExistenceChecker>,
+ KotlinPlatformComponent {
+ public companion object {
+ public fun getInstance(project: Project): KotlinPackageExistenceCheckerMerger = project.service()
+ }
+}
+
+
+public fun Project.mergePackageExistenceChecker(checkers: List<KotlinPackageExistenceChecker>): KotlinPackageExistenceChecker =
+ KotlinPackageExistenceCheckerMerger.getInstance(this).merge(checkers)
diff --git a/analysis/analysis-api-platform-interface/src/org/jetbrains/kotlin/analysis/api/platform/packages/KotlinPackageProvider.kt b/analysis/analysis-api-platform-interface/src/org/jetbrains/kotlin/analysis/api/platform/packages/KotlinPackageProvider.kt
index 66538bc..97b7579 100644
--- a/analysis/analysis-api-platform-interface/src/org/jetbrains/kotlin/analysis/api/platform/packages/KotlinPackageProvider.kt
+++ b/analysis/analysis-api-platform-interface/src/org/jetbrains/kotlin/analysis/api/platform/packages/KotlinPackageProvider.kt
@@ -19,7 +19,7 @@
* [scope][com.intellij.psi.search.GlobalSearchScope], but the details depend on the kind of package provider.
*
* The main kind of package providers is created via [KotlinPackageProviderFactory] and it is scope-based, but there are other kinds of
- * package providers, such as those created by [KotlinForwardDeclarationsPackageProviderFactory].
+ * package providers, such as those created by [KotlinForwardDeclarationsPackageExistenceCheckerFactory].
*
* Package providers are critical for performance, so implementations should cache results.
*/
diff --git a/analysis/analysis-api-platform-interface/src/org/jetbrains/kotlin/analysis/api/platform/packages/KotlinPackageProviderFactory.kt b/analysis/analysis-api-platform-interface/src/org/jetbrains/kotlin/analysis/api/platform/packages/KotlinPackageProviderFactory.kt
index 5d1e13e..b89812d 100644
--- a/analysis/analysis-api-platform-interface/src/org/jetbrains/kotlin/analysis/api/platform/packages/KotlinPackageProviderFactory.kt
+++ b/analysis/analysis-api-platform-interface/src/org/jetbrains/kotlin/analysis/api/platform/packages/KotlinPackageProviderFactory.kt
@@ -28,20 +28,8 @@
}
}
-/**
- * [KotlinPackageProviderMerger] allows merging multiple [KotlinPackageProvider]s into a more efficient package provider.
- *
- * Package providers should not be naively merged by combining scopes and calling [createPackageProvider], because there may be additional
- * package providers which do not operate based on scopes (e.g. resolve extension package providers).
- */
-public interface KotlinPackageProviderMerger : KotlinComposableProviderMerger<KotlinPackageProvider>, KotlinPlatformComponent {
- public companion object {
- public fun getInstance(project: Project): KotlinPackageProviderMerger = project.service()
- }
-}
public fun Project.createPackageProvider(searchScope: GlobalSearchScope): KotlinPackageProvider =
KotlinPackageProviderFactory.getInstance(this).createPackageProvider(searchScope)
-public fun Project.mergePackageProviders(packageProviders: List<KotlinPackageProvider>): KotlinPackageProvider =
- KotlinPackageProviderMerger.getInstance(this).merge(packageProviders)
+
diff --git a/analysis/analysis-api-standalone/analysis-api-standalone-base/src/org/jetbrains/kotlin/analysis/api/standalone/base/packages/KotlinStandalonePackageExistenceChecker.kt b/analysis/analysis-api-standalone/analysis-api-standalone-base/src/org/jetbrains/kotlin/analysis/api/standalone/base/packages/KotlinStandalonePackageExistenceChecker.kt
new file mode 100644
index 0000000..c601e8a
--- /dev/null
+++ b/analysis/analysis-api-standalone/analysis-api-standalone-base/src/org/jetbrains/kotlin/analysis/api/standalone/base/packages/KotlinStandalonePackageExistenceChecker.kt
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010-2024 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.analysis.api.standalone.base.packages
+
+import com.intellij.openapi.project.Project
+import com.intellij.psi.search.GlobalSearchScope
+import org.jetbrains.kotlin.analysis.api.platform.mergeSpecificProviders
+import org.jetbrains.kotlin.analysis.api.platform.packages.KotlinCompositePackageExistenceChecker
+import org.jetbrains.kotlin.analysis.api.platform.packages.KotlinEmptyPackageExistenceChecker
+import org.jetbrains.kotlin.analysis.api.platform.packages.KotlinPackageProvider
+import org.jetbrains.kotlin.analysis.api.platform.packages.KotlinPackageExistenceChecker
+import org.jetbrains.kotlin.analysis.api.platform.packages.KotlinPackageExistenceCheckerFactory
+import org.jetbrains.kotlin.analysis.api.platform.packages.KotlinPackageExistenceCheckerMerger
+import org.jetbrains.kotlin.analysis.api.projectStructure.KaModule
+import org.jetbrains.kotlin.name.FqName
+import org.jetbrains.kotlin.psi.KtFile
+
+class KotlinStandalonePackageExistenceChecker(
+ project: Project,
+ scope: GlobalSearchScope,
+ files: Collection<KtFile>,
+ val modules: List<KaModule>,
+) : KotlinPackageExistenceChecker {
+ // TODO
+ private val provider = KotlinStandalonePackageProvider(project, scope, files)
+
+ override fun doesKotlinOnlyPackageExist(packageFqName: FqName): Boolean {
+ return provider.doesKotlinOnlyPackageExist(packageFqName)
+ }
+}
+
+class KotlinStandalonePackageExistenceCheckerFactory(
+ private val project: Project,
+ private val files: Collection<KtFile>,
+) : KotlinPackageExistenceCheckerFactory {
+ override fun createPackageExistenceChecker(modules: List<KaModule>): KotlinPackageExistenceChecker {
+ if (modules.isEmpty()) return KotlinEmptyPackageExistenceChecker
+ return KotlinStandalonePackageExistenceChecker(project, GlobalSearchScope.union(modules.map { it.contentScope }), files, modules)
+ }
+}
+
+class KotlinStandalonePackageExistenceCheckerMerger(private val project: Project) : KotlinPackageExistenceCheckerMerger {
+ override fun merge(providers: List<KotlinPackageExistenceChecker>): KotlinPackageExistenceChecker =
+ providers.mergeSpecificProviders<_, KotlinStandalonePackageExistenceChecker>(KotlinCompositePackageExistenceChecker.factory) { targetProviders ->
+ KotlinPackageExistenceCheckerFactory.getInstance(project).createPackageExistenceChecker(
+ providers.flatMap { (it as KotlinStandalonePackageExistenceChecker).modules } + targetProviders.flatMap { it.modules }
+ )
+ }
+}
\ No newline at end of file
diff --git a/analysis/analysis-api-standalone/analysis-api-standalone-base/src/org/jetbrains/kotlin/analysis/api/standalone/base/packages/KotlinStandalonePackageProvider.kt b/analysis/analysis-api-standalone/analysis-api-standalone-base/src/org/jetbrains/kotlin/analysis/api/standalone/base/packages/KotlinStandalonePackageProvider.kt
index 213f7db..a227fca 100644
--- a/analysis/analysis-api-standalone/analysis-api-standalone-base/src/org/jetbrains/kotlin/analysis/api/standalone/base/packages/KotlinStandalonePackageProvider.kt
+++ b/analysis/analysis-api-standalone/analysis-api-standalone-base/src/org/jetbrains/kotlin/analysis/api/standalone/base/packages/KotlinStandalonePackageProvider.kt
@@ -9,11 +9,7 @@
import com.intellij.psi.search.GlobalSearchScope
import org.jetbrains.kotlin.analysis.api.platform.packages.KotlinPackageProvider
import org.jetbrains.kotlin.analysis.api.platform.packages.KotlinPackageProviderFactory
-import org.jetbrains.kotlin.analysis.api.platform.packages.KotlinPackageProviderMerger
-import org.jetbrains.kotlin.analysis.api.platform.packages.createPackageProvider
import org.jetbrains.kotlin.analysis.api.platform.packages.KotlinPackageProviderBase
-import org.jetbrains.kotlin.analysis.api.platform.mergeSpecificProviders
-import org.jetbrains.kotlin.analysis.api.platform.packages.KotlinCompositePackageProvider
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.psi.KtFile
@@ -53,16 +49,4 @@
override fun createPackageProvider(searchScope: GlobalSearchScope): KotlinPackageProvider {
return KotlinStandalonePackageProvider(project, searchScope, files)
}
-}
-
-class KotlinStandalonePackageProviderMerger(private val project: Project) : KotlinPackageProviderMerger {
- override fun merge(providers: List<KotlinPackageProvider>): KotlinPackageProvider =
- providers.mergeSpecificProviders<_, KotlinStandalonePackageProvider>(KotlinCompositePackageProvider.factory) { targetProviders ->
- val combinedScope = GlobalSearchScope.union(targetProviders.map { it.scope })
- project.createPackageProvider(combinedScope).apply {
- check(this is KotlinStandalonePackageProvider) {
- "`${KotlinStandalonePackageProvider::class.simpleName}` can only be merged into a combined package provider of the same type."
- }
- }
- }
-}
+}
\ No newline at end of file
diff --git a/analysis/analysis-api-standalone/src/org/jetbrains/kotlin/analysis/api/standalone/StandaloneAnalysisAPISessionBuilder.kt b/analysis/analysis-api-standalone/src/org/jetbrains/kotlin/analysis/api/standalone/StandaloneAnalysisAPISessionBuilder.kt
index 1de7e93..c4e43a0 100644
--- a/analysis/analysis-api-standalone/src/org/jetbrains/kotlin/analysis/api/standalone/StandaloneAnalysisAPISessionBuilder.kt
+++ b/analysis/analysis-api-standalone/src/org/jetbrains/kotlin/analysis/api/standalone/StandaloneAnalysisAPISessionBuilder.kt
@@ -21,9 +21,10 @@
import org.jetbrains.kotlin.analysis.api.platform.lifetime.KotlinLifetimeTokenFactory
import org.jetbrains.kotlin.analysis.api.platform.modification.KotlinGlobalModificationService
import org.jetbrains.kotlin.analysis.api.platform.modification.KotlinModificationTrackerFactory
+import org.jetbrains.kotlin.analysis.api.platform.packages.KotlinPackageExistenceCheckerFactory
+import org.jetbrains.kotlin.analysis.api.platform.packages.KotlinPackageExistenceCheckerMerger
import org.jetbrains.kotlin.analysis.api.platform.packages.KotlinPackagePartProviderFactory
import org.jetbrains.kotlin.analysis.api.platform.packages.KotlinPackageProviderFactory
-import org.jetbrains.kotlin.analysis.api.platform.packages.KotlinPackageProviderMerger
import org.jetbrains.kotlin.analysis.api.platform.projectStructure.KotlinByModulesResolutionScopeProvider
import org.jetbrains.kotlin.analysis.api.platform.projectStructure.KotlinCompilerPluginsProvider
import org.jetbrains.kotlin.analysis.api.platform.projectStructure.KotlinResolutionScopeProvider
@@ -35,8 +36,9 @@
import org.jetbrains.kotlin.analysis.api.standalone.base.declarations.KotlinStandaloneFirCompilerPluginsProvider
import org.jetbrains.kotlin.analysis.api.standalone.base.modification.KotlinStandaloneGlobalModificationService
import org.jetbrains.kotlin.analysis.api.standalone.base.modification.KotlinStandaloneModificationTrackerFactory
+import org.jetbrains.kotlin.analysis.api.standalone.base.packages.KotlinStandalonePackageExistenceCheckerFactory
+import org.jetbrains.kotlin.analysis.api.standalone.base.packages.KotlinStandalonePackageExistenceCheckerMerger
import org.jetbrains.kotlin.analysis.api.standalone.base.packages.KotlinStandalonePackageProviderFactory
-import org.jetbrains.kotlin.analysis.api.standalone.base.packages.KotlinStandalonePackageProviderMerger
import org.jetbrains.kotlin.analysis.api.standalone.base.projectStructure.AnalysisApiSimpleServiceRegistrar
import org.jetbrains.kotlin.analysis.api.standalone.base.projectStructure.ApplicationServiceRegistration
import org.jetbrains.kotlin.analysis.api.standalone.base.projectStructure.FirStandaloneServiceRegistrar
@@ -164,7 +166,14 @@
KotlinPackageProviderFactory::class.java,
KotlinStandalonePackageProviderFactory(project, sourceKtFiles + declarationProviderFactory.getAdditionalCreatedKtFiles())
)
- registerService(KotlinPackageProviderMerger::class.java, KotlinStandalonePackageProviderMerger(this))
+ registerService(
+ KotlinPackageExistenceCheckerFactory::class.java,
+ KotlinStandalonePackageExistenceCheckerFactory(
+ project,
+ sourceKtFiles + declarationProviderFactory.getAdditionalCreatedKtFiles()
+ )
+ )
+ registerService(KotlinPackageExistenceCheckerMerger::class.java, KotlinStandalonePackageExistenceCheckerMerger(this))
registerService(
KotlinPackagePartProviderFactory::class.java,
diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/providers/LLFirCombinedKotlinSymbolProvider.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/providers/LLFirCombinedKotlinSymbolProvider.kt
index 604dbb5..794bbd3 100644
--- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/providers/LLFirCombinedKotlinSymbolProvider.kt
+++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/providers/LLFirCombinedKotlinSymbolProvider.kt
@@ -9,9 +9,9 @@
import org.jetbrains.kotlin.analysis.low.level.api.fir.caches.NullableCaffeineCache
import org.jetbrains.kotlin.analysis.low.level.api.fir.sessions.LLFirSession
import org.jetbrains.kotlin.analysis.api.platform.declarations.KotlinDeclarationProvider
-import org.jetbrains.kotlin.analysis.api.platform.packages.KotlinPackageProvider
import org.jetbrains.kotlin.analysis.api.platform.declarations.mergeDeclarationProviders
-import org.jetbrains.kotlin.analysis.api.platform.packages.mergePackageProviders
+import org.jetbrains.kotlin.analysis.api.platform.packages.KotlinPackageExistenceChecker
+import org.jetbrains.kotlin.analysis.api.platform.packages.mergePackageExistenceChecker
import org.jetbrains.kotlin.builtins.StandardNames
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.resolve.providers.FirCompositeCachedSymbolNamesProvider
@@ -42,7 +42,7 @@
*
* [declarationProvider] must have a scope which combines the scopes of the individual [providers].
*
- * [packageProviderForKotlinPackages] should be the package provider combined from all [providers] which allow `kotlin` packages (see
+ * [packageExistenceCheckerForKotlinPackages] should be the package provider combined from all [providers] which allow `kotlin` packages (see
* [LLFirProvider.SymbolProvider.allowKotlinPackage]). It may be `null` if no such provider exists. See [getPackage] for a use case.
*/
internal class LLFirCombinedKotlinSymbolProvider private constructor(
@@ -50,8 +50,8 @@
project: Project,
providers: List<LLFirKotlinSymbolProvider>,
private val declarationProvider: KotlinDeclarationProvider,
- private val packageProvider: KotlinPackageProvider,
- private val packageProviderForKotlinPackages: KotlinPackageProvider?,
+ private val packageExistenceChecker: KotlinPackageExistenceChecker,
+ private val packageExistenceCheckerForKotlinPackages: KotlinPackageExistenceChecker?,
) : LLFirSelectingCombinedSymbolProvider<LLFirKotlinSymbolProvider>(session, project, providers) {
override val symbolNamesProvider: FirSymbolNamesProvider = FirCompositeCachedSymbolNamesProvider.fromSymbolProviders(session, providers)
@@ -126,9 +126,9 @@
// because calling that individual symbol provider directly would result in `null` (as it disallows `kotlin` packages). The
// `packageProviderForKotlinPackages` solves this issue by including only scopes from symbol providers which allow `kotlin`
// packages.
- packageProviderForKotlinPackages?.doesKotlinOnlyPackageExist(fqName) == true
+ packageExistenceCheckerForKotlinPackages?.doesKotlinOnlyPackageExist(fqName) == true
} else {
- packageProvider.doesKotlinOnlyPackageExist(fqName)
+ packageExistenceChecker.doesKotlinOnlyPackageExist(fqName)
}
// Regarding caching `hasPackage`: The static (standalone) package provider precomputes its packages, while the IDE package provider
@@ -141,20 +141,20 @@
if (providers.size > 1) {
val declarationProvider = project.mergeDeclarationProviders(providers.map { it.declarationProvider })
- val packageProvider = project.mergePackageProviders(providers.map { it.packageProvider })
+ val packageExistenceChecker = project.mergePackageExistenceChecker(providers.map { it.packageExistenceChecker })
val packageProviderForKotlinPackages = providers
.filter { it.allowKotlinPackage }
.takeIf { it.isNotEmpty() }
- ?.map { it.packageProvider }
- ?.let(project::mergePackageProviders)
+ ?.map { it.packageExistenceChecker }
+ ?.let(project::mergePackageExistenceChecker)
LLFirCombinedKotlinSymbolProvider(
session,
project,
providers,
declarationProvider,
- packageProvider,
+ packageExistenceChecker,
packageProviderForKotlinPackages,
)
} else providers.singleOrNull()
diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/providers/LLFirKotlinSymbolProvider.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/providers/LLFirKotlinSymbolProvider.kt
index a26601f..f766f5d 100644
--- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/providers/LLFirKotlinSymbolProvider.kt
+++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/providers/LLFirKotlinSymbolProvider.kt
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.analysis.low.level.api.fir.providers
import org.jetbrains.kotlin.analysis.api.platform.declarations.KotlinDeclarationProvider
+import org.jetbrains.kotlin.analysis.api.platform.packages.KotlinPackageExistenceChecker
import org.jetbrains.kotlin.analysis.api.platform.packages.KotlinPackageProvider
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider
@@ -29,7 +30,7 @@
internal abstract class LLFirKotlinSymbolProvider(session: FirSession) : FirSymbolProvider(session) {
abstract val declarationProvider: KotlinDeclarationProvider
- abstract val packageProvider: KotlinPackageProvider
+ abstract val packageExistenceChecker: KotlinPackageExistenceChecker
/**
* Whether the [LLFirKotlinSymbolProvider] should be able to find symbols defined in `kotlin` packages. This is usually not the case for
diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/providers/LLFirNativeForwardDeclarationsSymbolProvider.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/providers/LLFirNativeForwardDeclarationsSymbolProvider.kt
index ca2eb6a..15f5018 100644
--- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/providers/LLFirNativeForwardDeclarationsSymbolProvider.kt
+++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/providers/LLFirNativeForwardDeclarationsSymbolProvider.kt
@@ -10,9 +10,9 @@
import org.jetbrains.kotlin.analysis.low.level.api.fir.projectStructure.llFirModuleData
import org.jetbrains.kotlin.analysis.low.level.api.fir.util.LLFirKotlinSymbolNamesProvider
import org.jetbrains.kotlin.analysis.api.platform.declarations.KotlinDeclarationProvider
-import org.jetbrains.kotlin.analysis.api.platform.packages.KotlinPackageProvider
-import org.jetbrains.kotlin.analysis.api.platform.packages.createForwardDeclarationsPackageProvider
+import org.jetbrains.kotlin.analysis.api.platform.packages.createForwardDeclarationsPackageExistenceChecker
import org.jetbrains.kotlin.analysis.api.platform.declarations.createForwardDeclarationProvider
+import org.jetbrains.kotlin.analysis.api.platform.packages.KotlinPackageExistenceChecker
import org.jetbrains.kotlin.fir.FirModuleData
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.caches.FirCache
@@ -44,7 +44,7 @@
moduleDataProvider: SingleModuleDataProvider,
private val kotlinScopeProvider: FirKotlinScopeProvider,
override val declarationProvider: KotlinDeclarationProvider,
- override val packageProvider: KotlinPackageProvider,
+ override val packageExistenceChecker: KotlinPackageExistenceChecker,
) : LLFirKotlinSymbolProvider(
session,
) {
@@ -67,7 +67,7 @@
}
)
- override fun getPackage(fqName: FqName): FqName? = fqName.takeIf { packageProvider.doesKotlinOnlyPackageExist(fqName) }
+ override fun getPackage(fqName: FqName): FqName? = fqName.takeIf { packageExistenceChecker.doesKotlinOnlyPackageExist(fqName) }
@FirSymbolProviderInternals
override fun getClassLikeSymbolByClassId(
@@ -136,16 +136,16 @@
kotlinScopeProvider: FirKotlinScopeProvider,
): FirSymbolProvider? {
val ktModule = session.llFirModuleData.ktModule
- val packageProvider = project.createForwardDeclarationsPackageProvider(ktModule)
+ val packageExistenceChecker = project.createForwardDeclarationsPackageExistenceChecker(ktModule)
val declarationProvider = project.createForwardDeclarationProvider(ktModule)
- check((packageProvider == null) == (declarationProvider == null)) {
+ check((packageExistenceChecker == null) == (declarationProvider == null)) {
"Inconsistency between package and declaration providers for forward declarations. Both should be either null or non-null," +
- " but found: packageProvider $packageProvider; declarationProvider $declarationProvider"
+ " but found: packageProvider $packageExistenceChecker; declarationProvider $declarationProvider"
}
- if (packageProvider == null || declarationProvider == null) return null
+ if (packageExistenceChecker == null || declarationProvider == null) return null
return LLFirNativeForwardDeclarationsSymbolProvider(
- session, moduleDataProvider, kotlinScopeProvider, declarationProvider, packageProvider,
+ session, moduleDataProvider, kotlinScopeProvider, declarationProvider, packageExistenceChecker,
)
}
diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/providers/LLFirProvider.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/providers/LLFirProvider.kt
index 96c8e18..2fbe51b 100644
--- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/providers/LLFirProvider.kt
+++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/providers/LLFirProvider.kt
@@ -9,6 +9,7 @@
import org.jetbrains.kotlin.analysis.low.level.api.fir.LLFirModuleResolveComponents
import org.jetbrains.kotlin.analysis.low.level.api.fir.sessions.LLFirSession
import org.jetbrains.kotlin.analysis.api.platform.declarations.KotlinDeclarationProvider
+import org.jetbrains.kotlin.analysis.api.platform.packages.KotlinPackageExistenceChecker
import org.jetbrains.kotlin.analysis.api.platform.packages.KotlinPackageProvider
import org.jetbrains.kotlin.fir.NoMutableState
import org.jetbrains.kotlin.fir.ThreadSafeMutableState
@@ -110,7 +111,7 @@
internal inner class SymbolProvider : LLFirKotlinSymbolProvider(session) {
override val declarationProvider: KotlinDeclarationProvider get() = providerHelper.declarationProvider
- override val packageProvider: KotlinPackageProvider get() = providerHelper.packageProvider
+ override val packageExistenceChecker: KotlinPackageExistenceChecker get() = providerHelper.packageExistenceChecker
override val symbolNamesProvider: FirSymbolNamesProvider get() = providerHelper.symbolNameCache
diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/providers/LLFirProviderHelper.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/providers/LLFirProviderHelper.kt
index 6fb1697..b04beb4 100644
--- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/providers/LLFirProviderHelper.kt
+++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/providers/LLFirProviderHelper.kt
@@ -14,9 +14,9 @@
import org.jetbrains.kotlin.analysis.low.level.api.fir.util.FirElementFinder
import org.jetbrains.kotlin.analysis.low.level.api.fir.util.LLFirKotlinSymbolNamesProvider
import org.jetbrains.kotlin.analysis.api.platform.declarations.KotlinDeclarationProvider
-import org.jetbrains.kotlin.analysis.api.platform.packages.createPackageProvider
import org.jetbrains.kotlin.analysis.api.platform.declarations.KotlinCompositeDeclarationProvider
-import org.jetbrains.kotlin.analysis.api.platform.packages.KotlinCompositePackageProvider
+import org.jetbrains.kotlin.analysis.api.platform.packages.KotlinCompositePackageExistenceChecker
+import org.jetbrains.kotlin.analysis.api.platform.packages.KotlinPackageExistenceCheckerFactory
import org.jetbrains.kotlin.builtins.StandardNames
import org.jetbrains.kotlin.config.AnalysisFlags
import org.jetbrains.kotlin.fir.caches.FirCache
@@ -64,10 +64,10 @@
)
)
- val packageProvider = KotlinCompositePackageProvider.create(
+ val packageExistenceChecker = KotlinCompositePackageExistenceChecker.create(
listOfNotNull(
- firSession.project.createPackageProvider(searchScope),
- extensionTool?.packageProvider,
+ KotlinPackageExistenceCheckerFactory.getInstance(firSession.project).createPackageExistenceChecker(listOf(firSession.ktModule))
+// extensionTool?.packageProvider, TODO
)
)
@@ -229,7 +229,7 @@
fun getPackage(fqName: FqName): FqName? {
if (!allowKotlinPackage && fqName.isKotlinPackage()) return null
- return fqName.takeIf(packageProvider::doesKotlinOnlyPackageExist)
+ return fqName.takeIf(packageExistenceChecker::doesKotlinOnlyPackageExist)
}
}
diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/stubBased/deserialization/StubBasedFirDeserializedSymbolProvider.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/stubBased/deserialization/StubBasedFirDeserializedSymbolProvider.kt
index defa705..26bf1b6 100644
--- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/stubBased/deserialization/StubBasedFirDeserializedSymbolProvider.kt
+++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/stubBased/deserialization/StubBasedFirDeserializedSymbolProvider.kt
@@ -12,7 +12,7 @@
import org.jetbrains.kotlin.analysis.low.level.api.fir.providers.LLFirKotlinSymbolProvider
import org.jetbrains.kotlin.analysis.low.level.api.fir.util.LLFirKotlinSymbolNamesProvider
import org.jetbrains.kotlin.analysis.api.platform.declarations.createDeclarationProvider
-import org.jetbrains.kotlin.analysis.api.platform.packages.createPackageProvider
+import org.jetbrains.kotlin.analysis.api.platform.packages.KotlinPackageExistenceCheckerFactory
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.caches.FirCache
import org.jetbrains.kotlin.fir.caches.firCachesFactory
@@ -88,7 +88,8 @@
private val functionCache = session.firCachesFactory.createCache(::loadFunctionsByCallableId)
private val propertyCache = session.firCachesFactory.createCache(::loadPropertiesByCallableId)
- final override val packageProvider = project.createPackageProvider(scope)
+ final override val packageExistenceChecker =
+ KotlinPackageExistenceCheckerFactory.getInstance(project).createPackageExistenceChecker(session.llFirModuleData.ktModule)
/**
* Computes the origin for the declarations coming from [file].
@@ -285,7 +286,7 @@
}
override fun getPackage(fqName: FqName): FqName? =
- fqName.takeIf { packageProvider.doesKotlinOnlyPackageExist(fqName) }
+ fqName.takeIf { packageExistenceChecker.doesKotlinOnlyPackageExist(fqName) }
override fun getClassLikeSymbolByClassId(classId: ClassId): FirClassLikeSymbol<*>? {
if (!symbolNamesProvider.mayHaveTopLevelClassifier(classId)) return null