[LL] Use package provider to check for existing package

KT-59793
This commit is contained in:
Pavel Kirpichenkov
2023-07-24 16:46:48 +03:00
committed by teamcity
parent 7884b5fecf
commit ef6375f627
6 changed files with 45 additions and 21 deletions
@@ -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<KtFile>
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)
}
}
@@ -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<KtFile>()
private fun loadBuiltIns(): Collection<KotlinFileStubImpl> {
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<KtFile> {
return createdFakeKtFiles
}
}
/**
@@ -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,
@@ -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,
@@ -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
@@ -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 }
}