aboutsummaryrefslogtreecommitdiffstats
path: root/vendor/github.com/vektah/gqlparser/parser
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/vektah/gqlparser/parser')
-rw-r--r--vendor/github.com/vektah/gqlparser/parser/parser.go24
-rw-r--r--vendor/github.com/vektah/gqlparser/parser/query.go28
-rw-r--r--vendor/github.com/vektah/gqlparser/parser/query_test.yml15
-rw-r--r--vendor/github.com/vektah/gqlparser/parser/schema.go38
-rw-r--r--vendor/github.com/vektah/gqlparser/parser/schema_test.yml35
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 }]