]> git.lizzy.rs Git - rust.git/commitdiff
syntax: parse outer attributes in `quote_item!` calls.
authorHuon Wilson <dbau.pp+github@gmail.com>
Thu, 12 Jun 2014 23:40:10 +0000 (09:40 +1000)
committerAlex Crichton <alex@alexcrichton.com>
Fri, 13 Jun 2014 20:53:55 +0000 (13:53 -0700)
Fixes #14857.

src/libsyntax/ext/quote.rs
src/libsyntax/ext/tt/macro_rules.rs
src/libsyntax/parse/mod.rs
src/libsyntax/parse/parser.rs
src/test/run-pass-fulldeps/quote-tokens.rs

index bc5442a94fb7fd69b5b108e82349e93230cc3e6b..4f1e2ab356e1e794779867de5f51b5ae50e83f0c 100644 (file)
@@ -358,9 +358,8 @@ pub fn expand_quote_item(cx: &mut ExtCtxt,
                          sp: Span,
                          tts: &[ast::TokenTree])
                          -> Box<base::MacResult> {
-    let e_attrs = cx.expr_vec_ng(sp);
-    let expanded = expand_parse_call(cx, sp, "parse_item",
-                                    vec!(e_attrs), tts);
+    let expanded = expand_parse_call(cx, sp, "parse_item_with_outer_attributes",
+                                    vec!(), tts);
     base::MacExpr::new(expanded)
 }
 
index c4990255719f304f564faf9073520b591e2c96b8..72c578b87699c5b0f335ee3bad3395cc6e4fd818 100644 (file)
@@ -73,8 +73,7 @@ fn make_items(&self) -> Option<SmallVector<Gc<ast::Item>>> {
         let mut ret = SmallVector::zero();
         loop {
             let mut parser = self.parser.borrow_mut();
-            let attrs = parser.parse_outer_attributes();
-            match parser.parse_item(attrs) {
+            match parser.parse_item_with_outer_attributes() {
                 Some(item) => ret.push(item),
                 None => break
             }
index 88746d145b6fcffceb919b189024c099138aa535..1ebcbc8a7d10218452987c26a74d483aecc95e8d 100644 (file)
@@ -117,8 +117,7 @@ pub fn parse_item_from_source_str(name: String,
                                   sess: &ParseSess)
                                   -> Option<Gc<ast::Item>> {
     let mut p = new_parser_from_source_str(sess, cfg, name, source);
-    let attrs = p.parse_outer_attributes();
-    maybe_aborted(p.parse_item(attrs),p)
+    maybe_aborted(p.parse_item_with_outer_attributes(),p)
 }
 
 pub fn parse_meta_from_source_str(name: String,
index e1a45e5643d2597ca9c01d889ee16ff7df091c4e..d11d303059fa1e026232afee4615f6f03e7612a6 100644 (file)
@@ -4965,6 +4965,11 @@ fn parse_macro_use_or_failure(
         return IoviNone(attrs);
     }
 
+    pub fn parse_item_with_outer_attributes(&mut self) -> Option<Gc<Item>> {
+        let attrs = self.parse_outer_attributes();
+        self.parse_item(attrs)
+    }
+
     pub fn parse_item(&mut self, attrs: Vec<Attribute> ) -> Option<Gc<Item>> {
         match self.parse_item_or_view_item(attrs, true) {
             IoviNone(_) => None,
index c41ec0dbd658e869029be25a767a3045a8df7782..96f5fca5a2ded14e696f6a5491eff9a55277e461 100644 (file)
@@ -28,6 +28,9 @@ fn syntax_extension(cx: &ExtCtxt) {
     let _f: @syntax::ast::Expr = quote_expr!(cx, ());
     let _g: @syntax::ast::Expr = quote_expr!(cx, true);
     let _h: @syntax::ast::Expr = quote_expr!(cx, 'a');
+
+    let i: Option<@syntax::ast::Item> = quote_item!(cx, #[deriving(Eq)] struct Foo; );
+    assert!(i.is_some());
 }
 
 fn main() {