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 41ada52d176..5d8f6c7d573 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 @@ -78,21 +78,27 @@ object AnalysisApiBaseTestServiceRegistrar: AnalysisApiTestServiceRegistrar() { registerService(KotlinAnnotationsResolverFactory::class.java, KotlinStaticAnnotationsResolverFactory(allKtFiles)) val filter = BuiltInDefinitionFile.FILTER_OUT_CLASSES_EXISTING_AS_JVM_CLASS_FILES + val ktFilesForBinaries: List try { BuiltInDefinitionFile.FILTER_OUT_CLASSES_EXISTING_AS_JVM_CLASS_FILES = false + val declarationProviderFactory = KotlinStaticDeclarationProviderFactory( + project, + allKtFiles, + additionalRoots = roots, + skipBuiltins = testServices.moduleStructure.allDirectives.contains(NO_RUNTIME), + ) + ktFilesForBinaries = declarationProviderFactory.getAdditionalCreatedKtFiles() registerService( - KotlinDeclarationProviderFactory::class.java, KotlinStaticDeclarationProviderFactory( - project, - allKtFiles, - additionalRoots = roots, - skipBuiltins = testServices.moduleStructure.allDirectives.contains(NO_RUNTIME), - ) + KotlinDeclarationProviderFactory::class.java, declarationProviderFactory ) } finally { BuiltInDefinitionFile.FILTER_OUT_CLASSES_EXISTING_AS_JVM_CLASS_FILES = filter } registerService(KotlinDeclarationProviderMerger::class.java, KotlinStaticDeclarationProviderMerger(project)) - registerService(KotlinPackageProviderFactory::class.java, KotlinStaticPackageProviderFactory(project, allKtFiles)) + registerService( + KotlinPackageProviderFactory::class.java, + KotlinStaticPackageProviderFactory(project, allKtFiles + ktFilesForBinaries) + ) registerService(KotlinResolutionScopeProvider::class.java, KotlinByModulesResolutionScopeProvider::class.java) } } diff --git a/analysis/analysis-api-providers/src/org/jetbrains/kotlin/analysis/providers/impl/KotlinStaticDeclarationProvider.kt b/analysis/analysis-api-providers/src/org/jetbrains/kotlin/analysis/providers/impl/KotlinStaticDeclarationProvider.kt index 0a46c9bb36d..97eec681498 100644 --- a/analysis/analysis-api-providers/src/org/jetbrains/kotlin/analysis/providers/impl/KotlinStaticDeclarationProvider.kt +++ b/analysis/analysis-api-providers/src/org/jetbrains/kotlin/analysis/providers/impl/KotlinStaticDeclarationProvider.kt @@ -17,7 +17,6 @@ import com.intellij.psi.PsiManager import com.intellij.psi.SingleRootFileViewProvider import com.intellij.psi.search.GlobalSearchScope import com.intellij.psi.stubs.StubElement -import com.intellij.util.containers.CollectionFactory.createConcurrentWeakValueMap import com.intellij.util.indexing.FileContent import com.intellij.util.indexing.FileContentImpl import com.intellij.util.io.URLUtil @@ -135,6 +134,7 @@ public class KotlinStaticDeclarationProviderFactory( private val psiManager = PsiManager.getInstance(project) private val builtInDecompiler = KotlinBuiltInDecompiler() + private val createdFakeKtFiles = mutableListOf() private fun loadBuiltIns(): Collection { val classLoader = this::class.java.classLoader @@ -170,6 +170,7 @@ public class KotlinStaticDeclarationProviderFactory( override fun isPhysical() = false } ktFileStub.psi = fakeFile + createdFakeKtFiles.add(fakeFile) return ktFileStub } @@ -343,6 +344,7 @@ public class KotlinStaticDeclarationProviderFactory( override fun isPhysical() = false } stub.psi = fakeFile + createdFakeKtFiles.add(fakeFile) processStub(stub) } } @@ -356,6 +358,10 @@ public class KotlinStaticDeclarationProviderFactory( override fun createDeclarationProvider(scope: GlobalSearchScope, contextualModule: KtModule?): KotlinDeclarationProvider { return KotlinStaticDeclarationProvider(index, scope) } + + public fun getAdditionalCreatedKtFiles(): List { + return createdFakeKtFiles + } } /** 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 8bb2abafb09..a17fb529d67 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 @@ -128,16 +128,20 @@ public class StandaloneAnalysisAPISessionBuilder( registerService(KtModuleScopeProvider::class.java, KtModuleScopeProviderImpl()) registerService(KotlinAnnotationsResolverFactory::class.java, KotlinStaticAnnotationsResolverFactory(ktFiles)) registerService(KotlinResolutionScopeProvider::class.java, KotlinByModulesResolutionScopeProvider::class.java) + val declarationProviderFactory = KotlinStaticDeclarationProviderFactory( + this, + ktFiles, + kotlinCoreProjectEnvironment.environment.jarFileSystem as CoreJarFileSystem + ) registerService( KotlinDeclarationProviderFactory::class.java, - KotlinStaticDeclarationProviderFactory( - this, - ktFiles, - kotlinCoreProjectEnvironment.environment.jarFileSystem as CoreJarFileSystem - ) + declarationProviderFactory ) registerService(KotlinDeclarationProviderMerger::class.java, KotlinStaticDeclarationProviderMerger(this)) - registerService(KotlinPackageProviderFactory::class.java, KotlinStaticPackageProviderFactory(project, ktFiles)) + registerService( + KotlinPackageProviderFactory::class.java, + KotlinStaticPackageProviderFactory(project, ktFiles + declarationProviderFactory.getAdditionalCreatedKtFiles()) + ) registerService( FirSealedClassInheritorsProcessorFactory::class.java, diff --git a/analysis/analysis-api-standalone/src/org/jetbrains/kotlin/analysis/api/standalone/StandaloneUtils.kt b/analysis/analysis-api-standalone/src/org/jetbrains/kotlin/analysis/api/standalone/StandaloneUtils.kt index a7589a0b46b..6b5d1ddc86a 100644 --- a/analysis/analysis-api-standalone/src/org/jetbrains/kotlin/analysis/api/standalone/StandaloneUtils.kt +++ b/analysis/analysis-api-standalone/src/org/jetbrains/kotlin/analysis/api/standalone/StandaloneUtils.kt @@ -166,6 +166,7 @@ internal fun configureProjectEnvironment( ProjectStructureProvider::class.java, projectStructureProvider, ) + val declarationProviderFactory = KotlinStaticDeclarationProviderFactory(project, ktFiles) project.registerService( KotlinModuleDependentsProvider::class.java, KtStaticModuleDependentsProvider(projectStructureProvider.allKtModules), @@ -173,7 +174,7 @@ internal fun configureProjectEnvironment( project.registerService( KotlinDeclarationProviderFactory::class.java, - KotlinStaticDeclarationProviderFactory(project, ktFiles) + declarationProviderFactory ) project.registerService( KotlinDeclarationProviderMerger::class.java, @@ -181,7 +182,7 @@ internal fun configureProjectEnvironment( ) project.registerService( KotlinPackageProviderFactory::class.java, - KotlinStaticPackageProviderFactory(project, ktFiles) + KotlinStaticPackageProviderFactory(project, ktFiles + declarationProviderFactory.getAdditionalCreatedKtFiles()) ) project.registerService( PackagePartProviderFactory::class.java, 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 0d60a76686c..9be4985583d 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 @@ -11,6 +11,7 @@ import org.jetbrains.kotlin.analysis.low.level.api.fir.providers.LLFirKotlinSymb import org.jetbrains.kotlin.analysis.low.level.api.fir.util.LLFirKotlinSymbolNamesProvider import org.jetbrains.kotlin.analysis.providers.KotlinDeclarationProvider import org.jetbrains.kotlin.analysis.providers.createDeclarationProvider +import org.jetbrains.kotlin.analysis.providers.createPackageProvider import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.caches.FirCache import org.jetbrains.kotlin.fir.caches.firCachesFactory @@ -78,6 +79,8 @@ internal open class StubBasedFirDeserializedSymbolProvider( private val functionCache = session.firCachesFactory.createCache(::loadFunctionsByCallableId) private val propertyCache = session.firCachesFactory.createCache(::loadPropertiesByCallableId) + private val packageProvider = project.createPackageProvider(scope) + private fun findAndDeserializeTypeAlias( classId: ClassId, context: StubBasedFirDeserializationContext?, @@ -264,10 +267,7 @@ internal open class StubBasedFirDeserializedSymbolProvider( } override fun getPackage(fqName: FqName): FqName? = - fqName.takeIf { - symbolNamesProvider.getTopLevelClassifierNamesInPackage(fqName)?.isNotEmpty() == true || - symbolNamesProvider.getPackageNamesWithTopLevelCallables()?.contains(fqName.asString()) == true - } + fqName.takeIf { packageProvider.doesKotlinOnlyPackageExist(fqName) } override fun getClassLikeSymbolByClassId(classId: ClassId): FirClassLikeSymbol<*>? { if (!symbolNamesProvider.mayHaveTopLevelClassifier(classId)) return null diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/util/FirDeclarationForCompiledElementSearcher.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/util/FirDeclarationForCompiledElementSearcher.kt index 564fe2b9a87..ad4eda1ea4c 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/util/FirDeclarationForCompiledElementSearcher.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/util/FirDeclarationForCompiledElementSearcher.kt @@ -6,13 +6,16 @@ package org.jetbrains.kotlin.analysis.low.level.api.fir.util import org.jetbrains.kotlin.analysis.low.level.api.fir.element.builder.containingDeclaration +import org.jetbrains.kotlin.analysis.low.level.api.fir.project.structure.LLFirModuleData import org.jetbrains.kotlin.analysis.low.level.api.fir.project.structure.llFirModuleData import org.jetbrains.kotlin.analysis.low.level.api.fir.providers.LLFirModuleWithDependenciesSymbolProvider import org.jetbrains.kotlin.analysis.low.level.api.fir.sessions.LLFirBuiltinsAndCloneableSession +import org.jetbrains.kotlin.analysis.project.structure.KtBuiltinsModule import org.jetbrains.kotlin.analysis.project.structure.ProjectStructureProvider import org.jetbrains.kotlin.utils.exceptions.ExceptionAttachmentBuilder import org.jetbrains.kotlin.analysis.utils.errors.withClassEntry import org.jetbrains.kotlin.fir.declarations.* +import org.jetbrains.kotlin.fir.moduleData import org.jetbrains.kotlin.fir.realPsi import org.jetbrains.kotlin.fir.resolve.providers.* import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol @@ -165,9 +168,13 @@ internal class FirDeclarationForCompiledElementSearcher(private val symbolProvid } // Returns a built-in provider for a Kotlin standard library, as built-in declarations are its logical part. +// Returns one for built-ins modules as well, as these modules have empty scope and their content comes from the dependency provider. private val LLFirModuleWithDependenciesSymbolProvider.friendBuiltinsProvider: FirSymbolProvider? get() { - if (getPackageWithoutDependencies(StandardClassIds.BASE_KOTLIN_PACKAGE) != null) { + val moduleData = this.session.moduleData + if (getPackageWithoutDependencies(StandardClassIds.BASE_KOTLIN_PACKAGE) != null + || moduleData is LLFirModuleData && moduleData.ktModule is KtBuiltinsModule + ) { return dependencyProvider.providers.find { it.session is LLFirBuiltinsAndCloneableSession } }