Skip to content

Commit 1a67593

Browse files
committed
fix(kotlin-provider): add PsiErrorElement handling and collect syntax errors
This commit fixes an issue where PsiErrorElements were not being handled properly, leading to incorrect behavior when parsing Kotlin files. The commit adds a new method to the RunService interface, `PsiFile.collectPsiError()`, which collects all syntax errors from a PsiErrorElement. This method is used to ensure that only valid Kotlin files are tested. Additionally, the `JavaAutoTestService` now checks for syntax errors before creating a configuration, ensuring that only valid Java files are tested.
1 parent 2b912f3 commit 1a67593

File tree

3 files changed

+36
-0
lines changed

3 files changed

+36
-0
lines changed

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,12 @@ class JavaAutoTestService : AutoTestService() {
3030
override fun isApplicable(element: PsiElement): Boolean = element.language is JavaLanguage
3131

3232
override fun createConfiguration(project: Project, virtualFile: VirtualFile): RunConfiguration? {
33+
val psiFile = PsiManager.getInstance(project).findFile(virtualFile) as? PsiJavaFile ?: return null
34+
35+
if(psiFile.collectPsiError().isNotEmpty()) {
36+
return null
37+
}
38+
3339
return createConfigForGradle(virtualFile, project)
3440
}
3541

@@ -148,6 +154,7 @@ class JavaAutoTestService : AutoTestService() {
148154
val document = FileDocumentManager.getInstance().getDocument(testFile)
149155
document?.setText(testFileContent)
150156

157+
// OptimizeImportsFix
151158
testFile
152159
}
153160
}

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,9 @@ class KotlinAutoTestService : AutoTestService() {
219219
val document = FileDocumentManager.getInstance().getDocument(testFile)
220220
document?.setText(testFileContent)
221221

222+
// TODO: fix import
223+
// org.jetbrains.kotlin.idea.quickfix.ImportFix
224+
222225
testFile
223226
}
224227
}

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

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,15 @@ import com.intellij.execution.RunnerAndConfigurationSettings
66
import com.intellij.execution.actions.ConfigurationContext
77
import com.intellij.execution.configurations.RunConfiguration
88
import com.intellij.execution.configurations.RunProfile
9+
import com.intellij.openapi.application.runReadAction
910
import com.intellij.openapi.diagnostic.Logger
1011
import com.intellij.openapi.diagnostic.logger
1112
import com.intellij.openapi.progress.ProgressManager
1213
import com.intellij.openapi.project.Project
1314
import com.intellij.openapi.vfs.VirtualFile
1415
import com.intellij.psi.PsiElement
16+
import com.intellij.psi.PsiErrorElement
17+
import com.intellij.psi.PsiFile
1518

1619
interface RunService {
1720
private val logger: Logger get() = logger<RunService>()
@@ -88,6 +91,29 @@ interface RunService {
8891
return settings
8992
}
9093

94+
fun PsiFile.collectPsiError(): MutableList<String> {
95+
val errors = mutableListOf<String>()
96+
val visitor = object : JavaSyntaxCheckingVisitor() {
97+
override fun visitElement(element: PsiElement) {
98+
if (element is PsiErrorElement) {
99+
errors.add("Syntax error at position ${element.textRange.startOffset}: ${element.errorDescription}")
100+
}
101+
super.visitElement(element)
102+
}
103+
}
104+
105+
this.accept(visitor)
106+
return errors
107+
}
108+
109+
abstract class JavaSyntaxCheckingVisitor : com.intellij.psi.PsiElementVisitor() {
110+
override fun visitElement(element: PsiElement) {
111+
runReadAction {
112+
element.children.forEach { it.accept(this) }
113+
}
114+
}
115+
}
116+
91117
private fun createDefaultTestConfigurations(project: Project, element: PsiElement): RunnerAndConfigurationSettings? {
92118
return ConfigurationContext(element).configurationsFromContext?.firstOrNull()?.configurationSettings
93119
}

0 commit comments

Comments
 (0)