Skip to content

Commit df51262

Browse files
committed
feat(sketch): enhance inspection and error handling in PsiErrorCollector #288
1 parent 5cb68ba commit df51262

File tree

2 files changed

+45
-5
lines changed

2 files changed

+45
-5
lines changed

core/src/main/kotlin/cc/unitmesh/devti/sketch/lint/PsiErrorCollector.kt

Lines changed: 40 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,13 @@ package cc.unitmesh.devti.sketch.lint
33
import com.intellij.analysis.AnalysisScope
44
import com.intellij.codeInsight.daemon.DaemonCodeAnalyzer
55
import com.intellij.codeInsight.daemon.impl.DaemonCodeAnalyzerEx
6+
import com.intellij.codeInsight.daemon.impl.DaemonProgressIndicator
7+
import com.intellij.codeInspection.InspectionEngine
68
import com.intellij.codeInspection.InspectionManager
9+
import com.intellij.codeInspection.ProblemDescriptor
710
import com.intellij.codeInspection.ex.GlobalInspectionContextBase
11+
import com.intellij.codeInspection.ex.LocalInspectionToolWrapper
12+
import com.intellij.codeInspection.util.InspectionMessage
813
import com.intellij.lang.annotation.HighlightSeverity
914
import com.intellij.openapi.Disposable
1015
import com.intellij.openapi.application.runReadAction
@@ -13,20 +18,51 @@ import com.intellij.openapi.fileEditor.FileDocumentManager
1318
import com.intellij.openapi.project.Project
1419
import com.intellij.openapi.util.Disposer
1520
import com.intellij.openapi.util.TextRange
21+
import com.intellij.profile.codeInspection.InspectionProjectProfileManager
1622
import com.intellij.psi.PsiElement
1723
import com.intellij.psi.PsiErrorElement
1824
import com.intellij.psi.PsiFile
25+
import com.intellij.util.PairProcessor
1926
import com.intellij.util.messages.MessageBusConnection
2027
import java.util.concurrent.CompletableFuture
2128
import java.util.concurrent.TimeUnit
2229

2330
object PsiErrorCollector {
24-
fun runInspections(project: Project, psiFile: PsiFile) {
31+
fun runInspections(project: Project, psiFile: PsiFile): List<@InspectionMessage String> {
2532
val scope = AnalysisScope(psiFile)
26-
val globalContext = InspectionManager.getInstance(project).createNewGlobalContext() as? GlobalInspectionContextBase
33+
val globalContext = InspectionManager.getInstance(project).createNewGlobalContext()
34+
as? GlobalInspectionContextBase ?: return emptyList()
2735

28-
globalContext?.currentScope = scope
29-
globalContext?.doInspections(scope)
36+
val inspectionProfile = InspectionProjectProfileManager.getInstance(project).currentProfile
37+
38+
val toolWrappers = inspectionProfile.getInspectionTools(psiFile)
39+
40+
globalContext.currentScope = scope
41+
toolWrappers.forEach {
42+
it.initialize(globalContext)
43+
}
44+
45+
val toolsCopy: MutableList<LocalInspectionToolWrapper> = ArrayList<LocalInspectionToolWrapper>(toolWrappers.size)
46+
for (tool in toolWrappers) {
47+
if (tool is LocalInspectionToolWrapper) {
48+
toolsCopy.add(tool.createCopy())
49+
}
50+
}
51+
52+
if (toolsCopy.isEmpty()) {
53+
return emptyList()
54+
}
55+
56+
val indicator = DaemonProgressIndicator()
57+
return runReadAction {
58+
val result: Map<LocalInspectionToolWrapper, List<ProblemDescriptor>> = InspectionEngine.inspectEx(
59+
toolsCopy, psiFile, psiFile.textRange, psiFile.textRange, false, false, true,
60+
indicator, PairProcessor.alwaysTrue<LocalInspectionToolWrapper?, ProblemDescriptor?>()
61+
)
62+
63+
val problems = result.values.flatten()
64+
return@runReadAction problems.map { it.descriptionTemplate }
65+
}
3066
}
3167

3268
/**

core/src/main/kotlin/cc/unitmesh/devti/sketch/ui/patch/SingleFileDiffSketch.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -216,8 +216,12 @@ class SingleFileDiffSketch(
216216

217217
val newFile = LightVirtualFile(currentFile.name, newCode)
218218
val psiFile = runReadAction { PsiManager.getInstance(myProject).findFile(newFile) } ?: return
219+
val runInspections = PsiErrorCollector.runInspections(myProject, psiFile)
220+
if (runInspections.isNotEmpty()) {
221+
showErrors(runInspections)
222+
}
223+
219224
PsiErrorCollector.collectSyntaxError(psiFile, myProject) { errors ->
220-
PsiErrorCollector.runInspections(myProject, psiFile)
221225
if (errors.isEmpty()) return@collectSyntaxError
222226
showErrors(errors)
223227
}

0 commit comments

Comments
 (0)