From 02cfc8b82177d359d32be0439e86080b253e7131 Mon Sep 17 00:00:00 2001 From: Jinseong Jeon Date: Tue, 8 Feb 2022 01:17:08 -0800 Subject: [PATCH] AA: reuse CoreJarFileSystem from KotlinCoreEnvironment --- .../analysis/api/impl/base/util/LibraryUtils.kt | 12 ++++++++++-- .../analysis/api/standalone/StandaloneModeUtils.kt | 12 +++++++++++- .../impl/KtModuleByCompilerConfiguration.kt | 7 +++++-- ...rojectStructureProviderByCompilerConfiguration.kt | 4 +++- 4 files changed, 29 insertions(+), 6 deletions(-) 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 284b1de338a..929010107c9 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 com.intellij.util.io.URLUtil.JAR_SEPARATOR import java.nio.file.Path object LibraryUtils { - fun getAllVirtualFilesFromJar(jar: Path): Collection { - 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 { val root = jarFileSystem.refreshAndFindFileByPath(jar.toAbsolutePath().toString() + JAR_SEPARATOR)!! val files = mutableSetOf() 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 b14e8d710f2..de9d33ace6c 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 @@ package org.jetbrains.kotlin.analysis.api.standalone 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 @@ public fun configureApplicationEnvironment(app: MockApplication) { * * 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, packagePartProvider: (GlobalSearchScope) -> PackagePartProvider, + jarFileSystem: CoreJarFileSystem = CoreJarFileSystem(), ) { reRegisterJavaElementFinder(project) @@ -115,7 +120,12 @@ public fun configureProjectEnvironment( 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 72e93d23896..b84358e2c84 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 @@ package org.jetbrains.kotlin.analysis.project.structure.impl 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 @@ internal class KtSourceModuleByCompilerConfiguration( compilerConfig: CompilerConfiguration, project: Project, ktFiles: List, + jarFileSystem: CoreJarFileSystem, ) : BaseKtModuleByCompilerConfiguration(compilerConfig, project), KtSourceModule { override val directRegularDependencies: List by lazy { (compilerConfig.jvmModularRoots + compilerConfig.jvmClasspathRoots).map { - KtLibraryModuleByCompilerConfiguration(compilerConfig, project, it.toPath()) + KtLibraryModuleByCompilerConfiguration(compilerConfig, project, it.toPath(), jarFileSystem) } } @@ -66,11 +68,12 @@ internal class KtLibraryModuleByCompilerConfiguration( compilerConfig: CompilerConfiguration, project: Project, private val jar: Path, + jarFileSystem: CoreJarFileSystem, ) : BaseKtModuleByCompilerConfiguration(compilerConfig, project), KtLibraryModule { override val directRegularDependencies: List get() = emptyList() internal val virtualFiles: Collection 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 771278e9975..23ad2e4dbcd 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 @@ internal class ProjectStructureProviderByCompilerConfiguration( private val compilerConfig: CompilerConfiguration, project: Project, ktFiles: List, + jarFileSystem: CoreJarFileSystem, ) : ProjectStructureProvider() { private val sourceFiles: Set by lazy { buildSet { @@ -37,7 +39,7 @@ internal class ProjectStructureProviderByCompilerConfiguration( } } - 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