Js run configuration producers: get module from ConfigurationContext

Delegate mpp concerns to MultipleRunLocationsProvider EP
Restore old behaviour via bunch files
This commit is contained in:
Pavel V. Talanov
2018-09-10 20:36:49 +02:00
parent 456bf9808d
commit 3a2d25a422
15 changed files with 444 additions and 77 deletions
+2
View File
@@ -36,6 +36,8 @@ dependencies {
compile(project(":idea:idea-core")) { isTransitive = false }
compile(project(":idea:ide-common")) { isTransitive = false }
compile(project(":idea:idea-gradle")) { isTransitive = false }
compile(project(":compiler:util")) { isTransitive = false }
compile(project(":idea:idea-jps-common")) { isTransitive = false }
compileOnly(intellijCoreDep()) { includeJars("intellij-core") }
if (intellijUltimateEnabled) {
+2
View File
@@ -36,6 +36,8 @@ dependencies {
compile(project(":idea:idea-core")) { isTransitive = false }
compile(project(":idea:ide-common")) { isTransitive = false }
compile(project(":idea:idea-gradle")) { isTransitive = false }
compile(project(":compiler:util")) { isTransitive = false }
compile(project(":idea:idea-jps-common")) { isTransitive = false }
compileOnly(intellijCoreDep()) { includeJars("intellij-core") }
if (intellijUltimateEnabled) {
+2
View File
@@ -38,6 +38,8 @@ dependencies {
compile(project(":idea:idea-core")) { isTransitive = false }
compile(project(":idea:ide-common")) { isTransitive = false }
compile(project(":idea:idea-gradle")) { isTransitive = false }
compile(project(":compiler:util")) { isTransitive = false }
compile(project(":idea:idea-jps-common")) { isTransitive = false }
compileOnly(intellijCoreDep()) { includeJars("intellij-core") }
if (intellijUltimateEnabled) {
+2
View File
@@ -38,6 +38,8 @@ dependencies {
compile(project(":idea:idea-core")) { isTransitive = false }
compile(project(":idea:ide-common")) { isTransitive = false }
compile(project(":idea:idea-gradle")) { isTransitive = false }
compile(project(":compiler:util")) { isTransitive = false }
compile(project(":idea:idea-jps-common")) { isTransitive = false }
compileOnly(intellijCoreDep()) { includeJars("intellij-core") }
if (intellijUltimateEnabled) {
@@ -17,12 +17,11 @@ import org.jetbrains.kotlin.idea.MainFunctionDetector
import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny
import org.jetbrains.kotlin.idea.js.KotlinJSRunConfigurationData
import org.jetbrains.kotlin.idea.js.KotlinJSRunConfigurationDataProvider
import org.jetbrains.kotlin.idea.js.jsOrJsImpl
import org.jetbrains.kotlin.idea.js.asJsModule
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.KtNamedDeclaration
import org.jetbrains.kotlin.psi.KtNamedFunction
import org.jetbrains.kotlin.psi.psiUtil.getNonStrictParentOfType
@@ -45,27 +44,27 @@ private class KotlinNodeJsRunConfigurationProducer :
override val isForTests: Boolean
get() = false
private fun getConfigurationData(element: PsiElement, context: ConfigurationContext?): NodeJsConfigData? {
if (context != null && !context.isAcceptable) return null
val jsModule = element.module?.jsOrJsImpl() ?: return null
val jsFilePath = jsModule.jsProductionOutputFilePath ?: return null
override fun getConfigurationData(context: ConfigurationContext): NodeJsConfigData? {
if (!context.isAcceptable) return null
val element = context.psiLocation ?: return null
val module = context.module?.asJsModule() ?: return null
val jsFilePath = module.jsProductionOutputFilePath ?: return null
val declaration = element.getNonStrictParentOfType<KtNamedDeclaration>()
if (declaration is KtNamedFunction) {
val detector = MainFunctionDetector { it.resolveToDescriptorIfAny() }
if (!detector.isMain(declaration, false)) return null
} else if (!TestElementPath.isModuleAssociatedDir(element, jsModule)) return null
return NodeJsConfigData(element, jsModule, jsFilePath)
} else if (!TestElementPath.isModuleAssociatedDir(element, module)) return null
return NodeJsConfigData(element, module, jsFilePath)
}
override fun getConfigurationData(element: PsiElement) = getConfigurationData(element, null)
override fun setupConfigurationFromContext(
configuration: NodeJsRunConfiguration,
context: ConfigurationContext,
sourceElement: Ref<PsiElement>
): Boolean {
val psiElement = sourceElement.get() ?: return false
val configData = getConfigurationData(psiElement, context) ?: return false
val configData = getConfigurationData(context) ?: return false
if (configuration.workingDirectory.isNullOrBlank()) {
configuration.workingDirectory = FileUtil.toSystemDependentName(psiElement.project.baseDir.path)
@@ -79,8 +78,7 @@ private class KotlinNodeJsRunConfigurationProducer :
}
override fun isConfigurationFromContext(configuration: NodeJsRunConfiguration, context: ConfigurationContext): Boolean {
val contextPsi = context.psiLocation ?: return false
val configData = getConfigurationData(contextPsi, context) ?: return false
val configData = getConfigurationData(context) ?: return false
return configuration.inputPath == configData.jsOutputFilePath
}
}
@@ -14,16 +14,14 @@ import com.intellij.openapi.module.Module
import com.intellij.openapi.util.Ref
import com.intellij.openapi.util.io.FileUtil
import com.intellij.psi.PsiElement
import com.intellij.psi.util.PsiUtilCore
import org.jetbrains.kotlin.idea.js.KotlinJSRunConfigurationData
import org.jetbrains.kotlin.idea.js.jsOrJsImpl
import org.jetbrains.kotlin.idea.js.jsTestOutputFilePath
import org.jetbrains.kotlin.idea.js.KotlinJSRunConfigurationDataProvider
import org.jetbrains.kotlin.idea.js.asJsModule
import org.jetbrains.kotlin.idea.js.jsTestOutputFilePath
import org.jetbrains.kotlin.idea.nodejs.TestElementInfo
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.projectStructure.module
typealias JestTestElementInfo = TestElementInfo<JestRunSettings>
@@ -74,29 +72,24 @@ class KotlinJestRunConfigurationProducer :
override val isForTests: Boolean
get() = true
override fun getConfigurationData(element: PsiElement): JestConfigData? {
val module = element.module
val jsModule = module?.jsOrJsImpl() ?: return null
override fun getConfigurationData(
context: ConfigurationContext
): JestConfigData? {
val element = context.psiLocation ?: return null
val module = context.module?.asJsModule() ?: return null
val file = if (jsModule != module) {
jsModule.moduleFile
} else {
PsiUtilCore.getVirtualFile(element)
} ?: return null
val file = module.moduleFile
val project = module.project
if (!isTestRunnerPackageAvailableFor(project, file)) return null
if (!isTestRunnerPackageAvailableFor(module.project, file)) return null
val testFilePath = module.jsTestOutputFilePath ?: return null
val testElementPath = TestElementPath.forElement(element, module) ?: return null
return JestConfigData(element, jsModule, testFilePath, testElementPath)
return JestConfigData(element, module, testFilePath, testElementPath)
}
override fun isConfigurationFromCompatibleContext(configuration: JestRunConfiguration, context: ConfigurationContext): Boolean {
val element = context.psiLocation ?: return false
val configData = getConfigurationData(element) ?: return false
val configData = getConfigurationData(context) ?: return false
val (thisRunSettings, _) = createTestElementRunInfo(configData, configuration.runSettings)
val thatRunSettings = configuration.runSettings
@@ -117,8 +110,7 @@ class KotlinJestRunConfigurationProducer :
context: ConfigurationContext,
sourceElement: Ref<PsiElement>
): Boolean {
val element = context.psiLocation ?: return false
val configData = getConfigurationData(element) ?: return false
val configData = getConfigurationData(context) ?: return false
val (runSettings, enclosingTestElement) = createTestElementRunInfo(configData, configuration.runSettings)
configuration.runSettings = runSettings
sourceElement.set(enclosingTestElement)
@@ -26,20 +26,18 @@ import com.intellij.openapi.vfs.LocalFileSystem
import com.intellij.openapi.vfs.VfsUtilCore
import com.intellij.openapi.vfs.VirtualFile
import com.intellij.psi.PsiElement
import com.intellij.psi.util.PsiUtilCore
import com.intellij.util.SmartList
import com.intellij.util.containers.SmartHashSet
import com.jetbrains.nodejs.mocha.MochaUtil
import com.jetbrains.nodejs.mocha.execution.*
import org.jetbrains.kotlin.idea.js.KotlinJSRunConfigurationData
import org.jetbrains.kotlin.idea.js.KotlinJSRunConfigurationDataProvider
import org.jetbrains.kotlin.idea.js.jsOrJsImpl
import org.jetbrains.kotlin.idea.js.asJsModule
import org.jetbrains.kotlin.idea.js.jsTestOutputFilePath
import org.jetbrains.kotlin.idea.nodejs.TestElementInfo
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.projectStructure.module
private typealias MochaTestElementInfo = TestElementInfo<MochaRunSettings>
@@ -104,22 +102,18 @@ class KotlinMochaRunConfigurationProducer : MochaRunConfigurationProducer(), Kot
return MochaTestElementInfo(builder.build(), configData.element)
}
private fun getConfigurationData(element: PsiElement, context: ConfigurationContext?): MochaConfigData? {
val module = element.module
val jsModule = module?.jsOrJsImpl() ?: return null
val file = if (jsModule != module) {
jsModule.moduleFile
} else {
PsiUtilCore.getVirtualFile(element)
} ?: return null
override fun getConfigurationData(context: ConfigurationContext): MochaConfigData? {
val module = context.module?.asJsModule() ?: return null
val element = context.psiLocation ?: return null
val file = module.moduleFile ?: return null
val project = module.project
val testFilePath = module.jsTestOutputFilePath ?: return null
val testElementPath = TestElementPath.forElement(element, module) ?: return null
val configData = MochaConfigData(element, jsModule, testFilePath, testElementPath)
val configData = MochaConfigData(element, module, testFilePath, testElementPath)
if (context?.getOriginalConfiguration(MochaConfigurationType.getInstance()) is MochaRunConfiguration) return configData
if (context.getOriginalConfiguration(MochaConfigurationType.getInstance()) is MochaRunConfiguration) return configData
if (isTestRunnerPackageAvailableFor(project, file)) return configData
@@ -139,13 +133,8 @@ class KotlinMochaRunConfigurationProducer : MochaRunConfigurationProducer(), Kot
override val isForTests: Boolean
get() = true
override fun getConfigurationData(element: PsiElement): MochaConfigData? {
return getConfigurationData(element, null)
}
override fun isConfigurationFromCompatibleContext(configuration: MochaRunConfiguration, context: ConfigurationContext): Boolean {
val element = context.psiLocation ?: return false
val configData = getConfigurationData(element) ?: return false
val configData = getConfigurationData(context) ?: return false
val (thisRunSettings, _) = createTestElementRunInfo(configData, configuration.runSettings)
val thatRunSettings = configuration.runSettings
val thisTestKind = thisRunSettings.testKind
@@ -165,8 +154,7 @@ class KotlinMochaRunConfigurationProducer : MochaRunConfigurationProducer(), Kot
context: ConfigurationContext,
sourceElement: Ref<PsiElement>
): Boolean {
val element = context.psiLocation ?: return false
val configData = getConfigurationData(element, context) ?: return false
val configData = getConfigurationData(context) ?: return false
val (runSettings, enclosingTestElement) = createTestElementRunInfo(configData, configuration.runSettings)
if (runSettings.testKind == MochaTestKind.DIRECTORY) return false
configuration.runSettings = runSettings
@@ -19,13 +19,12 @@ package org.jetbrains.kotlin.idea.nodejs.protractor
import com.intellij.execution.actions.CompatibleRunConfigurationProducer
import com.intellij.execution.actions.ConfigurationContext
import com.intellij.openapi.module.Module
import com.intellij.openapi.module.ModuleUtilCore
import com.intellij.openapi.util.Ref
import com.intellij.openapi.util.io.FileUtil
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.idea.js.KotlinJSRunConfigurationData
import org.jetbrains.kotlin.idea.js.KotlinJSRunConfigurationDataProvider
import org.jetbrains.kotlin.idea.js.jsOrJsImpl
import org.jetbrains.kotlin.idea.js.asJsModule
import org.jetbrains.kotlin.idea.js.jsTestOutputFilePath
import org.jetbrains.kotlin.idea.nodejs.TestElementPath
import org.jetbrains.kotlin.idea.nodejs.getNodeJsEnvironmentVars
@@ -43,11 +42,13 @@ class KotlinProtractorRunConfigurationProducer :
override val isForTests: Boolean
get() = true
override fun getConfigurationData(element: PsiElement): ProtractorConfigData? {
val module = ModuleUtilCore.findModuleForPsiElement(element) ?: return null
override fun getConfigurationData(
context: ConfigurationContext
): ProtractorConfigData? {
val module = context.module?.asJsModule() ?: return null
val element = context.psiLocation ?: return null
if (!TestElementPath.isModuleAssociatedDir(element, module)) return null
val jsModule = module.jsOrJsImpl() ?: return null
val testFilePath = jsModule.jsTestOutputFilePath ?: return null
val testFilePath = module.jsTestOutputFilePath ?: return null
return ProtractorConfigData(element, module, testFilePath)
}
@@ -55,8 +56,7 @@ class KotlinProtractorRunConfigurationProducer :
configuration: KotlinProtractorRunConfiguration,
context: ConfigurationContext
): Boolean {
val contextPsi = context.psiLocation ?: return false
val configData = getConfigurationData(contextPsi) ?: return false
val configData = getConfigurationData(context) ?: return false
return configuration.runSettings.testFileSystemDependentPath == FileUtil.toSystemDependentName(configData.jsOutputFilePath)
}
@@ -66,7 +66,7 @@ class KotlinProtractorRunConfigurationProducer :
sourceElement: Ref<PsiElement>
): Boolean {
val element = context.psiLocation ?: return false
val configData = getConfigurationData(element) ?: return false
val configData = getConfigurationData(context) ?: return false
sourceElement.set(element)
configuration.runSettings = configuration.runSettings.copy(
testFilePath = configData.jsOutputFilePath,