Skip to main content

fluidattacks_blends/
parse.rs

1//! Source content → tree-sitter parse tree.
2
3use tree_sitter::{Parser, Tree};
4
5use crate::content::Content;
6use crate::language::LanguageExt;
7
8#[derive(Clone, Copy, PartialEq, Eq, Debug)]
9pub struct ParseError;
10
11pub fn parse(content: &Content) -> Result<Tree, ParseError> {
12    let mut parser = Parser::new();
13    parser
14        .set_language(&content.language.tree_sitter())
15        .map_err(|_| ParseError)?;
16
17    let tree = parser.parse(&content.bytes, None).ok_or(ParseError)?;
18    if tree.root_node().has_error() {
19        return Err(ParseError);
20    }
21
22    Ok(tree)
23}
24
25#[cfg(test)]
26mod tests {
27    use super::parse;
28    use crate::content::Content;
29    use std::fs;
30
31    fn file_content(source: &[u8]) -> Content {
32        let dir = tempfile::tempdir().unwrap();
33        let path = dir.path().join("snippet.java");
34        fs::write(&path, source).unwrap();
35        Content::from_path(&path, None).unwrap()
36    }
37
38    #[test]
39    fn parses_valid_file() {
40        assert!(parse(&file_content(b"class A {}")).is_ok());
41    }
42
43    #[test]
44    fn rejects_malformed_file() {
45        assert!(parse(&file_content(b"class A {")).is_err());
46    }
47}