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