fix: intern a sequence or choice of a single element the same as the element itself

This commit is contained in:
Amaan Qureshi 2024-05-25 00:48:13 -04:00
parent 3da7deedd8
commit 252e2a4bc0
3 changed files with 130 additions and 13 deletions

View file

@ -5011,7 +5011,7 @@ fn test_grammar_with_aliased_literal_query() {
let (parser_name, parser_code) = generate_parser_for_grammar(
r#"
{
"name": "test",
"name": "test_grammar_with_aliased_literal_query",
"rules": {
"source": {
"type": "REPEAT",
@ -5071,10 +5071,72 @@ fn test_grammar_with_aliased_literal_query() {
&language,
r#"
(compound_statement "}" @bracket1)
(expansion) @bracket2
"#,
);
assert!(query.is_ok());
let query = Query::new(
&language,
r#"
(expansion "}" @bracket2)
"#,
);
assert!(query.is_err());
}
#[test]
fn test_query_with_seq_or_choice_of_one_rule() {
// module.exports = grammar({
// name: 'test',
//
// rules: {
// source: $ => choice($._seq, $._choice),
//
// _seq: $ => seq("hi"),
// _choice: $ => choice("bye"),
// },
// });
let (parser_name, parser_code) = generate_parser_for_grammar(
r#"
{
"name": "test_query_with_seq_or_choice_of_one_rule",
"rules": {
"source": {
"type": "CHOICE",
"members": [
{ "type": "SYMBOL", "name": "_seq" },
{ "type": "SYMBOL", "name": "_choice" }
]
},
"_seq": {
"type": "SEQ",
"members": [{ "type": "STRING", "value": "hi" }]
},
"_choice": {
"type": "CHOICE",
"members": [ { "type": "STRING", "value": "bye" } ]
}
},
"extras": [{ "type": "PATTERN", "value": "\\s" }]
}
"#,
)
.unwrap();
let language = get_test_language(&parser_name, &parser_code, None);
let query = Query::new(
&language,
r#"
"hi" @seq
"bye" @choice
"#,
);
assert!(query.is_ok());
}