Skip to content

Commit 976241f

Browse files
authored
Merge pull request #248 from wader/parse-unexpected-multibyte-token-offset
set correct offset for multibyte tokens
2 parents 8874f53 + 1b5ce7f commit 976241f

File tree

2 files changed

+33
-1
lines changed

2 files changed

+33
-1
lines changed

compiler_test.go

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package gojq_test
22

33
import (
44
"context"
5+
"errors"
56
"fmt"
67
"log"
78
"os"
@@ -275,6 +276,36 @@ func TestCodeCompile_OptimizeJumps(t *testing.T) {
275276
}
276277
}
277278

279+
func TestParseErrorTokenOffset(t *testing.T) {
280+
testCases := []struct {
281+
src string
282+
offset int
283+
}{
284+
{src: "^", offset: 1},
285+
{src: " ^", offset: 2},
286+
{src: " ^ ", offset: 2},
287+
{src: "👍", offset: 4},
288+
{src: " 👍", offset: 5},
289+
{src: " 👍 ", offset: 5},
290+
{src: "test👍", offset: 8},
291+
}
292+
for _, tc := range testCases {
293+
t.Run(tc.src, func(t *testing.T) {
294+
_, err := gojq.Parse(tc.src)
295+
if err == nil {
296+
t.Fatal("expected: error")
297+
}
298+
var pe *gojq.ParseError
299+
if !errors.As(err, &pe) {
300+
t.Fatalf("expected: *gojq.ParseError, got %v", err)
301+
}
302+
if pe.Offset != tc.offset {
303+
t.Fatalf("expected: %v, got %v", tc.offset, pe.Offset)
304+
}
305+
})
306+
}
307+
}
308+
278309
func TestCodeRun_Race(t *testing.T) {
279310
query, err := gojq.Parse("range(10)")
280311
if err != nil {

lexer.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -235,7 +235,8 @@ func (l *lexer) Lex(lval *yySymType) (tokenType int) {
235235
default:
236236
if ch >= utf8.RuneSelf {
237237
r, size := utf8.DecodeRuneInString(l.source[l.offset-1:])
238-
l.offset += size
238+
// -1 to adjust for first byte consumed by next()
239+
l.offset += size - 1
239240
l.token = string(r)
240241
}
241242
}

0 commit comments

Comments
 (0)