diff options
| author | bors <bors@rust-lang.org> | 2016-05-09 21:31:55 -0700 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2016-05-09 21:31:55 -0700 |
| commit | a4d2424cc304e97f553c6d8eef17a24dc2f12c01 (patch) | |
| tree | 1660cb8661456bbfb7b9b52c2d98a046e30d6a4a /src/libsyntax | |
| parent | 72ed7e78942e8d68f87cc7299625fb236f442ef1 (diff) | |
| parent | 805666a4d283b60f9f4b979b53b3d498cd876f2e (diff) | |
| download | rust-a4d2424cc304e97f553c6d8eef17a24dc2f12c01.tar.gz rust-a4d2424cc304e97f553c6d8eef17a24dc2f12c01.zip | |
Auto merge of #33443 - jseyfried:resolve_ast, r=nrc
Perform name resolution before and during ast->hir lowering This PR performs name resolution before and during ast->hir lowering instead of in phase 3. r? @nrc
Diffstat (limited to 'src/libsyntax')
| -rw-r--r-- | src/libsyntax/ast.rs | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/src/libsyntax/ast.rs b/src/libsyntax/ast.rs index bf1c305e206..d1ad330c58c 100644 --- a/src/libsyntax/ast.rs +++ b/src/libsyntax/ast.rs @@ -551,6 +551,44 @@ impl fmt::Debug for Pat { } } +impl Pat { + pub fn walk<F>(&self, it: &mut F) -> bool + where F: FnMut(&Pat) -> bool + { + if !it(self) { + return false; + } + + match self.node { + PatKind::Ident(_, _, Some(ref p)) => p.walk(it), + PatKind::Struct(_, ref fields, _) => { + fields.iter().all(|field| field.node.pat.walk(it)) + } + PatKind::TupleStruct(_, Some(ref s)) | PatKind::Tup(ref s) => { + s.iter().all(|p| p.walk(it)) + } + PatKind::Box(ref s) | PatKind::Ref(ref s, _) => { + s.walk(it) + } + PatKind::Vec(ref before, ref slice, ref after) => { + before.iter().all(|p| p.walk(it)) && + slice.iter().all(|p| p.walk(it)) && + after.iter().all(|p| p.walk(it)) + } + PatKind::Wild | + PatKind::Lit(_) | + PatKind::Range(_, _) | + PatKind::Ident(_, _, _) | + PatKind::TupleStruct(..) | + PatKind::Path(..) | + PatKind::QPath(_, _) | + PatKind::Mac(_) => { + true + } + } + } +} + /// A single field in a struct pattern /// /// Patterns like the fields of Foo `{ x, ref y, ref mut z }` |
