Make it possible to instantiate StandaloneAnalysisAPISession with a custom clasloader
This commit is contained in:
committed by
Space Team
parent
98f7ac044c
commit
89c8392255
+18
-3
@@ -14,6 +14,7 @@ import com.intellij.ide.highlighter.JavaFileType
|
||||
import com.intellij.mock.MockApplication
|
||||
import com.intellij.mock.MockProject
|
||||
import com.intellij.openapi.Disposable
|
||||
import com.intellij.openapi.extensions.PluginDescriptor
|
||||
import com.intellij.openapi.roots.PackageIndex
|
||||
import com.intellij.openapi.vfs.VirtualFile
|
||||
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.utils.addIfNotNull
|
||||
import org.jetbrains.kotlin.utils.addToStdlib.popLast
|
||||
import org.picocontainer.PicoContainer
|
||||
import java.nio.file.Path
|
||||
|
||||
object StandaloneProjectFactory {
|
||||
@@ -61,6 +63,7 @@ object StandaloneProjectFactory {
|
||||
projectDisposable: Disposable,
|
||||
applicationDisposable: Disposable,
|
||||
compilerConfiguration: CompilerConfiguration = CompilerConfiguration(),
|
||||
classLoader: ClassLoader = MockProject::class.java.classLoader
|
||||
): KotlinCoreProjectEnvironment {
|
||||
val applicationEnvironment =
|
||||
KotlinCoreEnvironment.getOrCreateApplicationEnvironmentForTests(applicationDisposable, compilerConfiguration)
|
||||
@@ -68,9 +71,21 @@ object StandaloneProjectFactory {
|
||||
|
||||
registerApplicationServices(applicationEnvironment.application)
|
||||
|
||||
return KotlinCoreProjectEnvironment(projectDisposable, applicationEnvironment).apply {
|
||||
registerProjectServices(project)
|
||||
registerJavaPsiFacade(project)
|
||||
return object : KotlinCoreProjectEnvironment(projectDisposable, applicationEnvironment) {
|
||||
init {
|
||||
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
@@ -5,6 +5,7 @@
|
||||
|
||||
package org.jetbrains.kotlin.analysis.api.standalone
|
||||
|
||||
import com.intellij.mock.MockProject
|
||||
import com.intellij.openapi.Disposable
|
||||
import com.intellij.openapi.application.Application
|
||||
import com.intellij.openapi.project.Project
|
||||
@@ -43,6 +44,7 @@ import kotlin.contracts.contract
|
||||
public class StandaloneAnalysisAPISessionBuilder(
|
||||
applicationDisposable: Disposable,
|
||||
projectDisposable: Disposable,
|
||||
classLoader: ClassLoader = MockProject::class.java.classLoader
|
||||
) {
|
||||
init {
|
||||
// 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(
|
||||
projectDisposable,
|
||||
applicationDisposable,
|
||||
classLoader = classLoader
|
||||
)
|
||||
|
||||
|
||||
@@ -215,6 +218,7 @@ public inline fun buildStandaloneAnalysisAPISession(
|
||||
applicationDisposable: Disposable = Disposer.newDisposable("StandaloneAnalysisAPISession.application"),
|
||||
projectDisposable: Disposable = Disposer.newDisposable("StandaloneAnalysisAPISession.project"),
|
||||
withPsiDeclarationFromBinaryModuleProvider: Boolean = false,
|
||||
classLoader: ClassLoader = MockProject::class.java.classLoader,
|
||||
init: StandaloneAnalysisAPISessionBuilder.() -> Unit
|
||||
): StandaloneAnalysisAPISession {
|
||||
contract {
|
||||
@@ -223,6 +227,7 @@ public inline fun buildStandaloneAnalysisAPISession(
|
||||
return StandaloneAnalysisAPISessionBuilder(
|
||||
applicationDisposable,
|
||||
projectDisposable,
|
||||
classLoader
|
||||
).apply(init).build(
|
||||
withPsiDeclarationFromBinaryModuleProvider,
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user