use std::collections::BTreeMap;
use crate::ast::identifier_path::IdentifierPath;
use crate::ast::span::Span;
use crate::{parse_insert_punctuation, parse_set_optional};
use crate::parser::parse_empty_dot::parse_empty_dot;
use crate::parser::parse_identifier::parse_identifier;
use crate::parser::parse_span::parse_span;
use crate::parser::parser_context::ParserContext;
use crate::parser::pest_parser::{Pair, Rule};
use crate::traits::identifiable::Identifiable;
pub(super) fn parse_identifier_path(pair: Pair<'_>, context: &ParserContext) -> IdentifierPath {
let path = context.next_parent_path();
let mut children = BTreeMap::new();
let mut main_span: Option<Span> = None;
let mut identifiers = vec![];
let mut empty_dot = None;
for current in pair.into_inner() {
match current.as_rule() {
Rule::DOT => parse_insert_punctuation!(context, current, children, "."),
Rule::empty_dot => parse_set_optional!(parse_empty_dot(current, context), children, empty_dot),
Rule::identifier => {
let span = parse_span(¤t);
let identifier = parse_identifier(¤t, context);
identifiers.push(identifier.id());
children.insert(identifier.id(), identifier.into());
if let Some(main_span_unwrapped) = main_span {
main_span = Some(main_span_unwrapped.merge(&span))
} else {
main_span = Some(span);
}
},
_ => context.insert_unparsed(parse_span(¤t)),
}
}
context.pop_parent_id();
IdentifierPath {
span: main_span.unwrap(),
path,
children,
identifiers,
empty_dot,
}
}