@@ -7,6 +7,7 @@ import com.intellij.codeInsight.daemon.impl.DaemonProgressIndicator
7
7
import com.intellij.codeInspection.InspectionEngine
8
8
import com.intellij.codeInspection.InspectionManager
9
9
import com.intellij.codeInspection.ProblemDescriptor
10
+ import com.intellij.codeInspection.ProblemHighlightType
10
11
import com.intellij.codeInspection.ex.GlobalInspectionContextBase
11
12
import com.intellij.codeInspection.ex.LocalInspectionToolWrapper
12
13
import com.intellij.codeInspection.util.InspectionMessage
@@ -16,6 +17,8 @@ import com.intellij.openapi.application.runReadAction
16
17
import com.intellij.openapi.editor.Document
17
18
import com.intellij.openapi.fileEditor.FileDocumentManager
18
19
import com.intellij.openapi.project.Project
20
+ import com.intellij.openapi.ui.popup.JBPopup
21
+ import com.intellij.openapi.ui.popup.JBPopupFactory
19
22
import com.intellij.openapi.util.Disposer
20
23
import com.intellij.openapi.util.TextRange
21
24
import com.intellij.openapi.vfs.VirtualFile
@@ -24,13 +27,85 @@ import com.intellij.psi.PsiElement
24
27
import com.intellij.psi.PsiErrorElement
25
28
import com.intellij.psi.PsiFile
26
29
import com.intellij.psi.PsiManager
30
+ import com.intellij.ui.components.JBLabel
31
+ import com.intellij.ui.components.JBScrollPane
32
+ import com.intellij.ui.table.JBTable
27
33
import com.intellij.util.PairProcessor
28
34
import com.intellij.util.messages.MessageBusConnection
35
+ import java.awt.Dimension
36
+ import java.awt.event.MouseAdapter
37
+ import java.awt.event.MouseEvent
29
38
import java.util.concurrent.CompletableFuture
30
39
import java.util.concurrent.TimeUnit
40
+ import javax.swing.BorderFactory
41
+ import javax.swing.JPanel
42
+ import javax.swing.JTable
43
+ import javax.swing.table.DefaultTableModel
44
+
45
+ data class SketchInspectionError (
46
+ val lineNumber : Int ,
47
+ val description : String ,
48
+ val highlightType : ProblemHighlightType ,
49
+ ) {
50
+ companion object {
51
+ fun from (problemDescriptor : ProblemDescriptor ): SketchInspectionError {
52
+ return SketchInspectionError (
53
+ problemDescriptor.lineNumber,
54
+ problemDescriptor.descriptionTemplate,
55
+ problemDescriptor.highlightType
56
+ )
57
+ }
58
+ }
59
+ }
60
+
61
+ object PsiErrorUI {
62
+ fun showErrors (errors : List <SketchInspectionError >, panel : JPanel ) {
63
+ val columnNames = arrayOf(" Line" , " Description" , " Highlight Type" )
64
+ val data = errors.map {
65
+ arrayOf(it.lineNumber, it.description, it.highlightType.toString())
66
+ }.toTypedArray()
67
+
68
+ val tableModel = DefaultTableModel (data, columnNames)
69
+
70
+ val table = JBTable (tableModel).apply {
71
+ autoResizeMode = JTable .AUTO_RESIZE_ALL_COLUMNS
72
+ }
73
+
74
+ val scrollPane = JBScrollPane (table).apply {
75
+ preferredSize = Dimension (600 , 300 )
76
+ }
77
+ val errorLabel = JBLabel (" Found Lint issue: ${errors.size} " ).apply {
78
+ border = BorderFactory .createEmptyBorder(5 , 5 , 5 , 5 )
79
+ }
80
+ errorLabel.addMouseListener(object : MouseAdapter () {
81
+ override fun mouseClicked (e : MouseEvent ? ) {
82
+ createErrorButton(scrollPane, table, errors).showInCenterOf(panel)
83
+ }
84
+
85
+ // hover also show tip
86
+ override fun mouseEntered (e : MouseEvent ) {
87
+ errorLabel.toolTipText = " Click to view all errors"
88
+ }
89
+ })
90
+
91
+ panel.add(errorLabel)
92
+ }
93
+
94
+ private fun createErrorButton (
95
+ scrollPane : JBScrollPane ,
96
+ table : JBTable ,
97
+ errors : List <SketchInspectionError >
98
+ ): JBPopup = JBPopupFactory .getInstance()
99
+ .createComponentPopupBuilder(scrollPane, table)
100
+ .setTitle(" Found Lint Issues: ${errors.size} " )
101
+ .setResizable(true )
102
+ .setMovable(true )
103
+ .setRequestFocus(true )
104
+ .createPopup()
105
+ }
31
106
32
107
object PsiErrorCollector {
33
- fun runInspections (project : Project , psiFile : PsiFile , originFile : VirtualFile ): List <@ InspectionMessage String > {
108
+ fun runInspections (project : Project , psiFile : PsiFile , originFile : VirtualFile ): List <SketchInspectionError > {
34
109
val globalContext = InspectionManager .getInstance(project).createNewGlobalContext()
35
110
as ? GlobalInspectionContextBase ? : return emptyList()
36
111
@@ -54,12 +129,11 @@ object PsiErrorCollector {
54
129
55
130
val problems = result.values.flatten()
56
131
return @runReadAction problems.sortedBy { it.lineNumber }.distinctBy { it.lineNumber }.map {
57
- " Line ${it.lineNumber + 1 } : ${it.descriptionTemplate} "
132
+ SketchInspectionError .from(it)
58
133
}
59
134
}
60
135
}
61
136
62
- // skip NpmUsedModulesInstalled, ProblematicWhitespace, JSXUnresolvedComponent, UnterminatedStatement, UnterminatedStatementJS
63
137
private val frontEndSkipError =
64
138
setOf (
65
139
" NpmUsedModulesInstalled" ,
@@ -76,9 +150,11 @@ object PsiErrorCollector {
76
150
): MutableList <LocalInspectionToolWrapper > {
77
151
val inspectionProfile = InspectionProjectProfileManager .getInstance(project).currentProfile
78
152
val toolWrappers = inspectionProfile.getInspectionTools(psiFile)
79
- .filter { it.isApplicable(psiFile.language) }
80
- .filter { it.shortName !in frontEndSkipError }
81
- .filter { it.defaultLevel.severity == HighlightSeverity .WARNING || it.defaultLevel.severity == HighlightSeverity .ERROR }
153
+ .filter {
154
+ it.isApplicable(psiFile.language)
155
+ && it.displayKey?.id !in frontEndSkipError
156
+ && it.defaultLevel.severity == HighlightSeverity .WARNING || it.defaultLevel.severity == HighlightSeverity .ERROR
157
+ }
82
158
83
159
toolWrappers.forEach {
84
160
it.initialize(globalContext)
0 commit comments