diff options
| author | Keegan McAllister <kmcallister@mozilla.com> | 2014-05-19 13:29:41 -0700 |
|---|---|---|
| committer | Keegan McAllister <kmcallister@mozilla.com> | 2014-05-28 12:42:21 -0700 |
| commit | 5fdd0e4b05979a0a01ca6c14e0510880d320250c (patch) | |
| tree | 39cf0ef1e32d62913e2df001f2ff06db5cf3b2dd | |
| parent | 28a4ee5eeb6a7450f5c16b902504992e990c7042 (diff) | |
| download | rust-5fdd0e4b05979a0a01ca6c14e0510880d320250c.tar.gz rust-5fdd0e4b05979a0a01ca6c14e0510880d320250c.zip | |
Add AST node for pattern macros
| -rw-r--r-- | src/librustc/middle/cfg/construct.rs | 4 | ||||
| -rw-r--r-- | src/librustc/middle/check_match.rs | 6 | ||||
| -rw-r--r-- | src/librustc/middle/mem_categorization.rs | 4 | ||||
| -rw-r--r-- | src/librustc/middle/trans/_match.rs | 3 | ||||
| -rw-r--r-- | src/librustc/middle/trans/debuginfo.rs | 5 | ||||
| -rw-r--r-- | src/librustc/middle/typeck/check/_match.rs | 2 | ||||
| -rw-r--r-- | src/librustdoc/clean/mod.rs | 7 | ||||
| -rw-r--r-- | src/libsyntax/ast.rs | 3 | ||||
| -rw-r--r-- | src/libsyntax/ast_util.rs | 1 | ||||
| -rw-r--r-- | src/libsyntax/fold.rs | 1 | ||||
| -rw-r--r-- | src/libsyntax/print/pprust.rs | 1 | ||||
| -rw-r--r-- | src/libsyntax/visit.rs | 1 |
12 files changed, 36 insertions, 2 deletions
diff --git a/src/librustc/middle/cfg/construct.rs b/src/librustc/middle/cfg/construct.rs index acf2442f6c1..3f7bfefe27e 100644 --- a/src/librustc/middle/cfg/construct.rs +++ b/src/librustc/middle/cfg/construct.rs @@ -142,6 +142,10 @@ impl<'a> CFGBuilder<'a> { self.pats_all(post.iter().map(|p| *p), vec_exit); self.add_node(pat.id, [post_exit]) } + + ast::PatMac(_) => { + self.tcx.sess.span_bug(pat.span, "unexpanded macro"); + } } } diff --git a/src/librustc/middle/check_match.rs b/src/librustc/middle/check_match.rs index ffc9ee7ec76..bbea1349c14 100644 --- a/src/librustc/middle/check_match.rs +++ b/src/librustc/middle/check_match.rs @@ -392,6 +392,7 @@ fn pat_ctor_id(cx: &MatchCheckCtxt, p: @Pat) -> Option<ctor> { None => Some(vec(before.len() + after.len())) } } + PatMac(_) => cx.tcx.sess.bug("unexpanded macro"), } } @@ -849,6 +850,10 @@ fn specialize(cx: &MatchCheckCtxt, _ => None } } + PatMac(_) => { + cx.tcx.sess.span_err(pat_span, "unexpanded macro"); + None + } } } } @@ -947,6 +952,7 @@ fn find_refutable(cx: &MatchCheckCtxt, pat: &Pat, spans: &mut Vec<Span>) { } PatEnum(_,_) => {} PatVec(..) => { this_pattern!() } + PatMac(_) => cx.tcx.sess.bug("unexpanded macro"), } } diff --git a/src/librustc/middle/mem_categorization.rs b/src/librustc/middle/mem_categorization.rs index 5787657d639..10357ef3d56 100644 --- a/src/librustc/middle/mem_categorization.rs +++ b/src/librustc/middle/mem_categorization.rs @@ -1088,6 +1088,10 @@ impl<'t,TYPER:Typer> MemCategorizationContext<'t,TYPER> { ast::PatLit(_) | ast::PatRange(_, _) => { /*always ok*/ } + + ast::PatMac(_) => { + self.tcx().sess.span_bug(pat.span, "unexpanded macro"); + } } Ok(()) diff --git a/src/librustc/middle/trans/_match.rs b/src/librustc/middle/trans/_match.rs index a10b31e923b..8df57e7adfb 100644 --- a/src/librustc/middle/trans/_match.rs +++ b/src/librustc/middle/trans/_match.rs @@ -2282,6 +2282,9 @@ fn bind_irrefutable_pat<'a>( bcx.sess().span_bug(pat.span, "vector patterns are never irrefutable!"); } + ast::PatMac(..) => { + bcx.sess().span_bug(pat.span, "unexpanded macro"); + } ast::PatWild | ast::PatWildMulti | ast::PatLit(_) | ast::PatRange(_, _) => () } return bcx; diff --git a/src/librustc/middle/trans/debuginfo.rs b/src/librustc/middle/trans/debuginfo.rs index 225c3c48cf4..744200c80e8 100644 --- a/src/librustc/middle/trans/debuginfo.rs +++ b/src/librustc/middle/trans/debuginfo.rs @@ -2664,6 +2664,11 @@ fn populate_scope_map(cx: &CrateContext, walk_pattern(cx, sub_pat, scope_stack, scope_map); } } + + ast::PatMac(_) => { + cx.sess().span_bug(pat.span, "debuginfo::populate_scope_map() - \ + Found unexpanded macro."); + } } } diff --git a/src/librustc/middle/typeck/check/_match.rs b/src/librustc/middle/typeck/check/_match.rs index 3d37de38e45..e223f4001df 100644 --- a/src/librustc/middle/typeck/check/_match.rs +++ b/src/librustc/middle/typeck/check/_match.rs @@ -722,6 +722,8 @@ pub fn check_pat(pcx: &pat_ctxt, pat: &ast::Pat, expected: ty::t) { } fcx.write_ty(pat.id, expected); } + + ast::PatMac(_) => tcx.sess.bug("unexpanded macro"), } } diff --git a/src/librustdoc/clean/mod.rs b/src/librustdoc/clean/mod.rs index 33e3e5370e6..48e390b35fb 100644 --- a/src/librustdoc/clean/mod.rs +++ b/src/librustdoc/clean/mod.rs @@ -1731,7 +1731,12 @@ fn name_from_pat(p: &ast::Pat) -> String { PatRange(..) => fail!("tried to get argument name from PatRange, \ which is not allowed in function arguments"), PatVec(..) => fail!("tried to get argument name from pat_vec, \ - which is not allowed in function arguments") + which is not allowed in function arguments"), + PatMac(..) => { + warn!("can't document the name of a function argument \ + produced by a pattern macro"); + "(argument produced by macro)".to_string() + } } } diff --git a/src/libsyntax/ast.rs b/src/libsyntax/ast.rs index 69a92a87185..edeff1229bd 100644 --- a/src/libsyntax/ast.rs +++ b/src/libsyntax/ast.rs @@ -353,7 +353,8 @@ pub enum Pat_ { PatRange(@Expr, @Expr), // [a, b, ..i, y, z] is represented as // PatVec(~[a, b], Some(i), ~[y, z]) - PatVec(Vec<@Pat> , Option<@Pat>, Vec<@Pat> ) + PatVec(Vec<@Pat> , Option<@Pat>, Vec<@Pat> ), + PatMac(Mac), } #[deriving(Clone, Eq, TotalEq, Encodable, Decodable, Hash, Show)] diff --git a/src/libsyntax/ast_util.rs b/src/libsyntax/ast_util.rs index 3e41e58fbe2..5b61cd45483 100644 --- a/src/libsyntax/ast_util.rs +++ b/src/libsyntax/ast_util.rs @@ -665,6 +665,7 @@ pub fn walk_pat(pat: &Pat, it: |&Pat| -> bool) -> bool { slice.iter().advance(|&p| walk_pat(p, |p| it(p))) && after.iter().advance(|&p| walk_pat(p, |p| it(p))) } + PatMac(_) => fail!("attempted to analyze unexpanded pattern"), PatWild | PatWildMulti | PatLit(_) | PatRange(_, _) | PatIdent(_, _, _) | PatEnum(_, _) => { true diff --git a/src/libsyntax/fold.rs b/src/libsyntax/fold.rs index 1607820326b..b66d1f7eae5 100644 --- a/src/libsyntax/fold.rs +++ b/src/libsyntax/fold.rs @@ -770,6 +770,7 @@ pub fn noop_fold_pat<T: Folder>(p: @Pat, folder: &mut T) -> @Pat { slice.map(|x| folder.fold_pat(x)), after.iter().map(|x| folder.fold_pat(*x)).collect()) } + PatMac(ref mac) => PatMac(folder.fold_mac(mac)), }; @Pat { diff --git a/src/libsyntax/print/pprust.rs b/src/libsyntax/print/pprust.rs index 3cb2d0b421c..3127085ffed 100644 --- a/src/libsyntax/print/pprust.rs +++ b/src/libsyntax/print/pprust.rs @@ -1757,6 +1757,7 @@ impl<'a> State<'a> { |s, &p| s.print_pat(p))); try!(word(&mut self.s, "]")); } + ast::PatMac(ref m) => try!(self.print_mac(m)), } self.ann.post(self, NodePat(pat)) } diff --git a/src/libsyntax/visit.rs b/src/libsyntax/visit.rs index ce10d0db3ba..eb7aeb0e327 100644 --- a/src/libsyntax/visit.rs +++ b/src/libsyntax/visit.rs @@ -457,6 +457,7 @@ pub fn walk_pat<E: Clone, V: Visitor<E>>(visitor: &mut V, pattern: &Pat, env: E) visitor.visit_pat(*postpattern, env.clone()) } } + PatMac(ref macro) => visitor.visit_mac(macro, env), } } |
