@@ -11,8 +11,10 @@ import (
1111 "github.com/graphql-go/graphql/language/source"
1212)
1313
14+ type TokenKind int
15+
1416const (
15- EOF = iota + 1
17+ EOF TokenKind = iota + 1
1618 BANG
1719 DOLLAR
1820 PAREN_L
@@ -34,6 +36,33 @@ const (
3436 AMP
3537)
3638
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+
3766// NAME -> keyword relationship
3867const (
3968 FRAGMENT = "fragment"
@@ -51,61 +80,10 @@ const (
5180 DIRECTIVE = "directive"
5281)
5382
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-
10583// Token is a representation of a lexed Token. Value only appears for non-punctuation
10684// tokens: NAME, INT, FLOAT, and STRING.
10785type Token struct {
108- Kind int
86+ Kind TokenKind
10987 Start int
11088 End int
11189 Value string
@@ -151,7 +129,7 @@ func readName(source *source.Source, position, runePosition int) Token {
151129 break
152130 }
153131 }
154- return makeToken (TokenKind [ NAME ] , runePosition , endRune , string (body [position :endByte ]))
132+ return makeToken (NAME , runePosition , endRune , string (body [position :endByte ]))
155133}
156134
157135// 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
207185 }
208186 position = p
209187 }
210- kind := TokenKind [ INT ]
188+ kind := INT
211189 if isFloat {
212- kind = TokenKind [ FLOAT ]
190+ kind = FLOAT
213191 }
214192
215193 return makeToken (kind , start , position , string (body [start :position ])), nil
@@ -328,7 +306,7 @@ func readString(s *source.Source, start int) (Token, error) {
328306 stringContent := body [chunkStart :position ]
329307 valueBuffer .Write (stringContent )
330308 value := valueBuffer .String ()
331- return makeToken (TokenKind [ STRING ] , start , position + 1 , value ), nil
309+ return makeToken (STRING , start , position + 1 , value ), nil
332310}
333311
334312// readBlockString reads a block string token from the source file.
@@ -357,7 +335,7 @@ func readBlockString(s *source.Source, start int) (Token, error) {
357335 stringContent := body [chunkStart :position ]
358336 valueBuffer .Write (stringContent )
359337 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
361339 }
362340 }
363341
@@ -426,19 +404,13 @@ func blockStringValue(in string) string {
426404 }
427405
428406 // Remove leading blank lines.
429- for {
430- if isBlank := lineIsBlank (lines [0 ]); ! isBlank {
431- break
432- }
407+ for len (lines ) > 0 && lineIsBlank (lines [0 ]) {
433408 lines = lines [1 :]
434409 }
435410
436411 // Remove trailing blank lines.
437- for {
412+ for len ( lines ) > 0 && lineIsBlank ( lines [ len ( lines ) - 1 ]) {
438413 i := len (lines ) - 1
439- if isBlank := lineIsBlank (lines [i ]); ! isBlank {
440- break
441- }
442414 lines = append (lines [:i ], lines [i + 1 :]... )
443415 }
444416
@@ -490,7 +462,7 @@ func char2hex(a rune) int {
490462 return - 1
491463}
492464
493- func makeToken (kind int , start int , end int , value string ) Token {
465+ func makeToken (kind TokenKind , start int , end int , value string ) Token {
494466 return Token {Kind : kind , Start : start , End : end , Value : value }
495467}
496468
@@ -512,7 +484,7 @@ func readToken(s *source.Source, fromPosition int) (Token, error) {
512484 bodyLength := len (body )
513485 position , runePosition := positionAfterWhitespace (body , fromPosition )
514486 if position >= bodyLength {
515- return makeToken (TokenKind [ EOF ] , position , position , "" ), nil
487+ return makeToken (EOF , position , position , "" ), nil
516488 }
517489 code , codeLength := runeAt (body , position )
518490
@@ -524,51 +496,51 @@ func readToken(s *source.Source, fromPosition int) (Token, error) {
524496 switch code {
525497 // !
526498 case '!' :
527- return makeToken (TokenKind [ BANG ] , position , position + 1 , "" ), nil
499+ return makeToken (BANG , position , position + 1 , "" ), nil
528500 // $
529501 case '$' :
530- return makeToken (TokenKind [ DOLLAR ] , position , position + 1 , "" ), nil
502+ return makeToken (DOLLAR , position , position + 1 , "" ), nil
531503 // &
532504 case '&' :
533- return makeToken (TokenKind [ AMP ] , position , position + 1 , "" ), nil
505+ return makeToken (AMP , position , position + 1 , "" ), nil
534506 // (
535507 case '(' :
536- return makeToken (TokenKind [ PAREN_L ] , position , position + 1 , "" ), nil
508+ return makeToken (PAREN_L , position , position + 1 , "" ), nil
537509 // )
538510 case ')' :
539- return makeToken (TokenKind [ PAREN_R ] , position , position + 1 , "" ), nil
511+ return makeToken (PAREN_R , position , position + 1 , "" ), nil
540512 // .
541513 case '.' :
542514 next1 , _ := runeAt (body , position + 1 )
543515 next2 , _ := runeAt (body , position + 2 )
544516 if next1 == '.' && next2 == '.' {
545- return makeToken (TokenKind [ SPREAD ] , position , position + 3 , "" ), nil
517+ return makeToken (SPREAD , position , position + 3 , "" ), nil
546518 }
547519 break
548520 // :
549521 case ':' :
550- return makeToken (TokenKind [ COLON ] , position , position + 1 , "" ), nil
522+ return makeToken (COLON , position , position + 1 , "" ), nil
551523 // =
552524 case '=' :
553- return makeToken (TokenKind [ EQUALS ] , position , position + 1 , "" ), nil
525+ return makeToken (EQUALS , position , position + 1 , "" ), nil
554526 // @
555527 case '@' :
556- return makeToken (TokenKind [ AT ] , position , position + 1 , "" ), nil
528+ return makeToken (AT , position , position + 1 , "" ), nil
557529 // [
558530 case '[' :
559- return makeToken (TokenKind [ BRACKET_L ] , position , position + 1 , "" ), nil
531+ return makeToken (BRACKET_L , position , position + 1 , "" ), nil
560532 // ]
561533 case ']' :
562- return makeToken (TokenKind [ BRACKET_R ] , position , position + 1 , "" ), nil
534+ return makeToken (BRACKET_R , position , position + 1 , "" ), nil
563535 // {
564536 case '{' :
565- return makeToken (TokenKind [ BRACE_L ] , position , position + 1 , "" ), nil
537+ return makeToken (BRACE_L , position , position + 1 , "" ), nil
566538 // |
567539 case '|' :
568- return makeToken (TokenKind [ PIPE ] , position , position + 1 , "" ), nil
540+ return makeToken (PIPE , position , position + 1 , "" ), nil
569541 // }
570542 case '}' :
571- return makeToken (TokenKind [ BRACE_R ] , position , position + 1 , "" ), nil
543+ return makeToken (BRACE_R , position , position + 1 , "" ), nil
572544 // A-Z
573545 case 'A' , 'B' , 'C' , 'D' , 'E' , 'F' , 'G' , 'H' , 'I' , 'J' , 'K' , 'L' , 'M' , 'N' ,
574546 'O' , 'P' , 'Q' , 'R' , 'S' , 'T' , 'U' , 'V' , 'W' , 'X' , 'Y' , 'Z' :
@@ -672,11 +644,7 @@ func positionAfterWhitespace(body []byte, startPosition int) (position int, rune
672644
673645func GetTokenDesc (token Token ) string {
674646 if token .Value == "" {
675- return GetTokenKindDesc ( token .Kind )
647+ return token .Kind . String ( )
676648 }
677- return fmt .Sprintf ("%s \" %s\" " , GetTokenKindDesc (token .Kind ), token .Value )
678- }
679-
680- func GetTokenKindDesc (kind int ) string {
681- return tokenDescription [kind ]
649+ return fmt .Sprintf ("%s \" %s\" " , token .Kind .String (), token .Value )
682650}
0 commit comments