bytebraise_syntax/syntax/
make.rs

1// This module adapted from Rust Analyzer (https://github.com/rust-analyzer/rust-analyzer), which
2// is under MIT license.
3
4use crate::parser::parse_bitbake_from_str;
5use crate::syntax::ast::AstNode;
6use crate::syntax::ast::nodes::Assignment;
7use crate::syntax::ast::quoted_value::QuotedValue;
8use itertools::Itertools;
9
10pub fn ast_from_text<N: AstNode>(text: &str) -> N {
11    let parse = parse_bitbake_from_str(text);
12
13    let node = match parse.syntax().descendants().find_map(N::cast) {
14        Some(it) => it,
15        None => {
16            panic!(
17                "Failed to make ast node `{}` from text {}",
18                std::any::type_name::<N>(),
19                text
20            )
21        }
22    };
23    let node = node.clone_subtree();
24    assert_eq!(node.syntax().text_range().start(), 0.into());
25    node
26}
27
28pub fn assignment(var: String, op: String, value: String) -> Assignment {
29    ast_from_text::<Assignment>(&format!("{var} {op} {value}")).clone_for_update()
30}
31
32pub fn quoted_value(text: String) -> QuotedValue {
33    // TODO: quote character
34    let input = format!("A = \"{text}\"");
35    let assignment: Assignment = ast_from_text(&input);
36    assignment.clone_for_update().right()
37}
38
39// TODO: format
40pub fn quoted_value_from_slice(vals: &[String]) -> QuotedValue {
41    match vals.len() {
42        0 => quoted_value(String::new()),
43        1 => quoted_value(vals[0].clone()),
44        _ => {
45            let text = format!(
46                " \\\n{} \\\n",
47                vals.iter().map(|v| format!("    {v}")).join(" \\\n")
48            );
49            quoted_value(text)
50        }
51    }
52}