more span information

This commit is contained in:
elkowar 2021-07-02 18:20:39 +02:00
parent 76ca07b4dd
commit dedf40d57e
No known key found for this signature in database
GPG key ID: E321AD71B1D1F27F

View file

@ -41,10 +41,12 @@ pub struct Definitional<T> {
name: String, name: String,
attrs: HashMap<AttrName, Expr>, attrs: HashMap<AttrName, Expr>,
children: Vec<T>, children: Vec<T>,
span: Span,
} }
impl<T: FromExpr> FromExpr for Definitional<T> { impl<T: FromExpr> FromExpr for Definitional<T> {
fn from_expr(e: Expr) -> AstResult<Self> { fn from_expr(e: Expr) -> AstResult<Self> {
let span = e.span();
spanned!(e.span(), { spanned!(e.span(), {
let list = e.as_list()?; let list = e.as_list()?;
let mut iter = itertools::put_back(list.into_iter()); let mut iter = itertools::put_back(list.into_iter());
@ -54,7 +56,7 @@ impl<T: FromExpr> FromExpr for Definitional<T> {
let attrs = parse_key_values(&mut iter); let attrs = parse_key_values(&mut iter);
let children = iter.map(|x| T::from_expr(x)).collect::<AstResult<Vec<_>>>()?; let children = iter.map(|x| T::from_expr(x)).collect::<AstResult<Vec<_>>>()?;
Definitional { def_type, name, attrs, children } Definitional { span, def_type, name, attrs, children }
}) })
} }
} }
@ -63,10 +65,12 @@ pub struct Element<T> {
name: String, name: String,
attrs: HashMap<AttrName, Expr>, attrs: HashMap<AttrName, Expr>,
children: Vec<T>, children: Vec<T>,
span: Span,
} }
impl FromExpr for Element<Expr> { impl FromExpr for Element<Expr> {
fn from_expr(e: Expr) -> AstResult<Self> { fn from_expr(e: Expr) -> AstResult<Self> {
let span = e.span();
spanned!(e.span(), { spanned!(e.span(), {
let list = e.as_list()?; let list = e.as_list()?;
let mut iter = itertools::put_back(list.into_iter()); let mut iter = itertools::put_back(list.into_iter());
@ -74,7 +78,7 @@ impl FromExpr for Element<Expr> {
let name = iter.next().or_missing(ExprType::Str)?.as_symbol()?; let name = iter.next().or_missing(ExprType::Str)?.as_symbol()?;
let attrs = parse_key_values(&mut iter); 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!( assert_eq!(
Element::<Expr>::from_expr(parser.parse("(box :bar 12 :baz \"hi\" foo (bar))").unwrap()).unwrap(), Element::<Expr>::from_expr(parser.parse("(box :bar 12 :baz \"hi\" foo (bar))").unwrap()).unwrap(),
Element { Element {
span: Span(0, 33),
name: "box".to_string(), name: "box".to_string(),
attrs: maplit::hashmap! { attrs: maplit::hashmap! {
":bar".to_string() => Expr::Number(Span(10, 12), 12), ":bar".to_string() => Expr::Number(Span(10, 12), 12),