[AA] IDE mode tests: Build and index stubs for binary libraries
- Instead of indexing binary library declarations from decompiled PSI, the static declaration provider now builds and indexes stubs. As noted in KT-65960, this brings IDE mode tests much more in line with decompiled stubs indexing in the IDE. It should allow us to catch issues with the stub-based deserialized symbol provider outside of IDE tests. - In the Standalone mode, we can skip stub-indexing completely, as we provide FIR symbols via class-based deserialization. This also extends to shared binary roots. ^KT-65960 fixed
This commit is contained in:
committed by
Space Team
parent
78ef58bef4
commit
47afd37596
+31
-9
@@ -23,8 +23,11 @@ import org.jetbrains.kotlin.analysis.project.structure.KtBinaryModule
|
||||
import org.jetbrains.kotlin.analysis.providers.*
|
||||
import org.jetbrains.kotlin.analysis.providers.impl.*
|
||||
import org.jetbrains.kotlin.analysis.test.framework.project.structure.ktModuleProvider
|
||||
import org.jetbrains.kotlin.analysis.test.framework.services.configuration.AnalysisApiBinaryLibraryIndexingMode
|
||||
import org.jetbrains.kotlin.analysis.test.framework.services.configuration.libraryIndexingConfiguration
|
||||
import org.jetbrains.kotlin.analysis.test.framework.services.environmentManager
|
||||
import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestServiceRegistrar
|
||||
import org.jetbrains.kotlin.analysis.test.framework.test.configurators.TestModuleKind
|
||||
import org.jetbrains.kotlin.psi.KtClassOrObject
|
||||
import org.jetbrains.kotlin.psi.KtFile
|
||||
import org.jetbrains.kotlin.psi.KtFileClassProvider
|
||||
@@ -66,32 +69,51 @@ object AnalysisApiBaseTestServiceRegistrar : AnalysisApiTestServiceRegistrar() {
|
||||
|
||||
override fun registerProjectModelServices(project: MockProject, testServices: TestServices) {
|
||||
val moduleStructure = testServices.ktModuleProvider.getModuleStructure()
|
||||
val allSourceKtFiles = moduleStructure.mainModules.flatMap { it.files.filterIsInstance<KtFile>() }
|
||||
val binaryDependencies = moduleStructure.binaryModules.toMutableSet()
|
||||
val testKtFiles = moduleStructure.mainModules.flatMap { it.files.filterIsInstance<KtFile>() }
|
||||
|
||||
// We explicitly exclude decompiled libraries. Their decompiled PSI files are indexed by the declaration provider, so it shouldn't
|
||||
// additionally build and index stubs for the library.
|
||||
val mainBinaryModules = moduleStructure.mainModules
|
||||
.filter { it.moduleKind == TestModuleKind.LibraryBinary }
|
||||
.map { it.ktModule as KtBinaryModule }
|
||||
|
||||
val sharedBinaryDependencies = moduleStructure.binaryModules.toMutableSet()
|
||||
for (mainModule in moduleStructure.mainModules) {
|
||||
val ktModule = mainModule.ktModule
|
||||
if (ktModule !is KtBinaryModule) continue
|
||||
binaryDependencies -= ktModule
|
||||
sharedBinaryDependencies -= ktModule
|
||||
}
|
||||
|
||||
val roots = StandaloneProjectFactory.getVirtualFilesForLibraryRoots(
|
||||
binaryDependencies.flatMap { binary -> binary.getBinaryRoots() },
|
||||
val mainBinaryRoots = StandaloneProjectFactory.getVirtualFilesForLibraryRoots(
|
||||
mainBinaryModules.flatMap { it.getBinaryRoots() },
|
||||
testServices.environmentManager.getProjectEnvironment(),
|
||||
).distinct()
|
||||
|
||||
val sharedBinaryRoots = StandaloneProjectFactory.getVirtualFilesForLibraryRoots(
|
||||
sharedBinaryDependencies.flatMap { binary -> binary.getBinaryRoots() },
|
||||
testServices.environmentManager.getProjectEnvironment()
|
||||
).distinct()
|
||||
|
||||
project.apply {
|
||||
registerService(KotlinAnnotationsResolverFactory::class.java, KotlinStaticAnnotationsResolverFactory(project, allSourceKtFiles))
|
||||
registerService(KotlinAnnotationsResolverFactory::class.java, KotlinStaticAnnotationsResolverFactory(project, testKtFiles))
|
||||
|
||||
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 shouldBuildStubsForBinaryLibraries =
|
||||
testServices.libraryIndexingConfiguration.binaryLibraryIndexingMode == AnalysisApiBinaryLibraryIndexingMode.INDEX_STUBS
|
||||
|
||||
val declarationProviderFactory = KotlinStaticDeclarationProviderFactory(
|
||||
project,
|
||||
allSourceKtFiles,
|
||||
additionalRoots = roots,
|
||||
testKtFiles,
|
||||
binaryRoots = mainBinaryRoots,
|
||||
sharedBinaryRoots = sharedBinaryRoots,
|
||||
skipBuiltins = testServices.moduleStructure.allDirectives.contains(NO_RUNTIME),
|
||||
shouldBuildStubsForBinaryLibraries = shouldBuildStubsForBinaryLibraries,
|
||||
)
|
||||
|
||||
ktFilesForBinaries = declarationProviderFactory.getAdditionalCreatedKtFiles()
|
||||
registerService(
|
||||
KotlinDeclarationProviderFactory::class.java, declarationProviderFactory
|
||||
@@ -102,7 +124,7 @@ object AnalysisApiBaseTestServiceRegistrar : AnalysisApiTestServiceRegistrar() {
|
||||
registerService(KotlinDeclarationProviderMerger::class.java, KotlinStaticDeclarationProviderMerger(project))
|
||||
registerService(
|
||||
KotlinPackageProviderFactory::class.java,
|
||||
KotlinStaticPackageProviderFactory(project, allSourceKtFiles + ktFilesForBinaries)
|
||||
KotlinStaticPackageProviderFactory(project, testKtFiles + ktFilesForBinaries)
|
||||
)
|
||||
registerService(KotlinPackageProviderMerger::class.java, KotlinStaticPackageProviderMerger(project))
|
||||
registerService(KotlinResolutionScopeProvider::class.java, KotlinByModulesResolutionScopeProvider::class.java)
|
||||
|
||||
Reference in New Issue
Block a user