Skip to content

Commit b7316b0

Browse files
authored
Abstract tree-sitter functions by extending the Node module and introducing a Cursor struct (#1032)
1 parent 726de3d commit b7316b0

24 files changed

+402
-367
lines changed

src/alterator.rs

Lines changed: 18 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -10,26 +10,25 @@ where
1010

1111
fn get_text_span(node: &Node, code: &[u8], span: bool, text: bool) -> (String, Span) {
1212
let text = if text {
13-
String::from_utf8(code[node.object().start_byte()..node.object().end_byte()].to_vec())
14-
.unwrap()
13+
String::from_utf8(code[node.start_byte()..node.end_byte()].to_vec()).unwrap()
1514
} else {
1615
"".to_string()
1716
};
1817
if span {
19-
let spos = node.object().start_position();
20-
let epos = node.object().end_position();
18+
let (spos_row, spos_column) = node.start_position();
19+
let (epos_row, epos_column) = node.end_position();
2120
(
2221
text,
23-
Some((spos.row + 1, spos.column + 1, epos.row + 1, epos.column + 1)),
22+
Some((spos_row + 1, spos_column + 1, epos_row + 1, epos_column + 1)),
2423
)
2524
} else {
2625
(text, None)
2726
}
2827
}
2928

3029
fn get_default(node: &Node, code: &[u8], span: bool, children: Vec<AstNode>) -> AstNode {
31-
let (text, span) = Self::get_text_span(node, code, span, node.object().child_count() == 0);
32-
AstNode::new(node.object().kind(), text, span, children)
30+
let (text, span) = Self::get_text_span(node, code, span, node.child_count() == 0);
31+
AstNode::new(node.kind(), text, span, children)
3332
}
3433

3534
fn get_ast_node(
@@ -53,10 +52,10 @@ impl Alterator for CcommentCode {}
5352

5453
impl Alterator for CppCode {
5554
fn alterate(node: &Node, code: &[u8], span: bool, mut children: Vec<AstNode>) -> AstNode {
56-
match Cpp::from(node.object().kind_id()) {
55+
match Cpp::from(node.kind_id()) {
5756
Cpp::StringLiteral | Cpp::CharLiteral => {
5857
let (text, span) = Self::get_text_span(node, code, span, true);
59-
AstNode::new(node.object().kind(), text, span, Vec::new())
58+
AstNode::new(node.kind(), text, span, Vec::new())
6059
}
6160
Cpp::PreprocDef | Cpp::PreprocFunctionDef | Cpp::PreprocCall => {
6261
if let Some(last) = children.last() {
@@ -78,12 +77,12 @@ impl Alterator for KotlinCode {}
7877

7978
impl Alterator for MozjsCode {
8079
fn alterate(node: &Node, code: &[u8], span: bool, children: Vec<AstNode>) -> AstNode {
81-
match Mozjs::from(node.object().kind_id()) {
80+
match Mozjs::from(node.kind_id()) {
8281
Mozjs::String => {
8382
// TODO: have a thought about template_strings:
8483
// they may have children for replacement...
8584
let (text, span) = Self::get_text_span(node, code, span, true);
86-
AstNode::new(node.object().kind(), text, span, Vec::new())
85+
AstNode::new(node.kind(), text, span, Vec::new())
8786
}
8887
_ => Self::get_default(node, code, span, children),
8988
}
@@ -92,10 +91,10 @@ impl Alterator for MozjsCode {
9291

9392
impl Alterator for JavascriptCode {
9493
fn alterate(node: &Node, code: &[u8], span: bool, children: Vec<AstNode>) -> AstNode {
95-
match Javascript::from(node.object().kind_id()) {
94+
match Javascript::from(node.kind_id()) {
9695
Javascript::String => {
9796
let (text, span) = Self::get_text_span(node, code, span, true);
98-
AstNode::new(node.object().kind(), text, span, Vec::new())
97+
AstNode::new(node.kind(), text, span, Vec::new())
9998
}
10099
_ => Self::get_default(node, code, span, children),
101100
}
@@ -104,10 +103,10 @@ impl Alterator for JavascriptCode {
104103

105104
impl Alterator for TypescriptCode {
106105
fn alterate(node: &Node, code: &[u8], span: bool, children: Vec<AstNode>) -> AstNode {
107-
match Typescript::from(node.object().kind_id()) {
106+
match Typescript::from(node.kind_id()) {
108107
Typescript::String => {
109108
let (text, span) = Self::get_text_span(node, code, span, true);
110-
AstNode::new(node.object().kind(), text, span, Vec::new())
109+
AstNode::new(node.kind(), text, span, Vec::new())
111110
}
112111
_ => Self::get_default(node, code, span, children),
113112
}
@@ -116,10 +115,10 @@ impl Alterator for TypescriptCode {
116115

117116
impl Alterator for TsxCode {
118117
fn alterate(node: &Node, code: &[u8], span: bool, children: Vec<AstNode>) -> AstNode {
119-
match Tsx::from(node.object().kind_id()) {
118+
match Tsx::from(node.kind_id()) {
120119
Tsx::String => {
121120
let (text, span) = Self::get_text_span(node, code, span, true);
122-
AstNode::new(node.object().kind(), text, span, Vec::new())
121+
AstNode::new(node.kind(), text, span, Vec::new())
123122
}
124123
_ => Self::get_default(node, code, span, children),
125124
}
@@ -128,10 +127,10 @@ impl Alterator for TsxCode {
128127

129128
impl Alterator for RustCode {
130129
fn alterate(node: &Node, code: &[u8], span: bool, children: Vec<AstNode>) -> AstNode {
131-
match Rust::from(node.object().kind_id()) {
130+
match Rust::from(node.kind_id()) {
132131
Rust::StringLiteral | Rust::CharLiteral => {
133132
let (text, span) = Self::get_text_span(node, code, span, true);
134-
AstNode::new(node.object().kind(), text, span, Vec::new())
133+
AstNode::new(node.kind(), text, span, Vec::new())
135134
}
136135
_ => Self::get_default(node, code, span, children),
137136
}

src/ast.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ impl AstNode {
8080
fn build<T: ParserTrait>(parser: &T, span: bool, comment: bool) -> Option<AstNode> {
8181
let code = parser.get_code();
8282
let root = parser.get_root();
83-
let mut cursor = root.object().walk();
83+
let mut cursor = root.cursor();
8484
let mut node_stack = Vec::new();
8585
let mut child_stack = Vec::new();
8686

@@ -92,11 +92,11 @@ fn build<T: ParserTrait>(parser: &T, span: bool, comment: bool) -> Option<AstNod
9292
So once we have built the array of children we can build the node itself until the root. */
9393
loop {
9494
let ts_node = node_stack.last().unwrap();
95-
cursor.reset(ts_node.object());
95+
cursor.reset(ts_node);
9696
if cursor.goto_first_child() {
9797
let node = cursor.node();
9898
child_stack.push(Vec::with_capacity(node.child_count()));
99-
node_stack.push(Node::new(node));
99+
node_stack.push(node);
100100
} else {
101101
loop {
102102
let ts_node = node_stack.pop().unwrap();
@@ -113,9 +113,9 @@ fn build<T: ParserTrait>(parser: &T, span: bool, comment: bool) -> Option<AstNod
113113
return Some(node);
114114
}
115115
}
116-
if let Some(next_node) = ts_node.object().next_sibling() {
116+
if let Some(next_node) = ts_node.next_sibling() {
117117
child_stack.push(Vec::with_capacity(next_node.child_count()));
118-
node_stack.push(Node::new(next_node));
118+
node_stack.push(next_node);
119119
break;
120120
}
121121
}

src/asttools.rs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ pub fn get_parent<'a>(node: &'a Node<'a>, level: usize) -> Option<Node<'a>> {
55
let mut level = level;
66
let mut node = *node;
77
while level != 0 {
8-
if let Some(parent) = node.object().parent() {
9-
node = Node::new(parent);
8+
if let Some(parent) = node.parent() {
9+
node = parent;
1010
} else {
1111
return None;
1212
}
@@ -22,10 +22,10 @@ macro_rules! has_ancestors {
2222
loop {
2323
let mut node = *$node;
2424
$(
25-
if let Some(parent) = node.object().parent() {
25+
if let Some(parent) = node.parent() {
2626
match parent.kind_id().into() {
2727
$typ => {
28-
node = Node::new(parent);
28+
node = parent;
2929
},
3030
_ => {
3131
break;
@@ -35,7 +35,7 @@ macro_rules! has_ancestors {
3535
break;
3636
}
3737
)*
38-
if let Some(parent) = node.object().parent() {
38+
if let Some(parent) = node.parent() {
3939
match parent.kind_id().into() {
4040
$( $typs )|+ => {
4141
res = true;
@@ -57,17 +57,17 @@ macro_rules! count_specific_ancestors {
5757
($node:expr, $( $typs:pat_param )|*, $( $stops:pat_param )|*) => {{
5858
let mut count = 0;
5959
let mut node = *$node;
60-
while let Some(parent) = node.object().parent() {
60+
while let Some(parent) = node.parent() {
6161
match parent.kind_id().into() {
6262
$( $typs )|* => {
63-
if !Self::is_else_if(&Node::new(parent)) {
63+
if !Self::is_else_if(&parent) {
6464
count += 1;
6565
}
6666
},
6767
$( $stops )|* => break,
6868
_ => {}
6969
}
70-
node = Node::new(parent);
70+
node = parent;
7171
}
7272
count
7373
}};

0 commit comments

Comments
 (0)