From 23303cd0f8298c2d7b082fcb04919454c1c306ab Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Mon, 3 Sep 2018 01:51:46 +0300 Subject: match scope --- crates/libeditor/src/scope/fn_scope.rs | 41 ++++++++++++++++++++++------------ 1 file changed, 27 insertions(+), 14 deletions(-) (limited to 'crates/libeditor') diff --git a/crates/libeditor/src/scope/fn_scope.rs b/crates/libeditor/src/scope/fn_scope.rs index 78e9c061c..42cd71eb5 100644 --- a/crates/libeditor/src/scope/fn_scope.rs +++ b/crates/libeditor/src/scope/fn_scope.rs @@ -189,7 +189,20 @@ fn compute_expr_scopes(expr: ast::Expr, scopes: &mut FnScopes, scope: ScopeId) { .chain(e.expr()) .for_each(|expr| compute_expr_scopes(expr, scopes, scope)); } - + ast::Expr::MatchExpr(e) => { + if let Some(expr) = e.expr() { + compute_expr_scopes(expr, scopes, scope); + } + for arm in e.match_arm_list().into_iter().flat_map(|it| it.arms()) { + let scope = scopes.new_scope(scope); + for pat in arm.pats() { + scopes.add_bindings(scope, pat); + } + if let Some(expr) = arm.expr() { + compute_expr_scopes(expr, scopes, scope); + } + } + } _ => { expr.syntax().children() .filter_map(ast::Expr::cast) @@ -279,17 +292,17 @@ mod tests { ); } - // #[test] - // fn test_match() { - // do_check(r" - // fn quux() { - // match () { - // Some(x) => { - // <|> - // } - // }; - // }", - // &["x"], - // ); - // } + #[test] + fn test_match() { + do_check(r" + fn quux() { + match () { + Some(x) => { + <|> + } + }; + }", + &["x"], + ); + } } -- cgit v1.2.3