diff --git a/cli/src/lib.rs b/cli/src/lib.rs index d36417c2..d52b516a 100644 --- a/cli/src/lib.rs +++ b/cli/src/lib.rs @@ -14,3 +14,7 @@ pub mod wasm; #[cfg(test)] mod tests; + +// To run compile fail tests +#[cfg(doctest)] +mod tests; diff --git a/cli/src/tests/language_test.rs b/cli/src/tests/language_test.rs index 9880a9a3..5dd04c46 100644 --- a/cli/src/tests/language_test.rs +++ b/cli/src/tests/language_test.rs @@ -39,3 +39,57 @@ fn test_lookahead_iterator() { .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() {}