fix format_args
expansion error with raw strings
This commit is contained in:
parent
a2fba7c67e
commit
5c83e222a3
@ -235,6 +235,39 @@ fn main() {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_format_args_expand_with_raw_strings() {
|
||||||
|
check(
|
||||||
|
r##"
|
||||||
|
#[rustc_builtin_macro]
|
||||||
|
macro_rules! format_args {
|
||||||
|
($fmt:expr) => ({ /* compiler built-in */ });
|
||||||
|
($fmt:expr, $($args:tt)*) => ({ /* compiler built-in */ })
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
format_args!(
|
||||||
|
r#"{},mismatch,"{}","{}""#,
|
||||||
|
location_csv_pat(db, &analysis, vfs, &sm, pat_id),
|
||||||
|
mismatch.expected.display(db),
|
||||||
|
mismatch.actual.display(db)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
"##,
|
||||||
|
expect![[r##"
|
||||||
|
#[rustc_builtin_macro]
|
||||||
|
macro_rules! format_args {
|
||||||
|
($fmt:expr) => ({ /* compiler built-in */ });
|
||||||
|
($fmt:expr, $($args:tt)*) => ({ /* compiler built-in */ })
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
$crate::fmt::Arguments::new_v1(&[r#""#, r#",mismatch,""#, r#"",""#, r#"""#, ], &[$crate::fmt::ArgumentV1::new(&(location_csv_pat(db, &analysis, vfs, &sm, pat_id)), $crate::fmt::Display::fmt), $crate::fmt::ArgumentV1::new(&(mismatch.expected.display(db)), $crate::fmt::Display::fmt), $crate::fmt::ArgumentV1::new(&(mismatch.actual.display(db)), $crate::fmt::Display::fmt), ]);
|
||||||
|
}
|
||||||
|
"##]],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_format_args_expand_eager() {
|
fn test_format_args_expand_eager() {
|
||||||
check(
|
check(
|
||||||
|
@ -287,16 +287,27 @@ fn format_args_expand_general(
|
|||||||
match token_tree {
|
match token_tree {
|
||||||
tt::TokenTree::Leaf(l) => match l {
|
tt::TokenTree::Leaf(l) => match l {
|
||||||
tt::Leaf::Literal(l) => {
|
tt::Leaf::Literal(l) => {
|
||||||
let text = l.text.strip_prefix('"')?.strip_suffix('"')?;
|
if let Some(mut text) = l.text.strip_prefix('r') {
|
||||||
let span = l.span;
|
let mut raw_sharps = String::new();
|
||||||
Some((text, span))
|
while let Some(t) = text.strip_prefix('#') {
|
||||||
|
text = t;
|
||||||
|
raw_sharps.push('#');
|
||||||
|
}
|
||||||
|
text =
|
||||||
|
text.strip_suffix(&raw_sharps)?.strip_prefix('"')?.strip_suffix('"')?;
|
||||||
|
Some((text, l.span, Some(raw_sharps)))
|
||||||
|
} else {
|
||||||
|
let text = l.text.strip_prefix('"')?.strip_suffix('"')?;
|
||||||
|
let span = l.span;
|
||||||
|
Some((text, span, None))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
_ => None,
|
_ => None,
|
||||||
},
|
},
|
||||||
tt::TokenTree::Subtree(_) => None,
|
tt::TokenTree::Subtree(_) => None,
|
||||||
}
|
}
|
||||||
})();
|
})();
|
||||||
let Some((format_string, _format_string_span)) = format_string else {
|
let Some((format_string, _format_string_span, raw_sharps)) = format_string else {
|
||||||
return expand_error;
|
return expand_error;
|
||||||
};
|
};
|
||||||
let mut format_iter = format_string.chars().peekable();
|
let mut format_iter = format_string.chars().peekable();
|
||||||
@ -379,7 +390,12 @@ fn format_args_expand_general(
|
|||||||
parts.push(last_part);
|
parts.push(last_part);
|
||||||
}
|
}
|
||||||
let part_tts = parts.into_iter().map(|x| {
|
let part_tts = parts.into_iter().map(|x| {
|
||||||
let l = tt::Literal { span: tt::TokenId::unspecified(), text: format!("\"{}\"", x).into() };
|
let text = if let Some(raw) = &raw_sharps {
|
||||||
|
format!("r{raw}\"{}\"{raw}", x).into()
|
||||||
|
} else {
|
||||||
|
format!("\"{}\"", x).into()
|
||||||
|
};
|
||||||
|
let l = tt::Literal { span: tt::TokenId::unspecified(), text };
|
||||||
quote!(#l ,)
|
quote!(#l ,)
|
||||||
});
|
});
|
||||||
let arg_tts = arg_tts.into_iter().flat_map(|arg| arg.token_trees);
|
let arg_tts = arg_tts.into_iter().flat_map(|arg| arg.token_trees);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user