@@ -11,8 +11,10 @@ import (
11
11
"github.com/graphql-go/graphql/language/source"
12
12
)
13
13
14
+ type TokenKind int
15
+
14
16
const (
15
- EOF = iota + 1
17
+ EOF TokenKind = iota + 1
16
18
BANG
17
19
DOLLAR
18
20
PAREN_L
@@ -34,6 +36,33 @@ const (
34
36
AMP
35
37
)
36
38
39
+ var tokenDescription = map [TokenKind ]string {
40
+ EOF : "EOF" ,
41
+ BANG : "!" ,
42
+ DOLLAR : "$" ,
43
+ PAREN_L : "(" ,
44
+ PAREN_R : ")" ,
45
+ SPREAD : "..." ,
46
+ COLON : ":" ,
47
+ EQUALS : "=" ,
48
+ AT : "@" ,
49
+ BRACKET_L : "[" ,
50
+ BRACKET_R : "]" ,
51
+ BRACE_L : "{" ,
52
+ PIPE : "|" ,
53
+ BRACE_R : "}" ,
54
+ NAME : "Name" ,
55
+ INT : "Int" ,
56
+ FLOAT : "Float" ,
57
+ STRING : "String" ,
58
+ BLOCK_STRING : "BlockString" ,
59
+ AMP : "&" ,
60
+ }
61
+
62
+ func (kind TokenKind ) String () string {
63
+ return tokenDescription [kind ]
64
+ }
65
+
37
66
// NAME -> keyword relationship
38
67
const (
39
68
FRAGMENT = "fragment"
@@ -51,61 +80,10 @@ const (
51
80
DIRECTIVE = "directive"
52
81
)
53
82
54
- var TokenKind map [int ]int
55
- var tokenDescription map [int ]string
56
-
57
- func init () {
58
- TokenKind = make (map [int ]int )
59
- {
60
- TokenKind [EOF ] = EOF
61
- TokenKind [BANG ] = BANG
62
- TokenKind [DOLLAR ] = DOLLAR
63
- TokenKind [PAREN_L ] = PAREN_L
64
- TokenKind [PAREN_R ] = PAREN_R
65
- TokenKind [SPREAD ] = SPREAD
66
- TokenKind [COLON ] = COLON
67
- TokenKind [EQUALS ] = EQUALS
68
- TokenKind [AT ] = AT
69
- TokenKind [BRACKET_L ] = BRACKET_L
70
- TokenKind [BRACKET_R ] = BRACKET_R
71
- TokenKind [BRACE_L ] = BRACE_L
72
- TokenKind [PIPE ] = PIPE
73
- TokenKind [BRACE_R ] = BRACE_R
74
- TokenKind [NAME ] = NAME
75
- TokenKind [INT ] = INT
76
- TokenKind [FLOAT ] = FLOAT
77
- TokenKind [STRING ] = STRING
78
- TokenKind [BLOCK_STRING ] = BLOCK_STRING
79
- }
80
- tokenDescription = make (map [int ]string )
81
- {
82
- tokenDescription [TokenKind [EOF ]] = "EOF"
83
- tokenDescription [TokenKind [BANG ]] = "!"
84
- tokenDescription [TokenKind [DOLLAR ]] = "$"
85
- tokenDescription [TokenKind [PAREN_L ]] = "("
86
- tokenDescription [TokenKind [PAREN_R ]] = ")"
87
- tokenDescription [TokenKind [SPREAD ]] = "..."
88
- tokenDescription [TokenKind [COLON ]] = ":"
89
- tokenDescription [TokenKind [EQUALS ]] = "="
90
- tokenDescription [TokenKind [AT ]] = "@"
91
- tokenDescription [TokenKind [BRACKET_L ]] = "["
92
- tokenDescription [TokenKind [BRACKET_R ]] = "]"
93
- tokenDescription [TokenKind [BRACE_L ]] = "{"
94
- tokenDescription [TokenKind [PIPE ]] = "|"
95
- tokenDescription [TokenKind [BRACE_R ]] = "}"
96
- tokenDescription [TokenKind [NAME ]] = "Name"
97
- tokenDescription [TokenKind [INT ]] = "Int"
98
- tokenDescription [TokenKind [FLOAT ]] = "Float"
99
- tokenDescription [TokenKind [STRING ]] = "String"
100
- tokenDescription [TokenKind [BLOCK_STRING ]] = "BlockString"
101
- tokenDescription [TokenKind [AMP ]] = "&"
102
- }
103
- }
104
-
105
83
// Token is a representation of a lexed Token. Value only appears for non-punctuation
106
84
// tokens: NAME, INT, FLOAT, and STRING.
107
85
type Token struct {
108
- Kind int
86
+ Kind TokenKind
109
87
Start int
110
88
End int
111
89
Value string
@@ -151,7 +129,7 @@ func readName(source *source.Source, position, runePosition int) Token {
151
129
break
152
130
}
153
131
}
154
- return makeToken (TokenKind [ NAME ] , runePosition , endRune , string (body [position :endByte ]))
132
+ return makeToken (NAME , runePosition , endRune , string (body [position :endByte ]))
155
133
}
156
134
157
135
// Reads a number token from the source file, either a float
@@ -207,9 +185,9 @@ func readNumber(s *source.Source, start int, firstCode rune, codeLength int) (To
207
185
}
208
186
position = p
209
187
}
210
- kind := TokenKind [ INT ]
188
+ kind := INT
211
189
if isFloat {
212
- kind = TokenKind [ FLOAT ]
190
+ kind = FLOAT
213
191
}
214
192
215
193
return makeToken (kind , start , position , string (body [start :position ])), nil
@@ -328,7 +306,7 @@ func readString(s *source.Source, start int) (Token, error) {
328
306
stringContent := body [chunkStart :position ]
329
307
valueBuffer .Write (stringContent )
330
308
value := valueBuffer .String ()
331
- return makeToken (TokenKind [ STRING ] , start , position + 1 , value ), nil
309
+ return makeToken (STRING , start , position + 1 , value ), nil
332
310
}
333
311
334
312
// readBlockString reads a block string token from the source file.
@@ -357,7 +335,7 @@ func readBlockString(s *source.Source, start int) (Token, error) {
357
335
stringContent := body [chunkStart :position ]
358
336
valueBuffer .Write (stringContent )
359
337
value := blockStringValue (valueBuffer .String ())
360
- return makeToken (TokenKind [ BLOCK_STRING ] , start , position + 3 , value ), nil
338
+ return makeToken (BLOCK_STRING , start , position + 3 , value ), nil
361
339
}
362
340
}
363
341
@@ -490,7 +468,7 @@ func char2hex(a rune) int {
490
468
return - 1
491
469
}
492
470
493
- func makeToken (kind int , start int , end int , value string ) Token {
471
+ func makeToken (kind TokenKind , start int , end int , value string ) Token {
494
472
return Token {Kind : kind , Start : start , End : end , Value : value }
495
473
}
496
474
@@ -512,7 +490,7 @@ func readToken(s *source.Source, fromPosition int) (Token, error) {
512
490
bodyLength := len (body )
513
491
position , runePosition := positionAfterWhitespace (body , fromPosition )
514
492
if position >= bodyLength {
515
- return makeToken (TokenKind [ EOF ] , position , position , "" ), nil
493
+ return makeToken (EOF , position , position , "" ), nil
516
494
}
517
495
code , codeLength := runeAt (body , position )
518
496
@@ -524,51 +502,51 @@ func readToken(s *source.Source, fromPosition int) (Token, error) {
524
502
switch code {
525
503
// !
526
504
case '!' :
527
- return makeToken (TokenKind [ BANG ] , position , position + 1 , "" ), nil
505
+ return makeToken (BANG , position , position + 1 , "" ), nil
528
506
// $
529
507
case '$' :
530
- return makeToken (TokenKind [ DOLLAR ] , position , position + 1 , "" ), nil
508
+ return makeToken (DOLLAR , position , position + 1 , "" ), nil
531
509
// &
532
510
case '&' :
533
- return makeToken (TokenKind [ AMP ] , position , position + 1 , "" ), nil
511
+ return makeToken (AMP , position , position + 1 , "" ), nil
534
512
// (
535
513
case '(' :
536
- return makeToken (TokenKind [ PAREN_L ] , position , position + 1 , "" ), nil
514
+ return makeToken (PAREN_L , position , position + 1 , "" ), nil
537
515
// )
538
516
case ')' :
539
- return makeToken (TokenKind [ PAREN_R ] , position , position + 1 , "" ), nil
517
+ return makeToken (PAREN_R , position , position + 1 , "" ), nil
540
518
// .
541
519
case '.' :
542
520
next1 , _ := runeAt (body , position + 1 )
543
521
next2 , _ := runeAt (body , position + 2 )
544
522
if next1 == '.' && next2 == '.' {
545
- return makeToken (TokenKind [ SPREAD ] , position , position + 3 , "" ), nil
523
+ return makeToken (SPREAD , position , position + 3 , "" ), nil
546
524
}
547
525
break
548
526
// :
549
527
case ':' :
550
- return makeToken (TokenKind [ COLON ] , position , position + 1 , "" ), nil
528
+ return makeToken (COLON , position , position + 1 , "" ), nil
551
529
// =
552
530
case '=' :
553
- return makeToken (TokenKind [ EQUALS ] , position , position + 1 , "" ), nil
531
+ return makeToken (EQUALS , position , position + 1 , "" ), nil
554
532
// @
555
533
case '@' :
556
- return makeToken (TokenKind [ AT ] , position , position + 1 , "" ), nil
534
+ return makeToken (AT , position , position + 1 , "" ), nil
557
535
// [
558
536
case '[' :
559
- return makeToken (TokenKind [ BRACKET_L ] , position , position + 1 , "" ), nil
537
+ return makeToken (BRACKET_L , position , position + 1 , "" ), nil
560
538
// ]
561
539
case ']' :
562
- return makeToken (TokenKind [ BRACKET_R ] , position , position + 1 , "" ), nil
540
+ return makeToken (BRACKET_R , position , position + 1 , "" ), nil
563
541
// {
564
542
case '{' :
565
- return makeToken (TokenKind [ BRACE_L ] , position , position + 1 , "" ), nil
543
+ return makeToken (BRACE_L , position , position + 1 , "" ), nil
566
544
// |
567
545
case '|' :
568
- return makeToken (TokenKind [ PIPE ] , position , position + 1 , "" ), nil
546
+ return makeToken (PIPE , position , position + 1 , "" ), nil
569
547
// }
570
548
case '}' :
571
- return makeToken (TokenKind [ BRACE_R ] , position , position + 1 , "" ), nil
549
+ return makeToken (BRACE_R , position , position + 1 , "" ), nil
572
550
// A-Z
573
551
case 'A' , 'B' , 'C' , 'D' , 'E' , 'F' , 'G' , 'H' , 'I' , 'J' , 'K' , 'L' , 'M' , 'N' ,
574
552
'O' , 'P' , 'Q' , 'R' , 'S' , 'T' , 'U' , 'V' , 'W' , 'X' , 'Y' , 'Z' :
@@ -672,11 +650,7 @@ func positionAfterWhitespace(body []byte, startPosition int) (position int, rune
672
650
673
651
func GetTokenDesc (token Token ) string {
674
652
if token .Value == "" {
675
- return GetTokenKindDesc ( token .Kind )
653
+ return token .Kind . String ( )
676
654
}
677
- return fmt .Sprintf ("%s \" %s\" " , GetTokenKindDesc (token .Kind ), token .Value )
678
- }
679
-
680
- func GetTokenKindDesc (kind int ) string {
681
- return tokenDescription [kind ]
655
+ return fmt .Sprintf ("%s \" %s\" " , token .Kind .String (), token .Value )
682
656
}
0 commit comments