Skip to content

Commit 6a751c2

Browse files
committed
refactor(kotlin): optimize syntax error handling and fix warnings
- Import necessary classes for syntax error handling - Implement a more efficient way to handle syntax errors - Fix a log message to use warn instead of error
1 parent 93eb5cf commit 6a751c2

File tree

2 files changed

+61
-4
lines changed

2 files changed

+61
-4
lines changed

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

Lines changed: 60 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,22 +7,32 @@ import cc.unitmesh.devti.provider.AutoTestService
77
import cc.unitmesh.idea.service.JavaAutoTestService.Companion.createConfigForGradle
88
import cc.unitmesh.kotlin.util.KotlinPsiUtil
99
import cc.unitmesh.kotlin.util.getReturnTypeReferences
10+
import com.intellij.codeInsight.daemon.DaemonCodeAnalyzer
11+
import com.intellij.codeInsight.daemon.impl.DaemonCodeAnalyzerEx
1012
import com.intellij.execution.configurations.RunConfiguration
1113
import com.intellij.execution.configurations.RunProfile
14+
import com.intellij.lang.annotation.HighlightSeverity
1215
import com.intellij.openapi.application.ReadAction
1316
import com.intellij.openapi.application.runReadAction
1417
import com.intellij.openapi.command.WriteCommandAction
1518
import com.intellij.openapi.diagnostic.logger
1619
import com.intellij.openapi.fileEditor.FileDocumentManager
20+
import com.intellij.openapi.fileEditor.FileEditorManager
1721
import com.intellij.openapi.project.Project
1822
import com.intellij.openapi.project.guessProjectDir
23+
import com.intellij.openapi.util.Disposer
24+
import com.intellij.openapi.util.TextRange
1925
import com.intellij.openapi.vfs.LocalFileSystem
2026
import com.intellij.openapi.vfs.VirtualFile
2127
import com.intellij.openapi.vfs.VirtualFileManager
2228
import com.intellij.psi.PsiElement
2329
import com.intellij.psi.PsiFile
30+
import com.intellij.psi.PsiJavaFile
31+
import com.intellij.psi.PsiManager
2432
import com.intellij.psi.util.PsiTreeUtil
33+
import com.intellij.util.messages.MessageBusConnection
2534
import org.jetbrains.kotlin.idea.KotlinLanguage
35+
import org.jetbrains.kotlin.idea.codeInsight.KotlinReferenceImporter
2636
import org.jetbrains.kotlin.idea.references.mainReference
2737
import org.jetbrains.kotlin.psi.*
2838
import org.jetbrains.kotlin.psi.psiUtil.getValueParameters
@@ -220,11 +230,58 @@ class KotlinAutoTestService : AutoTestService() {
220230

221231
val document = FileDocumentManager.getInstance().getDocument(testFile)
222232
document?.setText(testFileContent)
233+
testFile
234+
}
235+
}
223236

224-
// TODO: fix import
225-
// org.jetbrains.kotlin.idea.quickfix.ImportFix
237+
override fun collectSyntaxError(
238+
outputFile: VirtualFile,
239+
project: Project,
240+
runAction: ((errors: List<String>) -> Unit)?
241+
) {
242+
val sourceFile: KtFile = runReadAction { PsiManager.getInstance(project).findFile(outputFile) as? KtFile } ?: return
243+
val collectPsiError = sourceFile.collectPsiError()
244+
if (collectPsiError.isNotEmpty()) {
245+
runAction?.invoke(collectPsiError)
246+
return
247+
}
226248

227-
testFile
249+
val document = runReadAction { FileDocumentManager.getInstance().getDocument(outputFile) } ?: return
250+
val range = TextRange(0, document.textLength)
251+
252+
DaemonCodeAnalyzerEx.getInstance(project).restart(sourceFile);
253+
254+
val hintDisposable = Disposer.newDisposable()
255+
val busConnection: MessageBusConnection = project.messageBus.connect(hintDisposable)
256+
257+
class DaemonListener : DaemonCodeAnalyzer.DaemonListener {
258+
val errors = mutableListOf<String>()
259+
260+
override fun daemonFinished() {
261+
DaemonCodeAnalyzerEx.processHighlights(document, project, HighlightSeverity.ERROR, range.startOffset, range.endOffset) {
262+
if (it.description != null) {
263+
errors.add(it.description)
264+
}
265+
266+
true
267+
}
268+
269+
runAction?.invoke(errors)
270+
busConnection.disconnect()
271+
Disposer.dispose(hintDisposable)
272+
}
228273
}
274+
275+
busConnection.subscribe<DaemonCodeAnalyzer.DaemonListener>(
276+
DaemonCodeAnalyzer.DAEMON_EVENT_TOPIC,
277+
DaemonListener()
278+
)
279+
}
280+
281+
override fun tryFixSyntaxError(outputFile: VirtualFile, project: Project) {
282+
val sourceFile = PsiManager.getInstance(project).findFile(outputFile) as? KtFile ?: return
283+
val editor = FileEditorManager.getInstance(project).selectedTextEditor ?: return
284+
val importer = KotlinReferenceImporter()
285+
importer.autoImportReferenceAtCursor(editor, sourceFile)
229286
}
230287
}

src/main/kotlin/cc/unitmesh/devti/runner/RunServiceTask.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ class RunServiceTask(
5555
fun doRun(indicator: ProgressIndicator?): RunnerResult? {
5656
val settings: RunnerAndConfigurationSettings? = runService.createRunSettings(project, virtualFile, testElement)
5757
if (settings == null) {
58-
logger<RunServiceTask>().error("No run configuration found for file: ${virtualFile.path}")
58+
logger<RunServiceTask>().warn("No run configuration found for file: ${virtualFile.path}")
5959
return null
6060
}
6161

0 commit comments

Comments
 (0)