diff --git a/src/config.rs b/src/config.rs index 9941e54..e1053d4 100644 --- a/src/config.rs +++ b/src/config.rs @@ -41,10 +41,12 @@ pub struct Definitional { name: String, attrs: HashMap, children: Vec, + span: Span, } impl FromExpr for Definitional { fn from_expr(e: Expr) -> AstResult { + let span = e.span(); spanned!(e.span(), { let list = e.as_list()?; let mut iter = itertools::put_back(list.into_iter()); @@ -54,7 +56,7 @@ impl FromExpr for Definitional { let attrs = parse_key_values(&mut iter); let children = iter.map(|x| T::from_expr(x)).collect::>>()?; - Definitional { def_type, name, attrs, children } + Definitional { span, def_type, name, attrs, children } }) } } @@ -63,10 +65,12 @@ pub struct Element { name: String, attrs: HashMap, children: Vec, + span: Span, } impl FromExpr for Element { fn from_expr(e: Expr) -> AstResult { + let span = e.span(); spanned!(e.span(), { let list = e.as_list()?; let mut iter = itertools::put_back(list.into_iter()); @@ -74,7 +78,7 @@ impl FromExpr for Element { let name = iter.next().or_missing(ExprType::Str)?.as_symbol()?; let attrs = parse_key_values(&mut iter); - Element { name, attrs, children: iter.collect_vec() } + Element { span, name, attrs, children: iter.collect_vec() } }) } } @@ -112,6 +116,7 @@ mod test { assert_eq!( Element::::from_expr(parser.parse("(box :bar 12 :baz \"hi\" foo (bar))").unwrap()).unwrap(), Element { + span: Span(0, 33), name: "box".to_string(), attrs: maplit::hashmap! { ":bar".to_string() => Expr::Number(Span(10, 12), 12),