Set SDK from JVM module when running JUnit tests for common module

This commit is contained in:
Dmitry Jemerov
2018-03-26 19:30:46 +02:00
parent 6bee25cad2
commit 8f19e95bd0
@@ -12,6 +12,7 @@ import com.intellij.execution.actions.RunConfigurationProducer
import com.intellij.execution.configurations.ModuleBasedConfiguration import com.intellij.execution.configurations.ModuleBasedConfiguration
import com.intellij.execution.junit.* import com.intellij.execution.junit.*
import com.intellij.openapi.project.DumbService import com.intellij.openapi.project.DumbService
import com.intellij.openapi.roots.ModuleRootManager
import com.intellij.openapi.util.Ref import com.intellij.openapi.util.Ref
import com.intellij.psi.PsiClass import com.intellij.psi.PsiClass
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
@@ -20,11 +21,13 @@ import com.intellij.psi.util.PsiTreeUtil
import org.jetbrains.kotlin.asJava.toLightClass import org.jetbrains.kotlin.asJava.toLightClass
import org.jetbrains.kotlin.idea.project.TargetPlatformDetector import org.jetbrains.kotlin.idea.project.TargetPlatformDetector
import org.jetbrains.kotlin.idea.util.ProjectRootsUtil import org.jetbrains.kotlin.idea.util.ProjectRootsUtil
import org.jetbrains.kotlin.idea.util.module
import org.jetbrains.kotlin.psi.KtClass import org.jetbrains.kotlin.psi.KtClass
import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.psi.KtFunction import org.jetbrains.kotlin.psi.KtFunction
import org.jetbrains.kotlin.psi.KtNamedFunction import org.jetbrains.kotlin.psi.KtNamedFunction
import org.jetbrains.kotlin.psi.psiUtil.getParentOfType import org.jetbrains.kotlin.psi.psiUtil.getParentOfType
import org.jetbrains.kotlin.resolve.TargetPlatform
import org.jetbrains.kotlin.resolve.jvm.platform.JvmPlatform import org.jetbrains.kotlin.resolve.jvm.platform.JvmPlatform
class KotlinJUnitRunConfigurationProducer : RunConfigurationProducer<JUnitConfiguration>(JUnitConfigurationType.getInstance()) { class KotlinJUnitRunConfigurationProducer : RunConfigurationProducer<JUnitConfiguration>(JUnitConfigurationType.getInstance()) {
@@ -85,7 +88,8 @@ class KotlinJUnitRunConfigurationProducer : RunConfigurationProducer<JUnitConfig
val ktFile = leaf.containingFile as KtFile val ktFile = leaf.containingFile as KtFile
if (TargetPlatformDetector.getPlatform(ktFile) != JvmPlatform) { val targetPlatform = TargetPlatformDetector.getPlatform(ktFile)
if (targetPlatform != JvmPlatform && targetPlatform != TargetPlatform.Common) {
return false return false
} }
@@ -95,6 +99,7 @@ class KotlinJUnitRunConfigurationProducer : RunConfigurationProducer<JUnitConfig
configuration.beMethodConfiguration(methodLocation) configuration.beMethodConfiguration(methodLocation)
configuration.restoreOriginalModule(originalModule) configuration.restoreOriginalModule(originalModule)
JavaRunConfigurationExtensionManager.getInstance().extendCreatedConfiguration(configuration, location) JavaRunConfigurationExtensionManager.getInstance().extendCreatedConfiguration(configuration, location)
fixJdkForCommonModule(ktFile, configuration)
return true return true
} }
@@ -104,12 +109,22 @@ class KotlinJUnitRunConfigurationProducer : RunConfigurationProducer<JUnitConfig
configuration.beClassConfiguration(testClass) configuration.beClassConfiguration(testClass)
configuration.restoreOriginalModule(originalModule) configuration.restoreOriginalModule(originalModule)
JavaRunConfigurationExtensionManager.getInstance().extendCreatedConfiguration(configuration, location) JavaRunConfigurationExtensionManager.getInstance().extendCreatedConfiguration(configuration, location)
fixJdkForCommonModule(ktFile, configuration)
return true return true
} }
return false return false
} }
private fun fixJdkForCommonModule(ktFile: KtFile, configuration: JUnitConfiguration) {
val implModule = ktFile.module?.findJvmImplementationModule() ?: return
val sdk = ModuleRootManager.getInstance(implModule).sdk
if (sdk != null) {
configuration.isAlternativeJrePathEnabled = true
configuration.alternativeJrePath = sdk.homePath
}
}
override fun onFirstRun(fromContext: ConfigurationFromContext, context: ConfigurationContext, performRunnable: Runnable) { override fun onFirstRun(fromContext: ConfigurationFromContext, context: ConfigurationContext, performRunnable: Runnable) {
val leaf = fromContext.sourceElement val leaf = fromContext.sourceElement
getTestClass(leaf)?.let { testClass -> getTestClass(leaf)?.let { testClass ->