sql_lsp/
token.rs

1//! Token 类型定义
2//! 参考 sqls-server/sqls 的 token 实现
3//! https://github.com/sqls-server/sqls/tree/master/token
4
5use tower_lsp::lsp_types::Position;
6
7/// Token 类型
8/// 参考 sqls 的 token 类型定义
9#[derive(Debug, Clone, PartialEq, Eq)]
10pub enum TokenType {
11    // 关键字
12    Keyword,
13    // 标识符(表名、列名等)
14    Identifier,
15    // 字符串字面量
16    String,
17    // 数字字面量
18    Number,
19    // 操作符
20    Operator,
21    // 分隔符(逗号、分号等)
22    Delimiter,
23    // 注释
24    Comment,
25    // 空白
26    Whitespace,
27    // 未知/错误
28    Unknown,
29}
30
31/// Token 信息
32#[derive(Debug, Clone)]
33pub struct Token {
34    /// Token 类型
35    pub token_type: TokenType,
36    /// Token 文本内容
37    pub text: String,
38    /// Token 在源代码中的位置
39    pub position: Position,
40    /// Token 长度
41    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
56/// SQL 关键字列表(参考 sqls)
57pub struct Keywords;
58
59impl Keywords {
60    /// 获取所有 SQL 关键字
61    pub fn all() -> Vec<&'static str> {
62        vec![
63            // DML
64            "SELECT",
65            "INSERT",
66            "UPDATE",
67            "DELETE",
68            "REPLACE",
69            // DDL
70            "CREATE",
71            "DROP",
72            "ALTER",
73            "TRUNCATE",
74            "RENAME",
75            // 表相关
76            "TABLE",
77            "INDEX",
78            "VIEW",
79            "DATABASE",
80            "SCHEMA",
81            // JOIN
82            "JOIN",
83            "INNER",
84            "LEFT",
85            "RIGHT",
86            "FULL",
87            "OUTER",
88            "CROSS",
89            "ON",
90            // WHERE/HAVING
91            "WHERE",
92            "HAVING",
93            "AND",
94            "OR",
95            "NOT",
96            "IN",
97            "LIKE",
98            "BETWEEN",
99            "IS",
100            "NULL",
101            // GROUP/ORDER
102            "GROUP",
103            "BY",
104            "ORDER",
105            "ASC",
106            "DESC",
107            // LIMIT/OFFSET
108            "LIMIT",
109            "OFFSET",
110            "FETCH",
111            // 聚合函数
112            "COUNT",
113            "SUM",
114            "AVG",
115            "MAX",
116            "MIN",
117            "DISTINCT",
118            // 其他
119            "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    /// 检查是否是关键字
152    pub fn is_keyword(text: &str) -> bool {
153        Self::all().contains(&text.to_uppercase().as_str())
154    }
155
156    /// 获取 MySQL 特定关键字
157    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    /// 获取 PostgreSQL 特定关键字
174    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    /// 获取 Hive 特定关键字
188    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
206/// 操作符列表
207pub struct Operators;
208
209impl Operators {
210    /// 获取所有操作符
211    pub fn all() -> Vec<&'static str> {
212        vec![
213            // 算术操作符
214            "+", "-", "*", "/", "%", // 比较操作符
215            "=", "!=", "<>", "<", ">", "<=", ">=", "<=>", // 逻辑操作符
216            "AND", "OR", "NOT", // 其他
217            "||", "&&", "::", "->", "->>", "#>", "#>>",
218        ]
219    }
220
221    /// 检查是否是操作符
222    pub fn is_operator(text: &str) -> bool {
223        Self::all().contains(&text)
224    }
225}
226
227/// 分隔符列表
228pub struct Delimiters;
229
230impl Delimiters {
231    /// 获取所有分隔符
232    pub fn all() -> Vec<&'static str> {
233        vec![",", ";", ".", "(", ")", "[", "]", "{", "}", ":"]
234    }
235
236    /// 检查是否是分隔符
237    pub fn is_delimiter(text: &str) -> bool {
238        Self::all().contains(&text)
239    }
240}