AA: reuse CoreJarFileSystem from KotlinCoreEnvironment
This commit is contained in:
committed by
Ilya Kirillov
parent
6b4c4457d8
commit
02cfc8b821
+10
-2
@@ -12,8 +12,16 @@ import com.intellij.util.io.URLUtil.JAR_SEPARATOR
|
|||||||
import java.nio.file.Path
|
import java.nio.file.Path
|
||||||
|
|
||||||
object LibraryUtils {
|
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 root = jarFileSystem.refreshAndFindFileByPath(jar.toAbsolutePath().toString() + JAR_SEPARATOR)!!
|
||||||
|
|
||||||
val files = mutableSetOf<VirtualFile>()
|
val files = mutableSetOf<VirtualFile>()
|
||||||
|
|||||||
+11
-1
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.analysis.api.standalone
|
|||||||
import com.intellij.mock.MockApplication
|
import com.intellij.mock.MockApplication
|
||||||
import com.intellij.mock.MockProject
|
import com.intellij.mock.MockProject
|
||||||
import com.intellij.openapi.project.Project
|
import com.intellij.openapi.project.Project
|
||||||
|
import com.intellij.openapi.vfs.impl.jar.CoreJarFileSystem
|
||||||
import com.intellij.psi.PsiElementFinder
|
import com.intellij.psi.PsiElementFinder
|
||||||
import com.intellij.psi.search.GlobalSearchScope
|
import com.intellij.psi.search.GlobalSearchScope
|
||||||
import org.jetbrains.kotlin.analysis.api.InvalidWayOfUsingAnalysisSession
|
import org.jetbrains.kotlin.analysis.api.InvalidWayOfUsingAnalysisSession
|
||||||
@@ -81,12 +82,16 @@ public fun configureApplicationEnvironment(app: MockApplication) {
|
|||||||
* * given [ktFiles] as Kotlin sources
|
* * given [ktFiles] as Kotlin sources
|
||||||
* * other Java sources in [compilerConfig] (set via [addJavaSourceRoots])
|
* * other Java sources in [compilerConfig] (set via [addJavaSourceRoots])
|
||||||
* * JVM class paths in [compilerConfig] (set via [addJvmClasspathRoots]) as library.
|
* * 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(
|
public fun configureProjectEnvironment(
|
||||||
project: MockProject,
|
project: MockProject,
|
||||||
compilerConfig: CompilerConfiguration,
|
compilerConfig: CompilerConfiguration,
|
||||||
ktFiles: List<KtFile>,
|
ktFiles: List<KtFile>,
|
||||||
packagePartProvider: (GlobalSearchScope) -> PackagePartProvider,
|
packagePartProvider: (GlobalSearchScope) -> PackagePartProvider,
|
||||||
|
jarFileSystem: CoreJarFileSystem = CoreJarFileSystem(),
|
||||||
) {
|
) {
|
||||||
reRegisterJavaElementFinder(project)
|
reRegisterJavaElementFinder(project)
|
||||||
|
|
||||||
@@ -115,7 +120,12 @@ public fun configureProjectEnvironment(
|
|||||||
|
|
||||||
project.picoContainer.registerComponentInstance(
|
project.picoContainer.registerComponentInstance(
|
||||||
ProjectStructureProvider::class.qualifiedName,
|
ProjectStructureProvider::class.qualifiedName,
|
||||||
ProjectStructureProviderByCompilerConfiguration(compilerConfig, project, ktFiles)
|
ProjectStructureProviderByCompilerConfiguration(
|
||||||
|
compilerConfig,
|
||||||
|
project,
|
||||||
|
ktFiles,
|
||||||
|
jarFileSystem
|
||||||
|
)
|
||||||
)
|
)
|
||||||
project.picoContainer.registerComponentInstance(
|
project.picoContainer.registerComponentInstance(
|
||||||
KotlinDeclarationProviderFactory::class.qualifiedName,
|
KotlinDeclarationProviderFactory::class.qualifiedName,
|
||||||
|
|||||||
+5
-2
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.analysis.project.structure.impl
|
|||||||
|
|
||||||
import com.intellij.openapi.project.Project
|
import com.intellij.openapi.project.Project
|
||||||
import com.intellij.openapi.vfs.VirtualFile
|
import com.intellij.openapi.vfs.VirtualFile
|
||||||
|
import com.intellij.openapi.vfs.impl.jar.CoreJarFileSystem
|
||||||
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.project.structure.KtLibraryModule
|
import org.jetbrains.kotlin.analysis.project.structure.KtLibraryModule
|
||||||
@@ -51,10 +52,11 @@ internal class KtSourceModuleByCompilerConfiguration(
|
|||||||
compilerConfig: CompilerConfiguration,
|
compilerConfig: CompilerConfiguration,
|
||||||
project: Project,
|
project: Project,
|
||||||
ktFiles: List<KtFile>,
|
ktFiles: List<KtFile>,
|
||||||
|
jarFileSystem: CoreJarFileSystem,
|
||||||
) : BaseKtModuleByCompilerConfiguration(compilerConfig, project), KtSourceModule {
|
) : BaseKtModuleByCompilerConfiguration(compilerConfig, project), KtSourceModule {
|
||||||
override val directRegularDependencies: List<KtModule> by lazy {
|
override val directRegularDependencies: List<KtModule> by lazy {
|
||||||
(compilerConfig.jvmModularRoots + compilerConfig.jvmClasspathRoots).map {
|
(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,
|
compilerConfig: CompilerConfiguration,
|
||||||
project: Project,
|
project: Project,
|
||||||
private val jar: Path,
|
private val jar: Path,
|
||||||
|
jarFileSystem: CoreJarFileSystem,
|
||||||
) : BaseKtModuleByCompilerConfiguration(compilerConfig, project), KtLibraryModule {
|
) : BaseKtModuleByCompilerConfiguration(compilerConfig, project), KtLibraryModule {
|
||||||
override val directRegularDependencies: List<KtModule> get() = emptyList()
|
override val directRegularDependencies: List<KtModule> get() = emptyList()
|
||||||
|
|
||||||
internal val virtualFiles: Collection<VirtualFile> by lazy {
|
internal val virtualFiles: Collection<VirtualFile> by lazy {
|
||||||
LibraryUtils.getAllVirtualFilesFromJar(jar)
|
LibraryUtils.getAllVirtualFilesFromJar(jar, jarFileSystem)
|
||||||
}
|
}
|
||||||
|
|
||||||
override val libraryName: String
|
override val libraryName: String
|
||||||
|
|||||||
+3
-1
@@ -6,6 +6,7 @@
|
|||||||
package org.jetbrains.kotlin.analysis.project.structure.impl
|
package org.jetbrains.kotlin.analysis.project.structure.impl
|
||||||
|
|
||||||
import com.intellij.openapi.project.Project
|
import com.intellij.openapi.project.Project
|
||||||
|
import com.intellij.openapi.vfs.impl.jar.CoreJarFileSystem
|
||||||
import com.intellij.psi.PsiElement
|
import com.intellij.psi.PsiElement
|
||||||
import org.jetbrains.kotlin.analysis.project.structure.KtModule
|
import org.jetbrains.kotlin.analysis.project.structure.KtModule
|
||||||
import org.jetbrains.kotlin.analysis.project.structure.ProjectStructureProvider
|
import org.jetbrains.kotlin.analysis.project.structure.ProjectStructureProvider
|
||||||
@@ -19,6 +20,7 @@ internal class ProjectStructureProviderByCompilerConfiguration(
|
|||||||
private val compilerConfig: CompilerConfiguration,
|
private val compilerConfig: CompilerConfiguration,
|
||||||
project: Project,
|
project: Project,
|
||||||
ktFiles: List<KtFile>,
|
ktFiles: List<KtFile>,
|
||||||
|
jarFileSystem: CoreJarFileSystem,
|
||||||
) : ProjectStructureProvider() {
|
) : ProjectStructureProvider() {
|
||||||
private val sourceFiles: Set<String> by lazy {
|
private val sourceFiles: Set<String> by lazy {
|
||||||
buildSet {
|
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 {
|
override fun getKtModuleForKtElement(element: PsiElement): KtModule {
|
||||||
val containingFilePath = element.containingFile.virtualFile.path
|
val containingFilePath = element.containingFile.virtualFile.path
|
||||||
|
|||||||
Reference in New Issue
Block a user