Interpolate AST nodes in quasiquote.
This changes the `ToTokens` implementations for expressions, statements, etc. with almost-trivial ones that produce `Interpolated(*Nt(...))` pseudo-tokens. In this way, quasiquote now works the same way as macros do: already-parsed AST fragments are used as-is, not reparsed. The `ToSource` trait is removed. Quasiquote no longer involves pretty-printing at all, which removes the need for the `encode_with_hygiene` hack. All associated machinery is removed. A new `Nonterminal` is added, NtArm, which the parser now interpolates. This is just for quasiquote, not macros (although it could be in the future). `ToTokens` is no longer implemented for `Arg` (although this could be added again) and `Generics` (which I don't think makes sense). This breaks any compiler extensions that relied on the ability of `ToTokens` to turn AST fragments back into inspectable token trees. For this reason, this closes #16987. As such, this is a [breaking-change]. Fixes #16472. Fixes #15962. Fixes #17397. Fixes #16617.
This commit is contained in:
parent
da623844a9
commit
2d9831dea5
9 changed files with 246 additions and 562 deletions
|
@ -1152,7 +1152,8 @@ impl<'a> Parser<'a> {
|
|||
&token::OpenDelim(token::Brace),
|
||||
&token::CloseDelim(token::Brace),
|
||||
seq_sep_none(),
|
||||
|p| {
|
||||
|p| -> PResult<P<TraitItem>> {
|
||||
maybe_whole!(no_clone p, NtTraitItem);
|
||||
let mut attrs = p.parse_outer_attributes();
|
||||
let lo = p.span.lo;
|
||||
|
||||
|
@ -2943,6 +2944,8 @@ impl<'a> Parser<'a> {
|
|||
}
|
||||
|
||||
pub fn parse_arm_nopanic(&mut self) -> PResult<Arm> {
|
||||
maybe_whole!(no_clone self, NtArm);
|
||||
|
||||
let attrs = self.parse_outer_attributes();
|
||||
let pats = try!(self.parse_pats());
|
||||
let mut guard = None;
|
||||
|
@ -4335,6 +4338,8 @@ impl<'a> Parser<'a> {
|
|||
|
||||
/// Parse an impl item.
|
||||
pub fn parse_impl_item(&mut self) -> PResult<P<ImplItem>> {
|
||||
maybe_whole!(no_clone self, NtImplItem);
|
||||
|
||||
let mut attrs = self.parse_outer_attributes();
|
||||
let lo = self.span.lo;
|
||||
let vis = try!(self.parse_visibility());
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue