From bc8cac190bf7e9c5b173cb640f9f6fbebdc62587 Mon Sep 17 00:00:00 2001 From: Shinnosuke Sawada <6warashi9@gmail.com> Date: Fri, 23 Jun 2023 06:12:48 +0900 Subject: [PATCH 1/5] feat(lexer): return comment tokens --- lexer/lexer.go | 5 +--- lexer/lexer_test.yml | 60 +++++++++++++++++++++++++++++++++++++------- 2 files changed, 52 insertions(+), 13 deletions(-) diff --git a/lexer/lexer.go b/lexer/lexer.go index 8ce04fd2..cc85f22c 100644 --- a/lexer/lexer.go +++ b/lexer/lexer.go @@ -121,10 +121,7 @@ func (s *Lexer) ReadToken() (token Token, err error) { case '|': return s.makeValueToken(Pipe, "") case '#': - if comment, err := s.readComment(); err != nil { - return comment, err - } - return s.ReadToken() + return s.readComment() case '_', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z': return s.readName() diff --git a/lexer/lexer_test.yml b/lexer/lexer_test.yml index d85afb41..ead5b21d 100644 --- a/lexer/lexer_test.yml +++ b/lexer/lexer_test.yml @@ -35,15 +35,6 @@ simple tokens: end: 9 value: 'foo' - - name: skips comments - input: "\n #comment\n foo#comment\n" - tokens: - - - kind: NAME - start: 18 - end: 21 - value: 'foo' - - name: skips commas input: ",,,foo,,," tokens: @@ -78,6 +69,57 @@ simple tokens: end: 1 value: a +lexes comments: + - name: basic + input: '#simple' + tokens: + - + kind: COMMENT + start: 0 + end: 7 + value: '#simple' + + - name: two lines + input: "#first\n#second" + tokens: + - + kind: COMMENT + start: 0 + end: 6 + value: "#first" + - + kind: COMMENT + start: 7 + end: 14 + value: "#second" + + - name: whitespace + input: '# white space ' + tokens: + - + kind: COMMENT + start: 0 + end: 14 + value: '# white space ' + + - name: not escaped + input: '#not escaped \n\r\b\t\f' + tokens: + - + kind: COMMENT + start: 0 + end: 23 + value: '#not escaped \n\r\b\t\f' + + - name: slashes + input: '#slashes \\ \/' + tokens: + - + kind: COMMENT + start: 0 + end: 14 + value: '#slashes \\ \/' + lexes strings: - name: basic input: '"simple"' From 374a51adda2930792a265633962cde6aba720e7e Mon Sep 17 00:00:00 2001 From: Shinnosuke Sawada <6warashi9@gmail.com> Date: Fri, 23 Jun 2023 06:17:56 +0900 Subject: [PATCH 2/5] fix(testrunner): fix error comparison in testrunner --- parser/testrunner/runner.go | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/parser/testrunner/runner.go b/parser/testrunner/runner.go index b1f35504..e8c1d50b 100644 --- a/parser/testrunner/runner.go +++ b/parser/testrunner/runner.go @@ -55,12 +55,7 @@ func Test(t *testing.T, filename string, f func(t *testing.T, input string) Spec if spec.Error == nil { if result.Error != nil { - gqlErr, ok := err.(*gqlerror.Error) - if ok { - t.Errorf("unexpected error %s", gqlErr.Message) - } else { - t.Errorf("unexpected error %+v", gqlerror.Wrap(err)) - } + t.Errorf("unexpected error %s", result.Error.Message) } } else if result.Error == nil { t.Errorf("expected error but got none") From 8435c09864ba43f7be08ac8447dd4289b43a2ad0 Mon Sep 17 00:00:00 2001 From: Shinnosuke Sawada <6warashi9@gmail.com> Date: Fri, 23 Jun 2023 07:28:54 +0900 Subject: [PATCH 3/5] test(lexer): add position test for comments --- lexer/lexer_test.yml | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/lexer/lexer_test.yml b/lexer/lexer_test.yml index ead5b21d..0899f4ca 100644 --- a/lexer/lexer_test.yml +++ b/lexer/lexer_test.yml @@ -26,6 +26,31 @@ simple tokens: column: 3 value: 'foo' + - name: records line and column with comments + input: "\n\n\n#foo\n #bar\n foo\n" + tokens: + - + kind: COMMENT + start: 3 + end: 7 + line: 4 + column: 0 + value: '#foo' + - + kind: COMMENT + start: 10 + end: 14 + line: 5 + column: 3 + value: '#bar' + - + kind: NAME + start: 17 + end: 20 + line: 6 + column: 3 + value: 'foo' + - name: skips whitespace input: "\n\n foo\n\n\n" tokens: From d5d75c907ba55e392102c4f6fa0766c41dc15e8e Mon Sep 17 00:00:00 2001 From: Shinnosuke Sawada <6warashi9@gmail.com> Date: Fri, 23 Jun 2023 07:57:06 +0900 Subject: [PATCH 4/5] test(parser): add position tests --- parser/query_test.go | 22 +++++++++++++++++++++- parser/schema_test.go | 11 +++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/parser/query_test.go b/parser/query_test.go index 3fd5b362..f1772617 100644 --- a/parser/query_test.go +++ b/parser/query_test.go @@ -3,9 +3,10 @@ package parser import ( "testing" - "github.com/vektah/gqlparser/v2/gqlerror" + "github.com/stretchr/testify/assert" "github.com/vektah/gqlparser/v2/ast" + "github.com/vektah/gqlparser/v2/gqlerror" "github.com/vektah/gqlparser/v2/parser/testrunner" ) @@ -24,3 +25,22 @@ func TestQueryDocument(t *testing.T) { } }) } + +func TestQueryPosition(t *testing.T) { + t.Run("query line number with comments", func(t *testing.T) { + query, err := ParseQuery(&ast.Source{ + Input: ` + # comment 1 +query SomeOperation { + # comment 2 + myAction { + id + } +} + `, + }) + assert.Nil(t, err) + assert.Equal(t, 3, query.Operations.ForName("SomeOperation").Position.Line) + assert.Equal(t, 5, query.Operations.ForName("SomeOperation").SelectionSet[0].GetPosition().Line) + }) +} diff --git a/parser/schema_test.go b/parser/schema_test.go index a40abb90..e9df4139 100644 --- a/parser/schema_test.go +++ b/parser/schema_test.go @@ -46,4 +46,15 @@ func TestTypePosition(t *testing.T) { assert.Nil(t, parseErr) assert.Equal(t, 2, schema.Definitions.ForName("query").Fields.ForName("me").Type.Position.Line) }) + t.Run("type line number with comments", func(t *testing.T) { + schema, parseErr := ParseSchema(&ast.Source{ + Input: `type query { + # comment + me: User + } + `, + }) + assert.Nil(t, parseErr) + assert.Equal(t, 3, schema.Definitions.ForName("query").Fields.ForName("me").Type.Position.Line) + }) } From e0c89e1c3a3e83bf92b2b3b9a1ed844ee8187140 Mon Sep 17 00:00:00 2001 From: Shinnosuke Sawada <6warashi9@gmail.com> Date: Fri, 23 Jun 2023 08:05:11 +0900 Subject: [PATCH 5/5] feat(parser): skip comments in parsing --- parser/parser.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/parser/parser.go b/parser/parser.go index 68eb51ed..765d0bee 100644 --- a/parser/parser.go +++ b/parser/parser.go @@ -35,6 +35,9 @@ func (p *parser) peek() lexer.Token { if !p.peeked { p.peekToken, p.peekError = p.lexer.ReadToken() + if p.peekToken.Kind == lexer.Comment { + return p.peek() + } p.peeked = true } @@ -57,6 +60,9 @@ func (p *parser) next() lexer.Token { p.prev, p.err = p.peekToken, p.peekError } else { p.prev, p.err = p.lexer.ReadToken() + if p.prev.Kind == lexer.Comment { + return p.next() + } } return p.prev }