use crate::ir::PATH_SEPARATOR;
use crate::ir::sites::IrRange;
use super::syn_helpers::span_from;
pub(super) fn range_of(span: proc_macro2::Span) -> IrRange {
IrRange {
start: span_from(span.start()),
end: span_from(span.end()),
}
}
pub(super) fn range_between(start: proc_macro2::Span, end: proc_macro2::Span) -> IrRange {
IrRange {
start: span_from(start.start()),
end: span_from(end.end()),
}
}
pub(super) fn path_segments(path: &syn::Path) -> Box<[Box<str>]> {
path.segments
.iter()
.map(|segment| segment.ident.to_string().into_boxed_str())
.collect()
}
pub(super) fn path_text(segments: &[Box<str>]) -> Box<str> {
let mut text = String::new();
for segment in segments {
if !text.is_empty() {
text.push_str(PATH_SEPARATOR);
}
text.push_str(segment);
}
text.into_boxed_str()
}
pub(super) fn path_range(path: &syn::Path) -> Option<IrRange> {
let first = path.segments.first().map(|segment| segment.ident.span());
let last = path.segments.last().map(|segment| segment.ident.span());
match (first, last) {
(Some(start), Some(end)) => Some(range_between(start, end)),
_ => None,
}
}