2019-04-15 22:40:02 -07:00
|
|
|
use crate::common::*;
|
|
|
|
|
2019-09-21 15:35:03 -07:00
|
|
|
pub(crate) struct Functions<'a> {
|
2019-04-15 22:40:02 -07:00
|
|
|
stack: Vec<&'a Expression<'a>>,
|
|
|
|
}
|
|
|
|
|
|
|
|
impl<'a> Functions<'a> {
|
2019-09-21 15:35:03 -07:00
|
|
|
pub(crate) fn new(root: &'a Expression<'a>) -> Functions<'a> {
|
2019-04-15 22:40:02 -07:00
|
|
|
Functions { stack: vec![root] }
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl<'a> Iterator for Functions<'a> {
|
|
|
|
type Item = (&'a Token<'a>, usize);
|
|
|
|
|
|
|
|
fn next(&mut self) -> Option<Self::Item> {
|
|
|
|
match self.stack.pop() {
|
|
|
|
None
|
|
|
|
| Some(Expression::String { .. })
|
|
|
|
| Some(Expression::Backtick { .. })
|
|
|
|
| Some(Expression::Variable { .. }) => None,
|
|
|
|
Some(Expression::Call {
|
|
|
|
token, arguments, ..
|
|
|
|
}) => Some((token, arguments.len())),
|
|
|
|
Some(Expression::Concatination { lhs, rhs }) => {
|
|
|
|
self.stack.push(lhs);
|
|
|
|
self.stack.push(rhs);
|
|
|
|
self.next()
|
|
|
|
}
|
|
|
|
Some(Expression::Group { expression }) => {
|
|
|
|
self.stack.push(expression);
|
|
|
|
self.next()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|