@@ -7,22 +7,32 @@ import cc.unitmesh.devti.provider.AutoTestService
77import cc.unitmesh.idea.service.JavaAutoTestService.Companion.createConfigForGradle
88import cc.unitmesh.kotlin.util.KotlinPsiUtil
99import cc.unitmesh.kotlin.util.getReturnTypeReferences
10+ import com.intellij.codeInsight.daemon.DaemonCodeAnalyzer
11+ import com.intellij.codeInsight.daemon.impl.DaemonCodeAnalyzerEx
1012import com.intellij.execution.configurations.RunConfiguration
1113import com.intellij.execution.configurations.RunProfile
14+ import com.intellij.lang.annotation.HighlightSeverity
1215import com.intellij.openapi.application.ReadAction
1316import com.intellij.openapi.application.runReadAction
1417import com.intellij.openapi.command.WriteCommandAction
1518import com.intellij.openapi.diagnostic.logger
1619import com.intellij.openapi.fileEditor.FileDocumentManager
20+ import com.intellij.openapi.fileEditor.FileEditorManager
1721import com.intellij.openapi.project.Project
1822import com.intellij.openapi.project.guessProjectDir
23+ import com.intellij.openapi.util.Disposer
24+ import com.intellij.openapi.util.TextRange
1925import com.intellij.openapi.vfs.LocalFileSystem
2026import com.intellij.openapi.vfs.VirtualFile
2127import com.intellij.openapi.vfs.VirtualFileManager
2228import com.intellij.psi.PsiElement
2329import com.intellij.psi.PsiFile
30+ import com.intellij.psi.PsiJavaFile
31+ import com.intellij.psi.PsiManager
2432import com.intellij.psi.util.PsiTreeUtil
33+ import com.intellij.util.messages.MessageBusConnection
2534import org.jetbrains.kotlin.idea.KotlinLanguage
35+ import org.jetbrains.kotlin.idea.codeInsight.KotlinReferenceImporter
2636import org.jetbrains.kotlin.idea.references.mainReference
2737import org.jetbrains.kotlin.psi.*
2838import 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}
0 commit comments