use crate::ir;
use crate::modelica_grammar_trait;
pub fn loc_info(token: &ir::ast::Token) -> String {
let loc = &token.location;
format!(
" at {}:{}:{}",
loc.file_name, loc.start_line, loc.start_column
)
}
pub fn span_location(start: &ir::ast::Token, end: &ir::ast::Token) -> ir::ast::Location {
ir::ast::Location {
start_line: start.location.start_line,
start_column: start.location.start_column,
end_line: end.location.end_line,
end_column: end.location.end_column,
start: start.location.start,
end: end.location.end,
file_name: start.location.file_name.clone(),
}
}
pub fn collect_array_elements(
args: &modelica_grammar_trait::ArrayArguments,
) -> anyhow::Result<ir::ast::Expression> {
if let Some(opt) = &args.array_arguments_opt {
match &opt.array_arguments_opt_group {
modelica_grammar_trait::ArrayArgumentsOptGroup::CommaArrayArgumentsNonFirst(
comma_args,
) => {
let mut elements = vec![args.expression.clone()];
collect_array_non_first(&comma_args.array_arguments_non_first, &mut elements);
Ok(ir::ast::Expression::Array {
elements,
is_matrix: false,
})
}
modelica_grammar_trait::ArrayArgumentsOptGroup::ForForIndices(for_indices) => {
let indices = convert_for_indices(&for_indices.for_indices);
Ok(ir::ast::Expression::ArrayComprehension {
expr: Box::new(args.expression.clone()),
indices,
})
}
}
} else {
Ok(ir::ast::Expression::Array {
elements: vec![args.expression.clone()],
is_matrix: false,
})
}
}
pub fn convert_for_indices(indices: &modelica_grammar_trait::ForIndices) -> Vec<ir::ast::ForIndex> {
let mut result = Vec::new();
result.push(convert_for_index(&indices.for_index));
for item in &indices.for_indices_list {
result.push(convert_for_index(&item.for_index));
}
result
}
fn convert_for_index(index: &modelica_grammar_trait::ForIndex) -> ir::ast::ForIndex {
let range = index
.for_index_opt
.as_ref()
.map(|opt| opt.expression.clone())
.unwrap_or(ir::ast::Expression::Empty);
ir::ast::ForIndex {
ident: index.ident.clone(),
range,
}
}
pub fn collect_array_non_first(
args: &modelica_grammar_trait::ArrayArgumentsNonFirst,
elements: &mut Vec<ir::ast::Expression>,
) {
elements.push(args.expression.clone());
if let Some(opt) = &args.array_arguments_non_first_opt {
collect_array_non_first(&opt.array_arguments_non_first, elements);
}
}