Skip to content

Commit 49e2ae6

Browse files
committed
feat(devins-run): add default langauge runner support for configurations and test discovery #100
This commit introduces support for C++ test configurations and test discovery within the DevIns IDE. It includes modifications to the `TestCodeGenTask` to handle C++ test files and the `CppAutoTestService` to provide the necessary functionality for running C++ tests. The `psiFileClass` method is overridden to specify the `OCFile` class for C++ test files. The `PythonAutoTestService`, `JavaAutoTestService`, `KotlinAutoTestService`, `RustTestService`, `RunService`, `ScalaTestService`, `GoAutoTestService`, and `RunInsCommand` classes have also been modified to support the new C++ test functionality. These changes include overriding the `psiFileClass` method to specify the correct PsiElement class for each language and updating the `runFile` method to accept a `testElement` parameter for C++ tests. The `JSAutoTestService` has been updated to include the necessary functionality for JavaScript test discovery and execution.
1 parent fb588e3 commit 49e2ae6

File tree

11 files changed

+30
-13
lines changed

11 files changed

+30
-13
lines changed

cpp/src/233/main/kotlin/cc/unitmesh/cpp/provider/testing/CppAutoTestService.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,14 @@ import com.intellij.psi.PsiElement
1414
import com.intellij.psi.PsiFile
1515
import com.jetbrains.cidr.cpp.execution.testing.tcatch.CMakeCatchTestRunConfigurationType
1616
import com.jetbrains.cidr.lang.OCLanguage
17+
import com.jetbrains.cidr.lang.psi.OCFile
1718
import com.jetbrains.cidr.lang.psi.OCFunctionDeclaration
1819
import java.io.File
1920

2021
class CppAutoTestService : AutoTestService() {
2122
override fun runConfigurationClass(project: Project): Class<out RunProfile>? = null
23+
override fun psiFileClass(project: Project): Class<out PsiElement> = OCFile::class.java
24+
2225
override fun isApplicable(element: PsiElement): Boolean = element.language is OCLanguage
2326

2427
override fun createConfiguration(project: Project, virtualFile: VirtualFile): RunConfiguration? {

exts/devins-lang/src/main/kotlin/cc/unitmesh/devti/language/compiler/exec/RunInsCommand.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ class RunInsCommand(val myProject: Project, private val argument: String) : InsC
2121
PsiManager.getInstance(myProject).findFile(virtualFile) ?: return "<DevInsError>: File not found: $argument"
2222
val testService =
2323
AutoTestService.context(psiFile) ?: return "<DevInsError>: No test service found for file: $argument"
24-
testService.runFile(myProject, virtualFile)
24+
testService.runFile(myProject, virtualFile, null)
2525

2626
return "Running tests for file: $argument"
2727
} catch (e: Exception) {

goland/src/main/kotlin/cc/unitmesh/go/provider/testing/GoAutoTestService.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ import com.intellij.testIntegration.TestFinderHelper
2727
class GoAutoTestService : AutoTestService() {
2828
override fun isApplicable(element: PsiElement): Boolean = element.containingFile?.language == GoLanguage.INSTANCE
2929
override fun runConfigurationClass(project: Project): Class<out RunProfile> = GoTestRunConfiguration::class.java
30+
override fun psiFileClass(project: Project): Class<out PsiElement> = GoFile::class.java
31+
3032
override fun lookupRelevantClass(project: Project, element: PsiElement): List<ClassContext> = listOf()
3133

3234
override fun createConfiguration(project: Project, virtualFile: VirtualFile): RunConfiguration? {

java/src/main/kotlin/cc/unitmesh/idea/service/JavaAutoTestService.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import java.io.File
2828
class JavaAutoTestService : AutoTestService() {
2929
override fun runConfigurationClass(project: Project): Class<out RunProfile> = GradleRunConfiguration::class.java
3030
override fun isApplicable(element: PsiElement): Boolean = element.language is JavaLanguage
31+
override fun psiFileClass(project: Project): Class<out PsiElement> = PsiJavaFile::class.java
3132

3233
override fun createConfiguration(project: Project, virtualFile: VirtualFile): RunConfiguration? {
3334
return createConfigForGradle(virtualFile, project)

javascript/src/main/kotlin/cc/unitmesh/ide/javascript/provider/testing/JSAutoTestService.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ import kotlin.io.path.Path
3636
class JSAutoTestService : AutoTestService() {
3737
val log = logger<JSAutoTestService>()
3838
override fun runConfigurationClass(project: Project): Class<out RunProfile> = NpmRunConfiguration::class.java
39+
override fun psiFileClass(project: Project): Class<out PsiElement> = JSFile::class.java
3940

4041
override fun isApplicable(element: PsiElement): Boolean {
4142
val sourceFile: PsiFile = element.containingFile ?: return false

kotlin/src/main/kotlin/cc/unitmesh/kotlin/provider/KotlinAutoTestService.kt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,11 @@ import org.jetbrains.plugins.gradle.service.execution.GradleRunConfiguration
3030
import java.io.File
3131

3232
class KotlinAutoTestService : AutoTestService() {
33-
companion object {
34-
val log = logger<KotlinAutoTestService>()
35-
}
33+
private val log = logger<KotlinAutoTestService>()
3634

3735
override fun runConfigurationClass(project: Project): Class<out RunProfile> = GradleRunConfiguration::class.java
3836
override fun isApplicable(element: PsiElement): Boolean = element.language is KotlinLanguage
37+
override fun psiFileClass(project: Project): Class<out PsiElement> = KtFile::class.java
3938

4039
override fun createConfiguration(project: Project, virtualFile: VirtualFile): RunConfiguration? {
4140
return createConfigForGradle(virtualFile, project)

pycharm/src/main/kotlin/cc/unitmesh/python/provider/PythonAutoTestService.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,8 @@ import com.jetbrains.python.run.PythonRunConfigurationProducer
2626

2727
class PythonAutoTestService : AutoTestService() {
2828
override fun isApplicable(element: PsiElement): Boolean = element.language is PythonLanguage
29-
3029
override fun runConfigurationClass(project: Project): Class<out RunProfile> = PythonRunConfiguration::class.java
30+
override fun psiFileClass(project: Project): Class<out PsiElement> = PyFile::class.java
3131

3232
override fun createConfiguration(project: Project, virtualFile: VirtualFile): RunConfiguration? {
3333
val psiFile: PyFile = PsiManager.getInstance(project).findFile(virtualFile) as? PyFile ?: return null

rust/src/main/kotlin/cc/unitmesh/rust/provider/RustTestService.kt

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import com.intellij.execution.configurations.RunProfile
1111
import com.intellij.openapi.application.ReadAction
1212
import com.intellij.openapi.application.runReadAction
1313
import com.intellij.openapi.project.Project
14-
import com.intellij.openapi.project.guessProjectDir
1514
import com.intellij.openapi.vfs.VirtualFile
1615
import com.intellij.psi.PsiElement
1716
import com.intellij.psi.PsiFile
@@ -27,10 +26,8 @@ import org.rust.lang.core.psi.*
2726

2827
class RustTestService : AutoTestService() {
2928
override fun runConfigurationClass(project: Project): Class<out RunProfile> = CargoCommandConfiguration::class.java
30-
31-
override fun isApplicable(element: PsiElement): Boolean {
32-
return element.language is RsLanguage
33-
}
29+
override fun isApplicable(element: PsiElement): Boolean = element.language is RsLanguage
30+
override fun psiFileClass(project: Project): Class<out PsiElement> = RsFile::class.java
3431

3532
override fun createConfiguration(project: Project, virtualFile: VirtualFile): RunConfiguration? {
3633
val pkg = findCargoPackage(project, virtualFile) ?: return null

scala/src/main/kotlin/cc/unitmesh/scala/provider/ScalaTestService.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import org.jetbrains.plugins.scala.testingSupport.test.testdata.AllInPackageTest
2121
class ScalaTestService : AutoTestService() {
2222
override fun isApplicable(element: PsiElement): Boolean = element is ScalaPsiElement
2323
override fun runConfigurationClass(project: Project): Class<out RunProfile>? = ScalaTestRunConfiguration::class.java
24+
override fun psiFileClass(project: Project): Class<out PsiElement> = ScalaFile::class.java
2425

2526
override fun createConfiguration(project: Project, virtualFile: VirtualFile): RunConfiguration? {
2627
val scalaFile = PsiManager.getInstance(project).findFile(virtualFile) as? ScalaFile ?: return null

src/main/kotlin/cc/unitmesh/devti/intentions/action/task/TestCodeGenTask.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,8 @@ class TestCodeGenTask(val request: TestCodeGenRequest) :
131131
runBlocking {
132132
writeTestToFile(request.project, flow, testContext)
133133
navigateTestFile(testContext.outputFile, request.project)
134-
autoTestService?.runFile(request.project, testContext.outputFile)
134+
135+
autoTestService?.runFile(request.project, testContext.outputFile, testContext.testElement)
135136

136137
AutoDevStatusService.notifyApplication(AutoDevStatus.Ready)
137138
indicator.fraction = 1.0

src/main/kotlin/cc/unitmesh/devti/provider/RunService.kt

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import com.intellij.execution.ExecutionManager
44
import com.intellij.execution.Executor
55
import com.intellij.execution.RunManager
66
import com.intellij.execution.RunnerAndConfigurationSettings
7+
import com.intellij.execution.actions.ConfigurationContext
78
import com.intellij.execution.configurations.RunConfiguration
89
import com.intellij.execution.configurations.RunProfile
910
import com.intellij.execution.executors.DefaultRunExecutor
@@ -13,6 +14,7 @@ import com.intellij.openapi.diagnostic.Logger
1314
import com.intellij.openapi.diagnostic.logger
1415
import com.intellij.openapi.project.Project
1516
import com.intellij.openapi.vfs.VirtualFile
17+
import com.intellij.psi.PsiElement
1618

1719
interface RunService {
1820
private val logger: Logger get() = logger<RunService>()
@@ -25,6 +27,8 @@ interface RunService {
2527
*/
2628
fun runConfigurationClass(project: Project): Class<out RunProfile>?
2729

30+
fun psiFileClass(project: Project): Class<out PsiElement>
31+
2832
fun createConfiguration(project: Project, virtualFile: VirtualFile): RunConfiguration? = null
2933

3034
/**
@@ -80,8 +84,12 @@ interface RunService {
8084
* @param virtualFile The virtual file that represents the file to be run.
8185
* @return The result of the run operation, or `null` if an error occurred.
8286
*/
83-
fun runFile(project: Project, virtualFile: VirtualFile): String? {
84-
val settings = createRunSettings(project, virtualFile) ?: return null
87+
fun runFile(project: Project, virtualFile: VirtualFile, testElement: PsiElement?): String? {
88+
var settings: RunnerAndConfigurationSettings? = createRunSettings(project, virtualFile)
89+
if (settings == null) {
90+
settings = createDefaultTestConfigurations(project, testElement ?: return null) ?: return null
91+
}
92+
8593
val executor: Executor = DefaultRunExecutor.getRunExecutorInstance()
8694
val builder = ExecutionEnvironmentBuilder.createOrNull(executor, settings) ?: return null
8795

@@ -90,4 +98,8 @@ interface RunService {
9098

9199
return null
92100
}
101+
102+
fun createDefaultTestConfigurations(project: Project, element: PsiElement): RunnerAndConfigurationSettings? {
103+
return ConfigurationContext(element).configurationsFromContext?.firstOrNull()?.configurationSettings
104+
}
93105
}

0 commit comments

Comments
 (0)