conjure_cp_essence_parser/parser/
find.rs1#![allow(clippy::legacy_numeric_constants)]
2
3use std::collections::BTreeMap;
4use tree_sitter::Node;
5
6use super::domain::parse_domain;
7use super::util::named_children;
8use crate::errors::{FatalParseError, RecoverableParseError};
9use conjure_cp_core::ast::{DomainPtr, Name, SymbolTablePtr};
10
11pub fn parse_find_statement(
13 find_statement: Node,
14 source_code: &str,
15 symbols: Option<SymbolTablePtr>,
16 errors: &mut Vec<RecoverableParseError>,
17) -> Result<BTreeMap<Name, DomainPtr>, FatalParseError> {
18 let mut vars = BTreeMap::new();
19
20 let domain = find_statement
21 .child_by_field_name("domain")
22 .expect("No domain found in find statement");
23 let domain = parse_domain(domain, source_code, symbols, errors)?;
24
25 let variable_list = find_statement
26 .child_by_field_name("variables")
27 .expect("No variable list found");
28 for variable in named_children(&variable_list) {
29 let variable_name = &source_code[variable.start_byte()..variable.end_byte()];
30 vars.insert(Name::user(variable_name), domain.clone());
31 }
32
33 Ok(vars)
34}