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
|
@ -381,6 +381,10 @@ pub enum Nonterminal {
|
|||
NtMeta(P<ast::MetaItem>),
|
||||
NtPath(Box<ast::Path>),
|
||||
NtTT(P<ast::TokenTree>), // needs P'ed to break a circularity
|
||||
// These is not exposed to macros, but is used by quasiquote.
|
||||
NtArm(ast::Arm),
|
||||
NtImplItem(P<ast::ImplItem>),
|
||||
NtTraitItem(P<ast::TraitItem>),
|
||||
}
|
||||
|
||||
impl fmt::Debug for Nonterminal {
|
||||
|
@ -396,6 +400,9 @@ impl fmt::Debug for Nonterminal {
|
|||
NtMeta(..) => f.pad("NtMeta(..)"),
|
||||
NtPath(..) => f.pad("NtPath(..)"),
|
||||
NtTT(..) => f.pad("NtTT(..)"),
|
||||
NtArm(..) => f.pad("NtArm(..)"),
|
||||
NtImplItem(..) => f.pad("NtImplItem(..)"),
|
||||
NtTraitItem(..) => f.pad("NtTraitItem(..)"),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue