more span information
This commit is contained in:
parent
76ca07b4dd
commit
dedf40d57e
1 changed files with 7 additions and 2 deletions
|
@ -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),
|
||||||
|
|
Loading…
Add table
Reference in a new issue