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
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);
}
}
}