KTIJ-30051 Add extension for Common modules RCS producers

This change will allow for multiple producers that apply for common
modules to be showns in the menu when trying to run tests

closes https://github.com/JetBrains/intellij-community/pull/2798

GitOrigin-RevId: 85af3b15d604e488437b3beaaab9e3f8994aa73c
This commit is contained in:
Karima Ichou
2024-07-01 19:39:03 +00:00
committed by intellij-monorepo-bot
parent 7e4a275cbe
commit 9738e552e7
8 changed files with 99 additions and 7 deletions
@@ -142,6 +142,10 @@ public abstract class ConfigurationFromContext {
if (PsiTreeUtil.isAncestor(configuration2.getSourceElement(), configuration1.getSourceElement(), true)) {
return -1;
}
// If neither configuration1 nor configuration2 are preferred to each other, then these are considered equal.
if (!configuration1.isPreferredTo(configuration2) && !configuration2.isPreferredTo(configuration1)) {
return 0;
}
if (!configuration1.isPreferredTo(configuration2)) {
return 1;
}
@@ -24,6 +24,11 @@
qualifiedName="org.jetbrains.kotlin.mppProjectResolve"
interface="org.jetbrains.kotlin.idea.gradleJava.configuration.mpp.KotlinMppGradleProjectResolverExtension"
dynamic="true"/>
<extensionPoint
qualifiedName="org.jetbrains.kotlin.idea.gradleJava.kotlinMultiplatformProducersProvider"
interface="org.jetbrains.kotlin.idea.gradleJava.extensions.KotlinMultiplatformCommonProducersProvider"
dynamic="true"/>
</extensionPoints>
<extensions defaultExtensionNs="org.jetbrains.plugins.gradle">
@@ -143,6 +148,13 @@
<extrasSerialization implementation="org.jetbrains.kotlin.idea.gradleJava.configuration.serialize.KotlinGradlePluginExtrasSerializationService"/>
</extensions>
<extensions defaultExtensionNs="org.jetbrains.kotlin.idea.gradleJava">
<kotlinMultiplatformProducersProvider implementation="org.jetbrains.kotlin.idea.gradleJava.testing.KotlinMultiplatformAllInDirectoryConfigurationProducer"/>
<kotlinMultiplatformProducersProvider implementation="org.jetbrains.kotlin.idea.gradleJava.testing.KotlinMultiplatformAllInPackageConfigurationProducer"/>
<kotlinMultiplatformProducersProvider implementation="org.jetbrains.kotlin.idea.gradleJava.testing.common.KotlinMultiplatformCommonTestClassGradleConfigurationProducer"/>
<kotlinMultiplatformProducersProvider implementation="org.jetbrains.kotlin.idea.gradleJava.testing.common.KotlinMultiplatformCommonTestMethodGradleConfigurationProducer"/>
</extensions>
<extensions defaultExtensionNs="org.jetbrains.kotlin.idea.gradleTooling">
<serialization.IdeaKotlinSerializationContext implementation="org.jetbrains.kotlin.idea.gradleJava.configuration.serialize.IntellijIdeaKotlinSerializationContext"/>
</extensions>
@@ -0,0 +1,19 @@
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.jetbrains.kotlin.idea.gradleJava.extensions
import com.intellij.execution.actions.ConfigurationFromContext
import com.intellij.openapi.extensions.ExtensionPointName
/**
* Common interface for Run configurations producers that apply to multiplatform modules.
* This interface must be implemented by every producer that apply to multiplatform modules.
*/
interface KotlinMultiplatformCommonProducersProvider {
companion object {
val EP_NAME: ExtensionPointName<KotlinMultiplatformCommonProducersProvider> =
ExtensionPointName.create("org.jetbrains.kotlin.idea.gradleJava.kotlinMultiplatformProducersProvider")
}
fun isProducedByCommonProducer(configuration: ConfigurationFromContext): Boolean
}
@@ -9,6 +9,7 @@ import com.intellij.psi.PsiClass
import com.intellij.psi.PsiMethod
import org.jetbrains.kotlin.idea.KotlinLanguage
import org.jetbrains.kotlin.idea.extensions.KotlinTestFrameworkProvider
import org.jetbrains.kotlin.idea.gradleJava.extensions.KotlinMultiplatformCommonProducersProvider
internal fun ConfigurationFromContext.isJpsJunitConfiguration(): Boolean {
for (extension in KotlinTestFrameworkProvider.EP_NAME.extensionList) {
@@ -21,6 +22,13 @@ internal fun ConfigurationFromContext.isJpsJunitConfiguration(): Boolean {
return isProducedBy(AbstractPatternBasedConfigurationProducer::class.java)
}
fun ConfigurationFromContext.isProvidedByMultiplatformProducer(): Boolean {
for (extension in KotlinMultiplatformCommonProducersProvider.EP_NAME.extensionList) {
if (extension.isProducedByCommonProducer(this)) return true
}
return false
}
internal fun canRunJvmTests(): Boolean {
return KotlinTestFrameworkProvider.EP_NAME.extensionList.any { it.canRunJvmTests }
}
@@ -8,22 +8,26 @@ import com.intellij.openapi.project.modules
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.idea.base.facet.isMultiPlatformModule
import org.jetbrains.kotlin.idea.base.facet.platform.platform
import org.jetbrains.kotlin.idea.gradleJava.extensions.KotlinMultiplatformCommonProducersProvider
import org.jetbrains.kotlin.idea.gradleJava.run.MultiplatformTestTasksChooser
import org.jetbrains.kotlin.idea.gradleJava.run.isProvidedByMultiplatformProducer
import org.jetbrains.kotlin.platform.isCommon
import org.jetbrains.plugins.gradle.execution.test.runner.AllInDirectoryGradleConfigurationProducer
import org.jetbrains.plugins.gradle.util.createTestWildcardFilter
class KotlinMultiplatformAllInDirectoryConfigurationProducer
: AllInDirectoryGradleConfigurationProducer() {
: AllInDirectoryGradleConfigurationProducer(), KotlinMultiplatformCommonProducersProvider {
private val mppTestTasksChooser = MultiplatformTestTasksChooser()
override fun isPreferredConfiguration(self: ConfigurationFromContext, other: ConfigurationFromContext): Boolean {
return !other.isProducedBy(KotlinMultiplatformAllInPackageConfigurationProducer::class.java) && super.isPreferredConfiguration(self, other)
&& !other.isProvidedByMultiplatformProducer()
}
override fun shouldReplace(self: ConfigurationFromContext, other: ConfigurationFromContext): Boolean {
return !other.isProducedBy(KotlinMultiplatformAllInPackageConfigurationProducer::class.java) && super.shouldReplace(self, other)
return !other.isProducedBy(KotlinMultiplatformAllInPackageConfigurationProducer::class.java) && super.shouldReplace(self, other) &&
!other.isProvidedByMultiplatformProducer()
}
override fun findExistingConfiguration(context: ConfigurationContext): RunnerAndConfigurationSettings? {
@@ -55,4 +59,8 @@ class KotlinMultiplatformAllInDirectoryConfigurationProducer
return tasks.map { TestTasksToRun(it, wildcardFilter) }
}
override fun isProducedByCommonProducer(configuration: ConfigurationFromContext): Boolean {
return configuration.isProducedBy(this.javaClass)
}
}
@@ -6,20 +6,25 @@ import com.intellij.execution.actions.ConfigurationFromContext
import com.intellij.openapi.project.modules
import com.intellij.psi.PsiPackage
import org.jetbrains.kotlin.idea.base.facet.isMultiPlatformModule
import org.jetbrains.kotlin.idea.gradleJava.extensions.KotlinMultiplatformCommonProducersProvider
import org.jetbrains.kotlin.idea.gradleJava.run.MultiplatformTestTasksChooser
import org.jetbrains.kotlin.idea.gradleJava.run.isProvidedByMultiplatformProducer
import org.jetbrains.plugins.gradle.execution.test.runner.AllInPackageGradleConfigurationProducer
import org.jetbrains.plugins.gradle.util.createTestFilterFrom
class KotlinMultiplatformAllInPackageConfigurationProducer: AllInPackageGradleConfigurationProducer() {
class KotlinMultiplatformAllInPackageConfigurationProducer: AllInPackageGradleConfigurationProducer(),
KotlinMultiplatformCommonProducersProvider {
private val mppTestTasksChooser = MultiplatformTestTasksChooser()
override fun isPreferredConfiguration(self: ConfigurationFromContext, other: ConfigurationFromContext): Boolean {
return other.isProducedBy(KotlinMultiplatformAllInDirectoryConfigurationProducer::class.java) || super.isPreferredConfiguration(self, other)
return other.isProducedBy(KotlinMultiplatformAllInDirectoryConfigurationProducer::class.java) ||
super.isPreferredConfiguration(self, other) && !other.isProvidedByMultiplatformProducer()
}
override fun shouldReplace(self: ConfigurationFromContext, other: ConfigurationFromContext): Boolean {
return other.isProducedBy(KotlinMultiplatformAllInDirectoryConfigurationProducer::class.java) || super.shouldReplace(self, other)
return other.isProducedBy(KotlinMultiplatformAllInDirectoryConfigurationProducer::class.java) ||
super.shouldReplace(self, other) && !other.isProvidedByMultiplatformProducer()
}
override fun getAllTestsTaskToRun(
@@ -38,4 +43,8 @@ class KotlinMultiplatformAllInPackageConfigurationProducer: AllInPackageGradleCo
return tasks.map { TestTasksToRun(it, wildcardFilter) }
}
override fun isProducedByCommonProducer(configuration: ConfigurationFromContext): Boolean {
return configuration.isProducedBy(this.javaClass)
}
}
@@ -4,14 +4,30 @@ package org.jetbrains.kotlin.idea.gradleJava.testing.common
import com.intellij.execution.RunnerAndConfigurationSettings
import com.intellij.execution.actions.ConfigurationContext
import com.intellij.execution.actions.ConfigurationFromContext
import com.intellij.openapi.module.Module
import org.jetbrains.kotlin.idea.gradleJava.run.AbstractKotlinMultiplatformTestClassGradleConfigurationProducer
import org.jetbrains.kotlin.idea.gradleJava.extensions.KotlinMultiplatformCommonProducersProvider
import org.jetbrains.kotlin.idea.gradleJava.run.isProvidedByMultiplatformProducer
import org.jetbrains.kotlin.platform.TargetPlatform
import org.jetbrains.kotlin.platform.isCommon
import org.jetbrains.kotlin.platform.jvm.isJvm
class KotlinMultiplatformCommonTestClassGradleConfigurationProducer : AbstractKotlinMultiplatformTestClassGradleConfigurationProducer() {
class KotlinMultiplatformCommonTestClassGradleConfigurationProducer : AbstractKotlinMultiplatformTestClassGradleConfigurationProducer(),
KotlinMultiplatformCommonProducersProvider {
override fun isApplicable(module: Module, platform: TargetPlatform) = platform.isCommon() || platform.isJvm()
override fun isPreferredConfiguration(self: ConfigurationFromContext, other: ConfigurationFromContext): Boolean {
return !other.isProvidedByMultiplatformProducer() || super.isPreferredConfiguration(self, other)
}
override fun shouldReplace(self: ConfigurationFromContext, other: ConfigurationFromContext): Boolean {
return !other.isProvidedByMultiplatformProducer() || super.shouldReplace(self, other)
}
override fun findExistingConfiguration(context: ConfigurationContext): RunnerAndConfigurationSettings? = null
override fun isProducedByCommonProducer(configuration: ConfigurationFromContext): Boolean {
return configuration.isProducedBy(this.javaClass)
}
}
@@ -4,13 +4,29 @@ package org.jetbrains.kotlin.idea.gradleJava.testing.common
import com.intellij.execution.RunnerAndConfigurationSettings
import com.intellij.execution.actions.ConfigurationContext
import com.intellij.execution.actions.ConfigurationFromContext
import com.intellij.openapi.module.Module
import org.jetbrains.kotlin.idea.gradleJava.run.AbstractKotlinMultiplatformTestMethodGradleConfigurationProducer
import org.jetbrains.kotlin.idea.gradleJava.extensions.KotlinMultiplatformCommonProducersProvider
import org.jetbrains.kotlin.idea.gradleJava.run.isProvidedByMultiplatformProducer
import org.jetbrains.kotlin.platform.TargetPlatform
import org.jetbrains.kotlin.platform.isCommon
import org.jetbrains.kotlin.platform.jvm.isJvm
class KotlinMultiplatformCommonTestMethodGradleConfigurationProducer : AbstractKotlinMultiplatformTestMethodGradleConfigurationProducer() {
class KotlinMultiplatformCommonTestMethodGradleConfigurationProducer : AbstractKotlinMultiplatformTestMethodGradleConfigurationProducer(),
KotlinMultiplatformCommonProducersProvider {
override fun isApplicable(module: Module, platform: TargetPlatform) = platform.isCommon() || platform.isJvm()
override fun findExistingConfiguration(context: ConfigurationContext): RunnerAndConfigurationSettings? = null
override fun isPreferredConfiguration(self: ConfigurationFromContext, other: ConfigurationFromContext): Boolean {
return !other.isProvidedByMultiplatformProducer() || super.isPreferredConfiguration(self, other)
}
override fun shouldReplace(self: ConfigurationFromContext, other: ConfigurationFromContext): Boolean {
return !other.isProvidedByMultiplatformProducer() || super.shouldReplace(self, other)
}
override fun isProducedByCommonProducer(configuration: ConfigurationFromContext): Boolean {
return configuration.isProducedBy(this.javaClass)
}
}