[ide-console] Load repl with module and its dependencies classpath

This commit is contained in:
Dmitry Kovanikov
2015-08-21 15:52:35 +03:00
committed by Pavel V. Talanov
parent cb5ff094bf
commit e4ffe8b145
@@ -16,8 +16,10 @@
package org.jetbrains.kotlin.console package org.jetbrains.kotlin.console
import com.intellij.execution.Platform
import com.intellij.execution.configurations.GeneralCommandLine import com.intellij.execution.configurations.GeneralCommandLine
import com.intellij.execution.configurations.JavaParameters import com.intellij.execution.configurations.JavaParameters
import com.intellij.openapi.compiler.ex.CompilerPathsEx
import com.intellij.openapi.components.ServiceManager import com.intellij.openapi.components.ServiceManager
import com.intellij.openapi.module.Module import com.intellij.openapi.module.Module
import com.intellij.openapi.project.Project import com.intellij.openapi.project.Project
@@ -25,6 +27,7 @@ import com.intellij.openapi.projectRoots.JavaSdkType
import com.intellij.openapi.projectRoots.JdkUtil import com.intellij.openapi.projectRoots.JdkUtil
import com.intellij.openapi.projectRoots.SimpleJavaSdkType import com.intellij.openapi.projectRoots.SimpleJavaSdkType
import com.intellij.openapi.roots.ModuleRootManager import com.intellij.openapi.roots.ModuleRootManager
import com.intellij.openapi.roots.OrderEnumerator
import com.intellij.openapi.vfs.VirtualFile import com.intellij.openapi.vfs.VirtualFile
import com.intellij.util.SystemProperties import com.intellij.util.SystemProperties
import org.jetbrains.kotlin.console.actions.errorNotification import org.jetbrains.kotlin.console.actions.errorNotification
@@ -38,7 +41,7 @@ public class KotlinConsoleKeeper(val project: Project) {
fun getConsoleByVirtualFile(virtualFile: VirtualFile) = consoleMap.get(virtualFile) fun getConsoleByVirtualFile(virtualFile: VirtualFile) = consoleMap.get(virtualFile)
fun putVirtualFileToConsole(virtualFile: VirtualFile, console: KotlinConsoleRunner) = consoleMap.put(virtualFile, console) fun putVirtualFileToConsole(virtualFile: VirtualFile, console: KotlinConsoleRunner) = consoleMap.put(virtualFile, console)
fun removeConsole(virtualFile: VirtualFile?) = consoleMap.remove(virtualFile) fun removeConsole(virtualFile: VirtualFile) = consoleMap.remove(virtualFile)
fun run(module: Module): KotlinConsoleRunner? { fun run(module: Module): KotlinConsoleRunner? {
val path = module.moduleFilePath val path = module.moduleFilePath
@@ -76,19 +79,22 @@ public class KotlinConsoleKeeper(val project: Project) {
// path to compiler and his options // path to compiler and his options
paramList.add("org.jetbrains.kotlin.cli.jvm.K2JVMCompiler") paramList.add("org.jetbrains.kotlin.cli.jvm.K2JVMCompiler")
// add path to compiled output in kompiler classpath
paramList.add("-cp")
paramList.add(pathToCompiledOutput(module))
return commandLine return commandLine
} }
private fun createJavaParametersWithSdk(module: Module?): JavaParameters { private fun createJavaParametersWithSdk(module: Module): JavaParameters {
val params = JavaParameters() val params = JavaParameters()
params.charset = null params.charset = null
if (module != null) { val sdk = ModuleRootManager.getInstance(module).sdk
val sdk = ModuleRootManager.getInstance(module).sdk if (sdk != null && sdk.sdkType is JavaSdkType && File(sdk.homePath).exists()) {
if (sdk != null && sdk.sdkType is JavaSdkType && File(sdk.homePath).exists()) { params.jdk = sdk
params.jdk = sdk
}
} }
if (params.jdk == null) { if (params.jdk == null) {
params.jdk = SimpleJavaSdkType().createJdk("tmp", SystemProperties.getJavaHome()) params.jdk = SimpleJavaSdkType().createJdk("tmp", SystemProperties.getJavaHome())
} }
@@ -96,6 +102,14 @@ public class KotlinConsoleKeeper(val project: Project) {
return params return params
} }
private fun pathToCompiledOutput(module: Module): String {
val outPaths = CompilerPathsEx.getOutputPaths(arrayOf(module))
val compiledModulePath = outPaths.find { "production" in it } ?: return "<module is not compiled>"
val moduleDependencies = OrderEnumerator.orderEntries(module).recursively().pathsList.pathsString
return "$compiledModulePath${Platform.current().pathSeparator}$moduleDependencies"
}
companion object { companion object {
private val REPL_TITLE = "Kotlin REPL" private val REPL_TITLE = "Kotlin REPL"