Skip to content

Commit 53a183f

Browse files
committed
Auto merge of #23359 - erickt:quote, r=pnkfelix
This PR allows the quote macros to unquote trait items, impl items, where clauses, and paths.
2 parents 199bdcf + a17f556 commit 53a183f

File tree

3 files changed

+41
-29
lines changed

3 files changed

+41
-29
lines changed

src/libsyntax/ext/quote.rs

+4
Original file line numberDiff line numberDiff line change
@@ -171,10 +171,12 @@ pub mod rt {
171171
}
172172
}
173173

174+
impl_to_source! { ast::Path, path_to_string }
174175
impl_to_source! { ast::Ty, ty_to_string }
175176
impl_to_source! { ast::Block, block_to_string }
176177
impl_to_source! { ast::Arg, arg_to_string }
177178
impl_to_source! { Generics, generics_to_string }
179+
impl_to_source! { ast::WhereClause, where_clause_to_string }
178180
impl_to_source! { P<ast::Item>, item_to_string }
179181
impl_to_source! { P<ast::ImplItem>, impl_item_to_string }
180182
impl_to_source! { P<ast::TraitItem>, trait_item_to_string }
@@ -310,6 +312,7 @@ pub mod rt {
310312
}
311313

312314
impl_to_tokens! { ast::Ident }
315+
impl_to_tokens! { ast::Path }
313316
impl_to_tokens! { P<ast::Item> }
314317
impl_to_tokens! { P<ast::ImplItem> }
315318
impl_to_tokens! { P<ast::TraitItem> }
@@ -319,6 +322,7 @@ pub mod rt {
319322
impl_to_tokens! { ast::Ty }
320323
impl_to_tokens_lifetime! { &'a [ast::Ty] }
321324
impl_to_tokens! { Generics }
325+
impl_to_tokens! { ast::WhereClause }
322326
impl_to_tokens! { P<ast::Stmt> }
323327
impl_to_tokens! { P<ast::Expr> }
324328
impl_to_tokens! { ast::Block }

src/libsyntax/parse/parser.rs

+23-16
Original file line numberDiff line numberDiff line change
@@ -1126,7 +1126,7 @@ impl<'a> Parser<'a> {
11261126
p.parse_arg_general(false)
11271127
});
11281128

1129-
p.parse_where_clause(&mut generics);
1129+
generics.where_clause = p.parse_where_clause();
11301130
let sig = ast::MethodSig {
11311131
unsafety: style,
11321132
decl: d,
@@ -3932,9 +3932,14 @@ impl<'a> Parser<'a> {
39323932
/// ```
39333933
/// where T : Trait<U, V> + 'b, 'a : 'b
39343934
/// ```
3935-
fn parse_where_clause(&mut self, generics: &mut ast::Generics) {
3935+
fn parse_where_clause(&mut self) -> ast::WhereClause {
3936+
let mut where_clause = WhereClause {
3937+
id: ast::DUMMY_NODE_ID,
3938+
predicates: Vec::new(),
3939+
};
3940+
39363941
if !self.eat_keyword(keywords::Where) {
3937-
return
3942+
return where_clause;
39383943
}
39393944

39403945
let mut parsed_something = false;
@@ -3957,7 +3962,7 @@ impl<'a> Parser<'a> {
39573962
let hi = self.span.hi;
39583963
let span = mk_sp(lo, hi);
39593964

3960-
generics.where_clause.predicates.push(ast::WherePredicate::RegionPredicate(
3965+
where_clause.predicates.push(ast::WherePredicate::RegionPredicate(
39613966
ast::WhereRegionPredicate {
39623967
span: span,
39633968
lifetime: bounded_lifetime,
@@ -3992,7 +3997,7 @@ impl<'a> Parser<'a> {
39923997
at least one bound in it");
39933998
}
39943999

3995-
generics.where_clause.predicates.push(ast::WherePredicate::BoundPredicate(
4000+
where_clause.predicates.push(ast::WherePredicate::BoundPredicate(
39964001
ast::WhereBoundPredicate {
39974002
span: span,
39984003
bound_lifetimes: bound_lifetimes,
@@ -4005,7 +4010,7 @@ impl<'a> Parser<'a> {
40054010
// let ty = self.parse_ty();
40064011
let hi = self.span.hi;
40074012
let span = mk_sp(lo, hi);
4008-
// generics.where_clause.predicates.push(
4013+
// where_clause.predicates.push(
40094014
// ast::WherePredicate::EqPredicate(ast::WhereEqPredicate {
40104015
// id: ast::DUMMY_NODE_ID,
40114016
// span: span,
@@ -4036,6 +4041,8 @@ impl<'a> Parser<'a> {
40364041
"a `where` clause must have at least one predicate \
40374042
in it");
40384043
}
4044+
4045+
where_clause
40394046
}
40404047

40414048
fn parse_fn_args(&mut self, named_args: bool, allow_variadic: bool)
@@ -4354,7 +4361,7 @@ impl<'a> Parser<'a> {
43544361
fn parse_item_fn(&mut self, unsafety: Unsafety, abi: abi::Abi) -> ItemInfo {
43554362
let (ident, mut generics) = self.parse_fn_header();
43564363
let decl = self.parse_fn_decl(false);
4357-
self.parse_where_clause(&mut generics);
4364+
generics.where_clause = self.parse_where_clause();
43584365
let (inner_attrs, body) = self.parse_inner_attrs_and_block();
43594366
(ident, ItemFn(decl, unsafety, abi, generics, body), Some(inner_attrs))
43604367
}
@@ -4439,7 +4446,7 @@ impl<'a> Parser<'a> {
44394446
let (explicit_self, decl) = self.parse_fn_decl_with_self(|p| {
44404447
p.parse_arg()
44414448
});
4442-
self.parse_where_clause(&mut generics);
4449+
generics.where_clause = self.parse_where_clause();
44434450
let (inner_attrs, body) = self.parse_inner_attrs_and_block();
44444451
(ident, inner_attrs, MethodImplItem(ast::MethodSig {
44454452
generics: generics,
@@ -4460,7 +4467,7 @@ impl<'a> Parser<'a> {
44604467
// Parse supertrait bounds.
44614468
let bounds = self.parse_colon_then_ty_param_bounds(BoundParsingMode::Bare);
44624469

4463-
self.parse_where_clause(&mut tps);
4470+
tps.where_clause = self.parse_where_clause();
44644471

44654472
let meths = self.parse_trait_items();
44664473
(ident, ItemTrait(unsafety, tps, bounds, meths), None)
@@ -4531,7 +4538,7 @@ impl<'a> Parser<'a> {
45314538
if opt_trait.is_some() {
45324539
ty = self.parse_ty_sum();
45334540
}
4534-
self.parse_where_clause(&mut generics);
4541+
generics.where_clause = self.parse_where_clause();
45354542

45364543
self.expect(&token::OpenDelim(token::Brace));
45374544
let attrs = self.parse_inner_attributes();
@@ -4603,7 +4610,7 @@ impl<'a> Parser<'a> {
46034610
// struct.
46044611

46054612
let (fields, ctor_id) = if self.token.is_keyword(keywords::Where) {
4606-
self.parse_where_clause(&mut generics);
4613+
generics.where_clause = self.parse_where_clause();
46074614
if self.eat(&token::Semi) {
46084615
// If we see a: `struct Foo<T> where T: Copy;` style decl.
46094616
(Vec::new(), Some(ast::DUMMY_NODE_ID))
@@ -4684,12 +4691,12 @@ impl<'a> Parser<'a> {
46844691
token::get_ident(class_name.clone())));
46854692
}
46864693

4687-
self.parse_where_clause(generics);
4694+
generics.where_clause = self.parse_where_clause();
46884695
self.expect(&token::Semi);
46894696
fields
46904697
// This is the case where we just see struct Foo<T> where T: Copy;
46914698
} else if self.token.is_keyword(keywords::Where) {
4692-
self.parse_where_clause(generics);
4699+
generics.where_clause = self.parse_where_clause();
46934700
self.expect(&token::Semi);
46944701
Vec::new()
46954702
// This case is where we see: `struct Foo<T>;`
@@ -4937,7 +4944,7 @@ impl<'a> Parser<'a> {
49374944

49384945
let (ident, mut generics) = self.parse_fn_header();
49394946
let decl = self.parse_fn_decl(true);
4940-
self.parse_where_clause(&mut generics);
4947+
generics.where_clause = self.parse_where_clause();
49414948
let hi = self.span.hi;
49424949
self.expect(&token::Semi);
49434950
P(ast::ForeignItem {
@@ -5074,7 +5081,7 @@ impl<'a> Parser<'a> {
50745081
fn parse_item_type(&mut self) -> ItemInfo {
50755082
let ident = self.parse_ident();
50765083
let mut tps = self.parse_generics();
5077-
self.parse_where_clause(&mut tps);
5084+
tps.where_clause = self.parse_where_clause();
50785085
self.expect(&token::Eq);
50795086
let ty = self.parse_ty_sum();
50805087
self.expect(&token::Semi);
@@ -5174,7 +5181,7 @@ impl<'a> Parser<'a> {
51745181
fn parse_item_enum(&mut self) -> ItemInfo {
51755182
let id = self.parse_ident();
51765183
let mut generics = self.parse_generics();
5177-
self.parse_where_clause(&mut generics);
5184+
generics.where_clause = self.parse_where_clause();
51785185
self.expect(&token::OpenDelim(token::Brace));
51795186

51805187
let enum_definition = self.parse_enum_def(&generics);

src/libsyntax/print/pprust.rs

+14-13
Original file line numberDiff line numberDiff line change
@@ -367,6 +367,10 @@ pub fn generics_to_string(generics: &ast::Generics) -> String {
367367
$to_string(|s| s.print_generics(generics))
368368
}
369369

370+
pub fn where_clause_to_string(i: &ast::WhereClause) -> String {
371+
$to_string(|s| s.print_where_clause(i))
372+
}
373+
370374
pub fn fn_block_to_string(p: &ast::FnDecl) -> String {
371375
$to_string(|s| s.print_fn_block_args(p))
372376
}
@@ -917,7 +921,7 @@ impl<'a> State<'a> {
917921
try!(space(&mut self.s));
918922
try!(self.word_space("="));
919923
try!(self.print_type(&**ty));
920-
try!(self.print_where_clause(params));
924+
try!(self.print_where_clause(&params.where_clause));
921925
try!(word(&mut self.s, ";"));
922926
try!(self.end()); // end the outer ibox
923927
}
@@ -980,7 +984,7 @@ impl<'a> State<'a> {
980984
}
981985

982986
try!(self.print_type(&**ty));
983-
try!(self.print_where_clause(generics));
987+
try!(self.print_where_clause(&generics.where_clause));
984988

985989
try!(space(&mut self.s));
986990
try!(self.bopen());
@@ -1008,7 +1012,7 @@ impl<'a> State<'a> {
10081012
}
10091013
}
10101014
try!(self.print_bounds(":", &real_bounds[..]));
1011-
try!(self.print_where_clause(generics));
1015+
try!(self.print_where_clause(&generics.where_clause));
10121016
try!(word(&mut self.s, " "));
10131017
try!(self.bopen());
10141018
for trait_item in trait_items {
@@ -1066,7 +1070,7 @@ impl<'a> State<'a> {
10661070
try!(self.head(&visibility_qualified(visibility, "enum")));
10671071
try!(self.print_ident(ident));
10681072
try!(self.print_generics(generics));
1069-
try!(self.print_where_clause(generics));
1073+
try!(self.print_where_clause(&generics.where_clause));
10701074
try!(space(&mut self.s));
10711075
self.print_variants(&enum_definition.variants, span)
10721076
}
@@ -1120,12 +1124,12 @@ impl<'a> State<'a> {
11201124
));
11211125
try!(self.pclose());
11221126
}
1123-
try!(self.print_where_clause(generics));
1127+
try!(self.print_where_clause(&generics.where_clause));
11241128
try!(word(&mut self.s, ";"));
11251129
try!(self.end());
11261130
self.end() // close the outer-box
11271131
} else {
1128-
try!(self.print_where_clause(generics));
1132+
try!(self.print_where_clause(&generics.where_clause));
11291133
try!(self.nbsp());
11301134
try!(self.bopen());
11311135
try!(self.hardbreak_if_not_bol());
@@ -2348,7 +2352,7 @@ impl<'a> State<'a> {
23482352
}
23492353
try!(self.print_generics(generics));
23502354
try!(self.print_fn_args_and_ret(decl, opt_explicit_self));
2351-
self.print_where_clause(generics)
2355+
self.print_where_clause(&generics.where_clause)
23522356
}
23532357

23542358
pub fn print_fn_args(&mut self, decl: &ast::FnDecl,
@@ -2531,19 +2535,16 @@ impl<'a> State<'a> {
25312535
}
25322536
}
25332537

2534-
pub fn print_where_clause(&mut self, generics: &ast::Generics)
2538+
pub fn print_where_clause(&mut self, where_clause: &ast::WhereClause)
25352539
-> io::Result<()> {
2536-
if generics.where_clause.predicates.len() == 0 {
2540+
if where_clause.predicates.len() == 0 {
25372541
return Ok(())
25382542
}
25392543

25402544
try!(space(&mut self.s));
25412545
try!(self.word_space("where"));
25422546

2543-
for (i, predicate) in generics.where_clause
2544-
.predicates
2545-
.iter()
2546-
.enumerate() {
2547+
for (i, predicate) in where_clause.predicates.iter().enumerate() {
25472548
if i != 0 {
25482549
try!(self.word_space(","));
25492550
}

0 commit comments

Comments
 (0)