Run Script Action should add script dependencies to classpath

This commit is contained in:
Natalia Selezneva
2018-03-01 15:58:53 +03:00
parent 7d76554966
commit a5ac8abc7c
@@ -23,18 +23,27 @@ import com.intellij.execution.configurations.*
import com.intellij.execution.runners.ExecutionEnvironment import com.intellij.execution.runners.ExecutionEnvironment
import com.intellij.execution.util.JavaParametersUtil import com.intellij.execution.util.JavaParametersUtil
import com.intellij.execution.util.ProgramParametersUtil import com.intellij.execution.util.ProgramParametersUtil
import com.intellij.ide.projectView.impl.ProjectRootsUtil
import com.intellij.openapi.compiler.CompilerPaths
import com.intellij.openapi.compiler.ex.CompilerPathsEx
import com.intellij.openapi.components.PathMacroManager import com.intellij.openapi.components.PathMacroManager
import com.intellij.openapi.module.Module
import com.intellij.openapi.module.ModuleUtilCore
import com.intellij.openapi.options.SettingsEditor import com.intellij.openapi.options.SettingsEditor
import com.intellij.openapi.options.SettingsEditorGroup import com.intellij.openapi.options.SettingsEditorGroup
import com.intellij.openapi.project.Project import com.intellij.openapi.project.Project
import com.intellij.openapi.roots.OrderEnumerator
import com.intellij.openapi.util.DefaultJDOMExternalizer import com.intellij.openapi.util.DefaultJDOMExternalizer
import com.intellij.openapi.vfs.LocalFileSystem import com.intellij.openapi.vfs.LocalFileSystem
import com.intellij.openapi.vfs.VirtualFile
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import com.intellij.refactoring.listeners.RefactoringElementAdapter import com.intellij.refactoring.listeners.RefactoringElementAdapter
import com.intellij.refactoring.listeners.RefactoringElementListener import com.intellij.refactoring.listeners.RefactoringElementListener
import org.jdom.Element import org.jdom.Element
import org.jetbrains.kotlin.idea.core.script.ScriptDependenciesManager import org.jetbrains.kotlin.idea.core.script.ScriptDependenciesManager
import org.jetbrains.kotlin.idea.run.KotlinRunConfiguration
import org.jetbrains.kotlin.idea.run.script.standalone.KotlinStandaloneScriptRunConfigurationProducer.Companion.pathFromPsiElement import org.jetbrains.kotlin.idea.run.script.standalone.KotlinStandaloneScriptRunConfigurationProducer.Companion.pathFromPsiElement
import org.jetbrains.kotlin.idea.util.ProjectRootsUtil.isProjectSourceFile
import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.utils.PathUtil import org.jetbrains.kotlin.utils.PathUtil
import java.io.File import java.io.File
@@ -44,7 +53,7 @@ class KotlinStandaloneScriptRunConfiguration(
project: Project, project: Project,
factory: ConfigurationFactory, factory: ConfigurationFactory,
name: String? name: String?
) : LocatableConfigurationBase(project, factory, name), CommonJavaRunConfigurationParameters, RefactoringListenerProvider { ) : KotlinRunConfiguration(name, JavaRunConfigurationModule(project, true), factory), CommonJavaRunConfigurationParameters, RefactoringListenerProvider {
@JvmField @JvmField
var filePath: String? = null var filePath: String? = null
@JvmField @JvmField
@@ -124,6 +133,11 @@ class KotlinStandaloneScriptRunConfiguration(
EnvironmentVariablesComponent.readExternal(element, getEnvs()) EnvironmentVariablesComponent.readExternal(element, getEnvs())
} }
override fun getModules(): Array<Module> {
val scriptVFile = LocalFileSystem.getInstance().findFileByIoFile(File(filePath))
return scriptVFile?.module(project)?.let { arrayOf(it) } ?: emptyArray()
}
override fun checkConfiguration() { override fun checkConfiguration() {
JavaParametersUtil.checkAlternativeJRE(this) JavaParametersUtil.checkAlternativeJRE(this)
ProgramParametersUtil.checkWorkingDirectoryExist(this, project, null) ProgramParametersUtil.checkWorkingDirectoryExist(this, project, null)
@@ -204,6 +218,19 @@ private class ScriptCommandLineState(
params.programParametersList.prepend(PathUtil.kotlinPathsForIdeaPlugin.homePath.path) params.programParametersList.prepend(PathUtil.kotlinPathsForIdeaPlugin.homePath.path)
params.programParametersList.prepend("-kotlin-home") params.programParametersList.prepend("-kotlin-home")
val module = scriptVFile.module(environment.project)
if (module != null) {
val orderEnumerator = OrderEnumerator.orderEntries(module).recursively().let {
if (!ProjectRootsUtil.isInTestSource(scriptVFile, environment.project)) it.productionOnly() else it
}
val moduleDependencies = orderEnumerator.classes().pathsList.pathsString
if (moduleDependencies.isNotBlank()) {
params.programParametersList.prepend(moduleDependencies)
params.programParametersList.prepend("-cp")
}
}
return params return params
} }
@@ -215,3 +242,10 @@ private class ScriptCommandLineState(
return params return params
} }
} }
private fun VirtualFile.module(project: Project): Module? {
if (isProjectSourceFile(project, this)) {
return ModuleUtilCore.findModuleForFile(this, project)
}
return null
}