-
Notifications
You must be signed in to change notification settings - Fork 13k
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
proc_macro: Use ToTokens
trait in quote
macro
#134693
base: master
Are you sure you want to change the base?
proc_macro: Use ToTokens
trait in quote
macro
#134693
Conversation
This comment has been minimized.
This comment has been minimized.
519aec5
to
0b32dec
Compare
Thanks for working on this! Could you update the new test file with applicable tests from https://github.com/dtolnay/quote/blob/aafba72e10919ad47c05169271cb78e614fb2b9d/tests/test.rs? Because of token stream limitations we can't actually mark them We can probably reuse the UI tests from https://github.com/dtolnay/quote/tree/aafba72e10919ad47c05169271cb78e614fb2b9d/tests/ui too. I think you can just make a new |
0b32dec
to
7e77f06
Compare
I have updated the PR for the macro implementation, and I will migrate the test cases from |
This comment has been minimized.
This comment has been minimized.
7e77f06
to
5d0a6c5
Compare
This comment has been minimized.
This comment has been minimized.
5d0a6c5
to
858ad51
Compare
Some changes occurred in src/tools/clippy cc @rust-lang/clippy |
858ad51
to
6404cf5
Compare
I'm working on migrating the applicable tests from https://github.com/dtolnay/quote/blob/0245506323a3616daa2ee41c6ad0b871e4d78ae4/tests/test.rs. It seems like the current // - quote_spanned:
// - fn test_quote_spanned_impl
// - fn test_type_inference_for_span
// - format_ident:
// - fn test_format_ident
// - fn test_format_ident_strip_raw
// - repetition:
// - fn test_iter
// - fn test_array
// - fn test_fancy_repetition
// - fn test_nested_fancy_repetition
// - fn test_duplicate_name_repetition
// - fn test_duplicate_name_repetition_no_copy
// - fn test_btreeset_repetition
// - fn test_variable_name_conflict
// - fn test_nonrep_in_repetition
// - fn test_closure
// - fn test_star_after_repetition And many tests cases failed with /*
message: assertion `left == right` failed
left: "impl < 'a , T : ToTokens > ToTokens for & 'a T { fn to_tokens (& self , tokens : & mut TokenStream) { (* * self) . to_tokens (tokens) } }"
right: "impl < 'a, T : ToTokens > ToTokens for & 'a T\n{\n fn to_tokens(& self, tokens : & mut TokenStream)\n { (** self).to_tokens(tokens) }\n}"
*/
fn test_quote_impl() {
let tokens = quote! {
impl<'a, T: ToTokens> ToTokens for &'a T {
fn to_tokens(&self, tokens: &mut TokenStream) {
(**self).to_tokens(tokens)
}
}
};
let expected = concat!(
"impl < 'a , T : ToTokens > ToTokens for & 'a T { ",
"fn to_tokens (& self , tokens : & mut TokenStream) { ",
"(* * self) . to_tokens (tokens) ",
"} ",
"}"
);
assert_eq!(expected, tokens.to_string());
} /*
message: assertion `left == right` failed
left: "X < X > (X) [X] { X }"
right: "X <X > (X) [X] { X }"
*/
fn test_substitution() {
let x = X;
let tokens = quote!($x <$x> ($x) [$x] {$x});
let expected = "X < X > (X) [X] { X }";
assert_eq!(expected, tokens.to_string());
} /*
message: assertion `left == right` failed
left: "struct SerializeWith < 'a , T > where T : Serialize { value : & 'a String , phantom : :: std :: marker :: PhantomData < Cow < 'a , str > > , } impl < 'a , T > :: serde :: Serialize for SerializeWith < 'a , T > where T : Serialize { fn serialize < S > (& self , s : & mut S) -> Result < () , S :: Error > where S : :: serde :: Serializer { SomeTrait :: serialize_with (self . value , s) } } SerializeWith { value : self . x , phantom : :: std :: marker :: PhantomData :: < Cow < 'a , str > > , }"
right: "struct SerializeWith < 'a, T > where T : Serialize\n{\n value : & 'a String, phantom : :: std :: marker :: PhantomData <Cow < 'a,\n str > >,\n} impl < 'a, T > :: serde :: Serialize for SerializeWith < 'a, T > where T :\nSerialize\n{\n fn serialize < S > (& self, s : & mut S) -> Result < (), S :: Error >\n where S : :: serde :: Serializer\n { SomeTrait :: serialize_with(self.value, s) }\n} SerializeWith\n{\n value : self.x, phantom : :: std :: marker :: PhantomData ::<Cow < 'a, str\n > >,\n}"
*/
fn test_advanced() { /* ... */ } and more. I propose to open a new PR to add these test cases with fixes, and leave a FIXME for these unimplemented features, to keep this PR clean. What do you think? @tgross35 |
At least at this time, there is no plan for
The examples you listed look like they have the same meaning but some different spacing. Updating the whitespace to match should be fine, as long as there aren't other inconsistencies. |
Something is wrong with raw string. /*
message: assertion `left == right` failed
left: "# [doc = r\" doc\"]"
right: "#[doc = \" doc\"]"
*/
fn test_outer_line_comment() {
let tokens = quote! {
/// doc
};
let expected = "# [doc = r\" doc\"]";
assert_eq!(expected, tokens.to_string());
}
/*
message: `"r#raw_id"` is not a valid identifier
*/
fn test_quote_raw_id() {
let id = quote!(r#raw_id);
assert_eq!(id.to_string(), "r#raw_id");
} |
We probably need to call to For doc comments, maybe |
Also if you prefer not to fix this here, it is okay to just open an issue and leave the test as a FIXME. I'd be happy to merge this nearly as-is since it's a big improvement over what we have, as long as tests pass and dtolnay has no objection. Same goes for the |
I'm fine to fix it in this PR as long as it's not a huge diff :) Also, compilefail tests are still being migrated. |
ef4e0b0
to
fd21ab6
Compare
c084d56
to
bba8cd1
Compare
This is the output of our
|
bba8cd1
to
dce1dc6
Compare
dce1dc6
to
8859f8d
Compare
Tracking issues: #130977, #54722
This PR changed
quote
macro to useToTokens
trait instead ofTokenStream::from
, and added a test case for directly referencing an individual token.r? @dtolnay
CC @tgross35