From edca562c87362c80e409f53d28e19617ca44646a Mon Sep 17 00:00:00 2001 From: Jared Roesch Date: Sat, 25 Jul 2015 21:40:57 -0700 Subject: [PATCH] Make parser recognize macro invocations in types Reapplied the changes from https://github.com/freebroccolo/rust/commit/8b07abaa6e8ab42d37656dfad89de0eb5810c3b3 to a clean branch of master --- src/libsyntax/parse/parser.rs | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index e7ab9a73c0ffd..7b8ad7d7af683 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -51,6 +51,7 @@ use ast::{SelfExplicit, SelfRegion, SelfStatic, SelfValue}; use ast::{Delimited, SequenceRepetition, TokenTree, TraitItem, TraitRef}; use ast::{TtDelimited, TtSequence, TtToken}; use ast::{TupleVariantKind, Ty, Ty_, TypeBinding}; +use ast::{TyMac}; use ast::{TyFixedLengthVec, TyBareFn, TyTypeof, TyInfer}; use ast::{TyParam, TyParamBound, TyParen, TyPath, TyPolyTraitRef, TyPtr}; use ast::{TyRptr, TyTup, TyU32, TyVec, UnUniq}; @@ -1369,8 +1370,20 @@ impl<'a> Parser<'a> { } else if self.check(&token::ModSep) || self.token.is_ident() || self.token.is_path() { - // NAMED TYPE - try!(self.parse_ty_path()) + let path = try!(self.parse_path(LifetimeAndTypesWithoutColons)); + if self.check(&token::Not) { + // MACRO INVOCATION + try!(self.bump()); + let delim = try!(self.expect_open_delim()); + let tts = try!(self.parse_seq_to_end(&token::CloseDelim(delim), + seq_sep_none(), + |p| p.parse_token_tree())); + let hi = self.span.hi; + TyMac(spanned(lo, hi, MacInvocTT(path, tts, EMPTY_CTXT))) + } else { + // NAMED TYPE + TyPath(None, path) + } } else if try!(self.eat(&token::Underscore) ){ // TYPE TO BE INFERRED TyInfer