fix: handle more cases of editing subtrees that depend on column values

(cherry picked from commit a83b893016)
This commit is contained in:
Ron Panduwana 2024-04-03 13:10:03 +07:00 committed by Amaan Qureshi
parent 77794c558f
commit d10308528d
5 changed files with 137 additions and 3 deletions

View file

@ -501,6 +501,67 @@ h + i
);
}
#[test]
fn test_parsing_after_editing_tree_that_depends_on_column_position() {
let dir = fixtures_dir()
.join("test_grammars")
.join("depends_on_column");
let grammar_json = load_grammar_file(&dir.join("grammar.js"), None).unwrap();
let (grammar_name, parser_code) = generate_parser_for_grammar(grammar_json.as_str()).unwrap();
let mut parser = Parser::new();
parser
.set_language(&get_test_language(&grammar_name, &parser_code, Some(&dir)))
.unwrap();
let mut code = b"\n x".to_vec();
let mut tree = parser.parse(&code, None).unwrap();
assert_eq!(tree.root_node().to_sexp(), "(x_is_at (odd_column))");
perform_edit(
&mut tree,
&mut code,
&Edit {
position: 1,
deleted_length: 0,
inserted_text: b" ".to_vec(),
},
)
.unwrap();
assert_eq!(code, b"\n x");
let mut recorder = ReadRecorder::new(&code);
let mut tree = parser
.parse_with(&mut |i, _| recorder.read(i), Some(&tree))
.unwrap();
assert_eq!(tree.root_node().to_sexp(), "(x_is_at (even_column))",);
assert_eq!(recorder.strings_read(), vec!["\n x"]);
perform_edit(
&mut tree,
&mut code,
&Edit {
position: 1,
deleted_length: 0,
inserted_text: b"\n".to_vec(),
},
)
.unwrap();
assert_eq!(code, b"\n\n x");
let mut recorder = ReadRecorder::new(&code);
let tree = parser
.parse_with(&mut |i, _| recorder.read(i), Some(&tree))
.unwrap();
assert_eq!(tree.root_node().to_sexp(), "(x_is_at (even_column))",);
assert_eq!(recorder.strings_read(), vec!["\n\n x"]);
}
#[test]
fn test_parsing_after_detecting_error_in_the_middle_of_a_string_token() {
let mut parser = Parser::new();