1use tower_lsp::lsp_types::Position;
6
7#[derive(Debug, Clone, PartialEq, Eq)]
10pub enum TokenType {
11 Keyword,
13 Identifier,
15 String,
17 Number,
19 Operator,
21 Delimiter,
23 Comment,
25 Whitespace,
27 Unknown,
29}
30
31#[derive(Debug, Clone)]
33pub struct Token {
34 pub token_type: TokenType,
36 pub text: String,
38 pub position: Position,
40 pub length: u32,
42}
43
44impl Token {
45 pub fn new(token_type: TokenType, text: String, position: Position) -> Self {
46 let length = text.len() as u32;
47 Self {
48 token_type,
49 text,
50 position,
51 length,
52 }
53 }
54}
55
56pub struct Keywords;
58
59impl Keywords {
60 pub fn all() -> Vec<&'static str> {
62 vec![
63 "SELECT",
65 "INSERT",
66 "UPDATE",
67 "DELETE",
68 "REPLACE",
69 "CREATE",
71 "DROP",
72 "ALTER",
73 "TRUNCATE",
74 "RENAME",
75 "TABLE",
77 "INDEX",
78 "VIEW",
79 "DATABASE",
80 "SCHEMA",
81 "JOIN",
83 "INNER",
84 "LEFT",
85 "RIGHT",
86 "FULL",
87 "OUTER",
88 "CROSS",
89 "ON",
90 "WHERE",
92 "HAVING",
93 "AND",
94 "OR",
95 "NOT",
96 "IN",
97 "LIKE",
98 "BETWEEN",
99 "IS",
100 "NULL",
101 "GROUP",
103 "BY",
104 "ORDER",
105 "ASC",
106 "DESC",
107 "LIMIT",
109 "OFFSET",
110 "FETCH",
111 "COUNT",
113 "SUM",
114 "AVG",
115 "MAX",
116 "MIN",
117 "DISTINCT",
118 "AS",
120 "FROM",
121 "INTO",
122 "SET",
123 "VALUES",
124 "UNION",
125 "ALL",
126 "EXISTS",
127 "CASE",
128 "WHEN",
129 "THEN",
130 "ELSE",
131 "END",
132 "IF",
133 "ELSEIF",
134 "ELSE",
135 "ENDIF",
136 "FOR",
137 "WHILE",
138 "LOOP",
139 "END",
140 "DECLARE",
141 "BEGIN",
142 "COMMIT",
143 "ROLLBACK",
144 "TRANSACTION",
145 "GRANT",
146 "REVOKE",
147 "PRIVILEGES",
148 ]
149 }
150
151 pub fn is_keyword(text: &str) -> bool {
153 Self::all().contains(&text.to_uppercase().as_str())
154 }
155
156 pub fn mysql() -> Vec<&'static str> {
158 vec![
159 "AUTO_INCREMENT",
160 "ENGINE",
161 "CHARSET",
162 "COLLATE",
163 "SHOW",
164 "DESCRIBE",
165 "EXPLAIN",
166 "USE",
167 "LOCK",
168 "UNLOCK",
169 "TABLES",
170 ]
171 }
172
173 pub fn postgres() -> Vec<&'static str> {
175 vec![
176 "ILIKE",
177 "SIMILAR",
178 "TO",
179 "ARRAY",
180 "JSONB",
181 "RETURNING",
182 "WITH",
183 "RECURSIVE",
184 ]
185 }
186
187 pub fn hive() -> Vec<&'static str> {
189 vec![
190 "PARTITION",
191 "PARTITIONED",
192 "CLUSTERED",
193 "SORTED",
194 "STORED",
195 "AS",
196 "TEXTFILE",
197 "ORCFILE",
198 "PARQUET",
199 "LATERAL",
200 "VIEW",
201 "EXPLODE",
202 ]
203 }
204}
205
206pub struct Operators;
208
209impl Operators {
210 pub fn all() -> Vec<&'static str> {
212 vec![
213 "+", "-", "*", "/", "%", "=", "!=", "<>", "<", ">", "<=", ">=", "<=>", "AND", "OR", "NOT", "||", "&&", "::", "->", "->>", "#>", "#>>",
218 ]
219 }
220
221 pub fn is_operator(text: &str) -> bool {
223 Self::all().contains(&text)
224 }
225}
226
227pub struct Delimiters;
229
230impl Delimiters {
231 pub fn all() -> Vec<&'static str> {
233 vec![",", ";", ".", "(", ")", "[", "]", "{", "}", ":"]
234 }
235
236 pub fn is_delimiter(text: &str) -> bool {
238 Self::all().contains(&text)
239 }
240}