Make it possible to instantiate StandaloneAnalysisAPISession with a custom clasloader

This commit is contained in:
Pavel Mikhailovskii
2023-06-13 13:34:11 +00:00
committed by Space Team
parent 98f7ac044c
commit 89c8392255
2 changed files with 23 additions and 3 deletions
@@ -14,6 +14,7 @@ import com.intellij.ide.highlighter.JavaFileType
import com.intellij.mock.MockApplication import com.intellij.mock.MockApplication
import com.intellij.mock.MockProject import com.intellij.mock.MockProject
import com.intellij.openapi.Disposable import com.intellij.openapi.Disposable
import com.intellij.openapi.extensions.PluginDescriptor
import com.intellij.openapi.roots.PackageIndex import com.intellij.openapi.roots.PackageIndex
import com.intellij.openapi.vfs.VirtualFile import com.intellij.openapi.vfs.VirtualFile
import com.intellij.openapi.vfs.VirtualFileManager import com.intellij.openapi.vfs.VirtualFileManager
@@ -54,6 +55,7 @@ import org.jetbrains.kotlin.resolve.jvm.KotlinJavaPsiFacade
import org.jetbrains.kotlin.resolve.jvm.modules.JavaModuleResolver import org.jetbrains.kotlin.resolve.jvm.modules.JavaModuleResolver
import org.jetbrains.kotlin.utils.addIfNotNull import org.jetbrains.kotlin.utils.addIfNotNull
import org.jetbrains.kotlin.utils.addToStdlib.popLast import org.jetbrains.kotlin.utils.addToStdlib.popLast
import org.picocontainer.PicoContainer
import java.nio.file.Path import java.nio.file.Path
object StandaloneProjectFactory { object StandaloneProjectFactory {
@@ -61,6 +63,7 @@ object StandaloneProjectFactory {
projectDisposable: Disposable, projectDisposable: Disposable,
applicationDisposable: Disposable, applicationDisposable: Disposable,
compilerConfiguration: CompilerConfiguration = CompilerConfiguration(), compilerConfiguration: CompilerConfiguration = CompilerConfiguration(),
classLoader: ClassLoader = MockProject::class.java.classLoader
): KotlinCoreProjectEnvironment { ): KotlinCoreProjectEnvironment {
val applicationEnvironment = val applicationEnvironment =
KotlinCoreEnvironment.getOrCreateApplicationEnvironmentForTests(applicationDisposable, compilerConfiguration) KotlinCoreEnvironment.getOrCreateApplicationEnvironmentForTests(applicationDisposable, compilerConfiguration)
@@ -68,9 +71,21 @@ object StandaloneProjectFactory {
registerApplicationServices(applicationEnvironment.application) registerApplicationServices(applicationEnvironment.application)
return KotlinCoreProjectEnvironment(projectDisposable, applicationEnvironment).apply { return object : KotlinCoreProjectEnvironment(projectDisposable, applicationEnvironment) {
registerProjectServices(project) init {
registerJavaPsiFacade(project) registerProjectServices(project)
registerJavaPsiFacade(project)
}
override fun createProject(parent: PicoContainer, parentDisposable: Disposable): MockProject {
return object : MockProject(parent, parentDisposable) {
@Throws(ClassNotFoundException::class)
override fun <T> loadClass(className: String, pluginDescriptor: PluginDescriptor): Class<T> {
@Suppress("UNCHECKED_CAST")
return Class.forName(className, true, classLoader) as Class<T>
}
}
}
} }
} }
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.analysis.api.standalone package org.jetbrains.kotlin.analysis.api.standalone
import com.intellij.mock.MockProject
import com.intellij.openapi.Disposable import com.intellij.openapi.Disposable
import com.intellij.openapi.application.Application import com.intellij.openapi.application.Application
import com.intellij.openapi.project.Project import com.intellij.openapi.project.Project
@@ -43,6 +44,7 @@ import kotlin.contracts.contract
public class StandaloneAnalysisAPISessionBuilder( public class StandaloneAnalysisAPISessionBuilder(
applicationDisposable: Disposable, applicationDisposable: Disposable,
projectDisposable: Disposable, projectDisposable: Disposable,
classLoader: ClassLoader = MockProject::class.java.classLoader
) { ) {
init { init {
// We depend on swing (indirectly through PSI or something), so we want to declare headless mode, // We depend on swing (indirectly through PSI or something), so we want to declare headless mode,
@@ -57,6 +59,7 @@ public class StandaloneAnalysisAPISessionBuilder(
StandaloneProjectFactory.createProjectEnvironment( StandaloneProjectFactory.createProjectEnvironment(
projectDisposable, projectDisposable,
applicationDisposable, applicationDisposable,
classLoader = classLoader
) )
@@ -215,6 +218,7 @@ public inline fun buildStandaloneAnalysisAPISession(
applicationDisposable: Disposable = Disposer.newDisposable("StandaloneAnalysisAPISession.application"), applicationDisposable: Disposable = Disposer.newDisposable("StandaloneAnalysisAPISession.application"),
projectDisposable: Disposable = Disposer.newDisposable("StandaloneAnalysisAPISession.project"), projectDisposable: Disposable = Disposer.newDisposable("StandaloneAnalysisAPISession.project"),
withPsiDeclarationFromBinaryModuleProvider: Boolean = false, withPsiDeclarationFromBinaryModuleProvider: Boolean = false,
classLoader: ClassLoader = MockProject::class.java.classLoader,
init: StandaloneAnalysisAPISessionBuilder.() -> Unit init: StandaloneAnalysisAPISessionBuilder.() -> Unit
): StandaloneAnalysisAPISession { ): StandaloneAnalysisAPISession {
contract { contract {
@@ -223,6 +227,7 @@ public inline fun buildStandaloneAnalysisAPISession(
return StandaloneAnalysisAPISessionBuilder( return StandaloneAnalysisAPISessionBuilder(
applicationDisposable, applicationDisposable,
projectDisposable, projectDisposable,
classLoader
).apply(init).build( ).apply(init).build(
withPsiDeclarationFromBinaryModuleProvider, withPsiDeclarationFromBinaryModuleProvider,
) )