diff --git a/parser/schema.go b/parser/schema.go index 804f02c9..a004a0f6 100644 --- a/parser/schema.go +++ b/parser/schema.go @@ -231,7 +231,6 @@ func (p *parser) parseFieldsDefinition() (FieldList, *CommentGroup) { func (p *parser) parseFieldDefinition() *FieldDefinition { var def FieldDefinition - def.Position = p.peekPos() desc := p.parseDescription() if desc.text != "" { @@ -241,6 +240,7 @@ func (p *parser) parseFieldDefinition() *FieldDefinition { p.peek() // peek to set p.comment def.AfterDescriptionComment = p.comment + def.Position = p.peekPos() def.Name = p.parseName() def.Arguments = p.parseArgumentDefs() p.expect(lexer.Colon) @@ -260,7 +260,6 @@ func (p *parser) parseArgumentDefs() ArgumentDefinitionList { func (p *parser) parseArgumentDef() *ArgumentDefinition { var def ArgumentDefinition - def.Position = p.peekPos() desc := p.parseDescription() if desc.text != "" { @@ -270,6 +269,7 @@ func (p *parser) parseArgumentDef() *ArgumentDefinition { p.peek() // peek to set p.comment def.AfterDescriptionComment = p.comment + def.Position = p.peekPos() def.Name = p.parseName() p.expect(lexer.Colon) def.Type = p.parseTypeReference() @@ -282,7 +282,6 @@ func (p *parser) parseArgumentDef() *ArgumentDefinition { func (p *parser) parseInputValueDef() *FieldDefinition { var def FieldDefinition - def.Position = p.peekPos() desc := p.parseDescription() if desc.text != "" { @@ -292,6 +291,7 @@ func (p *parser) parseInputValueDef() *FieldDefinition { p.peek() // peek to set p.comment def.AfterDescriptionComment = p.comment + def.Position = p.peekPos() def.Name = p.parseName() p.expect(lexer.Colon) def.Type = p.parseTypeReference() @@ -372,7 +372,6 @@ func (p *parser) parseEnumValuesDefinition() (EnumValueList, *CommentGroup) { func (p *parser) parseEnumValueDefinition() *EnumValueDefinition { var def EnumValueDefinition - def.Position = p.peekPos() desc := p.parseDescription() if desc.text != "" { def.BeforeDescriptionComment = desc.comment @@ -381,7 +380,7 @@ func (p *parser) parseEnumValueDefinition() *EnumValueDefinition { p.peek() // peek to set p.comment def.AfterDescriptionComment = p.comment - + def.Position = p.peekPos() def.Name = p.parseName() def.Directives = p.parseDirectives(true) diff --git a/parser/schema_test.go b/parser/schema_test.go index 957c86cf..621a738a 100644 --- a/parser/schema_test.go +++ b/parser/schema_test.go @@ -30,6 +30,72 @@ func TestSchemaDocument(t *testing.T) { }) } +func TestFieldPositionWithBlockStringDescription(t *testing.T) { + schema, parseErr := ParseSchema(&ast.Source{ + Input: `type Query { + """ + multi + line + """ + myField: String + }`, + }) + assert.NoError(t, parseErr) + field := schema.Definitions.ForName("Query").Fields.ForName("myField") + assert.Equal(t, 6, field.Position.Line) + assert.Equal(t, 6, field.Position.Column) +} + +func TestArgumentPositionWithBlockStringDescription(t *testing.T) { + schema, parseErr := ParseSchema(&ast.Source{ + Input: `type Query { + myField( + """ + multi + line + """ + myArg: String + ): String + }`, + }) + assert.NoError(t, parseErr) + arg := schema.Definitions.ForName("Query").Fields.ForName("myField").Arguments.ForName("myArg") + assert.Equal(t, 7, arg.Position.Line) + assert.Greater(t, arg.Position.Column, 0) +} + +func TestInputValuePositionWithBlockStringDescription(t *testing.T) { + schema, parseErr := ParseSchema(&ast.Source{ + Input: `input MyInput { + """ + multi + line + """ + myField: String + }`, + }) + assert.NoError(t, parseErr) + field := schema.Definitions.ForName("MyInput").Fields.ForName("myField") + assert.Equal(t, 6, field.Position.Line) + assert.Greater(t, field.Position.Column, 0) +} + +func TestEnumValuePositionWithBlockStringDescription(t *testing.T) { + schema, parseErr := ParseSchema(&ast.Source{ + Input: `enum MyEnum { + """ + multi + line + """ + MY_VALUE + }`, + }) + assert.NoError(t, parseErr) + val := schema.Definitions.ForName("MyEnum").EnumValues.ForName("MY_VALUE") + assert.Equal(t, 6, val.Position.Line) + assert.Greater(t, val.Position.Column, 0) +} + func TestTypePosition(t *testing.T) { t.Run("type line number with no bang", func(t *testing.T) { schema, parseErr := ParseSchema(&ast.Source{