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.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
@@ -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,
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user