1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
//! Module `ast` provides utilities visiting the slide AST.

use libslide::visit::StmtVisitor;
use libslide::*;

pub fn get_tightest_expr(pos: usize, program: &StmtList) -> Option<&RcExpr> {
    let mut finder = ExprFinder {
        tightest: None,
        pos,
    };
    finder.visit_stmt_list(program);
    finder.tightest
}
struct ExprFinder<'a> {
    tightest: Option<&'a RcExpr>,
    pos: usize,
}
impl<'a> StmtVisitor<'a> for ExprFinder<'a> {
    fn visit_stmt(&mut self, stmt: &'a Stmt) {
        if stmt.span().contains(self.pos) {
            visit::descend_stmt(self, stmt);
        }
    }

    fn visit_expr(&mut self, expr: &'a RcExpr) {
        if expr.span.contains(self.pos) {
            self.tightest = Some(expr);
            visit::descend_expr(self, expr);
        }
    }
}