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