Skip to content

Commit 127afb7

Browse files
feat: checking for errors when calling ts_parser_set_language
1 parent dd81d9e commit 127afb7

File tree

4 files changed

+33
-23
lines changed

4 files changed

+33
-23
lines changed

bindings.go

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,9 @@ func Parse(content []byte, lang *Language) *Node {
3333
// returns root node
3434
func ParseCtx(ctx context.Context, content []byte, lang *Language) (*Node, error) {
3535
p := NewParser()
36-
p.SetLanguage(lang)
36+
if err := p.SetLanguage(lang); err != nil {
37+
return nil, fmt.Errorf("error whiling setting language: %v", err)
38+
}
3739
tree, err := p.ParseCtx(ctx, nil, content)
3840
if err != nil {
3941
return nil, err
@@ -59,9 +61,12 @@ func NewParser() *Parser {
5961
}
6062

6163
// SetLanguage assignes Language to a parser
62-
func (p *Parser) SetLanguage(lang *Language) {
64+
func (p *Parser) SetLanguage(lang *Language) error {
6365
cLang := (*C.struct_TSLanguage)(lang.ptr)
64-
C.ts_parser_set_language(p.c, cLang)
66+
if !C.ts_parser_set_language(p.c, cLang) {
67+
return fmt.Errorf("could not set the language, make sure the language version is compatible with current tree sitter")
68+
}
69+
return nil
6570
}
6671

6772
// ReadFunc is a function to retrieve a chunk of text at a given byte offset and (row, column) position

bindings_test.go

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ func TestTree(t *testing.T) {
6464
parser := NewParser()
6565

6666
parser.Debug()
67-
parser.SetLanguage(getTestGrammar())
67+
assert.Nil(t, parser.SetLanguage(getTestGrammar()))
6868
tree, err := parser.ParseCtx(context.Background(), nil, []byte("1 + 2"))
6969
assert.NoError(err)
7070
n := tree.RootNode()
@@ -123,7 +123,7 @@ func TestErrorNodes(t *testing.T) {
123123
parser := NewParser()
124124

125125
parser.Debug()
126-
parser.SetLanguage(getTestGrammar())
126+
assert.Nil(t, parser.SetLanguage(getTestGrammar()))
127127
tree, err := parser.ParseCtx(context.Background(), nil, []byte("1 + a"))
128128
assert.NoError(err)
129129
n := tree.RootNode()
@@ -176,7 +176,7 @@ func TestGC(t *testing.T) {
176176

177177
parser := NewParser()
178178

179-
parser.SetLanguage(getTestGrammar())
179+
assert.Nil(t, parser.SetLanguage(getTestGrammar()))
180180
tree, err := parser.ParseCtx(context.Background(), nil, []byte("1 + 2"))
181181
assert.NoError(err)
182182
n := tree.RootNode()
@@ -206,7 +206,7 @@ func TestOperationLimitParsing(t *testing.T) {
206206

207207
parser := NewParser()
208208
parser.SetOperationLimit(10)
209-
parser.SetLanguage(getTestGrammar())
209+
assert.Nil(t, parser.SetLanguage(getTestGrammar()))
210210
items := []string{}
211211
for i := 0; i < 100; i++ {
212212
items = append(items, strconv.Itoa(i))
@@ -223,7 +223,7 @@ func TestContextCancellationParsing(t *testing.T) {
223223
defer cancel()
224224

225225
parser := NewParser()
226-
parser.SetLanguage(getTestGrammar())
226+
assert.Nil(t, parser.SetLanguage(getTestGrammar()))
227227
items := []string{}
228228
// the content needs to be big so that we have enough time to cancel
229229
for i := 0; i < 10000; i++ {
@@ -267,7 +267,7 @@ func TestIncludedRanges(t *testing.T) {
267267
code := "1 + 2\n//3 + 5"
268268

269269
parser := NewParser()
270-
parser.SetLanguage(getTestGrammar())
270+
assert.Nil(t, parser.SetLanguage(getTestGrammar()))
271271
mainTree, err := parser.ParseCtx(context.Background(), nil, []byte(code))
272272
assert.NoError(err)
273273
assert.Equal(
@@ -301,7 +301,7 @@ func TestSameNode(t *testing.T) {
301301
assert := assert.New(t)
302302

303303
parser := NewParser()
304-
parser.SetLanguage(getTestGrammar())
304+
assert.Nil(t, parser.SetLanguage(getTestGrammar()))
305305
tree, err := parser.ParseCtx(context.Background(), nil, []byte("1 + 2"))
306306
assert.NoError(err)
307307

@@ -332,7 +332,7 @@ func TestQuery(t *testing.T) {
332332

333333
// test match only
334334
parser := NewParser()
335-
parser.SetLanguage(getTestGrammar())
335+
assert.Nil(t, parser.SetLanguage(getTestGrammar()))
336336
tree, err := parser.ParseCtx(context.Background(), nil, []byte(js))
337337
assert.NoError(t, err)
338338
root := tree.RootNode()
@@ -360,7 +360,7 @@ func testCaptures(t *testing.T, body, sq string, expected []string) {
360360
assert := assert.New(t)
361361

362362
parser := NewParser()
363-
parser.SetLanguage(getTestGrammar())
363+
assert.Nil(t, parser.SetLanguage(getTestGrammar()))
364364
tree, err := parser.ParseCtx(context.Background(), nil, []byte(body))
365365
assert.NoError(err)
366366
root := tree.RootNode()
@@ -476,7 +476,7 @@ func TestTreeCursor(t *testing.T) {
476476
func TestLeakParse(t *testing.T) {
477477
ctx := context.Background()
478478
parser := NewParser()
479-
parser.SetLanguage(getTestGrammar())
479+
assert.Nil(t, parser.SetLanguage(getTestGrammar()))
480480

481481
for i := 0; i < 100000; i++ {
482482
_, _ = parser.ParseCtx(ctx, nil, []byte("1 + 2"))
@@ -494,7 +494,7 @@ func TestLeakParse(t *testing.T) {
494494
func TestLeakRootNode(t *testing.T) {
495495
ctx := context.Background()
496496
parser := NewParser()
497-
parser.SetLanguage(getTestGrammar())
497+
assert.Nil(t, parser.SetLanguage(getTestGrammar()))
498498

499499
for i := 0; i < 100000; i++ {
500500
tree, err := parser.ParseCtx(ctx, nil, []byte("1 + 2"))
@@ -515,7 +515,7 @@ func TestParseInput(t *testing.T) {
515515
assert := assert.New(t)
516516

517517
parser := NewParser()
518-
parser.SetLanguage(getTestGrammar())
518+
assert.Nil(t, parser.SetLanguage(getTestGrammar()))
519519

520520
// empty input
521521
input := Input{
@@ -570,7 +570,7 @@ func TestParseInput(t *testing.T) {
570570
func TestLeakParseInput(t *testing.T) {
571571
ctx := context.Background()
572572
parser := NewParser()
573-
parser.SetLanguage(getTestGrammar())
573+
assert.Nil(t, parser.SetLanguage(getTestGrammar()))
574574

575575
inputData := []byte("1 + 2")
576576
input := Input{
@@ -602,7 +602,7 @@ func TestCursorKeepsQuery(t *testing.T) {
602602
source := bytes.Repeat([]byte("1 + 1"), 10000)
603603

604604
parser := NewParser()
605-
parser.SetLanguage(getTestGrammar())
605+
assert.Nil(t, parser.SetLanguage(getTestGrammar()))
606606

607607
tree := parser.Parse(nil, source)
608608
root := tree.RootNode()
@@ -630,7 +630,7 @@ func TestCursorKeepsQuery(t *testing.T) {
630630
func BenchmarkParse(b *testing.B) {
631631
ctx := context.Background()
632632
parser := NewParser()
633-
parser.SetLanguage(getTestGrammar())
633+
assert.Nil(b, parser.SetLanguage(getTestGrammar()))
634634
inputData := []byte("1 + 2")
635635

636636
b.ResetTimer()
@@ -646,7 +646,7 @@ func BenchmarkParseCancellable(b *testing.B) {
646646
defer cancel()
647647

648648
parser := NewParser()
649-
parser.SetLanguage(getTestGrammar())
649+
assert.Nil(b, parser.SetLanguage(getTestGrammar()))
650650
inputData := []byte("1 + 2")
651651

652652
b.ResetTimer()
@@ -659,7 +659,7 @@ func BenchmarkParseCancellable(b *testing.B) {
659659
func BenchmarkParseInput(b *testing.B) {
660660
ctx := context.Background()
661661
parser := NewParser()
662-
parser.SetLanguage(getTestGrammar())
662+
assert.Nil(b, parser.SetLanguage(getTestGrammar()))
663663

664664
inputData := []byte("1 + 2")
665665
input := Input{

markdown/binding.go

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

33
import (
44
"context"
5+
"fmt"
56

67
sitter "github.com/smacker/go-tree-sitter"
78
tree_sitter_markdown "github.com/smacker/go-tree-sitter/markdown/tree-sitter-markdown"
@@ -82,7 +83,9 @@ type Node struct {
8283

8384
func ParseCtx(ctx context.Context, oldTree *MarkdownTree, content []byte) (*MarkdownTree, error) {
8485
p := sitter.NewParser()
85-
p.SetLanguage(tree_sitter_markdown.GetLanguage())
86+
if err := p.SetLanguage(tree_sitter_markdown.GetLanguage()); err != nil {
87+
return nil, fmt.Errorf("could not set markdown language: %v", err)
88+
}
8689

8790
var old *sitter.Tree
8891
if oldTree != nil {
@@ -99,7 +102,9 @@ func ParseCtx(ctx context.Context, oldTree *MarkdownTree, content []byte) (*Mark
99102
inlineIndices: map[uintptr]int{},
100103
}
101104

102-
p.SetLanguage(tree_sitter_markdown_inline.GetLanguage())
105+
if err := p.SetLanguage(tree_sitter_markdown_inline.GetLanguage()); err != nil {
106+
return nil, fmt.Errorf("could not set markdown inline language: %v", err)
107+
}
103108

104109
q, err := sitter.NewQuery([]byte(`(inline) @inline`), tree_sitter_markdown.GetLanguage())
105110
if err != nil {

predicates_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -380,7 +380,7 @@ func TestFilterPredicates(t *testing.T) {
380380
}
381381

382382
parser := NewParser()
383-
parser.SetLanguage(getTestGrammar())
383+
assert.Nil(t, parser.SetLanguage(getTestGrammar()))
384384

385385
for testNum, testCase := range testCases {
386386
tree := parser.Parse(nil, []byte(testCase.input))

0 commit comments

Comments
 (0)