[Analysis API] use createSearchScopeByLibraryRoots for test libraries
As it is more similar to production. Also, fixed scope search for klib. Now we register main binary modules before to avoid duplication with libraries from createLibrariesByCompilerConfigurators as now we can have a declared library and regular sources ^KT-62888 ^KT-62651
This commit is contained in:
committed by
Space Team
parent
02d99769ff
commit
8de9d42b0d
+11
-2
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
* 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.
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -19,6 +19,7 @@ import org.jetbrains.kotlin.analysis.decompiler.konan.KlibMetaFileType
|
|||||||
import org.jetbrains.kotlin.analysis.decompiler.psi.BuiltInDefinitionFile
|
import org.jetbrains.kotlin.analysis.decompiler.psi.BuiltInDefinitionFile
|
||||||
import org.jetbrains.kotlin.analysis.decompiler.psi.KotlinBuiltInFileType
|
import org.jetbrains.kotlin.analysis.decompiler.psi.KotlinBuiltInFileType
|
||||||
import org.jetbrains.kotlin.analysis.decompiler.psi.file.KtClsFile
|
import org.jetbrains.kotlin.analysis.decompiler.psi.file.KtClsFile
|
||||||
|
import org.jetbrains.kotlin.analysis.project.structure.KtBinaryModule
|
||||||
import org.jetbrains.kotlin.analysis.providers.*
|
import org.jetbrains.kotlin.analysis.providers.*
|
||||||
import org.jetbrains.kotlin.analysis.providers.impl.*
|
import org.jetbrains.kotlin.analysis.providers.impl.*
|
||||||
import org.jetbrains.kotlin.analysis.test.framework.project.structure.ktModuleProvider
|
import org.jetbrains.kotlin.analysis.test.framework.project.structure.ktModuleProvider
|
||||||
@@ -66,10 +67,18 @@ object AnalysisApiBaseTestServiceRegistrar : AnalysisApiTestServiceRegistrar() {
|
|||||||
override fun registerProjectModelServices(project: MockProject, testServices: TestServices) {
|
override fun registerProjectModelServices(project: MockProject, testServices: TestServices) {
|
||||||
val moduleStructure = testServices.ktModuleProvider.getModuleStructure()
|
val moduleStructure = testServices.ktModuleProvider.getModuleStructure()
|
||||||
val allSourceKtFiles = moduleStructure.mainModules.flatMap { it.files.filterIsInstance<KtFile>() }
|
val allSourceKtFiles = moduleStructure.mainModules.flatMap { it.files.filterIsInstance<KtFile>() }
|
||||||
|
val binaryDependencies = moduleStructure.binaryModules.toMutableSet()
|
||||||
|
for (mainModule in moduleStructure.mainModules) {
|
||||||
|
val ktModule = mainModule.ktModule
|
||||||
|
if (ktModule !is KtBinaryModule) continue
|
||||||
|
binaryDependencies -= ktModule
|
||||||
|
}
|
||||||
|
|
||||||
val roots = StandaloneProjectFactory.getVirtualFilesForLibraryRoots(
|
val roots = StandaloneProjectFactory.getVirtualFilesForLibraryRoots(
|
||||||
moduleStructure.binaryModules.flatMap { binary -> binary.getBinaryRoots() },
|
binaryDependencies.flatMap { binary -> binary.getBinaryRoots() },
|
||||||
testServices.environmentManager.getProjectEnvironment()
|
testServices.environmentManager.getProjectEnvironment()
|
||||||
).distinct()
|
).distinct()
|
||||||
|
|
||||||
project.apply {
|
project.apply {
|
||||||
registerService(KotlinAnnotationsResolverFactory::class.java, KotlinStaticAnnotationsResolverFactory(project, allSourceKtFiles))
|
registerService(KotlinAnnotationsResolverFactory::class.java, KotlinStaticAnnotationsResolverFactory(project, allSourceKtFiles))
|
||||||
|
|
||||||
|
|||||||
+3
-2
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
* 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.
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -53,6 +53,7 @@ import org.jetbrains.kotlin.cli.jvm.modules.CliJavaModuleResolver
|
|||||||
import org.jetbrains.kotlin.cli.jvm.modules.CoreJrtFileSystem
|
import org.jetbrains.kotlin.cli.jvm.modules.CoreJrtFileSystem
|
||||||
import org.jetbrains.kotlin.cli.jvm.modules.JavaModuleGraph
|
import org.jetbrains.kotlin.cli.jvm.modules.JavaModuleGraph
|
||||||
import org.jetbrains.kotlin.config.*
|
import org.jetbrains.kotlin.config.*
|
||||||
|
import org.jetbrains.kotlin.library.KLIB_FILE_EXTENSION
|
||||||
import org.jetbrains.kotlin.load.java.structure.impl.source.JavaElementSourceFactory
|
import org.jetbrains.kotlin.load.java.structure.impl.source.JavaElementSourceFactory
|
||||||
import org.jetbrains.kotlin.load.kotlin.MetadataFinderFactory
|
import org.jetbrains.kotlin.load.kotlin.MetadataFinderFactory
|
||||||
import org.jetbrains.kotlin.load.kotlin.VirtualFileFinderFactory
|
import org.jetbrains.kotlin.load.kotlin.VirtualFileFinderFactory
|
||||||
@@ -374,7 +375,7 @@ object StandaloneProjectFactory {
|
|||||||
return roots.mapNotNull { path ->
|
return roots.mapNotNull { path ->
|
||||||
val pathString = FileUtil.toSystemIndependentName(path.toAbsolutePath().toString())
|
val pathString = FileUtil.toSystemIndependentName(path.toAbsolutePath().toString())
|
||||||
when {
|
when {
|
||||||
pathString.endsWith(JAR_PROTOCOL) -> {
|
pathString.endsWith(JAR_PROTOCOL) || pathString.endsWith(KLIB_FILE_EXTENSION) -> {
|
||||||
environment.environment.jarFileSystem.findFileByPath(pathString + JAR_SEPARATOR)
|
environment.environment.jarFileSystem.findFileByPath(pathString + JAR_SEPARATOR)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+8
-4
@@ -1,13 +1,14 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
* 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.
|
* 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.test.framework.project.structure
|
package org.jetbrains.kotlin.analysis.test.framework.project.structure
|
||||||
|
|
||||||
import com.intellij.openapi.project.Project
|
import com.intellij.openapi.project.Project
|
||||||
import com.intellij.psi.search.GlobalSearchScope
|
|
||||||
import org.jetbrains.kotlin.analysis.api.standalone.base.project.structure.KtModuleWithFiles
|
import org.jetbrains.kotlin.analysis.api.standalone.base.project.structure.KtModuleWithFiles
|
||||||
|
import org.jetbrains.kotlin.analysis.api.standalone.base.project.structure.StandaloneProjectFactory
|
||||||
|
import org.jetbrains.kotlin.analysis.test.framework.services.environmentManager
|
||||||
import org.jetbrains.kotlin.analysis.test.framework.services.libraries.compiledLibraryProvider
|
import org.jetbrains.kotlin.analysis.test.framework.services.libraries.compiledLibraryProvider
|
||||||
import org.jetbrains.kotlin.analysis.test.framework.services.libraries.testModuleDecompiler
|
import org.jetbrains.kotlin.analysis.test.framework.services.libraries.testModuleDecompiler
|
||||||
import org.jetbrains.kotlin.test.model.TestModule
|
import org.jetbrains.kotlin.test.model.TestModule
|
||||||
@@ -25,12 +26,15 @@ object KtLibraryBinaryModuleFactory : KtModuleFactory {
|
|||||||
KtLibraryModuleImpl(
|
KtLibraryModuleImpl(
|
||||||
testModule.name,
|
testModule.name,
|
||||||
testModule.targetPlatform,
|
testModule.targetPlatform,
|
||||||
GlobalSearchScope.filesScope(project, decompiledFiles.mapTo(mutableSetOf()) { it.virtualFile }),
|
StandaloneProjectFactory.createSearchScopeByLibraryRoots(
|
||||||
|
listOf(library),
|
||||||
|
testServices.environmentManager.getProjectEnvironment(),
|
||||||
|
),
|
||||||
project,
|
project,
|
||||||
binaryRoots = listOf(library),
|
binaryRoots = listOf(library),
|
||||||
librarySources = null,
|
librarySources = null,
|
||||||
),
|
),
|
||||||
decompiledFiles
|
decompiledFiles,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+16
-4
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
* 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.
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -9,9 +9,11 @@ import com.intellij.openapi.project.Project
|
|||||||
import com.intellij.psi.search.GlobalSearchScope
|
import com.intellij.psi.search.GlobalSearchScope
|
||||||
import org.jetbrains.kotlin.analysis.api.impl.base.util.LibraryUtils
|
import org.jetbrains.kotlin.analysis.api.impl.base.util.LibraryUtils
|
||||||
import org.jetbrains.kotlin.analysis.api.standalone.base.project.structure.KtModuleWithFiles
|
import org.jetbrains.kotlin.analysis.api.standalone.base.project.structure.KtModuleWithFiles
|
||||||
|
import org.jetbrains.kotlin.analysis.api.standalone.base.project.structure.StandaloneProjectFactory
|
||||||
|
import org.jetbrains.kotlin.analysis.test.framework.services.environmentManager
|
||||||
|
import org.jetbrains.kotlin.analysis.test.framework.services.libraries.compiledLibraryProvider
|
||||||
import org.jetbrains.kotlin.test.model.TestModule
|
import org.jetbrains.kotlin.test.model.TestModule
|
||||||
import org.jetbrains.kotlin.test.services.TestServices
|
import org.jetbrains.kotlin.test.services.TestServices
|
||||||
import org.jetbrains.kotlin.analysis.test.framework.services.libraries.compiledLibraryProvider
|
|
||||||
import java.nio.file.Path
|
import java.nio.file.Path
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -28,15 +30,25 @@ object KtLibrarySourceModuleFactory : KtModuleFactory {
|
|||||||
librarySourcesJar = librarySourcesJar,
|
librarySourcesJar = librarySourcesJar,
|
||||||
testModule = testModule,
|
testModule = testModule,
|
||||||
project = project,
|
project = project,
|
||||||
|
testServices = testServices,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun createKtLibrarySourceModule(libraryJar: Path, librarySourcesJar: Path, testModule: TestModule, project: Project): KtModuleWithFiles {
|
fun createKtLibrarySourceModule(
|
||||||
|
libraryJar: Path,
|
||||||
|
librarySourcesJar: Path,
|
||||||
|
testModule: TestModule,
|
||||||
|
project: Project,
|
||||||
|
testServices: TestServices,
|
||||||
|
): KtModuleWithFiles {
|
||||||
val libraryKtModule = KtLibraryModuleImpl(
|
val libraryKtModule = KtLibraryModuleImpl(
|
||||||
testModule.name,
|
testModule.name,
|
||||||
testModule.targetPlatform,
|
testModule.targetPlatform,
|
||||||
GlobalSearchScope.filesScope(project, LibraryUtils.getAllVirtualFilesFromJar(libraryJar)),
|
StandaloneProjectFactory.createSearchScopeByLibraryRoots(
|
||||||
|
listOf(libraryJar),
|
||||||
|
testServices.environmentManager.getProjectEnvironment(),
|
||||||
|
),
|
||||||
project,
|
project,
|
||||||
binaryRoots = listOf(libraryJar),
|
binaryRoots = listOf(libraryJar),
|
||||||
librarySources = null,
|
librarySources = null,
|
||||||
|
|||||||
+5
-1
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
* 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.
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -58,6 +58,10 @@ object TestModuleStructureFactory {
|
|||||||
// Not-under-content-root modules have no external dependencies on purpose
|
// Not-under-content-root modules have no external dependencies on purpose
|
||||||
}
|
}
|
||||||
is KtModuleWithModifiableDependencies -> {
|
is KtModuleWithModifiableDependencies -> {
|
||||||
|
if (ktModule is KtBinaryModule) {
|
||||||
|
binaryModulesBySourceRoots.getOrPut(ktModule.getBinaryRoots().toSet()) { ktModule }
|
||||||
|
}
|
||||||
|
|
||||||
addModuleDependencies(testModule, moduleEntriesByName, ktModule)
|
addModuleDependencies(testModule, moduleEntriesByName, ktModule)
|
||||||
stdlibAndSdkDependencies(ktModule, testModule, project, testServices).forEach { library ->
|
stdlibAndSdkDependencies(ktModule, testModule, project, testServices).forEach { library ->
|
||||||
val cachedLibrary = binaryModulesBySourceRoots.getOrPut(library.getBinaryRoots().toSet()) { library }
|
val cachedLibrary = binaryModulesBySourceRoots.getOrPut(library.getBinaryRoots().toSet()) { library }
|
||||||
|
|||||||
+2
-1
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
* 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.
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -33,6 +33,7 @@ private object KtStdlibSourceModuleFactory : KtModuleFactory {
|
|||||||
librarySourcesJar = librarySourcesJar,
|
librarySourcesJar = librarySourcesJar,
|
||||||
testModule = testModule,
|
testModule = testModule,
|
||||||
project = project,
|
project = project,
|
||||||
|
testServices = testServices,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user