95 lines
3.3 KiB
Rust
95 lines
3.3 KiB
Rust
use super::helpers::fixtures::get_language;
|
|
use tree_sitter::Parser;
|
|
|
|
#[test]
|
|
fn test_lookahead_iterator() {
|
|
let mut parser = Parser::new();
|
|
let language = get_language("rust");
|
|
parser.set_language(language).unwrap();
|
|
|
|
let tree = parser.parse("struct Stuff {}", None).unwrap();
|
|
|
|
let mut cursor = tree.walk();
|
|
|
|
assert!(cursor.goto_first_child()); // struct
|
|
assert!(cursor.goto_first_child()); // struct keyword
|
|
|
|
let next_state = cursor.node().next_parse_state();
|
|
assert_ne!(next_state, 0);
|
|
assert_eq!(
|
|
next_state,
|
|
language.next_state(cursor.node().parse_state(), cursor.node().grammar_id())
|
|
);
|
|
assert!((next_state as usize) < language.parse_state_count());
|
|
assert!(cursor.goto_next_sibling()); // type_identifier
|
|
assert_eq!(next_state, cursor.node().parse_state());
|
|
assert_eq!(cursor.node().grammar_name(), "identifier");
|
|
assert_ne!(cursor.node().grammar_id(), cursor.node().kind_id());
|
|
|
|
let expected_symbols = ["identifier", "block_comment", "line_comment"];
|
|
let mut lookahead = language.lookahead_iterator(next_state).unwrap();
|
|
assert_eq!(lookahead.language(), language);
|
|
assert!(lookahead.iter_names().eq(expected_symbols));
|
|
|
|
lookahead.reset_state(next_state);
|
|
assert!(lookahead.iter_names().eq(expected_symbols));
|
|
|
|
lookahead.reset(language, next_state);
|
|
assert!(lookahead
|
|
.map(|s| language.node_kind_for_id(s).unwrap())
|
|
.eq(expected_symbols));
|
|
}
|
|
|
|
#[test]
|
|
fn test_lookahead_iterator_modifiable_only_by_mut() {
|
|
let mut parser = Parser::new();
|
|
let language = get_language("rust");
|
|
parser.set_language(language).unwrap();
|
|
|
|
let tree = parser.parse("struct Stuff {}", None).unwrap();
|
|
|
|
let mut cursor = tree.walk();
|
|
|
|
assert!(cursor.goto_first_child()); // struct
|
|
assert!(cursor.goto_first_child()); // struct keyword
|
|
|
|
let next_state = cursor.node().next_parse_state();
|
|
assert_ne!(next_state, 0);
|
|
|
|
let mut lookahead = language.lookahead_iterator(next_state).unwrap();
|
|
let _ = lookahead.next();
|
|
|
|
let mut names = lookahead.iter_names();
|
|
let _ = names.next();
|
|
}
|
|
|
|
/// It doesn't allowed to use lookahead iterator by shared ref:
|
|
/// error[E0596]: cannot borrow `lookahead` as mutable, as it is not declared as mutable
|
|
/// ```compile_fail
|
|
/// use tree_sitter::{Parser, Language};
|
|
/// let mut parser = Parser::new();
|
|
/// let language = unsafe { Language::from_raw(std::ptr::null()) };
|
|
/// let tree = parser.parse("", None).unwrap();
|
|
/// let mut cursor = tree.walk();
|
|
/// let next_state = cursor.node().next_parse_state();
|
|
/// let lookahead = language.lookahead_iterator(next_state).unwrap();
|
|
/// let _ = lookahead.next();
|
|
/// ```
|
|
|
|
/// It doesn't allowed to use lookahead names iterator by shared ref:
|
|
/// error[E0596]: cannot borrow `names` as mutable, as it is not declared as mutable
|
|
/// ```compile_fail
|
|
/// use tree_sitter::{Parser, Language};
|
|
/// let mut parser = Parser::new();
|
|
/// let language = unsafe { Language::from_raw(std::ptr::null()) };
|
|
/// let tree = parser.parse("", None).unwrap();
|
|
/// let mut cursor = tree.walk();
|
|
/// let next_state = cursor.node().next_parse_state();
|
|
/// if let Some(mut lookahead) = language.lookahead_iterator(next_state) {
|
|
/// let _ = lookahead.next();
|
|
/// let names = lookahead.iter_names();
|
|
/// let _ = names.next();
|
|
/// }
|
|
/// ```
|
|
|
|
fn _dummy() {}
|