ruby_tree_sitter 0.20.6.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/LICENSE +21 -0
- data/README.md +152 -0
- data/ext/tree_sitter/encoding.c +29 -0
- data/ext/tree_sitter/extconf.rb +172 -0
- data/ext/tree_sitter/input.c +126 -0
- data/ext/tree_sitter/input_edit.c +42 -0
- data/ext/tree_sitter/language.c +134 -0
- data/ext/tree_sitter/logger.c +212 -0
- data/ext/tree_sitter/macros.h +163 -0
- data/ext/tree_sitter/node.c +310 -0
- data/ext/tree_sitter/parser.c +203 -0
- data/ext/tree_sitter/point.c +26 -0
- data/ext/tree_sitter/quantifier.c +43 -0
- data/ext/tree_sitter/query.c +157 -0
- data/ext/tree_sitter/query_capture.c +28 -0
- data/ext/tree_sitter/query_cursor.c +103 -0
- data/ext/tree_sitter/query_error.c +41 -0
- data/ext/tree_sitter/query_match.c +44 -0
- data/ext/tree_sitter/query_predicate_step.c +83 -0
- data/ext/tree_sitter/range.c +35 -0
- data/ext/tree_sitter/symbol_type.c +46 -0
- data/ext/tree_sitter/tree.c +145 -0
- data/ext/tree_sitter/tree_cursor.c +97 -0
- data/ext/tree_sitter/tree_sitter.c +32 -0
- data/ext/tree_sitter/tree_sitter.h +107 -0
- data/lib/tree_sitter/node.rb +164 -0
- data/lib/tree_sitter/version.rb +5 -0
- data/lib/tree_sitter.rb +13 -0
- data/test/README.md +15 -0
- data/test/test_helper.rb +9 -0
- data/test/tree_sitter/language_test.rb +68 -0
- data/test/tree_sitter/logger_test.rb +69 -0
- data/test/tree_sitter/node_test.rb +355 -0
- data/test/tree_sitter/parser_test.rb +140 -0
- data/test/tree_sitter/query_test.rb +153 -0
- data/test/tree_sitter/tree_cursor_test.rb +83 -0
- data/test/tree_sitter/tree_test.rb +51 -0
- data/tree_sitter.gemspec +32 -0
- metadata +189 -0
@@ -0,0 +1,83 @@
|
|
1
|
+
#include "tree_sitter.h"
|
2
|
+
|
3
|
+
extern VALUE mTreeSitter;
|
4
|
+
|
5
|
+
VALUE cQueryPredicateStep;
|
6
|
+
|
7
|
+
const char *done = "Done";
|
8
|
+
const char *capture = "capture";
|
9
|
+
const char *string = "String";
|
10
|
+
|
11
|
+
DATA_WRAP(QueryPredicateStep, query_predicate_step)
|
12
|
+
|
13
|
+
VALUE new_query_predicate_step_type(TSQueryPredicateStepType type) {
|
14
|
+
switch (type) {
|
15
|
+
case TSQueryPredicateStepTypeDone:
|
16
|
+
return ID2SYM(rb_intern(done));
|
17
|
+
case TSQueryPredicateStepTypeCapture:
|
18
|
+
return ID2SYM(rb_intern(capture));
|
19
|
+
case TSQueryPredicateStepTypeString:
|
20
|
+
return ID2SYM(rb_intern(string));
|
21
|
+
default:
|
22
|
+
return Qnil;
|
23
|
+
}
|
24
|
+
}
|
25
|
+
|
26
|
+
static const char *query_predicate_type_string(TSQueryPredicateStepType type) {
|
27
|
+
switch (type) {
|
28
|
+
case TSQueryPredicateStepTypeDone:
|
29
|
+
return done;
|
30
|
+
case TSQueryPredicateStepTypeCapture:
|
31
|
+
return capture;
|
32
|
+
case TSQueryPredicateStepTypeString:
|
33
|
+
return string;
|
34
|
+
default:
|
35
|
+
return "???";
|
36
|
+
}
|
37
|
+
}
|
38
|
+
|
39
|
+
TSQueryPredicateStepType value_to_query_predicate_step_type(VALUE step_type) {
|
40
|
+
VALUE type = SYM2ID(step_type);
|
41
|
+
VALUE c = rb_const_get_at(cQueryPredicateStep, rb_intern(capture));
|
42
|
+
VALUE s = rb_const_get_at(cQueryPredicateStep, rb_intern(string));
|
43
|
+
|
44
|
+
// NOTE: should we emit a warning instead of defaulting to done?
|
45
|
+
if (type == c) {
|
46
|
+
return TSQueryPredicateStepTypeCapture;
|
47
|
+
} else if (type == s) {
|
48
|
+
return TSQueryPredicateStepTypeString;
|
49
|
+
} else {
|
50
|
+
return TSQueryPredicateStepTypeDone;
|
51
|
+
}
|
52
|
+
}
|
53
|
+
|
54
|
+
static VALUE query_predicate_step_inspect(VALUE self) {
|
55
|
+
query_predicate_step_t *step = unwrap(self);
|
56
|
+
return rb_sprintf("{value_id=%i, type=%s}", step->data.value_id,
|
57
|
+
query_predicate_type_string(step->data.type));
|
58
|
+
}
|
59
|
+
|
60
|
+
DATA_DEFINE_ACCESSOR(query_predicate_step, type, new_query_predicate_step_type,
|
61
|
+
value_to_query_predicate_step_type)
|
62
|
+
DATA_DEFINE_ACCESSOR(query_predicate_step, value_id, UINT2NUM, NUM2UINT)
|
63
|
+
|
64
|
+
void init_query_predicate_step(void) {
|
65
|
+
cQueryPredicateStep =
|
66
|
+
rb_define_class_under(mTreeSitter, "QueryPredicateStep", rb_cObject);
|
67
|
+
|
68
|
+
rb_define_alloc_func(cQueryPredicateStep, query_predicate_step_allocate);
|
69
|
+
|
70
|
+
/* Constants */
|
71
|
+
rb_define_const(cQueryPredicateStep, "DONE", ID2SYM(rb_intern(done)));
|
72
|
+
rb_define_const(cQueryPredicateStep, "CAPTURE", ID2SYM(rb_intern(capture)));
|
73
|
+
rb_define_const(cQueryPredicateStep, "STRING", ID2SYM(rb_intern(string)));
|
74
|
+
|
75
|
+
/* Class methods */
|
76
|
+
DECLARE_ACCESSOR(cQueryPredicateStep, query_predicate_step, type)
|
77
|
+
DECLARE_ACCESSOR(cQueryPredicateStep, query_predicate_step, value_id)
|
78
|
+
|
79
|
+
rb_define_method(cQueryPredicateStep, "inspect", query_predicate_step_inspect,
|
80
|
+
0);
|
81
|
+
rb_define_method(cQueryPredicateStep, "to_s", query_predicate_step_inspect,
|
82
|
+
0);
|
83
|
+
}
|
@@ -0,0 +1,35 @@
|
|
1
|
+
#include "tree_sitter.h"
|
2
|
+
|
3
|
+
extern VALUE mTreeSitter;
|
4
|
+
|
5
|
+
VALUE cRange;
|
6
|
+
|
7
|
+
DATA_WRAP(Range, range)
|
8
|
+
DATA_DEFINE_ACCESSOR(range, start_point, new_point_by_val, value_to_point)
|
9
|
+
DATA_DEFINE_ACCESSOR(range, end_point, new_point_by_val, value_to_point)
|
10
|
+
DATA_DEFINE_ACCESSOR(range, start_byte, UINT2NUM, NUM2UINT)
|
11
|
+
DATA_DEFINE_ACCESSOR(range, end_byte, UINT2NUM, NUM2UINT)
|
12
|
+
|
13
|
+
static VALUE range_inspect(VALUE self) {
|
14
|
+
range_t *range = unwrap(self);
|
15
|
+
return rb_sprintf("{start_point= %+" PRIsVALUE ", end_point=%+" PRIsVALUE
|
16
|
+
", start_byte=%i, end_byte=%i}",
|
17
|
+
new_point_by_val(range->data.start_point),
|
18
|
+
new_point_by_val(range->data.end_point),
|
19
|
+
range->data.start_byte, range->data.end_byte);
|
20
|
+
}
|
21
|
+
|
22
|
+
void init_range(void) {
|
23
|
+
cRange = rb_define_class_under(mTreeSitter, "Range", rb_cObject);
|
24
|
+
|
25
|
+
rb_define_alloc_func(cRange, range_allocate);
|
26
|
+
|
27
|
+
/* Class methods */
|
28
|
+
DECLARE_ACCESSOR(cRange, range, start_point)
|
29
|
+
DECLARE_ACCESSOR(cRange, range, end_point)
|
30
|
+
DECLARE_ACCESSOR(cRange, range, start_byte)
|
31
|
+
DECLARE_ACCESSOR(cRange, range, end_byte)
|
32
|
+
|
33
|
+
rb_define_method(cRange, "inspect", range_inspect, 0);
|
34
|
+
rb_define_method(cRange, "to_s", range_inspect, 0);
|
35
|
+
}
|
@@ -0,0 +1,46 @@
|
|
1
|
+
#include "tree_sitter.h"
|
2
|
+
|
3
|
+
extern VALUE mTreeSitter;
|
4
|
+
|
5
|
+
VALUE mSymbolType;
|
6
|
+
|
7
|
+
const char *regular = "regular";
|
8
|
+
const char *anonymous = "anonymous";
|
9
|
+
const char *auxiliary = "auxiliary";
|
10
|
+
|
11
|
+
TSSymbolType value_to_symbol_type(VALUE symbol_type) {
|
12
|
+
VALUE sym = SYM2ID(symbol_type);
|
13
|
+
VALUE anon = rb_const_get_at(mSymbolType, rb_intern(anonymous));
|
14
|
+
VALUE aux = rb_const_get_at(mSymbolType, rb_intern(auxiliary));
|
15
|
+
|
16
|
+
// NOTE: should we emit a warning instead of defaulting to regular?
|
17
|
+
if (sym == anon) {
|
18
|
+
return TSSymbolTypeAnonymous;
|
19
|
+
} else if (sym == aux) {
|
20
|
+
return TSSymbolTypeAuxiliary;
|
21
|
+
} else {
|
22
|
+
return TSSymbolTypeRegular;
|
23
|
+
}
|
24
|
+
}
|
25
|
+
|
26
|
+
VALUE new_symbol_type(TSSymbolType symbol_type) {
|
27
|
+
switch (symbol_type) {
|
28
|
+
case TSSymbolTypeRegular:
|
29
|
+
return ID2SYM(rb_intern(regular));
|
30
|
+
case TSSymbolTypeAnonymous:
|
31
|
+
return ID2SYM(rb_intern(anonymous));
|
32
|
+
case TSSymbolTypeAuxiliary:
|
33
|
+
return ID2SYM(rb_intern(auxiliary));
|
34
|
+
default:
|
35
|
+
return ID2SYM(rb_intern("this_should_never_get_reached"));
|
36
|
+
}
|
37
|
+
}
|
38
|
+
|
39
|
+
void init_symbol_type(void) {
|
40
|
+
mSymbolType = rb_define_module_under(mTreeSitter, "SymbolType");
|
41
|
+
|
42
|
+
/* Constants */
|
43
|
+
rb_define_const(mSymbolType, "REGULAR", ID2SYM(rb_intern(regular)));
|
44
|
+
rb_define_const(mSymbolType, "ANONYMOUS", ID2SYM(rb_intern(anonymous)));
|
45
|
+
rb_define_const(mSymbolType, "AUXILIARY", ID2SYM(rb_intern(auxiliary)));
|
46
|
+
}
|
@@ -0,0 +1,145 @@
|
|
1
|
+
#include "tree_sitter.h"
|
2
|
+
|
3
|
+
extern VALUE mTreeSitter;
|
4
|
+
|
5
|
+
VALUE cTree;
|
6
|
+
|
7
|
+
int tree_rc_free(const TSTree *tree) {
|
8
|
+
VALUE ptr = ULONG2NUM((uintptr_t)tree);
|
9
|
+
VALUE rc = rb_cv_get(cTree, "@@rc");
|
10
|
+
VALUE val = rb_hash_lookup(rc, ptr);
|
11
|
+
|
12
|
+
if (!NIL_P(val)) {
|
13
|
+
unsigned int count = NUM2UINT(val);
|
14
|
+
--count;
|
15
|
+
if (count < 1) {
|
16
|
+
rb_hash_delete(rc, ptr);
|
17
|
+
ts_tree_delete((TSTree *)tree);
|
18
|
+
return 1;
|
19
|
+
} else {
|
20
|
+
rb_hash_aset(rc, ptr, ULONG2NUM(count));
|
21
|
+
return 0;
|
22
|
+
}
|
23
|
+
} else {
|
24
|
+
return 1;
|
25
|
+
}
|
26
|
+
}
|
27
|
+
|
28
|
+
void tree_rc_new(const TSTree *tree) {
|
29
|
+
VALUE ptr = ULONG2NUM((uintptr_t)tree);
|
30
|
+
VALUE rc = rb_cv_get(cTree, "@@rc");
|
31
|
+
VALUE val = rb_hash_lookup(rc, ptr);
|
32
|
+
|
33
|
+
if (NIL_P(val)) {
|
34
|
+
rb_hash_aset(rc, ptr, UINT2NUM(1));
|
35
|
+
} else {
|
36
|
+
rb_hash_aset(rc, ptr, UINT2NUM(NUM2UINT(val) + 1));
|
37
|
+
}
|
38
|
+
}
|
39
|
+
|
40
|
+
DATA_TYPE(TSTree *, tree)
|
41
|
+
static void tree_free(void *ptr) {
|
42
|
+
tree_t *type = (tree_t *)ptr;
|
43
|
+
if (tree_rc_free(type->data)) {
|
44
|
+
xfree(ptr);
|
45
|
+
}
|
46
|
+
}
|
47
|
+
|
48
|
+
DATA_MEMSIZE(tree)
|
49
|
+
DATA_DECLARE_DATA_TYPE(tree)
|
50
|
+
DATA_ALLOCATE(tree)
|
51
|
+
DATA_UNWRAP(tree)
|
52
|
+
|
53
|
+
VALUE new_tree(TSTree *ptr) {
|
54
|
+
if (ptr == NULL) {
|
55
|
+
return Qnil;
|
56
|
+
}
|
57
|
+
VALUE res = tree_allocate(cTree);
|
58
|
+
tree_t *type = unwrap(res);
|
59
|
+
type->data = ptr;
|
60
|
+
tree_rc_new(ptr);
|
61
|
+
return res;
|
62
|
+
}
|
63
|
+
|
64
|
+
DATA_FROM_VALUE(TSTree *, tree)
|
65
|
+
|
66
|
+
static VALUE tree_copy(VALUE self) { return new_tree(ts_tree_copy(SELF)); }
|
67
|
+
|
68
|
+
static VALUE tree_root_node(VALUE self) {
|
69
|
+
return new_node_by_val(ts_tree_root_node(SELF));
|
70
|
+
}
|
71
|
+
|
72
|
+
static VALUE tree_language(VALUE self) {
|
73
|
+
return new_language(ts_tree_language(SELF));
|
74
|
+
}
|
75
|
+
|
76
|
+
static VALUE tree_edit(VALUE self, VALUE edit) {
|
77
|
+
TSInputEdit in = value_to_input_edit(edit);
|
78
|
+
ts_tree_edit(SELF, &in);
|
79
|
+
return Qnil;
|
80
|
+
}
|
81
|
+
|
82
|
+
static VALUE tree_changed_ranges(VALUE _self, VALUE old_tree, VALUE new_tree) {
|
83
|
+
TSTree *old = unwrap(old_tree)->data;
|
84
|
+
TSTree *new = unwrap(new_tree)->data;
|
85
|
+
uint32_t length;
|
86
|
+
TSRange *ranges = ts_tree_get_changed_ranges(old, new, &length);
|
87
|
+
VALUE res = rb_ary_new_capa(length);
|
88
|
+
|
89
|
+
for (uint32_t i = 0; i < length; i++) {
|
90
|
+
rb_ary_push(res, new_range(&ranges[i]));
|
91
|
+
}
|
92
|
+
|
93
|
+
if (ranges) {
|
94
|
+
free(ranges);
|
95
|
+
}
|
96
|
+
|
97
|
+
return res;
|
98
|
+
}
|
99
|
+
|
100
|
+
static VALUE tree_print_dot_graph(VALUE self, VALUE file) {
|
101
|
+
Check_Type(file, T_STRING);
|
102
|
+
char *path = StringValueCStr(file);
|
103
|
+
FILE *fd = fopen(path, "w+");
|
104
|
+
ts_tree_print_dot_graph(SELF, fd);
|
105
|
+
fclose(fd);
|
106
|
+
return Qnil;
|
107
|
+
}
|
108
|
+
|
109
|
+
static VALUE tree_finalizer(VALUE _self) {
|
110
|
+
VALUE rc = rb_cv_get(cTree, "@@rc");
|
111
|
+
VALUE keys = rb_funcall(rc, rb_intern("keys"), 0);
|
112
|
+
VALUE *elements = RARRAY_PTR(keys);
|
113
|
+
long len = RARRAY_LEN(keys);
|
114
|
+
|
115
|
+
for (long i = 0; i < len; ++i) {
|
116
|
+
VALUE curr = elements[i];
|
117
|
+
unsigned int val = NUM2UINT(rb_hash_lookup(rc, curr));
|
118
|
+
if (val > 0) {
|
119
|
+
ts_tree_delete((TSTree *)NUM2ULONG(curr));
|
120
|
+
}
|
121
|
+
|
122
|
+
rb_hash_delete(rc, curr);
|
123
|
+
}
|
124
|
+
|
125
|
+
return Qnil;
|
126
|
+
}
|
127
|
+
|
128
|
+
void init_tree(void) {
|
129
|
+
cTree = rb_define_class_under(mTreeSitter, "Tree", rb_cObject);
|
130
|
+
|
131
|
+
rb_undef_alloc_func(cTree);
|
132
|
+
|
133
|
+
/* Class methods */
|
134
|
+
rb_define_method(cTree, "copy", tree_copy, 0);
|
135
|
+
rb_define_method(cTree, "root_node", tree_root_node, 0);
|
136
|
+
rb_define_method(cTree, "language", tree_language, 0);
|
137
|
+
rb_define_method(cTree, "edit", tree_edit, 1);
|
138
|
+
rb_define_module_function(cTree, "changed_ranges", tree_changed_ranges, 2);
|
139
|
+
rb_define_method(cTree, "print_dot_graph", tree_print_dot_graph, 1);
|
140
|
+
rb_define_module_function(cTree, "finalizer", tree_finalizer, 0);
|
141
|
+
|
142
|
+
// Reference-count created trees
|
143
|
+
VALUE rc = rb_hash_new();
|
144
|
+
rb_cv_set(cTree, "@@rc", rc);
|
145
|
+
}
|
@@ -0,0 +1,97 @@
|
|
1
|
+
#include "tree_sitter.h"
|
2
|
+
|
3
|
+
extern VALUE mTreeSitter;
|
4
|
+
|
5
|
+
VALUE cTreeCursor;
|
6
|
+
|
7
|
+
DATA_TYPE(TSTreeCursor, tree_cursor)
|
8
|
+
static void tree_cursor_free(void *ptr) {
|
9
|
+
tree_cursor_t *type = (tree_cursor_t *)ptr;
|
10
|
+
ts_tree_cursor_delete(&type->data);
|
11
|
+
xfree(ptr);
|
12
|
+
}
|
13
|
+
DATA_MEMSIZE(tree_cursor)
|
14
|
+
DATA_DECLARE_DATA_TYPE(tree_cursor)
|
15
|
+
DATA_ALLOCATE(tree_cursor)
|
16
|
+
DATA_UNWRAP(tree_cursor)
|
17
|
+
DATA_NEW(cTreeCursor, TSTreeCursor, tree_cursor)
|
18
|
+
DATA_FROM_VALUE(TSTreeCursor, tree_cursor)
|
19
|
+
|
20
|
+
static VALUE tree_cursor_initialize(VALUE self, VALUE node) {
|
21
|
+
TSNode n = value_to_node(node);
|
22
|
+
tree_cursor_t *ptr = unwrap(self);
|
23
|
+
ptr->data = ts_tree_cursor_new(n);
|
24
|
+
return self;
|
25
|
+
}
|
26
|
+
|
27
|
+
static VALUE tree_cursor_reset(VALUE self, VALUE node) {
|
28
|
+
ts_tree_cursor_reset(&SELF, value_to_node(node));
|
29
|
+
return Qnil;
|
30
|
+
}
|
31
|
+
|
32
|
+
static VALUE tree_cursor_current_node(VALUE self) {
|
33
|
+
TSNode node = ts_tree_cursor_current_node(&SELF);
|
34
|
+
return new_node(&node);
|
35
|
+
}
|
36
|
+
|
37
|
+
static VALUE tree_cursor_current_field_name(VALUE self) {
|
38
|
+
return safe_str(ts_tree_cursor_current_field_name(&SELF));
|
39
|
+
}
|
40
|
+
|
41
|
+
static VALUE tree_cursor_current_field_id(VALUE self) {
|
42
|
+
return UINT2NUM(ts_tree_cursor_current_field_id(&SELF));
|
43
|
+
}
|
44
|
+
|
45
|
+
static VALUE tree_cursor_goto_parent(VALUE self) {
|
46
|
+
return ts_tree_cursor_goto_parent(&SELF) ? Qtrue : Qfalse;
|
47
|
+
}
|
48
|
+
|
49
|
+
static VALUE tree_cursor_goto_next_sibling(VALUE self) {
|
50
|
+
return ts_tree_cursor_goto_next_sibling(&SELF) ? Qtrue : Qfalse;
|
51
|
+
}
|
52
|
+
|
53
|
+
static VALUE tree_cursor_goto_first_child(VALUE self) {
|
54
|
+
return ts_tree_cursor_goto_first_child(&SELF) ? Qtrue : Qfalse;
|
55
|
+
}
|
56
|
+
|
57
|
+
static VALUE tree_cursor_goto_first_child_for_byte(VALUE self, VALUE byte) {
|
58
|
+
return LL2NUM(
|
59
|
+
ts_tree_cursor_goto_first_child_for_byte(&SELF, NUM2UINT(byte)));
|
60
|
+
}
|
61
|
+
|
62
|
+
static VALUE tree_cursor_goto_first_child_for_point(VALUE self, VALUE point) {
|
63
|
+
return LL2NUM(
|
64
|
+
ts_tree_cursor_goto_first_child_for_point(&SELF, value_to_point(point)));
|
65
|
+
}
|
66
|
+
|
67
|
+
static VALUE tree_cursor_copy(VALUE self) {
|
68
|
+
VALUE res = tree_cursor_allocate(cTreeCursor);
|
69
|
+
tree_cursor_t *ptr = unwrap(res);
|
70
|
+
ptr->data = ts_tree_cursor_copy(&SELF);
|
71
|
+
return res;
|
72
|
+
}
|
73
|
+
|
74
|
+
void init_tree_cursor(void) {
|
75
|
+
cTreeCursor = rb_define_class_under(mTreeSitter, "TreeCursor", rb_cObject);
|
76
|
+
|
77
|
+
rb_define_alloc_func(cTreeCursor, tree_cursor_allocate);
|
78
|
+
|
79
|
+
/* Class methods */
|
80
|
+
rb_define_method(cTreeCursor, "initialize", tree_cursor_initialize, 1);
|
81
|
+
rb_define_method(cTreeCursor, "reset", tree_cursor_reset, 1);
|
82
|
+
rb_define_method(cTreeCursor, "current_node", tree_cursor_current_node, 0);
|
83
|
+
rb_define_method(cTreeCursor, "current_field_name",
|
84
|
+
tree_cursor_current_field_name, 0);
|
85
|
+
rb_define_method(cTreeCursor, "current_field_id",
|
86
|
+
tree_cursor_current_field_id, 0);
|
87
|
+
rb_define_method(cTreeCursor, "goto_parent", tree_cursor_goto_parent, 0);
|
88
|
+
rb_define_method(cTreeCursor, "goto_next_sibling",
|
89
|
+
tree_cursor_goto_next_sibling, 0);
|
90
|
+
rb_define_method(cTreeCursor, "goto_first_child",
|
91
|
+
tree_cursor_goto_first_child, 0);
|
92
|
+
rb_define_method(cTreeCursor, "goto_first_child_for_byte",
|
93
|
+
tree_cursor_goto_first_child_for_byte, 1);
|
94
|
+
rb_define_method(cTreeCursor, "goto_first_child_for_point",
|
95
|
+
tree_cursor_goto_first_child_for_point, 1);
|
96
|
+
rb_define_method(cTreeCursor, "copy", tree_cursor_copy, 0);
|
97
|
+
}
|
@@ -0,0 +1,32 @@
|
|
1
|
+
#include "tree_sitter.h"
|
2
|
+
|
3
|
+
VALUE mTreeSitter;
|
4
|
+
|
5
|
+
void Init_tree_sitter() {
|
6
|
+
mTreeSitter = rb_define_module("TreeSitter");
|
7
|
+
|
8
|
+
rb_define_const(mTreeSitter, "LANGUAGE_VERSION",
|
9
|
+
INT2NUM(TREE_SITTER_LANGUAGE_VERSION));
|
10
|
+
rb_define_const(mTreeSitter, "MIN_COMPATIBLE_LANGUAGE_VERSION",
|
11
|
+
TREE_SITTER_MIN_COMPATIBLE_LANGUAGE_VERSION);
|
12
|
+
|
13
|
+
init_encoding();
|
14
|
+
init_input();
|
15
|
+
init_input_edit();
|
16
|
+
init_language();
|
17
|
+
init_logger();
|
18
|
+
init_node();
|
19
|
+
init_parser();
|
20
|
+
init_point();
|
21
|
+
init_quantifier();
|
22
|
+
init_query();
|
23
|
+
init_query_capture();
|
24
|
+
init_query_cursor();
|
25
|
+
init_query_error();
|
26
|
+
init_query_match();
|
27
|
+
init_query_predicate_step();
|
28
|
+
init_range();
|
29
|
+
init_symbol_type();
|
30
|
+
init_tree();
|
31
|
+
init_tree_cursor();
|
32
|
+
}
|
@@ -0,0 +1,107 @@
|
|
1
|
+
#ifndef _RB_TREE_SITTER_H
|
2
|
+
#define _RB_TREE_SITTER_H
|
3
|
+
|
4
|
+
#include "macros.h"
|
5
|
+
#include <dlfcn.h>
|
6
|
+
#include <fcntl.h>
|
7
|
+
#include <ruby.h>
|
8
|
+
#include <stdio.h>
|
9
|
+
#include <string.h>
|
10
|
+
#include <tree_sitter/api.h>
|
11
|
+
|
12
|
+
static inline VALUE safe_str(const char *str) {
|
13
|
+
if (str == NULL) {
|
14
|
+
return Qnil;
|
15
|
+
} else {
|
16
|
+
return rb_utf8_str_new_cstr(str);
|
17
|
+
}
|
18
|
+
}
|
19
|
+
|
20
|
+
static inline VALUE safe_str2(const char *str, uint32_t len) {
|
21
|
+
if (str == NULL) {
|
22
|
+
return Qnil;
|
23
|
+
} else if (len == 0) {
|
24
|
+
return rb_utf8_str_new_cstr("");
|
25
|
+
} else {
|
26
|
+
return rb_utf8_str_new(str, len);
|
27
|
+
}
|
28
|
+
}
|
29
|
+
|
30
|
+
static inline VALUE safe_symbol(const char *str) {
|
31
|
+
if (str == NULL) {
|
32
|
+
return Qnil;
|
33
|
+
} else {
|
34
|
+
return ID2SYM(rb_intern(str));
|
35
|
+
}
|
36
|
+
}
|
37
|
+
|
38
|
+
// VALUE to TS* converters
|
39
|
+
|
40
|
+
TSInput value_to_input(VALUE);
|
41
|
+
TSInputEdit value_to_input_edit(VALUE);
|
42
|
+
TSInputEncoding value_to_encoding(VALUE);
|
43
|
+
TSLanguage *value_to_language(VALUE);
|
44
|
+
TSLogger value_to_logger(VALUE);
|
45
|
+
TSNode value_to_node(VALUE);
|
46
|
+
TSPoint value_to_point(VALUE);
|
47
|
+
TSQuantifier value_to_quantifier(VALUE);
|
48
|
+
TSQuery *value_to_query(VALUE);
|
49
|
+
TSQueryCursor *value_to_query_cursor(VALUE);
|
50
|
+
TSQueryError value_to_query_error(VALUE);
|
51
|
+
TSQueryMatch value_to_query_match(VALUE);
|
52
|
+
TSQueryPredicateStep value_to_query_predicate_step(VALUE);
|
53
|
+
TSQueryPredicateStepType value_to_query_predicate_step_type(VALUE);
|
54
|
+
TSRange value_to_range(VALUE);
|
55
|
+
TSSymbolType value_to_symbol_type(VALUE);
|
56
|
+
TSTree *value_to_tree(VALUE);
|
57
|
+
TSTreeCursor value_to_tree_cursor(VALUE);
|
58
|
+
|
59
|
+
// TS* to VALUE converters
|
60
|
+
VALUE new_input(const TSInput *);
|
61
|
+
VALUE new_language(const TSLanguage *);
|
62
|
+
VALUE new_logger(const TSLogger *);
|
63
|
+
VALUE new_logger_by_val(TSLogger);
|
64
|
+
VALUE new_node(const TSNode *);
|
65
|
+
VALUE new_node_by_val(TSNode);
|
66
|
+
VALUE new_point(const TSPoint *);
|
67
|
+
VALUE new_point_by_val(TSPoint);
|
68
|
+
VALUE new_query_capture(const TSQueryCapture *);
|
69
|
+
VALUE new_query_match(const TSQueryMatch *);
|
70
|
+
VALUE new_query_predicate_step(const TSQueryPredicateStep *);
|
71
|
+
VALUE new_range(const TSRange *);
|
72
|
+
VALUE new_symbol_type(TSSymbolType);
|
73
|
+
VALUE new_tree(TSTree *);
|
74
|
+
|
75
|
+
// All init_* functions are called from Init_tree_sitter
|
76
|
+
void init_encoding(void);
|
77
|
+
void init_input(void);
|
78
|
+
void init_input_edit(void);
|
79
|
+
void init_language(void);
|
80
|
+
void init_logger(void);
|
81
|
+
void init_node(void);
|
82
|
+
void init_parser(void);
|
83
|
+
void init_point(void);
|
84
|
+
void init_quantifier(void);
|
85
|
+
void init_query(void);
|
86
|
+
void init_query_capture(void);
|
87
|
+
void init_query_cursor(void);
|
88
|
+
void init_query_error(void);
|
89
|
+
void init_query_match(void);
|
90
|
+
void init_query_predicate_step(void);
|
91
|
+
void init_range(void);
|
92
|
+
void init_symbol_type(void);
|
93
|
+
void init_tree(void);
|
94
|
+
void init_tree_cursor(void);
|
95
|
+
|
96
|
+
// Other helpers
|
97
|
+
const char *quantifier_str(TSQuantifier);
|
98
|
+
const char *query_error_str(TSQueryError);
|
99
|
+
|
100
|
+
// TSTree reference counting
|
101
|
+
int tree_rc_free(const TSTree *);
|
102
|
+
void tree_rc_new(const TSTree *);
|
103
|
+
|
104
|
+
// This is a special entry-point for the extension
|
105
|
+
void Init_tree_sitter(void);
|
106
|
+
|
107
|
+
#endif
|