aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksey Kladov <[email protected]>2018-09-02 23:51:46 +0100
committerAleksey Kladov <[email protected]>2018-09-02 23:51:46 +0100
commit23303cd0f8298c2d7b082fcb04919454c1c306ab (patch)
tree12c22fd573fb86f7718a68ec1d74eb62e401b2f6
parent83e2ab434cf20313c9248fbbe7e90f65f27d31ce (diff)
match scope
-rw-r--r--crates/libeditor/src/scope/fn_scope.rs41
-rw-r--r--crates/libsyntax2/src/ast/generated.rs26
-rw-r--r--crates/libsyntax2/src/grammar.ron16
3 files changed, 63 insertions, 20 deletions
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) {
189 .chain(e.expr()) 189 .chain(e.expr())
190 .for_each(|expr| compute_expr_scopes(expr, scopes, scope)); 190 .for_each(|expr| compute_expr_scopes(expr, scopes, scope));
191 } 191 }
192 192 ast::Expr::MatchExpr(e) => {
193 if let Some(expr) = e.expr() {
194 compute_expr_scopes(expr, scopes, scope);
195 }
196 for arm in e.match_arm_list().into_iter().flat_map(|it| it.arms()) {
197 let scope = scopes.new_scope(scope);
198 for pat in arm.pats() {
199 scopes.add_bindings(scope, pat);
200 }
201 if let Some(expr) = arm.expr() {
202 compute_expr_scopes(expr, scopes, scope);
203 }
204 }
205 }
193 _ => { 206 _ => {
194 expr.syntax().children() 207 expr.syntax().children()
195 .filter_map(ast::Expr::cast) 208 .filter_map(ast::Expr::cast)
@@ -279,17 +292,17 @@ mod tests {
279 ); 292 );
280 } 293 }
281 294
282 // #[test] 295 #[test]
283 // fn test_match() { 296 fn test_match() {
284 // do_check(r" 297 do_check(r"
285 // fn quux() { 298 fn quux() {
286 // match () { 299 match () {
287 // Some(x) => { 300 Some(x) => {
288 // <|> 301 <|>
289 // } 302 }
290 // }; 303 };
291 // }", 304 }",
292 // &["x"], 305 &["x"],
293 // ); 306 );
294 // } 307 }
295} 308}
diff --git a/crates/libsyntax2/src/ast/generated.rs b/crates/libsyntax2/src/ast/generated.rs
index f21e49437..bdee635ae 100644
--- a/crates/libsyntax2/src/ast/generated.rs
+++ b/crates/libsyntax2/src/ast/generated.rs
@@ -842,7 +842,17 @@ impl<'a> AstNode<'a> for MatchArm<'a> {
842 fn syntax(self) -> SyntaxNodeRef<'a> { self.syntax } 842 fn syntax(self) -> SyntaxNodeRef<'a> { self.syntax }
843} 843}
844 844
845impl<'a> MatchArm<'a> {} 845impl<'a> MatchArm<'a> {
846 pub fn pats(self) -> impl Iterator<Item = Pat<'a>> + 'a {
847 super::children(self)
848 }
849pub fn guard(self) -> Option<MatchGuard<'a>> {
850 super::child_opt(self)
851 }
852pub fn expr(self) -> Option<Expr<'a>> {
853 super::child_opt(self)
854 }
855}
846 856
847// MatchArmList 857// MatchArmList
848#[derive(Debug, Clone, Copy)] 858#[derive(Debug, Clone, Copy)]
@@ -860,7 +870,11 @@ impl<'a> AstNode<'a> for MatchArmList<'a> {
860 fn syntax(self) -> SyntaxNodeRef<'a> { self.syntax } 870 fn syntax(self) -> SyntaxNodeRef<'a> { self.syntax }
861} 871}
862 872
863impl<'a> MatchArmList<'a> {} 873impl<'a> MatchArmList<'a> {
874 pub fn arms(self) -> impl Iterator<Item = MatchArm<'a>> + 'a {
875 super::children(self)
876 }
877}
864 878
865// MatchExpr 879// MatchExpr
866#[derive(Debug, Clone, Copy)] 880#[derive(Debug, Clone, Copy)]
@@ -878,7 +892,13 @@ impl<'a> AstNode<'a> for MatchExpr<'a> {
878 fn syntax(self) -> SyntaxNodeRef<'a> { self.syntax } 892 fn syntax(self) -> SyntaxNodeRef<'a> { self.syntax }
879} 893}
880 894
881impl<'a> MatchExpr<'a> {} 895impl<'a> MatchExpr<'a> {pub fn expr(self) -> Option<Expr<'a>> {
896 super::child_opt(self)
897 }
898pub fn match_arm_list(self) -> Option<MatchArmList<'a>> {
899 super::child_opt(self)
900 }
901}
882 902
883// MatchGuard 903// MatchGuard
884#[derive(Debug, Clone, Copy)] 904#[derive(Debug, Clone, Copy)]
diff --git a/crates/libsyntax2/src/grammar.ron b/crates/libsyntax2/src/grammar.ron
index fbe8397d8..798725f7e 100644
--- a/crates/libsyntax2/src/grammar.ron
+++ b/crates/libsyntax2/src/grammar.ron
@@ -370,9 +370,19 @@ Grammar(
370 options: [ "Block" ] 370 options: [ "Block" ]
371 ), 371 ),
372 "ReturnExpr": (), 372 "ReturnExpr": (),
373 "MatchExpr": (), 373 "MatchExpr": (
374 "MatchArmList": (), 374 options: [ "Expr", "MatchArmList" ],
375 "MatchArm": (), 375 ),
376 "MatchArmList": (
377 collections: [ ["arms", "MatchArm"] ],
378 ),
379 "MatchArm": (
380 options: [
381 [ "guard", "MatchGuard" ],
382 "Expr",
383 ],
384 collections: [ [ "pats", "Pat" ] ]
385 ),
376 "MatchGuard": (), 386 "MatchGuard": (),
377 "StructLit": (), 387 "StructLit": (),
378 "NamedFieldList": (), 388 "NamedFieldList": (),