diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/run/KotlinGradleTestRunConfigurationProducer.kt b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/run/KotlinGradleTestRunConfigurationProducer.kt index deac0795cc7..8a2c7e8a191 100644 --- a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/run/KotlinGradleTestRunConfigurationProducer.kt +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/run/KotlinGradleTestRunConfigurationProducer.kt @@ -54,7 +54,7 @@ private fun getTestClass(leaf: PsiElement): PsiClass? { private fun getTestMethod(leaf: PsiElement): PsiMethod? { if (IS_JUNIT_ENABLED) { - KotlinJUnitRunConfigurationProducer.getTestMethodLocation(leaf)?.psiElement?.let { return it } + KotlinJUnitRunConfigurationProducer.getTestMethod(leaf)?.let { return it } } if (IS_TESTNG_ENABLED) { KotlinTestNgConfigurationProducer.getTestClassAndMethod(leaf)?.second?.let { return it } diff --git a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/run/KotlinJUnitRunConfigurationProducer.kt b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/run/KotlinJUnitRunConfigurationProducer.kt index c1917dc4b97..be6dd826921 100644 --- a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/run/KotlinJUnitRunConfigurationProducer.kt +++ b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/run/KotlinJUnitRunConfigurationProducer.kt @@ -5,17 +5,20 @@ package org.jetbrains.kotlin.idea.run -import com.intellij.execution.* +import com.intellij.execution.CommonJavaRunConfigurationParameters +import com.intellij.execution.PsiLocation +import com.intellij.execution.RunManager +import com.intellij.execution.RunnerAndConfigurationSettings import com.intellij.execution.actions.ConfigurationContext import com.intellij.execution.actions.ConfigurationFromContext import com.intellij.execution.actions.RunConfigurationProducer -import com.intellij.execution.configurations.ModuleBasedConfiguration import com.intellij.execution.junit.* import com.intellij.execution.testframework.AbstractPatternBasedConfigurationProducer import com.intellij.openapi.project.DumbService import com.intellij.openapi.util.Ref import com.intellij.psi.PsiClass import com.intellij.psi.PsiElement +import com.intellij.psi.PsiMember import com.intellij.psi.PsiMethod import com.intellij.psi.util.PsiTreeUtil import org.jetbrains.kotlin.asJava.toLightClass @@ -40,11 +43,11 @@ class KotlinJUnitRunConfigurationProducer : RunConfigurationProducer - val fromContextSubstitute = object : ConfigurationFromContext() { - override fun getConfigurationSettings() = fromContext.configurationSettings + val sourceElement = getTestClass(leaf) ?: return super.onFirstRun(fromContext, context, performRunnable) - override fun setConfigurationSettings(configurationSettings: RunnerAndConfigurationSettings) { - fromContext.configurationSettings = configurationSettings - } + val contextWithLightElement = createDelegatingContextWithLightElement(fromContext, sourceElement) + // TODO: use TestClassConfigurationProducer when constructor becomes public + return object : AbstractTestClassConfigurationProducer(JUnitConfigurationType.getInstance()) {} + .onFirstRun(contextWithLightElement, context, performRunnable) + } - override fun getSourceElement() = testClass + private fun createDelegatingContextWithLightElement( + fromContext: ConfigurationFromContext, + lightElement: PsiMember + ): ConfigurationFromContext { + return object : ConfigurationFromContext() { + override fun getConfigurationSettings() = fromContext.configurationSettings + + override fun setConfigurationSettings(configurationSettings: RunnerAndConfigurationSettings) { + fromContext.configurationSettings = configurationSettings } - // TODO: use TestClassConfigurationProducer when constructor becomes public - return object : AbstractTestClassConfigurationProducer(JUnitConfigurationType.getInstance()){} - .onFirstRun(fromContextSubstitute, context, performRunnable) - } - super.onFirstRun(fromContext, context, performRunnable) + override fun getSourceElement() = lightElement + } } companion object { @@ -132,16 +140,15 @@ class KotlinJUnitRunConfigurationProducer : RunConfigurationProducer? { + fun getTestMethod(leaf: PsiElement): PsiMethod? { val function = leaf.getParentOfType(false) ?: return null val owner = PsiTreeUtil.getParentOfType(function, KtFunction::class.java, KtClass::class.java) if (owner is KtClass) { val delegate = owner.toLightClass() ?: return null val method = delegate.methods.firstOrNull() { it.navigationElement == function } ?: return null - val methodLocation = PsiLocation.fromPsiElement(method) - if (JUnitUtil.isTestMethod(methodLocation, false)) { - return methodLocation + if (JUnitUtil.isTestMethod(method.toLocation(), false)) { + return method } } return null @@ -154,3 +161,5 @@ class KotlinJUnitRunConfigurationProducer : RunConfigurationProducer().singleOrNull { it.isJUnitTestClass() } } } + +private fun PsiMethod.toLocation() = PsiLocation.fromPsiElement(this) \ No newline at end of file