AA: reuse CoreJarFileSystem from KotlinCoreEnvironment
diff --git a/analysis/analysis-api-impl-base/src/org/jetbrains/kotlin/analysis/api/impl/base/util/LibraryUtils.kt b/analysis/analysis-api-impl-base/src/org/jetbrains/kotlin/analysis/api/impl/base/util/LibraryUtils.kt
index 284b1de..9290101 100644
--- a/analysis/analysis-api-impl-base/src/org/jetbrains/kotlin/analysis/api/impl/base/util/LibraryUtils.kt
+++ b/analysis/analysis-api-impl-base/src/org/jetbrains/kotlin/analysis/api/impl/base/util/LibraryUtils.kt
@@ -12,8 +12,16 @@
import java.nio.file.Path
object LibraryUtils {
- fun getAllVirtualFilesFromJar(jar: Path): Collection<VirtualFile> {
- val jarFileSystem = CoreJarFileSystem()
+ /**
+ * Get all [VirtualFile]s inside the given [jar] (of [Path])
+ *
+ * Note that, if [CoreJarFileSystem] is not given, a fresh instance will be used, which will create fresh instances of [VirtualFile],
+ * resulting in potential hash mismatch (e.g., if used in scope membership check).
+ */
+ fun getAllVirtualFilesFromJar(
+ jar: Path,
+ jarFileSystem: CoreJarFileSystem = CoreJarFileSystem(),
+ ): Collection<VirtualFile> {
val root = jarFileSystem.refreshAndFindFileByPath(jar.toAbsolutePath().toString() + JAR_SEPARATOR)!!
val files = mutableSetOf<VirtualFile>()
diff --git a/analysis/analysis-api-standalone/src/org/jetbrains/kotlin/analysis/api/standalone/StandaloneModeUtils.kt b/analysis/analysis-api-standalone/src/org/jetbrains/kotlin/analysis/api/standalone/StandaloneModeUtils.kt
index b14e8d7..de9d33a 100644
--- a/analysis/analysis-api-standalone/src/org/jetbrains/kotlin/analysis/api/standalone/StandaloneModeUtils.kt
+++ b/analysis/analysis-api-standalone/src/org/jetbrains/kotlin/analysis/api/standalone/StandaloneModeUtils.kt
@@ -8,6 +8,7 @@
import com.intellij.mock.MockApplication
import com.intellij.mock.MockProject
import com.intellij.openapi.project.Project
+import com.intellij.openapi.vfs.impl.jar.CoreJarFileSystem
import com.intellij.psi.PsiElementFinder
import com.intellij.psi.search.GlobalSearchScope
import org.jetbrains.kotlin.analysis.api.InvalidWayOfUsingAnalysisSession
@@ -81,12 +82,16 @@
* * given [ktFiles] as Kotlin sources
* * other Java sources in [compilerConfig] (set via [addJavaSourceRoots])
* * JVM class paths in [compilerConfig] (set via [addJvmClasspathRoots]) as library.
+ *
+ * To make sure the same instance of [CoreJarFileSystem] is used (and thus file lookup in jars is cached),
+ * pass [jarFileSystem] from [KotlinCoreEnvironment] if available.
*/
public fun configureProjectEnvironment(
project: MockProject,
compilerConfig: CompilerConfiguration,
ktFiles: List<KtFile>,
packagePartProvider: (GlobalSearchScope) -> PackagePartProvider,
+ jarFileSystem: CoreJarFileSystem = CoreJarFileSystem(),
) {
reRegisterJavaElementFinder(project)
@@ -115,7 +120,12 @@
project.picoContainer.registerComponentInstance(
ProjectStructureProvider::class.qualifiedName,
- ProjectStructureProviderByCompilerConfiguration(compilerConfig, project, ktFiles)
+ ProjectStructureProviderByCompilerConfiguration(
+ compilerConfig,
+ project,
+ ktFiles,
+ jarFileSystem
+ )
)
project.picoContainer.registerComponentInstance(
KotlinDeclarationProviderFactory::class.qualifiedName,
diff --git a/analysis/analysis-api-standalone/src/org/jetbrains/kotlin/analysis/project/structure/impl/KtModuleByCompilerConfiguration.kt b/analysis/analysis-api-standalone/src/org/jetbrains/kotlin/analysis/project/structure/impl/KtModuleByCompilerConfiguration.kt
index 72e93d2..b84358e 100644
--- a/analysis/analysis-api-standalone/src/org/jetbrains/kotlin/analysis/project/structure/impl/KtModuleByCompilerConfiguration.kt
+++ b/analysis/analysis-api-standalone/src/org/jetbrains/kotlin/analysis/project/structure/impl/KtModuleByCompilerConfiguration.kt
@@ -7,6 +7,7 @@
import com.intellij.openapi.project.Project
import com.intellij.openapi.vfs.VirtualFile
+import com.intellij.openapi.vfs.impl.jar.CoreJarFileSystem
import com.intellij.psi.search.GlobalSearchScope
import org.jetbrains.kotlin.analysis.api.impl.base.util.LibraryUtils
import org.jetbrains.kotlin.analysis.project.structure.KtLibraryModule
@@ -51,10 +52,11 @@
compilerConfig: CompilerConfiguration,
project: Project,
ktFiles: List<KtFile>,
+ jarFileSystem: CoreJarFileSystem,
) : BaseKtModuleByCompilerConfiguration(compilerConfig, project), KtSourceModule {
override val directRegularDependencies: List<KtModule> by lazy {
(compilerConfig.jvmModularRoots + compilerConfig.jvmClasspathRoots).map {
- KtLibraryModuleByCompilerConfiguration(compilerConfig, project, it.toPath())
+ KtLibraryModuleByCompilerConfiguration(compilerConfig, project, it.toPath(), jarFileSystem)
}
}
@@ -66,11 +68,12 @@
compilerConfig: CompilerConfiguration,
project: Project,
private val jar: Path,
+ jarFileSystem: CoreJarFileSystem,
) : BaseKtModuleByCompilerConfiguration(compilerConfig, project), KtLibraryModule {
override val directRegularDependencies: List<KtModule> get() = emptyList()
internal val virtualFiles: Collection<VirtualFile> by lazy {
- LibraryUtils.getAllVirtualFilesFromJar(jar)
+ LibraryUtils.getAllVirtualFilesFromJar(jar, jarFileSystem)
}
override val libraryName: String
diff --git a/analysis/analysis-api-standalone/src/org/jetbrains/kotlin/analysis/project/structure/impl/ProjectStructureProviderByCompilerConfiguration.kt b/analysis/analysis-api-standalone/src/org/jetbrains/kotlin/analysis/project/structure/impl/ProjectStructureProviderByCompilerConfiguration.kt
index 771278e..23ad2e4 100644
--- a/analysis/analysis-api-standalone/src/org/jetbrains/kotlin/analysis/project/structure/impl/ProjectStructureProviderByCompilerConfiguration.kt
+++ b/analysis/analysis-api-standalone/src/org/jetbrains/kotlin/analysis/project/structure/impl/ProjectStructureProviderByCompilerConfiguration.kt
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.analysis.project.structure.impl
import com.intellij.openapi.project.Project
+import com.intellij.openapi.vfs.impl.jar.CoreJarFileSystem
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.analysis.project.structure.KtModule
import org.jetbrains.kotlin.analysis.project.structure.ProjectStructureProvider
@@ -19,6 +20,7 @@
private val compilerConfig: CompilerConfiguration,
project: Project,
ktFiles: List<KtFile>,
+ jarFileSystem: CoreJarFileSystem,
) : ProjectStructureProvider() {
private val sourceFiles: Set<String> by lazy {
buildSet {
@@ -37,7 +39,7 @@
}
}
- private val sourceModule = KtSourceModuleByCompilerConfiguration(compilerConfig, project, ktFiles)
+ private val sourceModule = KtSourceModuleByCompilerConfiguration(compilerConfig, project, ktFiles, jarFileSystem)
override fun getKtModuleForKtElement(element: PsiElement): KtModule {
val containingFilePath = element.containingFile.virtualFile.path