diff options
Diffstat (limited to 'vendor/github.com/vektah/gqlparser/parser')
5 files changed, 125 insertions, 15 deletions
diff --git a/vendor/github.com/vektah/gqlparser/parser/parser.go b/vendor/github.com/vektah/gqlparser/parser/parser.go index f3648cb3..96e98402 100644 --- a/vendor/github.com/vektah/gqlparser/parser/parser.go +++ b/vendor/github.com/vektah/gqlparser/parser/parser.go @@ -82,6 +82,10 @@ func (p *parser) expect(kind lexer.Type) lexer.Token { } func (p *parser) skip(kind lexer.Type) bool { + if p.err != nil { + return false + } + tok := p.peek() if tok.Kind != kind { @@ -110,3 +114,23 @@ func (p *parser) many(start lexer.Type, end lexer.Type, cb func()) { } p.next() } + +func (p *parser) some(start lexer.Type, end lexer.Type, cb func()) { + hasDef := p.skip(start) + if !hasDef { + return + } + + called := false + for p.peek().Kind != end && p.err == nil { + called = true + cb() + } + + if !called { + p.error(p.peek(), "expected at least one definition, found %s", p.peek().Kind.String()) + return + } + + p.next() +} diff --git a/vendor/github.com/vektah/gqlparser/parser/query.go b/vendor/github.com/vektah/gqlparser/parser/query.go index 7fecb57f..89e1e2e3 100644 --- a/vendor/github.com/vektah/gqlparser/parser/query.go +++ b/vendor/github.com/vektah/gqlparser/parser/query.go @@ -46,7 +46,7 @@ func (p *parser) parseOperationDefinition() *OperationDefinition { return &OperationDefinition{ Position: p.peekPos(), Operation: Query, - SelectionSet: p.parseSelectionSet(), + SelectionSet: p.parseRequiredSelectionSet(), } } @@ -60,7 +60,7 @@ func (p *parser) parseOperationDefinition() *OperationDefinition { od.VariableDefinitions = p.parseVariableDefinitions() od.Directives = p.parseDirectives(false) - od.SelectionSet = p.parseSelectionSet() + od.SelectionSet = p.parseRequiredSelectionSet() return &od } @@ -109,9 +109,23 @@ func (p *parser) parseVariable() string { return p.parseName() } -func (p *parser) parseSelectionSet() SelectionSet { +func (p *parser) parseOptionalSelectionSet() SelectionSet { var selections []Selection - p.many(lexer.BraceL, lexer.BraceR, func() { + p.some(lexer.BraceL, lexer.BraceR, func() { + selections = append(selections, p.parseSelection()) + }) + + return SelectionSet(selections) +} + +func (p *parser) parseRequiredSelectionSet() SelectionSet { + if p.peek().Kind != lexer.BraceL { + p.error(p.peek(), "Expected %s, found %s", lexer.BraceL, p.peek().Kind.String()) + return nil + } + + var selections []Selection + p.some(lexer.BraceL, lexer.BraceR, func() { selections = append(selections, p.parseSelection()) }) @@ -139,7 +153,7 @@ func (p *parser) parseField() *Field { field.Arguments = p.parseArguments(false) field.Directives = p.parseDirectives(false) if p.peek().Kind == lexer.BraceL { - field.SelectionSet = p.parseSelectionSet() + field.SelectionSet = p.parseOptionalSelectionSet() } return &field @@ -184,7 +198,7 @@ func (p *parser) parseFragment() Selection { } def.Directives = p.parseDirectives(false) - def.SelectionSet = p.parseSelectionSet() + def.SelectionSet = p.parseRequiredSelectionSet() return &def } @@ -200,7 +214,7 @@ func (p *parser) parseFragmentDefinition() *FragmentDefinition { def.TypeCondition = p.parseName() def.Directives = p.parseDirectives(false) - def.SelectionSet = p.parseSelectionSet() + def.SelectionSet = p.parseRequiredSelectionSet() return &def } diff --git a/vendor/github.com/vektah/gqlparser/parser/query_test.yml b/vendor/github.com/vektah/gqlparser/parser/query_test.yml index f392eb8e..902bb15f 100644 --- a/vendor/github.com/vektah/gqlparser/parser/query_test.yml +++ b/vendor/github.com/vektah/gqlparser/parser/query_test.yml @@ -504,4 +504,17 @@ large queries: Value: $b - <Argument> Name: "obj" - Value: {"key":"value","block":"block string uses \"\"\""} + Value: {key:"value",block:"block string uses \"\"\""} + +fuzzer: +- name: 01 + input: '{__typename{...}}' + error: + message: 'Expected {, found }' + locations: [{ line: 1, column: 16 }] + +- name: 02 + input: '{...{__typename{...{}}}}' + error: + message: 'expected at least one definition, found }' + locations: [{ line: 1, column: 21 }] diff --git a/vendor/github.com/vektah/gqlparser/parser/schema.go b/vendor/github.com/vektah/gqlparser/parser/schema.go index f409f1f4..5689e433 100644 --- a/vendor/github.com/vektah/gqlparser/parser/schema.go +++ b/vendor/github.com/vektah/gqlparser/parser/schema.go @@ -10,7 +10,31 @@ func ParseSchema(source *Source) (*SchemaDocument, *gqlerror.Error) { p := parser{ lexer: lexer.New(source), } - return p.parseSchemaDocument(), p.err + ast, err := p.parseSchemaDocument(), p.err + if err != nil { + return nil, err + } + + for _, def := range ast.Definitions { + def.BuiltIn = source.BuiltIn + } + for _, def := range ast.Extensions { + def.BuiltIn = source.BuiltIn + } + + return ast, nil +} + +func ParseSchemas(inputs ...*Source) (*SchemaDocument, *gqlerror.Error) { + ast := &SchemaDocument{} + for _, input := range inputs { + inputAst, err := ParseSchema(input) + if err != nil { + return nil, err + } + ast.Merge(inputAst) + } + return ast, nil } func (p *parser) parseSchemaDocument() *SchemaDocument { @@ -96,7 +120,7 @@ func (p *parser) parseSchemaDefinition(description string) *SchemaDefinition { def.Description = description def.Directives = p.parseDirectives(true) - p.many(lexer.BraceL, lexer.BraceR, func() { + p.some(lexer.BraceL, lexer.BraceR, func() { def.OperationTypes = append(def.OperationTypes, p.parseOperationTypeDefinition()) }) return &def @@ -154,7 +178,7 @@ func (p *parser) parseImplementsInterfaces() []string { func (p *parser) parseFieldsDefinition() FieldList { var defs FieldList - p.many(lexer.BraceL, lexer.BraceR, func() { + p.some(lexer.BraceL, lexer.BraceR, func() { defs = append(defs, p.parseFieldDefinition()) }) return defs @@ -175,7 +199,7 @@ func (p *parser) parseFieldDefinition() *FieldDefinition { func (p *parser) parseArgumentDefs() ArgumentDefinitionList { var args ArgumentDefinitionList - p.many(lexer.ParenL, lexer.ParenR, func() { + p.some(lexer.ParenL, lexer.ParenR, func() { args = append(args, p.parseArgumentDef()) }) return args @@ -264,7 +288,7 @@ func (p *parser) parseEnumTypeDefinition(description string) *Definition { func (p *parser) parseEnumValuesDefinition() EnumValueList { var values EnumValueList - p.many(lexer.BraceL, lexer.BraceR, func() { + p.some(lexer.BraceL, lexer.BraceR, func() { values = append(values, p.parseEnumValueDefinition()) }) return values @@ -294,7 +318,7 @@ func (p *parser) parseInputObjectTypeDefinition(description string) *Definition func (p *parser) parseInputFieldsDefinition() FieldList { var values FieldList - p.many(lexer.BraceL, lexer.BraceR, func() { + p.some(lexer.BraceL, lexer.BraceR, func() { values = append(values, p.parseInputValueDef()) }) return values @@ -329,7 +353,7 @@ func (p *parser) parseSchemaExtension() *SchemaDefinition { var def SchemaDefinition def.Position = p.peekPos() def.Directives = p.parseDirectives(true) - p.many(lexer.BraceL, lexer.BraceR, func() { + p.some(lexer.BraceL, lexer.BraceR, func() { def.OperationTypes = append(def.OperationTypes, p.parseOperationTypeDefinition()) }) if len(def.Directives) == 0 && len(def.OperationTypes) == 0 { diff --git a/vendor/github.com/vektah/gqlparser/parser/schema_test.yml b/vendor/github.com/vektah/gqlparser/parser/schema_test.yml index c65239a5..394bd363 100644 --- a/vendor/github.com/vektah/gqlparser/parser/schema_test.yml +++ b/vendor/github.com/vektah/gqlparser/parser/schema_test.yml @@ -136,6 +136,12 @@ object types: Name: "argTwo" Type: Int Type: String + - name: must define one or more fields + input: | + type Hello {} + error: + message: "expected at least one definition, found }" + locations: [{ line: 1, column: 13 }] type extensions: - name: Object extension @@ -378,6 +384,12 @@ enums: Name: "WO" - <EnumValueDefinition> Name: "RLD" + - name: must define one or more unique enum values + input: | + enum Hello {} + error: + message: "expected at least one definition, found }" + locations: [{ line: 1, column: 13 }] interface: - name: simple @@ -395,6 +407,12 @@ interface: - <FieldDefinition> Name: "world" Type: String + - name: must define one or more fields + input: | + interface Hello {} + error: + message: "expected at least one definition, found }" + locations: [{ line: 1, column: 18 }] unions: - name: simple @@ -485,6 +503,12 @@ input object: error: message: "Expected :, found (" locations: [{ line: 2, column: 8 }] + - name: must define one or more input fields + input: | + input Hello {} + error: + message: "expected at least one definition, found }" + locations: [{ line: 1, column: 14 }] directives: - name: simple @@ -503,3 +527,14 @@ directives: message: 'Unexpected Name "INCORRECT_LOCATION"' locations: [{ line: 1, column: 27 }] +fuzzer: + - name: 1 + input: "type o{d(g:[" + error: + message: 'Expected Name, found <EOF>' + locations: [{ line: 1, column: 13 }] + - name: 2 + input: "\"\"\"\r" + error: + message: 'Unexpected <Invalid>' + locations: [{ line: 1, column: 5 }] |