-
Notifications
You must be signed in to change notification settings - Fork 12.8k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Hygiene issues when reparsing token trees #16987
Labels
A-syntaxext
Area: Syntax extensions
Comments
I forgot to mention, this seems to have been introduced with #16477 |
goffrie
added a commit
to goffrie/rust
that referenced
this issue
Mar 5, 2015
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. Two new `Nonterminal`s are added: NtArm and NtMethod, which the parser now interpolates. These are just for quasiquote. They aren't used by macros (although they 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 rust-lang#16987. As such, this is a [breaking-change]. Fixes rust-lang#16472. Fixes rust-lang#15962. Fixes rust-lang#17397. Fixes rust-lang#16617.
goffrie
added a commit
to goffrie/rust
that referenced
this issue
Mar 10, 2015
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. Two new `Nonterminal`s are added: NtArm and NtMethod, which the parser now interpolates. These are just for quasiquote. They aren't used by macros (although they 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 rust-lang#16987. As such, this is a [breaking-change]. Fixes rust-lang#16472. Fixes rust-lang#15962. Fixes rust-lang#17397. Fixes rust-lang#16617.
goffrie
added a commit
to goffrie/rust
that referenced
this issue
Mar 13, 2015
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. Two new `Nonterminal`s are added: NtArm and NtMethod, which the parser now interpolates. These are just for quasiquote. They aren't used by macros (although they 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 rust-lang#16987. As such, this is a [breaking-change]. Fixes rust-lang#16472. Fixes rust-lang#15962. Fixes rust-lang#17397. Fixes rust-lang#16617.
goffrie
added a commit
to goffrie/rust
that referenced
this issue
Mar 16, 2015
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 rust-lang#16987. As such, this is a [breaking-change]. Fixes rust-lang#16472. Fixes rust-lang#15962. Fixes rust-lang#17397. Fixes rust-lang#16617.
goffrie
added a commit
to goffrie/rust
that referenced
this issue
Apr 9, 2015
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 rust-lang#16987. As such, this is a [breaking-change]. Fixes rust-lang#16472. Fixes rust-lang#15962. Fixes rust-lang#17397. Fixes rust-lang#16617.
goffrie
added a commit
to goffrie/rust
that referenced
this issue
Apr 19, 2015
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 rust-lang#16987. As such, this is a [breaking-change]. Fixes rust-lang#16472. Fixes rust-lang#15962. Fixes rust-lang#17397. Fixes rust-lang#16617.
goffrie
added a commit
to goffrie/rust
that referenced
this issue
Apr 23, 2015
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 rust-lang#16987. As such, this is a [breaking-change]. Fixes rust-lang#16472. Fixes rust-lang#15962. Fixes rust-lang#17397. Fixes rust-lang#16617.
goffrie
added a commit
to goffrie/rust
that referenced
this issue
Apr 23, 2015
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 rust-lang#16987. As such, this is a [breaking-change]. Fixes rust-lang#16472. Fixes rust-lang#15962. Fixes rust-lang#17397. Fixes rust-lang#16617.
goffrie
added a commit
to goffrie/rust
that referenced
this issue
Apr 24, 2015
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 rust-lang#16987. As such, this is a [breaking-change]. Fixes rust-lang#16472. Fixes rust-lang#15962. Fixes rust-lang#17397. Fixes rust-lang#16617.
goffrie
added a commit
to goffrie/rust
that referenced
this issue
Apr 26, 2015
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 rust-lang#16987. As such, this is a [breaking-change]. Fixes rust-lang#16472. Fixes rust-lang#15962. Fixes rust-lang#17397. Fixes rust-lang#16617.
bors
added a commit
that referenced
this issue
Apr 26, 2015
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. New `Nonterminal`s are added: NtArm, NtImplItem, and NtTraitItem. These are just for quasiquote, not macros. `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.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
I get errors when I call
to_tokens
on a parsed block and parse that again using procedural macros. It seems to be related to hygiene being lost when you do that, but I might be wrong, here's a gist that shows the problem: https://gist.github.com/uorbe001/1118f22c378d2e382d29If I try to compile that gist, I get the following error on the assert! line:
I thought this was related to #8063, but apparently this is a separate issue.
The text was updated successfully, but these errors were encountered: