[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)) registerService(KotlinAnnotationsResolverFactory::class.java, KotlinStaticAnnotationsResolverFactory(allKtFiles))
val filter = BuiltInDefinitionFile.FILTER_OUT_CLASSES_EXISTING_AS_JVM_CLASS_FILES val filter = BuiltInDefinitionFile.FILTER_OUT_CLASSES_EXISTING_AS_JVM_CLASS_FILES
val ktFilesForBinaries: List<KtFile>
try { try {
BuiltInDefinitionFile.FILTER_OUT_CLASSES_EXISTING_AS_JVM_CLASS_FILES = false 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( registerService(
KotlinDeclarationProviderFactory::class.java, KotlinStaticDeclarationProviderFactory( KotlinDeclarationProviderFactory::class.java, declarationProviderFactory
project,
allKtFiles,
additionalRoots = roots,
skipBuiltins = testServices.moduleStructure.allDirectives.contains(NO_RUNTIME),
)
) )
} finally { } finally {
BuiltInDefinitionFile.FILTER_OUT_CLASSES_EXISTING_AS_JVM_CLASS_FILES = filter BuiltInDefinitionFile.FILTER_OUT_CLASSES_EXISTING_AS_JVM_CLASS_FILES = filter
} }
registerService(KotlinDeclarationProviderMerger::class.java, KotlinStaticDeclarationProviderMerger(project)) 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) 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.SingleRootFileViewProvider
import com.intellij.psi.search.GlobalSearchScope import com.intellij.psi.search.GlobalSearchScope
import com.intellij.psi.stubs.StubElement import com.intellij.psi.stubs.StubElement
import com.intellij.util.containers.CollectionFactory.createConcurrentWeakValueMap
import com.intellij.util.indexing.FileContent import com.intellij.util.indexing.FileContent
import com.intellij.util.indexing.FileContentImpl import com.intellij.util.indexing.FileContentImpl
import com.intellij.util.io.URLUtil import com.intellij.util.io.URLUtil
@@ -135,6 +134,7 @@ public class KotlinStaticDeclarationProviderFactory(
private val psiManager = PsiManager.getInstance(project) private val psiManager = PsiManager.getInstance(project)
private val builtInDecompiler = KotlinBuiltInDecompiler() private val builtInDecompiler = KotlinBuiltInDecompiler()
private val createdFakeKtFiles = mutableListOf<KtFile>()
private fun loadBuiltIns(): Collection<KotlinFileStubImpl> { private fun loadBuiltIns(): Collection<KotlinFileStubImpl> {
val classLoader = this::class.java.classLoader val classLoader = this::class.java.classLoader
@@ -170,6 +170,7 @@ public class KotlinStaticDeclarationProviderFactory(
override fun isPhysical() = false override fun isPhysical() = false
} }
ktFileStub.psi = fakeFile ktFileStub.psi = fakeFile
createdFakeKtFiles.add(fakeFile)
return ktFileStub return ktFileStub
} }
@@ -343,6 +344,7 @@ public class KotlinStaticDeclarationProviderFactory(
override fun isPhysical() = false override fun isPhysical() = false
} }
stub.psi = fakeFile stub.psi = fakeFile
createdFakeKtFiles.add(fakeFile)
processStub(stub) processStub(stub)
} }
} }
@@ -356,6 +358,10 @@ public class KotlinStaticDeclarationProviderFactory(
override fun createDeclarationProvider(scope: GlobalSearchScope, contextualModule: KtModule?): KotlinDeclarationProvider { override fun createDeclarationProvider(scope: GlobalSearchScope, contextualModule: KtModule?): KotlinDeclarationProvider {
return KotlinStaticDeclarationProvider(index, scope) return KotlinStaticDeclarationProvider(index, scope)
} }
public fun getAdditionalCreatedKtFiles(): List<KtFile> {
return createdFakeKtFiles
}
} }
/** /**
@@ -128,16 +128,20 @@ public class StandaloneAnalysisAPISessionBuilder(
registerService(KtModuleScopeProvider::class.java, KtModuleScopeProviderImpl()) registerService(KtModuleScopeProvider::class.java, KtModuleScopeProviderImpl())
registerService(KotlinAnnotationsResolverFactory::class.java, KotlinStaticAnnotationsResolverFactory(ktFiles)) registerService(KotlinAnnotationsResolverFactory::class.java, KotlinStaticAnnotationsResolverFactory(ktFiles))
registerService(KotlinResolutionScopeProvider::class.java, KotlinByModulesResolutionScopeProvider::class.java) registerService(KotlinResolutionScopeProvider::class.java, KotlinByModulesResolutionScopeProvider::class.java)
val declarationProviderFactory = KotlinStaticDeclarationProviderFactory(
this,
ktFiles,
kotlinCoreProjectEnvironment.environment.jarFileSystem as CoreJarFileSystem
)
registerService( registerService(
KotlinDeclarationProviderFactory::class.java, KotlinDeclarationProviderFactory::class.java,
KotlinStaticDeclarationProviderFactory( declarationProviderFactory
this,
ktFiles,
kotlinCoreProjectEnvironment.environment.jarFileSystem as CoreJarFileSystem
)
) )
registerService(KotlinDeclarationProviderMerger::class.java, KotlinStaticDeclarationProviderMerger(this)) registerService(KotlinDeclarationProviderMerger::class.java, KotlinStaticDeclarationProviderMerger(this))
registerService(KotlinPackageProviderFactory::class.java, KotlinStaticPackageProviderFactory(project, ktFiles)) registerService(
KotlinPackageProviderFactory::class.java,
KotlinStaticPackageProviderFactory(project, ktFiles + declarationProviderFactory.getAdditionalCreatedKtFiles())
)
registerService( registerService(
FirSealedClassInheritorsProcessorFactory::class.java, FirSealedClassInheritorsProcessorFactory::class.java,
@@ -166,6 +166,7 @@ internal fun configureProjectEnvironment(
ProjectStructureProvider::class.java, ProjectStructureProvider::class.java,
projectStructureProvider, projectStructureProvider,
) )
val declarationProviderFactory = KotlinStaticDeclarationProviderFactory(project, ktFiles)
project.registerService( project.registerService(
KotlinModuleDependentsProvider::class.java, KotlinModuleDependentsProvider::class.java,
KtStaticModuleDependentsProvider(projectStructureProvider.allKtModules), KtStaticModuleDependentsProvider(projectStructureProvider.allKtModules),
@@ -173,7 +174,7 @@ internal fun configureProjectEnvironment(
project.registerService( project.registerService(
KotlinDeclarationProviderFactory::class.java, KotlinDeclarationProviderFactory::class.java,
KotlinStaticDeclarationProviderFactory(project, ktFiles) declarationProviderFactory
) )
project.registerService( project.registerService(
KotlinDeclarationProviderMerger::class.java, KotlinDeclarationProviderMerger::class.java,
@@ -181,7 +182,7 @@ internal fun configureProjectEnvironment(
) )
project.registerService( project.registerService(
KotlinPackageProviderFactory::class.java, KotlinPackageProviderFactory::class.java,
KotlinStaticPackageProviderFactory(project, ktFiles) KotlinStaticPackageProviderFactory(project, ktFiles + declarationProviderFactory.getAdditionalCreatedKtFiles())
) )
project.registerService( project.registerService(
PackagePartProviderFactory::class.java, 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.low.level.api.fir.util.LLFirKotlinSymbolNamesProvider
import org.jetbrains.kotlin.analysis.providers.KotlinDeclarationProvider import org.jetbrains.kotlin.analysis.providers.KotlinDeclarationProvider
import org.jetbrains.kotlin.analysis.providers.createDeclarationProvider 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.FirSession
import org.jetbrains.kotlin.fir.caches.FirCache import org.jetbrains.kotlin.fir.caches.FirCache
import org.jetbrains.kotlin.fir.caches.firCachesFactory import org.jetbrains.kotlin.fir.caches.firCachesFactory
@@ -78,6 +79,8 @@ internal open class StubBasedFirDeserializedSymbolProvider(
private val functionCache = session.firCachesFactory.createCache(::loadFunctionsByCallableId) private val functionCache = session.firCachesFactory.createCache(::loadFunctionsByCallableId)
private val propertyCache = session.firCachesFactory.createCache(::loadPropertiesByCallableId) private val propertyCache = session.firCachesFactory.createCache(::loadPropertiesByCallableId)
private val packageProvider = project.createPackageProvider(scope)
private fun findAndDeserializeTypeAlias( private fun findAndDeserializeTypeAlias(
classId: ClassId, classId: ClassId,
context: StubBasedFirDeserializationContext?, context: StubBasedFirDeserializationContext?,
@@ -264,10 +267,7 @@ internal open class StubBasedFirDeserializedSymbolProvider(
} }
override fun getPackage(fqName: FqName): FqName? = override fun getPackage(fqName: FqName): FqName? =
fqName.takeIf { fqName.takeIf { packageProvider.doesKotlinOnlyPackageExist(fqName) }
symbolNamesProvider.getTopLevelClassifierNamesInPackage(fqName)?.isNotEmpty() == true ||
symbolNamesProvider.getPackageNamesWithTopLevelCallables()?.contains(fqName.asString()) == true
}
override fun getClassLikeSymbolByClassId(classId: ClassId): FirClassLikeSymbol<*>? { override fun getClassLikeSymbolByClassId(classId: ClassId): FirClassLikeSymbol<*>? {
if (!symbolNamesProvider.mayHaveTopLevelClassifier(classId)) return null if (!symbolNamesProvider.mayHaveTopLevelClassifier(classId)) return null
@@ -6,13 +6,16 @@
package org.jetbrains.kotlin.analysis.low.level.api.fir.util 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.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.project.structure.llFirModuleData
import org.jetbrains.kotlin.analysis.low.level.api.fir.providers.LLFirModuleWithDependenciesSymbolProvider 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.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.analysis.project.structure.ProjectStructureProvider
import org.jetbrains.kotlin.utils.exceptions.ExceptionAttachmentBuilder import org.jetbrains.kotlin.utils.exceptions.ExceptionAttachmentBuilder
import org.jetbrains.kotlin.analysis.utils.errors.withClassEntry import org.jetbrains.kotlin.analysis.utils.errors.withClassEntry
import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.moduleData
import org.jetbrains.kotlin.fir.realPsi import org.jetbrains.kotlin.fir.realPsi
import org.jetbrains.kotlin.fir.resolve.providers.* import org.jetbrains.kotlin.fir.resolve.providers.*
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol 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 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? private val LLFirModuleWithDependenciesSymbolProvider.friendBuiltinsProvider: FirSymbolProvider?
get() { 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 } return dependencyProvider.providers.find { it.session is LLFirBuiltinsAndCloneableSession }
} }