z_mirror/luapls

git clone https://git.raiguard.me/z_mirror/luapls

Caleb HeuerStart a proper annotation parserb6e515c

main
3.2 KiB231 linesraw
1package token
2
3import (
4	"encoding/json"
5	"fmt"
6	"strings"
7)
8
9type TokenType int
10
11const (
12	INVALID TokenType = iota
13	EOF
14	COMMENT
15	WHITESPACE
16
17	// Variable
18	IDENT
19	LABEL
20
21	// Keywords
22	BREAK
23	DO
24	ELSE
25	ELSEIF
26	END
27	FOR
28	FUNCTION
29	GOTO
30	IF
31	IN
32	LOCAL
33	REPEAT
34	RETURN
35	THEN
36	UNTIL
37	WHILE
38
39	// Literals
40	FALSE
41	NIL
42	NUMBER
43	RAWSTRING
44	STRING
45	TRUE
46
47	// Operators
48	AND
49	ASSIGN
50	POW
51	CONCAT
52	EQUAL
53	GEQ
54	GT
55	LEN
56	LEQ
57	LT
58	MINUS
59	NEQ
60	NOT
61	OR
62	MOD
63	PLUS
64	SLASH
65	MUL
66
67	// Structure
68	LPAREN
69	RPAREN
70	LBRACK
71	RBRACK
72	LBRACE
73	RBRACE
74
75	// Grammar
76	COLON
77	COMMA
78	DOT
79	SEMICOLON
80	VARARG
81
82	// Annotation
83	DOC_CLASS
84)
85
86func (t TokenType) String() string {
87	return TokenStr[t]
88}
89
90func (t *TokenType) MarshalJSON() ([]byte, error) {
91	return json.Marshal(t.String())
92}
93
94type Token struct {
95	Type    TokenType
96	Literal string
97	Pos     Pos
98}
99
100type Pos = int
101
102var InvalidPos = Pos(-1)
103
104func (t Token) End() int {
105	return t.Pos + len(t.Literal)
106}
107
108func (t *Token) Range() Range {
109	return Range{t.Pos, t.End()}
110}
111
112func (t *Token) String() string {
113	return fmt.Sprintf("[%s] `%s` %v", TokenStr[t.Type], strings.NewReplacer("\n", "\\n", "\t", "\\t").Replace(t.Literal), t.Pos)
114}
115
116type Range struct {
117	Start int
118	End   int
119}
120
121func (r *Range) String() string {
122	return fmt.Sprintf("%v:%v", r.Start, r.End)
123}
124
125func (r *Range) ContainsPos(pos Pos) bool {
126	return r.Start <= pos && r.End > pos
127}
128
129func (r *Range) ContainsRange(rng Range) bool {
130	return r.Start <= rng.Start && r.End >= rng.End
131}
132
133var TokenStr = map[TokenType]string{
134	INVALID:    "invalid",
135	EOF:        "eof",
136	IDENT:      "identifier",
137	LABEL:      "label",
138	COMMENT:    "comment",
139	WHITESPACE: "whitespace",
140
141	// Keywords
142	BREAK:    "break",
143	DO:       "do",
144	ELSE:     "else",
145	ELSEIF:   "elseif",
146	END:      "end",
147	FOR:      "for",
148	FUNCTION: "function",
149	GOTO:     "goto",
150	IF:       "if",
151	IN:       "in",
152	LOCAL:    "local",
153	REPEAT:   "repeat",
154	RETURN:   "return",
155	THEN:     "then",
156	UNTIL:    "until",
157	WHILE:    "while",
158
159	// Literals
160	FALSE:     "false",
161	NIL:       "nil",
162	NUMBER:    "number",
163	RAWSTRING: "rawstring",
164	STRING:    "string",
165	TRUE:      "true",
166
167	// Operators
168	AND:    "and",
169	ASSIGN: "assign",
170	POW:    "pow",
171	EQUAL:  "equal",
172	GEQ:    "geq",
173	GT:     "gt",
174	LEN:    "len",
175	LEQ:    "leq",
176	LT:     "lt",
177	MINUS:  "minus",
178	NEQ:    "neq",
179	NOT:    "not",
180	OR:     "or",
181	MOD:    "mod",
182	PLUS:   "plus",
183	SLASH:  "slash",
184	MUL:    "mul",
185
186	// Structure
187	LPAREN: "left paren",
188	RPAREN: "right paren",
189	LBRACK: "left bracket",
190	RBRACK: "right bracket",
191	LBRACE: "left brace",
192	RBRACE: "right brace",
193
194	// Grammar
195	COLON:     "colon",
196	COMMA:     "comma",
197	CONCAT:    "concat",
198	DOT:       "dot",
199	SEMICOLON: "semicolon",
200	VARARG:    "vararg",
201
202	// Annotation
203	DOC_CLASS: "@class",
204}
205
206var Reserved = map[string]TokenType{
207	"and":      AND,
208	"break":    BREAK,
209	"do":       DO,
210	"else":     ELSE,
211	"elseif":   ELSEIF,
212	"end":      END,
213	"false":    FALSE,
214	"for":      FOR,
215	"function": FUNCTION,
216	"goto":     GOTO,
217	"if":       IF,
218	"in":       IN,
219	"local":    LOCAL,
220	"nil":      NIL,
221	"not":      NOT,
222	"or":       OR,
223	"repeat":   REPEAT,
224	"return":   RETURN,
225	"then":     THEN,
226	"true":     TRUE,
227	"until":    UNTIL,
228	"while":    WHILE,
229
230	"@class": DOC_CLASS,
231}