Start work on new ref API, for giving names to nodes' children
Co-Authored-By: Ayman Nadeem <aymannadeem@gmail.com>
This commit is contained in:
parent
dac13af206
commit
bf4e1304f8
7 changed files with 85 additions and 1 deletions
|
|
@ -26,6 +26,10 @@ enum RuleJSON {
|
|||
CHOICE {
|
||||
members: Vec<RuleJSON>,
|
||||
},
|
||||
REF {
|
||||
value: String,
|
||||
content: Box<RuleJSON>,
|
||||
},
|
||||
SEQ {
|
||||
members: Vec<RuleJSON>,
|
||||
},
|
||||
|
|
@ -120,6 +124,7 @@ fn parse_rule(json: RuleJSON) -> Rule {
|
|||
RuleJSON::PATTERN { value } => Rule::Pattern(value),
|
||||
RuleJSON::SYMBOL { name } => Rule::NamedSymbol(name),
|
||||
RuleJSON::CHOICE { members } => Rule::choice(members.into_iter().map(parse_rule).collect()),
|
||||
RuleJSON::REF { content, value } => parse_rule(*content),
|
||||
RuleJSON::SEQ { members } => Rule::seq(members.into_iter().map(parse_rule).collect()),
|
||||
RuleJSON::REPEAT1 { content } => Rule::repeat(parse_rule(*content)),
|
||||
RuleJSON::REPEAT { content } => {
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
mod corpus_test;
|
||||
mod helpers;
|
||||
mod node_refs;
|
||||
mod node_test;
|
||||
mod parser_test;
|
||||
mod properties_test;
|
||||
|
|
|
|||
62
cli/src/tests/node_refs.rs
Normal file
62
cli/src/tests/node_refs.rs
Normal file
|
|
@ -0,0 +1,62 @@
|
|||
use super::helpers::fixtures::get_test_language;
|
||||
use crate::generate::generate_parser_for_grammar;
|
||||
use tree_sitter::Parser;
|
||||
|
||||
#[test]
|
||||
fn test_basic_node_refs() {
|
||||
let (parser_name, parser_code) = generate_parser_for_grammar(
|
||||
r#"
|
||||
{
|
||||
"name": "test_grammar_with_refs",
|
||||
"extras": [
|
||||
{"type": "PATTERN", "value": "\\s+"}
|
||||
],
|
||||
"rules": {
|
||||
"rule_a": {
|
||||
"type": "SEQ",
|
||||
"members": [
|
||||
{
|
||||
"type": "REF",
|
||||
"value": "ref_1",
|
||||
"content": {
|
||||
"type": "STRING",
|
||||
"value": "child-1"
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "CHOICE",
|
||||
"members": [
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": "child-2"
|
||||
},
|
||||
{
|
||||
"type": "BLANK"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "REF",
|
||||
"value": "ref_2",
|
||||
"content": {
|
||||
"type": "STRING",
|
||||
"value": "child-3"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
"#,
|
||||
)
|
||||
.unwrap();
|
||||
|
||||
let mut parser = Parser::new();
|
||||
let language = get_test_language(&parser_name, &parser_code, None);
|
||||
parser.set_language(language).unwrap();
|
||||
|
||||
let tree = parser.parse("child-1 child-2 child-3", None).unwrap();
|
||||
let root_node = tree.root_node();
|
||||
assert_eq!(root_node.child_by_ref("ref_1"), root_node.child(0));
|
||||
assert_eq!(root_node.child_by_ref("ref_2"), root_node.child(2));
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue