JS: Fix NodeJS run configuration support

#KT-16710 Fixed
This commit is contained in:
Alexey Sedunov
2018-03-21 20:30:48 +03:00
parent e604707450
commit f4936d3e31
5 changed files with 24 additions and 13 deletions
@@ -21,7 +21,9 @@ import org.jetbrains.kotlin.idea.nodejs.TestElementPath
import org.jetbrains.kotlin.idea.nodejs.getNodeJsEnvironmentVars import org.jetbrains.kotlin.idea.nodejs.getNodeJsEnvironmentVars
import org.jetbrains.kotlin.idea.run.addBuildTask import org.jetbrains.kotlin.idea.run.addBuildTask
import org.jetbrains.kotlin.idea.util.module import org.jetbrains.kotlin.idea.util.module
import org.jetbrains.kotlin.psi.KtNamedDeclaration
import org.jetbrains.kotlin.psi.KtNamedFunction import org.jetbrains.kotlin.psi.KtNamedFunction
import org.jetbrains.kotlin.psi.psiUtil.getNonStrictParentOfType
private class KotlinNodeJsRunConfigurationProducer : private class KotlinNodeJsRunConfigurationProducer :
RunConfigurationProducer<NodeJsRunConfiguration>(NodeJsRunConfigurationType.getInstance()) { RunConfigurationProducer<NodeJsRunConfiguration>(NodeJsRunConfigurationType.getInstance()) {
@@ -43,9 +45,10 @@ private class KotlinNodeJsRunConfigurationProducer :
val jsModule = psiFile.module?.jsOrJsImpl() ?: return false val jsModule = psiFile.module?.jsOrJsImpl() ?: return false
val project = psiFile.project val project = psiFile.project
if (psiElement is KtNamedFunction) { val declaration = psiElement.getNonStrictParentOfType<KtNamedDeclaration>()
if (declaration is KtNamedFunction) {
val detector = MainFunctionDetector { it.resolveToDescriptorIfAny() } val detector = MainFunctionDetector { it.resolveToDescriptorIfAny() }
if (!detector.isMain(psiElement, false)) return false if (!detector.isMain(declaration, false)) return false
} }
else if (!TestElementPath.isModuleAssociatedDir(psiElement, jsModule)) return false else if (!TestElementPath.isModuleAssociatedDir(psiElement, jsModule)) return false
@@ -55,7 +58,7 @@ private class KotlinNodeJsRunConfigurationProducer :
configuration.workingDirectory = FileUtil.toSystemDependentName(project.baseDir.path) configuration.workingDirectory = FileUtil.toSystemDependentName(project.baseDir.path)
} }
configuration.inputPath = jsFilePath configuration.inputPath = jsFilePath
configuration.envs = jsModule.getNodeJsEnvironmentVars().envs configuration.envs = jsModule.getNodeJsEnvironmentVars(false).envs
configuration.setGeneratedName() configuration.setGeneratedName()
configuration.addBuildTask() configuration.addBuildTask()
@@ -52,7 +52,7 @@ class KotlinJestRunConfigurationProducer : JestRunConfigurationProducer() {
builder.setScopeKind(JestScopeKind.TEST_FILE) builder.setScopeKind(JestScopeKind.TEST_FILE)
} }
} }
builder.setEnvData(module.getNodeJsEnvironmentVars()) builder.setEnvData(module.getNodeJsEnvironmentVars(true))
return JestTestElementInfo(builder.build(), element) return JestTestElementInfo(builder.build(), element)
} }
@@ -123,7 +123,7 @@ class KotlinMochaRunConfigurationProducer : MochaRunConfigurationProducer() {
} }
} }
builder.setEnvData(module.getNodeJsEnvironmentVars()) builder.setEnvData(module.getNodeJsEnvironmentVars(true))
return MochaTestElementInfo(builder.build(), element) return MochaTestElementInfo(builder.build(), element)
} }
@@ -17,26 +17,34 @@ import java.util.*
const val NODE_PATH_VAR = "NODE_PATH" const val NODE_PATH_VAR = "NODE_PATH"
fun Module.getNodeJsEnvironmentVars(): EnvironmentVariablesData { fun Module.getNodeJsEnvironmentVars(isForTests: Boolean): EnvironmentVariablesData {
val nodeJsClasspath = getNodeJsClasspath(this).joinToString(File.pathSeparator) { val nodeJsClasspath = getNodeJsClasspath(this, isForTests).joinToString(File.pathSeparator) {
val basePath = project.basePath ?: return@joinToString it val basePath = project.basePath ?: return@joinToString it
FileUtil.getRelativePath(basePath, it, '/') ?: it FileUtil.getRelativePath(basePath, it, '/') ?: it
} }
return EnvironmentVariablesData.create(mapOf(NODE_PATH_VAR to nodeJsClasspath), true) return EnvironmentVariablesData.create(mapOf(NODE_PATH_VAR to nodeJsClasspath), true)
} }
private fun addSingleModulePaths(target: Module, result: MutableList<String>) { private fun addSingleModulePaths(
target: Module,
isForTests: Boolean,
result: MutableList<String>
) {
val compilerExtension = CompilerModuleExtension.getInstance(target) ?: return val compilerExtension = CompilerModuleExtension.getInstance(target) ?: return
result.addIfNotNull(compilerExtension.compilerOutputPath?.path) if (isForTests) {
result.addIfNotNull(compilerExtension.compilerOutputPathForTests?.let { "${it.path}/lib" }) result.addIfNotNull(compilerExtension.compilerOutputPath?.path)
result.addIfNotNull(compilerExtension.compilerOutputPathForTests?.let { "${it.path}/lib" })
} else {
result.addIfNotNull(compilerExtension.compilerOutputPath?.let { "${it.path}/lib" })
}
} }
private fun getNodeJsClasspath(module: Module): List<String> { private fun getNodeJsClasspath(module: Module, isForTests: Boolean): List<String> {
if (!module.shouldUseJpsOutput) return emptyList() if (!module.shouldUseJpsOutput) return emptyList()
val result = ArrayList<String>() val result = ArrayList<String>()
ModuleRootManager.getInstance(module).orderEntries().recursively().forEachModule { ModuleRootManager.getInstance(module).orderEntries().recursively().forEachModule {
addSingleModulePaths(it, result) addSingleModulePaths(it, isForTests, result)
true true
} }
return result return result
@@ -55,7 +55,7 @@ class KotlinProtractorRunConfigurationProducer :
sourceElement.set(element) sourceElement.set(element)
configuration.runSettings = configuration.runSettings.copy( configuration.runSettings = configuration.runSettings.copy(
testFilePath = testFilePath, testFilePath = testFilePath,
envData = jsModule.getNodeJsEnvironmentVars() envData = jsModule.getNodeJsEnvironmentVars(true)
) )
configuration.name = configuration.suggestedName() configuration.name = configuration.suggestedName()
configuration.addBuildTask() configuration.addBuildTask()