Kotlin Ultimate: Add "Build" action to JS run configurations

#KT-20522 Fixed
This commit is contained in:
Alexey Sedunov
2018-01-22 12:54:53 +03:00
parent 8ffb205f1c
commit 80887a84ca
7 changed files with 35 additions and 5 deletions
@@ -0,0 +1,13 @@
/*
* 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.run
import com.intellij.compiler.options.CompileStepBeforeRun
import com.intellij.execution.configurations.RunConfiguration
fun RunConfiguration.addBuildTask() {
beforeRunTasks = beforeRunTasks + CompileStepBeforeRun.MakeBeforeRunTask()
}
@@ -21,13 +21,17 @@ import com.intellij.openapi.roots.CompilerModuleExtension
import org.jetbrains.jps.util.JpsPathUtil import org.jetbrains.jps.util.JpsPathUtil
import org.jetbrains.kotlin.idea.facet.KotlinFacet import org.jetbrains.kotlin.idea.facet.KotlinFacet
import org.jetbrains.kotlin.idea.facet.implementingModules import org.jetbrains.kotlin.idea.facet.implementingModules
import org.jetbrains.kotlin.idea.framework.isGradleModule
import org.jetbrains.kotlin.idea.project.TargetPlatformDetector import org.jetbrains.kotlin.idea.project.TargetPlatformDetector
import org.jetbrains.kotlin.js.resolve.JsPlatform import org.jetbrains.kotlin.js.resolve.JsPlatform
import org.jetbrains.kotlin.resolve.TargetPlatform import org.jetbrains.kotlin.resolve.TargetPlatform
import org.jetbrains.plugins.gradle.settings.GradleSystemRunningSettings
val Module.jsTestOutputFilePath: String? val Module.jsTestOutputFilePath: String?
get() { get() {
(KotlinFacet.get(this)?.configuration?.settings?.testOutputPath)?.let { return it } if (!shouldUseJpsOutput) {
(KotlinFacet.get(this)?.configuration?.settings?.testOutputPath)?.let { return it }
}
val compilerExtension = CompilerModuleExtension.getInstance(this) val compilerExtension = CompilerModuleExtension.getInstance(this)
val outputDir = compilerExtension?.compilerOutputUrlForTests ?: return null val outputDir = compilerExtension?.compilerOutputUrlForTests ?: return null
@@ -38,4 +42,7 @@ fun Module.jsOrJsImpl() = when (TargetPlatformDetector.getPlatform(this)) {
is TargetPlatform.Common -> implementingModules.firstOrNull { TargetPlatformDetector.getPlatform(it) is JsPlatform } is TargetPlatform.Common -> implementingModules.firstOrNull { TargetPlatformDetector.getPlatform(it) is JsPlatform }
is JsPlatform -> this is JsPlatform -> this
else -> null else -> null
} }
val Module.shouldUseJpsOutput: Boolean
get() = !(isGradleModule() && GradleSystemRunningSettings.getInstance().isUseGradleAwareMake)
@@ -19,6 +19,7 @@ import org.jetbrains.kotlin.idea.js.jsTestOutputFilePath
import org.jetbrains.kotlin.idea.nodejs.TestElementInfo import org.jetbrains.kotlin.idea.nodejs.TestElementInfo
import org.jetbrains.kotlin.idea.nodejs.TestElementPath 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.util.projectStructure.module import org.jetbrains.kotlin.idea.util.projectStructure.module
private typealias JestTestElementInfo = TestElementInfo<JestRunSettings> private typealias JestTestElementInfo = TestElementInfo<JestRunSettings>
@@ -94,6 +95,7 @@ class KotlinJestRunConfigurationProducer : JestRunConfigurationProducer() {
configuration.runSettings = runSettings configuration.runSettings = runSettings
sourceElement.set(enclosingTestElement) sourceElement.set(enclosingTestElement)
configuration.setGeneratedName() configuration.setGeneratedName()
configuration.addBuildTask()
return true return true
} }
} }
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.idea.nodejs package org.jetbrains.kotlin.idea.nodejs
import com.intellij.openapi.module.Module import com.intellij.openapi.module.Module
import com.intellij.openapi.roots.ModuleRootManager
import com.intellij.psi.PsiDirectory import com.intellij.psi.PsiDirectory
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.idea.util.projectStructure.getModuleDir import org.jetbrains.kotlin.idea.util.projectStructure.getModuleDir
@@ -24,7 +25,10 @@ sealed class TestElementPath {
companion object { companion object {
fun isModuleAssociatedDir(element: PsiElement, module: Module): Boolean { fun isModuleAssociatedDir(element: PsiElement, module: Module): Boolean {
return element is PsiDirectory && module.getModuleDir() == element.virtualFile.path if (element !is PsiDirectory) return false
val virtualFile = element.virtualFile
return (module.getModuleDir() == virtualFile.path
|| virtualFile == ModuleRootManager.getInstance(module).contentRoots.singleOrNull())
} }
fun forElement(element: PsiElement, module: Module): TestElementPath? { fun forElement(element: PsiElement, module: Module): TestElementPath? {
@@ -35,6 +35,7 @@ import org.jetbrains.kotlin.idea.js.jsTestOutputFilePath
import org.jetbrains.kotlin.idea.nodejs.TestElementInfo import org.jetbrains.kotlin.idea.nodejs.TestElementInfo
import org.jetbrains.kotlin.idea.nodejs.TestElementPath 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.util.projectStructure.module import org.jetbrains.kotlin.idea.util.projectStructure.module
private typealias MochaTestElementInfo = TestElementInfo<MochaRunSettings> private typealias MochaTestElementInfo = TestElementInfo<MochaRunSettings>
@@ -155,6 +156,7 @@ class KotlinMochaRunConfigurationProducer : MochaRunConfigurationProducer() {
configuration.runSettings = runSettings configuration.runSettings = runSettings
sourceElement.set(enclosingTestElement) sourceElement.set(enclosingTestElement)
configuration.setGeneratedName() configuration.setGeneratedName()
configuration.addBuildTask()
return true return true
} }
} }
@@ -10,7 +10,7 @@ import com.intellij.openapi.module.Module
import com.intellij.openapi.roots.CompilerModuleExtension import com.intellij.openapi.roots.CompilerModuleExtension
import com.intellij.openapi.roots.ModuleRootManager import com.intellij.openapi.roots.ModuleRootManager
import com.intellij.openapi.util.io.FileUtil import com.intellij.openapi.util.io.FileUtil
import org.jetbrains.kotlin.idea.framework.isGradleModule import org.jetbrains.kotlin.idea.js.shouldUseJpsOutput
import org.jetbrains.kotlin.utils.addIfNotNull import org.jetbrains.kotlin.utils.addIfNotNull
import java.io.File import java.io.File
import java.util.* import java.util.*
@@ -32,7 +32,7 @@ private fun addSingleModulePaths(target: Module, result: MutableList<String>) {
} }
private fun getNodeJsClasspath(module: Module): List<String> { private fun getNodeJsClasspath(module: Module): List<String> {
if (module.isGradleModule()) 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 {
@@ -26,6 +26,7 @@ import org.jetbrains.kotlin.idea.js.jsOrJsImpl
import org.jetbrains.kotlin.idea.js.jsTestOutputFilePath import org.jetbrains.kotlin.idea.js.jsTestOutputFilePath
import org.jetbrains.kotlin.idea.nodejs.TestElementPath 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.util.projectStructure.module import org.jetbrains.kotlin.idea.util.projectStructure.module
class KotlinProtractorRunConfigurationProducer : class KotlinProtractorRunConfigurationProducer :
@@ -57,6 +58,7 @@ class KotlinProtractorRunConfigurationProducer :
envData = jsModule.getNodeJsEnvironmentVars() envData = jsModule.getNodeJsEnvironmentVars()
) )
configuration.name = configuration.suggestedName() configuration.name = configuration.suggestedName()
configuration.addBuildTask()
return true return true
} }
} }