cubefs
1596 строк · 37.8 Кб
1package parser
2
3import (
4"fmt"
5
6"github.com/graphql-go/graphql/gqlerrors"
7"github.com/graphql-go/graphql/language/ast"
8"github.com/graphql-go/graphql/language/lexer"
9"github.com/graphql-go/graphql/language/source"
10)
11
12type parseFn func(parser *Parser) (interface{}, error)
13
14// parse operation, fragment, typeSystem{schema, type..., extension, directives} definition
15type parseDefinitionFn func(parser *Parser) (ast.Node, error)
16
17var tokenDefinitionFn map[string]parseDefinitionFn
18
19func init() {
20tokenDefinitionFn = make(map[string]parseDefinitionFn)
21{
22// for sign
23tokenDefinitionFn[lexer.BRACE_L.String()] = parseOperationDefinition
24tokenDefinitionFn[lexer.STRING.String()] = parseTypeSystemDefinition
25tokenDefinitionFn[lexer.BLOCK_STRING.String()] = parseTypeSystemDefinition
26tokenDefinitionFn[lexer.NAME.String()] = parseTypeSystemDefinition
27// for NAME
28tokenDefinitionFn[lexer.FRAGMENT] = parseFragmentDefinition
29tokenDefinitionFn[lexer.QUERY] = parseOperationDefinition
30tokenDefinitionFn[lexer.MUTATION] = parseOperationDefinition
31tokenDefinitionFn[lexer.SUBSCRIPTION] = parseOperationDefinition
32tokenDefinitionFn[lexer.SCHEMA] = parseSchemaDefinition
33tokenDefinitionFn[lexer.SCALAR] = parseScalarTypeDefinition
34tokenDefinitionFn[lexer.TYPE] = parseObjectTypeDefinition
35tokenDefinitionFn[lexer.INTERFACE] = parseInterfaceTypeDefinition
36tokenDefinitionFn[lexer.UNION] = parseUnionTypeDefinition
37tokenDefinitionFn[lexer.ENUM] = parseEnumTypeDefinition
38tokenDefinitionFn[lexer.INPUT] = parseInputObjectTypeDefinition
39tokenDefinitionFn[lexer.EXTEND] = parseTypeExtensionDefinition
40tokenDefinitionFn[lexer.DIRECTIVE] = parseDirectiveDefinition
41}
42}
43
44type ParseOptions struct {
45NoLocation bool
46NoSource bool
47}
48
49type ParseParams struct {
50Source interface{}
51Options ParseOptions
52}
53
54type Parser struct {
55LexToken lexer.Lexer
56Source *source.Source
57Options ParseOptions
58PrevEnd int
59Token lexer.Token
60}
61
62func Parse(p ParseParams) (*ast.Document, error) {
63var sourceObj *source.Source
64switch src := p.Source.(type) {
65case *source.Source:
66sourceObj = src
67default:
68body, _ := p.Source.(string)
69sourceObj = source.NewSource(&source.Source{Body: []byte(body)})
70}
71parser, err := makeParser(sourceObj, p.Options)
72if err != nil {
73return nil, err
74}
75doc, err := parseDocument(parser)
76if err != nil {
77return nil, err
78}
79return doc, nil
80}
81
82// TODO: test and expose parseValue as a public
83func parseValue(p ParseParams) (ast.Value, error) {
84var value ast.Value
85var sourceObj *source.Source
86switch src := p.Source.(type) {
87case *source.Source:
88sourceObj = src
89default:
90body, _ := p.Source.(string)
91sourceObj = source.NewSource(&source.Source{Body: []byte(body)})
92}
93parser, err := makeParser(sourceObj, p.Options)
94if err != nil {
95return value, err
96}
97value, err = parseValueLiteral(parser, false)
98if err != nil {
99return value, err
100}
101return value, nil
102}
103
104// Converts a name lex token into a name parse node.
105func parseName(parser *Parser) (*ast.Name, error) {
106token, err := expect(parser, lexer.NAME)
107if err != nil {
108return nil, err
109}
110return ast.NewName(&ast.Name{
111Value: token.Value,
112Loc: loc(parser, token.Start),
113}), nil
114}
115
116func makeParser(s *source.Source, opts ParseOptions) (*Parser, error) {
117lexToken := lexer.Lex(s)
118token, err := lexToken(0)
119if err != nil {
120return &Parser{}, err
121}
122return &Parser{
123LexToken: lexToken,
124Source: s,
125Options: opts,
126PrevEnd: 0,
127Token: token,
128}, nil
129}
130
131/* Implements the parsing rules in the Document section. */
132
133func parseDocument(parser *Parser) (*ast.Document, error) {
134var (
135nodes []ast.Node
136node ast.Node
137item parseDefinitionFn
138err error
139)
140start := parser.Token.Start
141for {
142if skp, err := skip(parser, lexer.EOF); err != nil {
143return nil, err
144} else if skp {
145break
146}
147switch kind := parser.Token.Kind; kind {
148case lexer.BRACE_L, lexer.NAME, lexer.STRING, lexer.BLOCK_STRING:
149item = tokenDefinitionFn[kind.String()]
150default:
151return nil, unexpected(parser, lexer.Token{})
152}
153if node, err = item(parser); err != nil {
154return nil, err
155}
156nodes = append(nodes, node)
157}
158return ast.NewDocument(&ast.Document{
159Loc: loc(parser, start),
160Definitions: nodes,
161}), nil
162}
163
164/* Implements the parsing rules in the Operations section. */
165
166/**
167* OperationDefinition :
168* - SelectionSet
169* - OperationType Name? VariableDefinitions? Directives? SelectionSet
170*/
171func parseOperationDefinition(parser *Parser) (ast.Node, error) {
172var (
173operation string
174variableDefinitions []*ast.VariableDefinition
175name *ast.Name
176directives []*ast.Directive
177selectionSet *ast.SelectionSet
178err error
179)
180start := parser.Token.Start
181if peek(parser, lexer.BRACE_L) {
182selectionSet, err := parseSelectionSet(parser)
183if err != nil {
184return nil, err
185}
186return ast.NewOperationDefinition(&ast.OperationDefinition{
187Operation: ast.OperationTypeQuery,
188Directives: []*ast.Directive{},
189SelectionSet: selectionSet,
190Loc: loc(parser, start),
191}), nil
192}
193if operation, err = parseOperationType(parser); err != nil {
194return nil, err
195}
196
197if peek(parser, lexer.NAME) {
198if name, err = parseName(parser); err != nil {
199return nil, err
200}
201}
202if variableDefinitions, err = parseVariableDefinitions(parser); err != nil {
203return nil, err
204}
205if directives, err = parseDirectives(parser); err != nil {
206return nil, err
207}
208if selectionSet, err = parseSelectionSet(parser); err != nil {
209return nil, err
210}
211return ast.NewOperationDefinition(&ast.OperationDefinition{
212Operation: operation,
213Name: name,
214VariableDefinitions: variableDefinitions,
215Directives: directives,
216SelectionSet: selectionSet,
217Loc: loc(parser, start),
218}), nil
219}
220
221/**
222* OperationType : one of query mutation subscription
223*/
224func parseOperationType(parser *Parser) (string, error) {
225operationToken, err := expect(parser, lexer.NAME)
226if err != nil {
227return "", err
228}
229switch operationToken.Value {
230case ast.OperationTypeQuery:
231return operationToken.Value, nil
232case ast.OperationTypeMutation:
233return operationToken.Value, nil
234case ast.OperationTypeSubscription:
235return operationToken.Value, nil
236default:
237return "", unexpected(parser, operationToken)
238}
239}
240
241/**
242* VariableDefinitions : ( VariableDefinition+ )
243*/
244func parseVariableDefinitions(parser *Parser) ([]*ast.VariableDefinition, error) {
245variableDefinitions := []*ast.VariableDefinition{}
246if !peek(parser, lexer.PAREN_L) {
247return variableDefinitions, nil
248}
249if vdefs, err := reverse(parser,
250lexer.PAREN_L, parseVariableDefinition, lexer.PAREN_R,
251true,
252); err != nil {
253return variableDefinitions, err
254} else {
255for _, vdef := range vdefs {
256variableDefinitions = append(variableDefinitions, vdef.(*ast.VariableDefinition))
257}
258}
259return variableDefinitions, nil
260}
261
262/**
263* VariableDefinition : Variable : Type DefaultValue?
264*/
265func parseVariableDefinition(parser *Parser) (interface{}, error) {
266var (
267variable *ast.Variable
268ttype ast.Type
269err error
270)
271start := parser.Token.Start
272if variable, err = parseVariable(parser); err != nil {
273return nil, err
274}
275if _, err = expect(parser, lexer.COLON); err != nil {
276return nil, err
277}
278if ttype, err = parseType(parser); err != nil {
279return nil, err
280}
281var defaultValue ast.Value
282if skp, err := skip(parser, lexer.EQUALS); err != nil {
283return nil, err
284} else if skp {
285if defaultValue, err = parseValueLiteral(parser, true); err != nil {
286return nil, err
287}
288}
289return ast.NewVariableDefinition(&ast.VariableDefinition{
290Variable: variable,
291Type: ttype,
292DefaultValue: defaultValue,
293Loc: loc(parser, start),
294}), nil
295}
296
297/**
298* Variable : $ Name
299*/
300func parseVariable(parser *Parser) (*ast.Variable, error) {
301var (
302err error
303name *ast.Name
304)
305start := parser.Token.Start
306if _, err = expect(parser, lexer.DOLLAR); err != nil {
307return nil, err
308}
309if name, err = parseName(parser); err != nil {
310return nil, err
311}
312return ast.NewVariable(&ast.Variable{
313Name: name,
314Loc: loc(parser, start),
315}), nil
316}
317
318/**
319* SelectionSet : { Selection+ }
320*/
321func parseSelectionSet(parser *Parser) (*ast.SelectionSet, error) {
322start := parser.Token.Start
323selections := []ast.Selection{}
324if iSelections, err := reverse(parser,
325lexer.BRACE_L, parseSelection, lexer.BRACE_R,
326true,
327); err != nil {
328return nil, err
329} else {
330for _, iSelection := range iSelections {
331selections = append(selections, iSelection.(ast.Selection))
332}
333}
334
335return ast.NewSelectionSet(&ast.SelectionSet{
336Selections: selections,
337Loc: loc(parser, start),
338}), nil
339}
340
341/**
342* Selection :
343* - Field
344* - FragmentSpread
345* - InlineFragment
346*/
347func parseSelection(parser *Parser) (interface{}, error) {
348if peek(parser, lexer.SPREAD) {
349return parseFragment(parser)
350}
351return parseField(parser)
352}
353
354/**
355* Field : Alias? Name Arguments? Directives? SelectionSet?
356*
357* Alias : Name :
358*/
359func parseField(parser *Parser) (*ast.Field, error) {
360var (
361name *ast.Name
362alias *ast.Name
363arguments []*ast.Argument
364directives []*ast.Directive
365err error
366)
367start := parser.Token.Start
368if name, err = parseName(parser); err != nil {
369return nil, err
370}
371if skp, err := skip(parser, lexer.COLON); err != nil {
372return nil, err
373} else if skp {
374alias = name
375if name, err = parseName(parser); err != nil {
376return nil, err
377}
378}
379if arguments, err = parseArguments(parser); err != nil {
380return nil, err
381}
382if directives, err = parseDirectives(parser); err != nil {
383return nil, err
384}
385var selectionSet *ast.SelectionSet
386if peek(parser, lexer.BRACE_L) {
387if selectionSet, err = parseSelectionSet(parser); err != nil {
388return nil, err
389}
390}
391return ast.NewField(&ast.Field{
392Alias: alias,
393Name: name,
394Arguments: arguments,
395Directives: directives,
396SelectionSet: selectionSet,
397Loc: loc(parser, start),
398}), nil
399}
400
401/**
402* Arguments : ( Argument+ )
403*/
404func parseArguments(parser *Parser) ([]*ast.Argument, error) {
405arguments := []*ast.Argument{}
406if peek(parser, lexer.PAREN_L) {
407if iArguments, err := reverse(parser,
408lexer.PAREN_L, parseArgument, lexer.PAREN_R,
409true,
410); err != nil {
411return arguments, err
412} else {
413for _, iArgument := range iArguments {
414arguments = append(arguments, iArgument.(*ast.Argument))
415}
416}
417}
418return arguments, nil
419}
420
421/**
422* Argument : Name : Value
423*/
424func parseArgument(parser *Parser) (interface{}, error) {
425var (
426err error
427name *ast.Name
428value ast.Value
429)
430start := parser.Token.Start
431if name, err = parseName(parser); err != nil {
432return nil, err
433}
434if _, err = expect(parser, lexer.COLON); err != nil {
435return nil, err
436}
437if value, err = parseValueLiteral(parser, false); err != nil {
438return nil, err
439}
440return ast.NewArgument(&ast.Argument{
441Name: name,
442Value: value,
443Loc: loc(parser, start),
444}), nil
445}
446
447/* Implements the parsing rules in the Fragments section. */
448
449/**
450* Corresponds to both FragmentSpread and InlineFragment in the spec.
451*
452* FragmentSpread : ... FragmentName Directives?
453*
454* InlineFragment : ... TypeCondition? Directives? SelectionSet
455*/
456func parseFragment(parser *Parser) (interface{}, error) {
457var (
458err error
459)
460start := parser.Token.Start
461if _, err = expect(parser, lexer.SPREAD); err != nil {
462return nil, err
463}
464if peek(parser, lexer.NAME) && parser.Token.Value != "on" {
465name, err := parseFragmentName(parser)
466if err != nil {
467return nil, err
468}
469directives, err := parseDirectives(parser)
470if err != nil {
471return nil, err
472}
473return ast.NewFragmentSpread(&ast.FragmentSpread{
474Name: name,
475Directives: directives,
476Loc: loc(parser, start),
477}), nil
478}
479var typeCondition *ast.Named
480if parser.Token.Value == "on" {
481if err := advance(parser); err != nil {
482return nil, err
483}
484name, err := parseNamed(parser)
485if err != nil {
486return nil, err
487}
488typeCondition = name
489
490}
491directives, err := parseDirectives(parser)
492if err != nil {
493return nil, err
494}
495selectionSet, err := parseSelectionSet(parser)
496if err != nil {
497return nil, err
498}
499return ast.NewInlineFragment(&ast.InlineFragment{
500TypeCondition: typeCondition,
501Directives: directives,
502SelectionSet: selectionSet,
503Loc: loc(parser, start),
504}), nil
505}
506
507/**
508* FragmentDefinition :
509* - fragment FragmentName on TypeCondition Directives? SelectionSet
510*
511* TypeCondition : NamedType
512*/
513func parseFragmentDefinition(parser *Parser) (ast.Node, error) {
514start := parser.Token.Start
515_, err := expectKeyWord(parser, lexer.FRAGMENT)
516if err != nil {
517return nil, err
518}
519name, err := parseFragmentName(parser)
520if err != nil {
521return nil, err
522}
523_, err = expectKeyWord(parser, "on")
524if err != nil {
525return nil, err
526}
527typeCondition, err := parseNamed(parser)
528if err != nil {
529return nil, err
530}
531directives, err := parseDirectives(parser)
532if err != nil {
533return nil, err
534}
535selectionSet, err := parseSelectionSet(parser)
536if err != nil {
537return nil, err
538}
539return ast.NewFragmentDefinition(&ast.FragmentDefinition{
540Name: name,
541TypeCondition: typeCondition,
542Directives: directives,
543SelectionSet: selectionSet,
544Loc: loc(parser, start),
545}), nil
546}
547
548/**
549* FragmentName : Name but not `on`
550*/
551func parseFragmentName(parser *Parser) (*ast.Name, error) {
552if parser.Token.Value == "on" {
553return nil, unexpected(parser, lexer.Token{})
554}
555return parseName(parser)
556}
557
558/* Implements the parsing rules in the Values section. */
559
560/**
561* Value[Const] :
562* - [~Const] Variable
563* - IntValue
564* - FloatValue
565* - StringValue
566* - BooleanValue
567* - EnumValue
568* - ListValue[?Const]
569* - ObjectValue[?Const]
570*
571* BooleanValue : one of `true` `false`
572*
573* EnumValue : Name but not `true`, `false` or `null`
574*/
575func parseValueLiteral(parser *Parser, isConst bool) (ast.Value, error) {
576token := parser.Token
577switch token.Kind {
578case lexer.BRACKET_L:
579return parseList(parser, isConst)
580case lexer.BRACE_L:
581return parseObject(parser, isConst)
582case lexer.INT:
583if err := advance(parser); err != nil {
584return nil, err
585}
586return ast.NewIntValue(&ast.IntValue{
587Value: token.Value,
588Loc: loc(parser, token.Start),
589}), nil
590case lexer.FLOAT:
591if err := advance(parser); err != nil {
592return nil, err
593}
594return ast.NewFloatValue(&ast.FloatValue{
595Value: token.Value,
596Loc: loc(parser, token.Start),
597}), nil
598case lexer.BLOCK_STRING, lexer.STRING:
599return parseStringLiteral(parser)
600case lexer.NAME:
601if token.Value == "true" || token.Value == "false" {
602if err := advance(parser); err != nil {
603return nil, err
604}
605value := true
606if token.Value == "false" {
607value = false
608}
609return ast.NewBooleanValue(&ast.BooleanValue{
610Value: value,
611Loc: loc(parser, token.Start),
612}), nil
613} else if token.Value != "null" {
614if err := advance(parser); err != nil {
615return nil, err
616}
617return ast.NewEnumValue(&ast.EnumValue{
618Value: token.Value,
619Loc: loc(parser, token.Start),
620}), nil
621}
622case lexer.DOLLAR:
623if !isConst {
624return parseVariable(parser)
625}
626}
627
628return nil, unexpected(parser, lexer.Token{})
629}
630
631func parseConstValue(parser *Parser) (interface{}, error) {
632value, err := parseValueLiteral(parser, true)
633if err != nil {
634return value, err
635}
636return value, nil
637}
638
639func parseValueValue(parser *Parser) (interface{}, error) {
640return parseValueLiteral(parser, false)
641}
642
643/**
644* ListValue[Const] :
645* - [ ]
646* - [ Value[?Const]+ ]
647*/
648func parseList(parser *Parser, isConst bool) (*ast.ListValue, error) {
649start := parser.Token.Start
650var item parseFn = parseValueValue
651if isConst {
652item = parseConstValue
653}
654values := []ast.Value{}
655if iValues, err := reverse(parser,
656lexer.BRACKET_L, item, lexer.BRACKET_R,
657false,
658); err != nil {
659return nil, err
660} else {
661for _, iValue := range iValues {
662values = append(values, iValue.(ast.Value))
663}
664}
665return ast.NewListValue(&ast.ListValue{
666Values: values,
667Loc: loc(parser, start),
668}), nil
669}
670
671/**
672* ObjectValue[Const] :
673* - { }
674* - { ObjectField[?Const]+ }
675*/
676func parseObject(parser *Parser, isConst bool) (*ast.ObjectValue, error) {
677start := parser.Token.Start
678if _, err := expect(parser, lexer.BRACE_L); err != nil {
679return nil, err
680}
681fields := []*ast.ObjectField{}
682for {
683if skp, err := skip(parser, lexer.BRACE_R); err != nil {
684return nil, err
685} else if skp {
686break
687}
688if field, err := parseObjectField(parser, isConst); err != nil {
689return nil, err
690} else {
691fields = append(fields, field)
692}
693}
694return ast.NewObjectValue(&ast.ObjectValue{
695Fields: fields,
696Loc: loc(parser, start),
697}), nil
698}
699
700/**
701* ObjectField[Const] : Name : Value[?Const]
702*/
703func parseObjectField(parser *Parser, isConst bool) (*ast.ObjectField, error) {
704var (
705name *ast.Name
706value ast.Value
707err error
708)
709start := parser.Token.Start
710if name, err = parseName(parser); err != nil {
711return nil, err
712}
713if _, err = expect(parser, lexer.COLON); err != nil {
714return nil, err
715}
716if value, err = parseValueLiteral(parser, isConst); err != nil {
717return nil, err
718}
719return ast.NewObjectField(&ast.ObjectField{
720Name: name,
721Value: value,
722Loc: loc(parser, start),
723}), nil
724}
725
726/* Implements the parsing rules in the Directives section. */
727
728/**
729* Directives : Directive+
730*/
731func parseDirectives(parser *Parser) ([]*ast.Directive, error) {
732directives := []*ast.Directive{}
733for peek(parser, lexer.AT) {
734if directive, err := parseDirective(parser); err != nil {
735return directives, err
736} else {
737directives = append(directives, directive)
738}
739}
740return directives, nil
741}
742
743/**
744* Directive : @ Name Arguments?
745*/
746func parseDirective(parser *Parser) (*ast.Directive, error) {
747var (
748err error
749name *ast.Name
750args []*ast.Argument
751)
752start := parser.Token.Start
753if _, err = expect(parser, lexer.AT); err != nil {
754return nil, err
755}
756if name, err = parseName(parser); err != nil {
757return nil, err
758}
759if args, err = parseArguments(parser); err != nil {
760return nil, err
761}
762return ast.NewDirective(&ast.Directive{
763Name: name,
764Arguments: args,
765Loc: loc(parser, start),
766}), nil
767}
768
769/* Implements the parsing rules in the Types section. */
770
771/**
772* Type :
773* - NamedType
774* - ListType
775* - NonNullType
776*/
777func parseType(parser *Parser) (ttype ast.Type, err error) {
778token := parser.Token
779// [ String! ]!
780switch token.Kind {
781case lexer.BRACKET_L:
782if err = advance(parser); err != nil {
783return nil, err
784}
785if ttype, err = parseType(parser); err != nil {
786return nil, err
787}
788fallthrough
789case lexer.BRACKET_R:
790if err = advance(parser); err != nil {
791return nil, err
792}
793ttype = ast.NewList(&ast.List{
794Type: ttype,
795Loc: loc(parser, token.Start),
796})
797case lexer.NAME:
798if ttype, err = parseNamed(parser); err != nil {
799return nil, err
800}
801}
802
803// BANG must be executed
804if skp, err := skip(parser, lexer.BANG); err != nil {
805return nil, err
806} else if skp {
807ttype = ast.NewNonNull(&ast.NonNull{
808Type: ttype,
809Loc: loc(parser, token.Start),
810})
811}
812return ttype, nil
813}
814
815/**
816* NamedType : Name
817*/
818func parseNamed(parser *Parser) (*ast.Named, error) {
819start := parser.Token.Start
820name, err := parseName(parser)
821if err != nil {
822return nil, err
823}
824return ast.NewNamed(&ast.Named{
825Name: name,
826Loc: loc(parser, start),
827}), nil
828}
829
830/* Implements the parsing rules in the Type Definition section. */
831
832/**
833* TypeSystemDefinition :
834* - SchemaDefinition
835* - TypeDefinition
836* - TypeExtension
837* - DirectiveDefinition
838*
839* TypeDefinition :
840* - ScalarTypeDefinition
841* - ObjectTypeDefinition
842* - InterfaceTypeDefinition
843* - UnionTypeDefinition
844* - EnumTypeDefinition
845* - InputObjectTypeDefinition
846*/
847func parseTypeSystemDefinition(parser *Parser) (ast.Node, error) {
848var (
849item parseDefinitionFn
850err error
851)
852// Many definitions begin with a description and require a lookahead.
853keywordToken := parser.Token
854if peekDescription(parser) {
855if keywordToken, err = lookahead(parser); err != nil {
856return nil, err
857}
858}
859
860if keywordToken.Kind != lexer.NAME {
861return nil, unexpected(parser, keywordToken)
862}
863var ok bool
864if item, ok = tokenDefinitionFn[keywordToken.Value]; !ok {
865return nil, unexpected(parser, keywordToken)
866}
867return item(parser)
868}
869
870/**
871* SchemaDefinition : schema Directives? { OperationTypeDefinition+ }
872*
873* OperationTypeDefinition : OperationType : NamedType
874*/
875func parseSchemaDefinition(parser *Parser) (ast.Node, error) {
876start := parser.Token.Start
877_, err := expectKeyWord(parser, "schema")
878if err != nil {
879return nil, err
880}
881directives, err := parseDirectives(parser)
882if err != nil {
883return nil, err
884}
885operationTypesI, err := reverse(
886parser,
887lexer.BRACE_L, parseOperationTypeDefinition, lexer.BRACE_R,
888true,
889)
890if err != nil {
891return nil, err
892}
893operationTypes := []*ast.OperationTypeDefinition{}
894for _, op := range operationTypesI {
895if op, ok := op.(*ast.OperationTypeDefinition); ok {
896operationTypes = append(operationTypes, op)
897}
898}
899return ast.NewSchemaDefinition(&ast.SchemaDefinition{
900OperationTypes: operationTypes,
901Directives: directives,
902Loc: loc(parser, start),
903}), nil
904}
905
906func parseOperationTypeDefinition(parser *Parser) (interface{}, error) {
907start := parser.Token.Start
908operation, err := parseOperationType(parser)
909if err != nil {
910return nil, err
911}
912_, err = expect(parser, lexer.COLON)
913if err != nil {
914return nil, err
915}
916ttype, err := parseNamed(parser)
917if err != nil {
918return nil, err
919}
920return ast.NewOperationTypeDefinition(&ast.OperationTypeDefinition{
921Operation: operation,
922Type: ttype,
923Loc: loc(parser, start),
924}), nil
925}
926
927/**
928* ScalarTypeDefinition : Description? scalar Name Directives?
929*/
930func parseScalarTypeDefinition(parser *Parser) (ast.Node, error) {
931start := parser.Token.Start
932description, err := parseDescription(parser)
933if err != nil {
934return nil, err
935}
936_, err = expectKeyWord(parser, lexer.SCALAR)
937if err != nil {
938return nil, err
939}
940name, err := parseName(parser)
941if err != nil {
942return nil, err
943}
944directives, err := parseDirectives(parser)
945if err != nil {
946return nil, err
947}
948def := ast.NewScalarDefinition(&ast.ScalarDefinition{
949Name: name,
950Description: description,
951Directives: directives,
952Loc: loc(parser, start),
953})
954return def, nil
955}
956
957/**
958* ObjectTypeDefinition :
959* Description?
960* type Name ImplementsInterfaces? Directives? { FieldDefinition+ }
961*/
962func parseObjectTypeDefinition(parser *Parser) (ast.Node, error) {
963start := parser.Token.Start
964description, err := parseDescription(parser)
965if err != nil {
966return nil, err
967}
968_, err = expectKeyWord(parser, lexer.TYPE)
969if err != nil {
970return nil, err
971}
972name, err := parseName(parser)
973if err != nil {
974return nil, err
975}
976interfaces, err := parseImplementsInterfaces(parser)
977if err != nil {
978return nil, err
979}
980directives, err := parseDirectives(parser)
981if err != nil {
982return nil, err
983}
984iFields, err := reverse(parser,
985lexer.BRACE_L, parseFieldDefinition, lexer.BRACE_R,
986false,
987)
988if err != nil {
989return nil, err
990}
991fields := []*ast.FieldDefinition{}
992for _, iField := range iFields {
993if iField != nil {
994fields = append(fields, iField.(*ast.FieldDefinition))
995}
996}
997return ast.NewObjectDefinition(&ast.ObjectDefinition{
998Name: name,
999Description: description,
1000Loc: loc(parser, start),
1001Interfaces: interfaces,
1002Directives: directives,
1003Fields: fields,
1004}), nil
1005}
1006
1007/**
1008* ImplementsInterfaces :
1009* - implements `&`? NamedType
1010* - ImplementsInterfaces & NamedType
1011*/
1012func parseImplementsInterfaces(parser *Parser) ([]*ast.Named, error) {
1013types := []*ast.Named{}
1014if parser.Token.Value == "implements" {
1015if err := advance(parser); err != nil {
1016return nil, err
1017}
1018// optional leading ampersand
1019skip(parser, lexer.AMP)
1020for {
1021ttype, err := parseNamed(parser)
1022if err != nil {
1023return types, err
1024}
1025types = append(types, ttype)
1026if skipped, err := skip(parser, lexer.AMP); !skipped {
1027break
1028} else if err != nil {
1029return types, err
1030}
1031}
1032}
1033return types, nil
1034}
1035
1036/**
1037* FieldDefinition : Description? Name ArgumentsDefinition? : Type Directives?
1038*/
1039func parseFieldDefinition(parser *Parser) (interface{}, error) {
1040start := parser.Token.Start
1041description, err := parseDescription(parser)
1042if err != nil {
1043return nil, err
1044}
1045name, err := parseName(parser)
1046if err != nil {
1047return nil, err
1048}
1049args, err := parseArgumentDefs(parser)
1050if err != nil {
1051return nil, err
1052}
1053_, err = expect(parser, lexer.COLON)
1054if err != nil {
1055return nil, err
1056}
1057ttype, err := parseType(parser)
1058if err != nil {
1059return nil, err
1060}
1061directives, err := parseDirectives(parser)
1062if err != nil {
1063return nil, err
1064}
1065return ast.NewFieldDefinition(&ast.FieldDefinition{
1066Name: name,
1067Description: description,
1068Arguments: args,
1069Type: ttype,
1070Directives: directives,
1071Loc: loc(parser, start),
1072}), nil
1073}
1074
1075/**
1076* ArgumentsDefinition : ( InputValueDefinition+ )
1077*/
1078func parseArgumentDefs(parser *Parser) ([]*ast.InputValueDefinition, error) {
1079inputValueDefinitions := []*ast.InputValueDefinition{}
1080
1081if !peek(parser, lexer.PAREN_L) {
1082return inputValueDefinitions, nil
1083}
1084iInputValueDefinitions, err := reverse(parser,
1085lexer.PAREN_L, parseInputValueDef, lexer.PAREN_R,
1086true,
1087)
1088if err != nil {
1089return inputValueDefinitions, err
1090}
1091for _, iInputValueDefinition := range iInputValueDefinitions {
1092if iInputValueDefinition != nil {
1093inputValueDefinitions = append(inputValueDefinitions, iInputValueDefinition.(*ast.InputValueDefinition))
1094}
1095}
1096return inputValueDefinitions, err
1097}
1098
1099/**
1100* InputValueDefinition : Description? Name : Type DefaultValue? Directives?
1101*/
1102func parseInputValueDef(parser *Parser) (interface{}, error) {
1103var (
1104description *ast.StringValue
1105name *ast.Name
1106ttype ast.Type
1107directives []*ast.Directive
1108err error
1109)
1110start := parser.Token.Start
1111if description, err = parseDescription(parser); err != nil {
1112return nil, err
1113}
1114if name, err = parseName(parser); err != nil {
1115return nil, err
1116}
1117if _, err = expect(parser, lexer.COLON); err != nil {
1118return nil, err
1119}
1120if ttype, err = parseType(parser); err != nil {
1121return nil, err
1122}
1123var defaultValue ast.Value
1124if skp, err := skip(parser, lexer.EQUALS); err != nil {
1125return nil, err
1126} else if skp {
1127val, err := parseConstValue(parser)
1128if err != nil {
1129return nil, err
1130}
1131if val, ok := val.(ast.Value); ok {
1132defaultValue = val
1133}
1134}
1135if directives, err = parseDirectives(parser); err != nil {
1136return nil, err
1137}
1138return ast.NewInputValueDefinition(&ast.InputValueDefinition{
1139Name: name,
1140Description: description,
1141Type: ttype,
1142DefaultValue: defaultValue,
1143Directives: directives,
1144Loc: loc(parser, start),
1145}), nil
1146}
1147
1148/**
1149* InterfaceTypeDefinition :
1150* Description?
1151* interface Name Directives? { FieldDefinition+ }
1152*/
1153func parseInterfaceTypeDefinition(parser *Parser) (ast.Node, error) {
1154start := parser.Token.Start
1155description, err := parseDescription(parser)
1156if err != nil {
1157return nil, err
1158}
1159_, err = expectKeyWord(parser, lexer.INTERFACE)
1160if err != nil {
1161return nil, err
1162}
1163name, err := parseName(parser)
1164if err != nil {
1165return nil, err
1166}
1167directives, err := parseDirectives(parser)
1168if err != nil {
1169return nil, err
1170}
1171iFields, err := reverse(parser,
1172lexer.BRACE_L, parseFieldDefinition, lexer.BRACE_R,
1173false,
1174)
1175if err != nil {
1176return nil, err
1177}
1178fields := []*ast.FieldDefinition{}
1179for _, iField := range iFields {
1180if iField != nil {
1181fields = append(fields, iField.(*ast.FieldDefinition))
1182}
1183}
1184return ast.NewInterfaceDefinition(&ast.InterfaceDefinition{
1185Name: name,
1186Description: description,
1187Directives: directives,
1188Loc: loc(parser, start),
1189Fields: fields,
1190}), nil
1191}
1192
1193/**
1194* UnionTypeDefinition : Description? union Name Directives? = UnionMembers
1195*/
1196func parseUnionTypeDefinition(parser *Parser) (ast.Node, error) {
1197start := parser.Token.Start
1198description, err := parseDescription(parser)
1199if err != nil {
1200return nil, err
1201}
1202_, err = expectKeyWord(parser, lexer.UNION)
1203if err != nil {
1204return nil, err
1205}
1206name, err := parseName(parser)
1207if err != nil {
1208return nil, err
1209}
1210directives, err := parseDirectives(parser)
1211if err != nil {
1212return nil, err
1213}
1214_, err = expect(parser, lexer.EQUALS)
1215if err != nil {
1216return nil, err
1217}
1218types, err := parseUnionMembers(parser)
1219if err != nil {
1220return nil, err
1221}
1222return ast.NewUnionDefinition(&ast.UnionDefinition{
1223Name: name,
1224Description: description,
1225Directives: directives,
1226Loc: loc(parser, start),
1227Types: types,
1228}), nil
1229}
1230
1231/**
1232* UnionMembers :
1233* - NamedType
1234* - UnionMembers | NamedType
1235*/
1236func parseUnionMembers(parser *Parser) ([]*ast.Named, error) {
1237members := []*ast.Named{}
1238for {
1239member, err := parseNamed(parser)
1240if err != nil {
1241return members, err
1242}
1243members = append(members, member)
1244if skp, err := skip(parser, lexer.PIPE); err != nil {
1245return nil, err
1246} else if !skp {
1247break
1248}
1249}
1250return members, nil
1251}
1252
1253/**
1254* EnumTypeDefinition : Description? enum Name Directives? { EnumValueDefinition+ }
1255*/
1256func parseEnumTypeDefinition(parser *Parser) (ast.Node, error) {
1257start := parser.Token.Start
1258description, err := parseDescription(parser)
1259if err != nil {
1260return nil, err
1261}
1262_, err = expectKeyWord(parser, lexer.ENUM)
1263if err != nil {
1264return nil, err
1265}
1266name, err := parseName(parser)
1267if err != nil {
1268return nil, err
1269}
1270directives, err := parseDirectives(parser)
1271if err != nil {
1272return nil, err
1273}
1274iEnumValueDefs, err := reverse(parser,
1275lexer.BRACE_L, parseEnumValueDefinition, lexer.BRACE_R,
1276false,
1277)
1278if err != nil {
1279return nil, err
1280}
1281values := []*ast.EnumValueDefinition{}
1282for _, iEnumValueDef := range iEnumValueDefs {
1283if iEnumValueDef != nil {
1284values = append(values, iEnumValueDef.(*ast.EnumValueDefinition))
1285}
1286}
1287return ast.NewEnumDefinition(&ast.EnumDefinition{
1288Name: name,
1289Description: description,
1290Directives: directives,
1291Loc: loc(parser, start),
1292Values: values,
1293}), nil
1294}
1295
1296/**
1297* EnumValueDefinition : Description? EnumValue Directives?
1298*
1299* EnumValue : Name
1300*/
1301func parseEnumValueDefinition(parser *Parser) (interface{}, error) {
1302start := parser.Token.Start
1303description, err := parseDescription(parser)
1304if err != nil {
1305return nil, err
1306}
1307name, err := parseName(parser)
1308if err != nil {
1309return nil, err
1310}
1311directives, err := parseDirectives(parser)
1312if err != nil {
1313return nil, err
1314}
1315return ast.NewEnumValueDefinition(&ast.EnumValueDefinition{
1316Name: name,
1317Description: description,
1318Directives: directives,
1319Loc: loc(parser, start),
1320}), nil
1321}
1322
1323/**
1324* InputObjectTypeDefinition :
1325* - Description? input Name Directives? { InputValueDefinition+ }
1326*/
1327func parseInputObjectTypeDefinition(parser *Parser) (ast.Node, error) {
1328start := parser.Token.Start
1329description, err := parseDescription(parser)
1330if err != nil {
1331return nil, err
1332}
1333_, err = expectKeyWord(parser, lexer.INPUT)
1334if err != nil {
1335return nil, err
1336}
1337name, err := parseName(parser)
1338if err != nil {
1339return nil, err
1340}
1341directives, err := parseDirectives(parser)
1342if err != nil {
1343return nil, err
1344}
1345iInputValueDefinitions, err := reverse(parser,
1346lexer.BRACE_L, parseInputValueDef, lexer.BRACE_R,
1347false,
1348)
1349if err != nil {
1350return nil, err
1351}
1352fields := []*ast.InputValueDefinition{}
1353for _, iInputValueDefinition := range iInputValueDefinitions {
1354if iInputValueDefinition != nil {
1355fields = append(fields, iInputValueDefinition.(*ast.InputValueDefinition))
1356}
1357}
1358return ast.NewInputObjectDefinition(&ast.InputObjectDefinition{
1359Name: name,
1360Description: description,
1361Directives: directives,
1362Loc: loc(parser, start),
1363Fields: fields,
1364}), nil
1365}
1366
1367/**
1368* TypeExtensionDefinition : extend ObjectTypeDefinition
1369*/
1370func parseTypeExtensionDefinition(parser *Parser) (ast.Node, error) {
1371start := parser.Token.Start
1372_, err := expectKeyWord(parser, lexer.EXTEND)
1373if err != nil {
1374return nil, err
1375}
1376
1377definition, err := parseObjectTypeDefinition(parser)
1378if err != nil {
1379return nil, err
1380}
1381return ast.NewTypeExtensionDefinition(&ast.TypeExtensionDefinition{
1382Loc: loc(parser, start),
1383Definition: definition.(*ast.ObjectDefinition),
1384}), nil
1385}
1386
1387/**
1388* DirectiveDefinition :
1389* - directive @ Name ArgumentsDefinition? on DirectiveLocations
1390*/
1391func parseDirectiveDefinition(parser *Parser) (ast.Node, error) {
1392var (
1393err error
1394description *ast.StringValue
1395name *ast.Name
1396args []*ast.InputValueDefinition
1397locations []*ast.Name
1398)
1399start := parser.Token.Start
1400if description, err = parseDescription(parser); err != nil {
1401return nil, err
1402}
1403if _, err = expectKeyWord(parser, lexer.DIRECTIVE); err != nil {
1404return nil, err
1405}
1406if _, err = expect(parser, lexer.AT); err != nil {
1407return nil, err
1408}
1409if name, err = parseName(parser); err != nil {
1410return nil, err
1411}
1412if args, err = parseArgumentDefs(parser); err != nil {
1413return nil, err
1414}
1415if _, err = expectKeyWord(parser, "on"); err != nil {
1416return nil, err
1417}
1418if locations, err = parseDirectiveLocations(parser); err != nil {
1419return nil, err
1420}
1421
1422return ast.NewDirectiveDefinition(&ast.DirectiveDefinition{
1423Loc: loc(parser, start),
1424Name: name,
1425Description: description,
1426Arguments: args,
1427Locations: locations,
1428}), nil
1429}
1430
1431/**
1432* DirectiveLocations :
1433* - Name
1434* - DirectiveLocations | Name
1435*/
1436func parseDirectiveLocations(parser *Parser) ([]*ast.Name, error) {
1437locations := []*ast.Name{}
1438for {
1439if name, err := parseName(parser); err != nil {
1440return locations, err
1441} else {
1442locations = append(locations, name)
1443}
1444
1445if hasPipe, err := skip(parser, lexer.PIPE); err != nil {
1446return locations, err
1447} else if !hasPipe {
1448break
1449}
1450}
1451return locations, nil
1452}
1453
1454func parseStringLiteral(parser *Parser) (*ast.StringValue, error) {
1455token := parser.Token
1456if err := advance(parser); err != nil {
1457return nil, err
1458}
1459return ast.NewStringValue(&ast.StringValue{
1460Value: token.Value,
1461Loc: loc(parser, token.Start),
1462}), nil
1463}
1464
1465/**
1466* Description : StringValue
1467*/
1468func parseDescription(parser *Parser) (*ast.StringValue, error) {
1469if peekDescription(parser) {
1470return parseStringLiteral(parser)
1471}
1472return nil, nil
1473}
1474
1475/* Core parsing utility functions */
1476
1477// Returns a location object, used to identify the place in
1478// the source that created a given parsed object.
1479func loc(parser *Parser, start int) *ast.Location {
1480if parser.Options.NoLocation {
1481return nil
1482}
1483if parser.Options.NoSource {
1484return ast.NewLocation(&ast.Location{
1485Start: start,
1486End: parser.PrevEnd,
1487})
1488}
1489return ast.NewLocation(&ast.Location{
1490Start: start,
1491End: parser.PrevEnd,
1492Source: parser.Source,
1493})
1494}
1495
1496// Moves the internal parser object to the next lexed token.
1497func advance(parser *Parser) error {
1498parser.PrevEnd = parser.Token.End
1499token, err := parser.LexToken(parser.PrevEnd)
1500if err != nil {
1501return err
1502}
1503parser.Token = token
1504return nil
1505}
1506
1507// lookahead retrieves the next token
1508func lookahead(parser *Parser) (lexer.Token, error) {
1509return parser.LexToken(parser.Token.End)
1510}
1511
1512// Determines if the next token is of a given kind
1513func peek(parser *Parser, Kind lexer.TokenKind) bool {
1514return parser.Token.Kind == Kind
1515}
1516
1517// peekDescription determines if the next token is a string value
1518func peekDescription(parser *Parser) bool {
1519return peek(parser, lexer.STRING) || peek(parser, lexer.BLOCK_STRING)
1520}
1521
1522// If the next token is of the given kind, return true after advancing
1523// the parser. Otherwise, do not change the parser state and return false.
1524func skip(parser *Parser, Kind lexer.TokenKind) (bool, error) {
1525if parser.Token.Kind == Kind {
1526return true, advance(parser)
1527}
1528return false, nil
1529}
1530
1531// If the next token is of the given kind, return that token after advancing
1532// the parser. Otherwise, do not change the parser state and return error.
1533func expect(parser *Parser, kind lexer.TokenKind) (lexer.Token, error) {
1534token := parser.Token
1535if token.Kind == kind {
1536return token, advance(parser)
1537}
1538descp := fmt.Sprintf("Expected %s, found %s", kind, lexer.GetTokenDesc(token))
1539return token, gqlerrors.NewSyntaxError(parser.Source, token.Start, descp)
1540}
1541
1542// If the next token is a keyword with the given value, return that token after
1543// advancing the parser. Otherwise, do not change the parser state and return false.
1544func expectKeyWord(parser *Parser, value string) (lexer.Token, error) {
1545token := parser.Token
1546if token.Kind == lexer.NAME && token.Value == value {
1547return token, advance(parser)
1548}
1549descp := fmt.Sprintf("Expected \"%s\", found %s", value, lexer.GetTokenDesc(token))
1550return token, gqlerrors.NewSyntaxError(parser.Source, token.Start, descp)
1551}
1552
1553// Helper function for creating an error when an unexpected lexed token
1554// is encountered.
1555func unexpected(parser *Parser, atToken lexer.Token) error {
1556var token = atToken
1557if (atToken == lexer.Token{}) {
1558token = parser.Token
1559}
1560description := fmt.Sprintf("Unexpected %v", lexer.GetTokenDesc(token))
1561return gqlerrors.NewSyntaxError(parser.Source, token.Start, description)
1562}
1563
1564func unexpectedEmpty(parser *Parser, beginLoc int, openKind, closeKind lexer.TokenKind) error {
1565description := fmt.Sprintf("Unexpected empty IN %s%s", openKind, closeKind)
1566return gqlerrors.NewSyntaxError(parser.Source, beginLoc, description)
1567}
1568
1569// Returns list of parse nodes, determined by
1570// the parseFn. This list begins with a lex token of openKind
1571// and ends with a lex token of closeKind. Advances the parser
1572// to the next lex token after the closing token.
1573// if zinteger is true, len(nodes) > 0
1574func reverse(parser *Parser, openKind lexer.TokenKind, parseFn parseFn, closeKind lexer.TokenKind, zinteger bool) ([]interface{}, error) {
1575token, err := expect(parser, openKind)
1576if err != nil {
1577return nil, err
1578}
1579var nodes []interface{}
1580for {
1581if skp, err := skip(parser, closeKind); err != nil {
1582return nil, err
1583} else if skp {
1584break
1585}
1586node, err := parseFn(parser)
1587if err != nil {
1588return nodes, err
1589}
1590nodes = append(nodes, node)
1591}
1592if zinteger && len(nodes) == 0 {
1593return nodes, unexpectedEmpty(parser, token.Start, openKind, closeKind)
1594}
1595return nodes, nil
1596}
1597