-
Notifications
You must be signed in to change notification settings - Fork 496
/
SqlDelightHighlightVisitor.kt
149 lines (133 loc) · 4.78 KB
/
SqlDelightHighlightVisitor.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
package app.cash.sqldelight.intellij.lang
import app.cash.sqldelight.core.SqlDelightProjectService
import app.cash.sqldelight.core.lang.SqlDelightFile
import app.cash.sqldelight.core.psi.SqlDelightImportStmt
import app.cash.sqldelight.core.psi.SqlDelightStmtIdentifier
import com.alecstrong.sql.psi.core.psi.AliasElement
import com.alecstrong.sql.psi.core.psi.SqlColumnName
import com.alecstrong.sql.psi.core.psi.SqlFunctionName
import com.alecstrong.sql.psi.core.psi.SqlIdentifier
import com.alecstrong.sql.psi.core.psi.SqlTableName
import com.alecstrong.sql.psi.core.psi.SqlTypeName
import com.alecstrong.sql.psi.core.psi.SqlVisitor
import com.intellij.codeInsight.daemon.impl.HighlightInfo
import com.intellij.codeInsight.daemon.impl.HighlightInfoType
import com.intellij.codeInsight.daemon.impl.HighlightVisitor
import com.intellij.codeInsight.daemon.impl.analysis.HighlightInfoHolder
import com.intellij.openapi.editor.DefaultLanguageHighlighterColors
import com.intellij.openapi.editor.colors.TextAttributesKey
import com.intellij.psi.PsiElement
import com.intellij.psi.PsiFile
class SqlDelightHighlightVisitor : SqlVisitor(), HighlightVisitor {
private var myHolder: HighlightInfoHolder? = null
override fun suitableForFile(file: PsiFile): Boolean {
if (file !is SqlDelightFile) return false
val module = file.module ?: return false
return SqlDelightProjectService.getInstance(file.project).fileIndex(module).isConfigured
}
override fun visit(element: PsiElement) {
when (element) {
is AliasElement -> visitAliasElement(element)
is SqlColumnName -> visitColumnName(element)
is SqlFunctionName -> visitFunctionName(element)
is SqlIdentifier -> visitIdentifier(element)
is SqlTableName -> visitTableName(element)
is SqlTypeName -> visitTypeName(element)
is SqlDelightImportStmt -> visitImportStmt(element)
}
}
override fun analyze(
file: PsiFile,
updateWholeFile: Boolean,
holder: HighlightInfoHolder,
action: Runnable,
): Boolean {
myHolder = holder
try {
action.run()
} finally {
myHolder = null
}
return true
}
override fun clone(): HighlightVisitor {
return SqlDelightHighlightVisitor()
}
override fun visitColumnName(o: SqlColumnName) {
val info = HighlightInfo.newHighlightInfo(createSymbolTypeInfo(SQL_COLUMN_NAME))
.range(o)
.create()
myHolder?.add(info)
}
override fun visitFunctionName(o: SqlFunctionName) {
val info = HighlightInfo.newHighlightInfo(createSymbolTypeInfo(SQL_FUNCTION_NAME))
.range(o)
.create()
myHolder?.add(info)
}
override fun visitIdentifier(o: SqlIdentifier) {
if (o.parent is SqlDelightStmtIdentifier) {
val info = HighlightInfo.newHighlightInfo(createSymbolTypeInfo(SQL_STMT_IDENTIFIER_NAME))
.range(o)
.create()
myHolder?.add(info)
}
}
override fun visitTypeName(o: SqlTypeName) {
val info = HighlightInfo.newHighlightInfo(createSymbolTypeInfo(SQL_TYPE_NAME))
.range(o)
.create()
myHolder?.add(info)
}
override fun visitTableName(o: SqlTableName) {
val info = HighlightInfo.newHighlightInfo(createSymbolTypeInfo(SQL_TABLE_NAME))
.range(o)
.create()
myHolder?.add(info)
}
override fun visitAliasElement(o: AliasElement) {
val info = HighlightInfo.newHighlightInfo(createSymbolTypeInfo(SQL_ALIAS))
.range(o)
.create()
myHolder?.add(info)
}
private fun visitImportStmt(o: SqlDelightImportStmt) {
val info = HighlightInfo.newHighlightInfo(createSymbolTypeInfo(SQL_TYPE_NAME))
.range(o.firstChild.textRange)
.create()
myHolder?.add(info)
}
private fun createSymbolTypeInfo(attributesKey: TextAttributesKey): HighlightInfoType {
return HighlightInfoType.HighlightInfoTypeImpl(
HighlightInfoType.SYMBOL_TYPE_SEVERITY,
attributesKey,
false,
)
}
companion object {
val SQL_ALIAS = TextAttributesKey.createTextAttributesKey(
"SQL.ALIAS",
DefaultLanguageHighlighterColors.LOCAL_VARIABLE,
)
val SQL_COLUMN_NAME = TextAttributesKey.createTextAttributesKey(
"SQL.COLUMN_NAME",
DefaultLanguageHighlighterColors.INSTANCE_FIELD,
)
val SQL_FUNCTION_NAME = TextAttributesKey.createTextAttributesKey(
"SQL.FUNCTION_NAME",
DefaultLanguageHighlighterColors.STATIC_METHOD,
)
val SQL_STMT_IDENTIFIER_NAME = TextAttributesKey.createTextAttributesKey(
"SQL.STMT_IDENTIFIER_NAME",
DefaultLanguageHighlighterColors.INSTANCE_METHOD,
)
val SQL_TABLE_NAME = TextAttributesKey.createTextAttributesKey(
"SQL.TABLE_NAME",
DefaultLanguageHighlighterColors.CLASS_NAME,
)
val SQL_TYPE_NAME = TextAttributesKey.createTextAttributesKey(
"SQL.TYPE_NAME",
DefaultLanguageHighlighterColors.KEYWORD,
)
}
}