use crate::ast::node_utils::{children, ensure_node, AstNodeAndId};
use crate::ast::{AstGraph, AstNode};
use crate::syntax::_node_builders::core::SyntaxNodeBuildError;
use crate::syntax::core_nodes::{CoreSyntaxNodeWithId, ReferenceExpression};
use crate::syntax::fields::rust::reference_expression;
use crate::syntax::fields::RequiredField;
use alloc::borrow::ToOwned;
pub fn build_reference_expression(
graph: &AstGraph,
node: &AstNode,
build_syntax_node: impl Fn(AstNodeAndId) -> Result<CoreSyntaxNodeWithId, SyntaxNodeBuildError>,
) -> Result<ReferenceExpression, SyntaxNodeBuildError> {
let all_children = children(graph, node).map_err(SyntaxNodeBuildError::ResolutionError)?;
let is_raw = all_children.iter().any(|(child, _)| child.kind == "raw");
let is_mutable = all_children
.iter()
.any(|(child, _)| child.kind == "mutable_specifier");
let value_id = node
.fields
.get(reference_expression::VALUE.name())
.copied()
.ok_or_else(|| {
SyntaxNodeBuildError::Error("A ReferenceExpression must have a value".to_owned())
})?;
ensure_node(graph, value_id)
.map_err(SyntaxNodeBuildError::ResolutionError)
.and_then(build_syntax_node)
.map(|value| ReferenceExpression {
value,
is_mutable,
is_raw,
})
}
#[cfg(test)]
mod tests;