[decompiler] extract builtin VirtualFile creation to a separate service for further reuse

^KTIJ-26760
This commit is contained in:
Ilya Kirillov
2023-08-24 12:35:55 +02:00
committed by Space Team
parent 373abbde5d
commit e8db349f24
5 changed files with 89 additions and 22 deletions
@@ -9,6 +9,7 @@ dependencies {
implementation(project(":compiler:psi"))
implementation(project(":analysis:analysis-api-impl-base"))
implementation(project(":analysis:decompiled:decompiler-to-file-stubs"))
implementation(project(":analysis:decompiled:decompiler-to-psi"))
api(project(":compiler:cli-base"))
api(project(":analysis:analysis-api"))
api(project(":analysis:analysis-api-impl-base"))
@@ -0,0 +1,28 @@
/*
* Copyright 2010-2023 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.
*/
package org.jetbrains.kotlin.analysis.api.standalone.base.project.structure
import com.intellij.openapi.vfs.VirtualFile
import com.intellij.openapi.vfs.impl.jar.CoreJarFileSystem
import com.intellij.util.io.URLUtil
import org.jetbrains.kotlin.analysis.decompiler.psi.BuiltInsVirtualFileProviderBaseImpl
import org.jetbrains.kotlin.utils.exceptions.errorWithAttachment
import java.net.URL
internal class BuiltInsVirtualFileProviderImp(
private val jarFileSystem: CoreJarFileSystem,
) : BuiltInsVirtualFileProviderBaseImpl() {
override fun findVirtualFile(url: URL): VirtualFile? {
val split = URLUtil.splitJarUrl(url.path)
?: errorWithAttachment("URL for builtins does not contain jar separator") {
withEntry("url", url) { url.toString() }
}
val jarPath = split.first
val builtInFile = split.second
val pathToQuery = jarPath + URLUtil.JAR_SEPARATOR + builtInFile
return jarFileSystem.findFileByPath(pathToQuery)
}
}
@@ -20,6 +20,7 @@ import com.intellij.openapi.roots.PackageIndex
import com.intellij.openapi.util.io.FileUtil
import com.intellij.openapi.vfs.VirtualFile
import com.intellij.openapi.vfs.VirtualFileManager
import com.intellij.openapi.vfs.impl.jar.CoreJarFileSystem
import com.intellij.psi.*
import com.intellij.psi.impl.file.impl.JavaFileManager
import com.intellij.psi.impl.smartPointers.PsiClassReferenceTypePointerFactory
@@ -32,6 +33,7 @@ import com.intellij.util.io.URLUtil.JAR_SEPARATOR
import org.jetbrains.kotlin.analysis.api.impl.base.java.source.JavaElementSourceWithSmartPointerFactory
import org.jetbrains.kotlin.analysis.api.impl.base.references.HLApiReferenceProviderService
import org.jetbrains.kotlin.analysis.api.resolve.extensions.KtResolveExtensionProvider
import org.jetbrains.kotlin.analysis.decompiler.psi.BuiltInsVirtualFileProvider
import org.jetbrains.kotlin.analysis.decompiler.stub.file.ClsKotlinBinaryClassCache
import org.jetbrains.kotlin.analysis.decompiler.stub.file.DummyFileAttributeService
import org.jetbrains.kotlin.analysis.decompiler.stub.file.FileAttributeService
@@ -67,7 +69,7 @@ object StandaloneProjectFactory {
applicationDisposable: Disposable,
unitTestMode: Boolean = false,
compilerConfiguration: CompilerConfiguration = CompilerConfiguration(),
classLoader: ClassLoader = MockProject::class.java.classLoader
classLoader: ClassLoader = MockProject::class.java.classLoader,
): KotlinCoreProjectEnvironment {
val applicationEnvironment = if (unitTestMode)
KotlinCoreEnvironment.getOrCreateApplicationEnvironmentForTests(applicationDisposable, compilerConfiguration)
@@ -76,7 +78,7 @@ object StandaloneProjectFactory {
registerApplicationExtensionPoints(applicationEnvironment, applicationDisposable)
registerApplicationServices(applicationEnvironment.application)
registerApplicationServices(applicationEnvironment)
return object : KotlinCoreProjectEnvironment(projectDisposable, applicationEnvironment) {
init {
@@ -96,7 +98,8 @@ object StandaloneProjectFactory {
}
}
private fun registerApplicationServices(application: MockApplication) {
private fun registerApplicationServices(applicationEnvironment: KotlinCoreApplicationEnvironment) {
val application = applicationEnvironment.application
if (application.getServiceIfCreated(KotlinFakeClsStubsCache::class.java) != null) {
// application services already registered by som other threads, tests
return
@@ -109,6 +112,10 @@ object StandaloneProjectFactory {
application.apply {
registerService(KotlinFakeClsStubsCache::class.java, KotlinFakeClsStubsCache::class.java)
registerService(ClsKotlinBinaryClassCache::class.java)
registerService(
BuiltInsVirtualFileProvider::class.java,
BuiltInsVirtualFileProviderImp(applicationEnvironment.jarFileSystem as CoreJarFileSystem)
)
registerService(FileAttributeService::class.java, DummyFileAttributeService::class.java)
}
}