]> git.lizzy.rs Git - rust.git/commitdiff
Fix expansion of format_args
authorFlorian Diebold <flodiebold@gmail.com>
Sun, 8 Dec 2019 08:26:17 +0000 (09:26 +0100)
committerFlorian Diebold <flodiebold@gmail.com>
Sun, 8 Dec 2019 12:02:52 +0000 (13:02 +0100)
crates/ra_hir_expand/src/builtin_macro.rs
crates/ra_ide/src/goto_definition.rs

index c7071fe85a3a4d4b700b08a97808b265c86f2451..ec5ace757c663767fe1f04eb5c251a6ef60037bc 100644 (file)
@@ -208,15 +208,20 @@ fn format_args_expand(
     _id: MacroCallId,
     tt: &tt::Subtree,
 ) -> Result<tt::Subtree, mbe::ExpandError> {
-    // We expand `format_args!("", arg1, arg2)` to
-    // `std::fmt::Arguments::new_v1(&[], &[&arg1, &arg2])`,
+    // We expand `format_args!("", a1, a2)` to
+    // ```
+    // std::fmt::Arguments::new_v1(&[], &[
+    //   std::fmt::ArgumentV1::new(&arg1,std::fmt::Display::fmt),
+    //   std::fmt::ArgumentV1::new(&arg2,std::fmt::Display::fmt),
+    // ])
+    // ```,
     // which is still not really correct, but close enough for now
     let mut args = Vec::new();
     let mut current = Vec::new();
     for tt in tt.token_trees.iter().cloned() {
         match tt {
             tt::TokenTree::Leaf(tt::Leaf::Punct(p)) if p.char == ',' => {
-                args.push(tt::Subtree { delimiter: tt::Delimiter::None, token_trees: current });
+                args.push(current);
                 current = Vec::new();
             }
             _ => {
@@ -225,13 +230,15 @@ fn format_args_expand(
         }
     }
     if !current.is_empty() {
-        args.push(tt::Subtree { delimiter: tt::Delimiter::None, token_trees: current });
+        args.push(current);
     }
     if args.is_empty() {
         return Err(mbe::ExpandError::NoMatchingRule);
     }
     let _format_string = args.remove(0);
-    let arg_tts = args.into_iter().flat_map(|arg| (quote! { & #arg , }).token_trees);
+    let arg_tts = args.into_iter().flat_map(|arg| {
+        quote! { std::fmt::ArgumentV1::new(&(##arg), std::fmt::Display::fmt), }
+    }.token_trees).collect::<Vec<_>>();
     let expanded = quote! {
         std::fmt::Arguments::new_v1(&[], &[##arg_tts])
     };
@@ -360,6 +367,6 @@ macro_rules! format_args {
             BuiltinFnLikeExpander::FormatArgs,
         );
 
-        assert_eq!(expanded, r#"std::fmt::Arguments::new_v1(&[] ,&[&arg1(a,b,c),&arg2,])"#);
+        assert_eq!(expanded, r#"std::fmt::Arguments::new_v1(&[] ,&[std::fmt::ArgumentV1::new(&(arg1(a,b,c)),std::fmt::Display::fmt),std::fmt::ArgumentV1::new(&(arg2),std::fmt::Display::fmt),])"#);
     }
 }
index 1b968134d6e1de0c2c933578ae03957050a4bc43..077b0beda69ec07f42974ae040f0faf542107349 100644 (file)
@@ -693,7 +693,6 @@ fn bar() {
         );
     }
 
-    #[should_panic] // currently failing because of expr mapping problems
     #[test]
     fn goto_through_format() {
         check_goto(