]> git.lizzy.rs Git - rust.git/commitdiff
syntax: Add unquoting ast::{Generics,WhereClause}
authorErick Tryzelaar <erick.tryzelaar@gmail.com>
Sat, 2 May 2015 17:55:41 +0000 (10:55 -0700)
committerErick Tryzelaar <erick.tryzelaar@gmail.com>
Fri, 15 May 2015 15:01:55 +0000 (08:01 -0700)
src/libsyntax/ext/quote.rs
src/libsyntax/fold.rs
src/libsyntax/parse/parser.rs
src/libsyntax/parse/token.rs
src/libsyntax/print/pprust.rs

index e100b7705d8178ff813058b8a7aa8813f695f531..39ddafffaece88c5a36c515ff23a60ad35bf297e 100644 (file)
@@ -94,6 +94,18 @@ fn to_tokens(&self, _cx: &ExtCtxt) -> Vec<TokenTree> {
         }
     }
 
+    impl ToTokens for ast::Generics {
+        fn to_tokens(&self, _cx: &ExtCtxt) -> Vec<TokenTree> {
+            vec![ast::TtToken(DUMMY_SP, token::Interpolated(token::NtGenerics(self.clone())))]
+        }
+    }
+
+    impl ToTokens for ast::WhereClause {
+        fn to_tokens(&self, _cx: &ExtCtxt) -> Vec<TokenTree> {
+            vec![ast::TtToken(DUMMY_SP, token::Interpolated(token::NtWhereClause(self.clone())))]
+        }
+    }
+
     impl ToTokens for P<ast::Item> {
         fn to_tokens(&self, _cx: &ExtCtxt) -> Vec<TokenTree> {
             vec![ast::TtToken(self.span, token::Interpolated(token::NtItem(self.clone())))]
index adfda988b23b747a05c13329b097e2f4af80f8b7..4bf15f509a048e1f34b833228ba10da97cd43fa2 100644 (file)
@@ -689,6 +689,9 @@ pub fn noop_fold_interpolated<T: Folder>(nt: token::Nonterminal, fld: &mut T)
         token::NtTraitItem(arm) =>
             token::NtTraitItem(fld.fold_trait_item(arm)
                                .expect_one("expected fold to produce exactly one item")),
+        token::NtGenerics(generics) => token::NtGenerics(fld.fold_generics(generics)),
+        token::NtWhereClause(where_clause) =>
+            token::NtWhereClause(fld.fold_where_clause(where_clause)),
     }
 }
 
index 541ec16b415d47ad6c22b1bc994568c0c1af4aaf..9bf6fa88ba5531d48e61fce29a2fb34548a9f8c9 100644 (file)
@@ -3808,6 +3808,8 @@ fn parse_ty_param(&mut self) -> PResult<TyParam> {
     ///                  | ( < lifetimes , typaramseq ( , )? > )
     /// where   typaramseq = ( typaram ) | ( typaram , typaramseq )
     pub fn parse_generics(&mut self) -> PResult<ast::Generics> {
+        maybe_whole!(self, NtGenerics);
+
         if try!(self.eat(&token::Lt) ){
             let lifetime_defs = try!(self.parse_lifetime_defs());
             let mut seen_default = false;
@@ -3928,6 +3930,8 @@ fn forbid_lifetime(&mut self) -> PResult<()> {
     /// where T : Trait<U, V> + 'b, 'a : 'b
     /// ```
     pub fn parse_where_clause(&mut self) -> PResult<ast::WhereClause> {
+        maybe_whole!(self, NtWhereClause);
+
         let mut where_clause = WhereClause {
             id: ast::DUMMY_NODE_ID,
             predicates: Vec::new(),
index 53ed4f351d35667f5c4d1eec07edb51f7b14d043..832fec40199b8ae9be51f7ed59abf0368c50b08a 100644 (file)
@@ -385,6 +385,8 @@ pub enum Nonterminal {
     NtArm(ast::Arm),
     NtImplItem(P<ast::ImplItem>),
     NtTraitItem(P<ast::TraitItem>),
+    NtGenerics(ast::Generics),
+    NtWhereClause(ast::WhereClause),
 }
 
 impl fmt::Debug for Nonterminal {
@@ -403,6 +405,8 @@ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
             NtArm(..) => f.pad("NtArm(..)"),
             NtImplItem(..) => f.pad("NtImplItem(..)"),
             NtTraitItem(..) => f.pad("NtTraitItem(..)"),
+            NtGenerics(..) => f.pad("NtGenerics(..)"),
+            NtWhereClause(..) => f.pad("NtWhereClause(..)"),
         }
     }
 }
index 419b37262945fab49229329a5c93768a4bebcfbd..b71d65a8fb0c5dcafdd173deefdf6e847ac6dd6c 100644 (file)
@@ -287,19 +287,21 @@ pub fn token_to_string(tok: &Token) -> String {
         token::SpecialVarNt(var)    => format!("${}", var.as_str()),
 
         token::Interpolated(ref nt) => match *nt {
-            token::NtExpr(ref e)      => expr_to_string(&**e),
-            token::NtMeta(ref e)      => meta_item_to_string(&**e),
-            token::NtTy(ref e)        => ty_to_string(&**e),
-            token::NtPath(ref e)      => path_to_string(&**e),
-            token::NtItem(ref e)      => item_to_string(&**e),
-            token::NtBlock(ref e)     => block_to_string(&**e),
-            token::NtStmt(ref e)      => stmt_to_string(&**e),
-            token::NtPat(ref e)       => pat_to_string(&**e),
-            token::NtIdent(ref e)     => ident_to_string(&**e),
-            token::NtTT(ref e)        => tt_to_string(&**e),
-            token::NtArm(ref e)       => arm_to_string(&**e),
-            token::NtImplItem(ref e)  => impl_item_to_string(&**e),
-            token::NtTraitItem(ref e) => trait_item_to_string(&**e),
+            token::NtExpr(ref e)        => expr_to_string(&**e),
+            token::NtMeta(ref e)        => meta_item_to_string(&**e),
+            token::NtTy(ref e)          => ty_to_string(&**e),
+            token::NtPath(ref e)        => path_to_string(&**e),
+            token::NtItem(ref e)        => item_to_string(&**e),
+            token::NtBlock(ref e)       => block_to_string(&**e),
+            token::NtStmt(ref e)        => stmt_to_string(&**e),
+            token::NtPat(ref e)         => pat_to_string(&**e),
+            token::NtIdent(ref e, _)    => ident_to_string(&**e),
+            token::NtTT(ref e)          => tt_to_string(&**e),
+            token::NtArm(ref e)         => arm_to_string(&*e),
+            token::NtImplItem(ref e)    => impl_item_to_string(&**e),
+            token::NtTraitItem(ref e)   => trait_item_to_string(&**e),
+            token::NtGenerics(ref e)    => generics_to_string(&*e),
+            token::NtWhereClause(ref e) => where_clause_to_string(&*e),
         }
     }
 }