use alloc::string::String;
use crate::syntax::builders::utils::register_symbol_in_scope;
use crate::syntax::SyntaxGraph;
use crate::syntax::SyntaxNode;
use crate::syntax::{SyntaxGraphArgs, SyntaxGraphError};
use crate::NodeId;
fn declared_variable(graph: &SyntaxGraph, declaration_id: NodeId) -> Option<String> {
let node = graph.nodes.get(&declaration_id)?;
let variable = match node {
SyntaxNode::VariableDeclaration { variable, .. } => Some(variable.clone()),
SyntaxNode::Parameter { variable, .. } => variable.clone(),
_ => None,
}
.filter(|value| !value.is_empty());
if variable.is_some() {
return variable;
}
let (SyntaxNode::VariableDeclaration {
variable_id: Some(var_id),
..
}
| SyntaxNode::Assignment {
variable_id: var_id,
..
}) = node
else {
return None;
};
match graph.nodes.get(var_id)? {
SyntaxNode::SymbolLookup { symbol, .. } => {
Some(symbol.clone()).filter(|value| !value.is_empty())
}
_ => None,
}
}
pub fn build_using_statement_node(
args: &mut SyntaxGraphArgs<'_>,
n_id: NodeId,
block_id: NodeId,
declaration_id: Option<NodeId>,
) -> Result<NodeId, SyntaxGraphError> {
args.syntax_graph.add_node(
n_id,
SyntaxNode::UsingStatement {
block_id,
declaration_id,
},
);
let built_block = args.generic(block_id)?;
args.syntax_graph.add_ast_edge(n_id, built_block);
if let Some(declaration_id) = declaration_id {
let built_declaration = args.generic(declaration_id)?;
args.syntax_graph.add_ast_edge(n_id, built_declaration);
if let Some(variable) = declared_variable(args.syntax_graph, declaration_id) {
register_symbol_in_scope(args.syntax_graph, args.metadata, variable, n_id);
}
}
Ok(n_id)
}