Kotlin Ultimate: Support NodeJS CLI run configuration

#KT-16710 Fixed
This commit is contained in:
Alexey Sedunov
2018-01-23 17:29:20 +03:00
parent 1f7fab837f
commit 4d52bf04fe
2 changed files with 74 additions and 0 deletions
@@ -5,5 +5,6 @@
<runConfigurationProducer implementation="org.jetbrains.kotlin.idea.nodejs.mocha.KotlinMochaRunConfigurationProducer"/>
<runConfigurationProducer implementation="org.jetbrains.kotlin.idea.nodejs.protractor.KotlinProtractorRunConfigurationProducer"/>
<runConfigurationProducer implementation="org.jetbrains.kotlin.idea.nodejs.jest.KotlinJestRunConfigurationProducer"/>
<runConfigurationProducer implementation="org.jetbrains.kotlin.idea.nodejs.cli.KotlinNodeJsRunConfigurationProducer"/>
</extensions>
</idea-plugin>
@@ -0,0 +1,73 @@
/*
* Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
* that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.idea.nodejs.cli
import com.intellij.execution.actions.ConfigurationContext
import com.intellij.execution.actions.RunConfigurationProducer
import com.intellij.openapi.util.Ref
import com.intellij.openapi.util.io.FileUtil
import com.intellij.psi.PsiElement
import com.jetbrains.nodejs.run.NodeJsRunConfiguration
import com.jetbrains.nodejs.run.NodeJsRunConfigurationType
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
import org.jetbrains.kotlin.idea.MainFunctionDetector
import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny
import org.jetbrains.kotlin.idea.js.jsOrJsImpl
import org.jetbrains.kotlin.idea.js.jsProductionOutputFilePath
import org.jetbrains.kotlin.idea.nodejs.TestElementPath
import org.jetbrains.kotlin.idea.nodejs.getNodeJsEnvironmentVars
import org.jetbrains.kotlin.idea.run.addBuildTask
import org.jetbrains.kotlin.idea.util.module
import org.jetbrains.kotlin.psi.KtNamedFunction
private class KotlinNodeJsRunConfigurationProducer :
RunConfigurationProducer<NodeJsRunConfiguration>(NodeJsRunConfigurationType.getInstance()) {
private val ConfigurationContext?.isAcceptable: Boolean
get() {
val original = this?.getOriginalConfiguration(null)
return original == null || original is NodeJsRunConfiguration
}
override fun setupConfigurationFromContext(
configuration: NodeJsRunConfiguration,
context: ConfigurationContext,
sourceElement: Ref<PsiElement>
): Boolean {
if (!context.isAcceptable) return false
val psiElement = sourceElement.get() ?: return false
val psiFile = psiElement.containingFile
val jsModule = psiFile.module?.jsOrJsImpl() ?: return false
val project = psiFile.project
if (psiElement is KtNamedFunction) {
val detector = MainFunctionDetector { it.resolveToDescriptorIfAny() as? FunctionDescriptor }
if (!detector.isMain(psiElement, false)) return false
}
else if (!TestElementPath.isModuleAssociatedDir(psiElement, jsModule)) return false
val jsFilePath = jsModule.jsProductionOutputFilePath ?: return false
if (configuration.workingDirectory.isNullOrBlank()) {
configuration.workingDirectory = FileUtil.toSystemDependentName(project.baseDir.path)
}
configuration.inputPath = jsFilePath
configuration.envs = jsModule.getNodeJsEnvironmentVars().envs
configuration.setGeneratedName()
configuration.addBuildTask()
return true
}
override fun isConfigurationFromContext(configuration: NodeJsRunConfiguration, context: ConfigurationContext): Boolean {
if (!context.isAcceptable) return false
val contextPsi = context.psiLocation ?: return false
val jsModule = contextPsi.module?.jsOrJsImpl() ?: return false
val jsFilePath = jsModule.jsProductionOutputFilePath ?: return false
return configuration.inputPath == jsFilePath
}
}