Skip to content

Commit b8437f7

Browse files
Less hacky assert! expansion
1 parent 368c5f6 commit b8437f7

File tree

3 files changed

+31
-15
lines changed

3 files changed

+31
-15
lines changed

crates/hir_expand/src/builtin_macro.rs

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -180,22 +180,28 @@ fn assert_expand(
180180
_id: MacroCallId,
181181
tt: &tt::Subtree,
182182
) -> ExpandResult<tt::Subtree> {
183-
// A hacky implementation for goto def and hover
184-
// We expand `assert!(cond, arg1, arg2)` to
185-
// ```
186-
// {(cond, &(arg1), &(arg2));}
187-
// ```,
188-
// which is wrong but useful.
189-
183+
let krate = tt::Ident { text: "$crate".into(), id: tt::TokenId::unspecified() };
190184
let args = parse_exprs_with_sep(tt, ',');
191-
192-
let arg_tts = args.into_iter().flat_map(|arg| {
193-
quote! { &(#arg), }
194-
}.token_trees);
195-
196-
let expanded = quote! {
197-
{ { (##arg_tts); } }
185+
let expanded = match &*args {
186+
[cond, panic_args @ ..] => {
187+
let cond = cond.clone();
188+
let panic_args = panic_args.iter().cloned().intersperse(tt::Subtree {
189+
delimiter: None,
190+
token_trees: vec![tt::TokenTree::Leaf(tt::Leaf::Punct(tt::Punct {
191+
char: ',',
192+
spacing: tt::Spacing::Alone,
193+
id: tt::TokenId::unspecified(),
194+
}))],
195+
});
196+
quote! {{
197+
if !#cond {
198+
#krate::panic!(##panic_args);
199+
}
200+
}}
201+
}
202+
[] => quote! {{}},
198203
};
204+
199205
ExpandResult::ok(expanded)
200206
}
201207

@@ -731,7 +737,7 @@ mod tests {
731737
}
732738
assert!(true, "{} {:?}", arg1(a, b, c), arg2);
733739
"#,
734-
expect![["{{(&(true), &(\"{} {:?}\"), &(arg1(a,b,c)), &(arg2),);}}"]],
740+
expect![[r#"{if!true{$crate::panic!("{} {:?}",arg1(a,b,c),arg2);}}"#]],
735741
);
736742
}
737743

crates/ide/src/syntax_highlighting/test_data/highlight_strings.html

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,10 @@
7474
<span class="brace">}</span>
7575

7676
<span class="attribute attribute">#</span><span class="attribute attribute">[</span><span class="builtin_attr attribute">rustc_builtin_macro</span><span class="parenthesis attribute">(</span><span class="none attribute">std_panic</span><span class="parenthesis attribute">)</span><span class="attribute attribute">]</span>
77+
<span class="attribute attribute">#</span><span class="attribute attribute">[</span><span class="builtin_attr attribute">macro_export</span><span class="attribute attribute">]</span>
7778
<span class="keyword">macro_rules</span><span class="punctuation">!</span> <span class="macro declaration">panic</span> <span class="brace">{</span><span class="brace">}</span>
79+
<span class="attribute attribute">#</span><span class="attribute attribute">[</span><span class="builtin_attr attribute">rustc_builtin_macro</span><span class="attribute attribute">]</span>
80+
<span class="keyword">macro_rules</span><span class="punctuation">!</span> <span class="macro declaration">assert</span> <span class="brace">{</span><span class="brace">}</span>
7881

7982
<span class="keyword">fn</span> <span class="function declaration">main</span><span class="parenthesis">(</span><span class="parenthesis">)</span> <span class="brace">{</span>
8083
<span class="comment">// from https://doc.rust-lang.org/std/fmt/index.html</span>
@@ -127,4 +130,6 @@
127130
<span class="macro">println!</span><span class="parenthesis">(</span><span class="string_literal">"</span><span class="format_specifier">{</span><span class="format_specifier">:</span><span class="variable">x</span><span class="format_specifier">?</span><span class="format_specifier">}</span><span class="string_literal"> </span><span class="format_specifier">{</span><span class="format_specifier">}</span><span class="string_literal"> "</span><span class="comma">,</span> thingy<span class="comma">,</span> n2<span class="parenthesis">)</span><span class="semicolon">;</span>
128131
<span class="macro">panic!</span><span class="parenthesis">(</span><span class="string_literal">"</span><span class="format_specifier">{</span><span class="format_specifier">}</span><span class="string_literal">"</span><span class="comma">,</span> <span class="numeric_literal">0</span><span class="parenthesis">)</span><span class="semicolon">;</span>
129132
<span class="macro">panic!</span><span class="parenthesis">(</span><span class="string_literal">"more </span><span class="format_specifier">{</span><span class="format_specifier">}</span><span class="string_literal">"</span><span class="comma">,</span> <span class="numeric_literal">1</span><span class="parenthesis">)</span><span class="semicolon">;</span>
133+
<span class="macro">assert!</span><span class="parenthesis">(</span><span class="bool_literal">true</span><span class="comma">,</span> <span class="string_literal">"</span><span class="format_specifier">{</span><span class="format_specifier">}</span><span class="string_literal">"</span><span class="comma">,</span> <span class="numeric_literal">1</span><span class="parenthesis">)</span><span class="semicolon">;</span>
134+
<span class="macro">assert!</span><span class="parenthesis">(</span><span class="bool_literal">true</span><span class="comma">,</span> <span class="string_literal">"</span><span class="format_specifier">{</span><span class="format_specifier">}</span><span class="string_literal"> asdasd"</span><span class="comma">,</span> <span class="numeric_literal">1</span><span class="parenthesis">)</span><span class="semicolon">;</span>
130135
<span class="brace">}</span></code></pre>

crates/ide/src/syntax_highlighting/tests.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -469,7 +469,10 @@ mod panic {
469469
}
470470
471471
#[rustc_builtin_macro(std_panic)]
472+
#[macro_export]
472473
macro_rules! panic {}
474+
#[rustc_builtin_macro]
475+
macro_rules! assert {}
473476
474477
fn main() {
475478
// from https://doc.rust-lang.org/std/fmt/index.html
@@ -522,6 +525,8 @@ fn main() {
522525
println!("{:x?} {} ", thingy, n2);
523526
panic!("{}", 0);
524527
panic!("more {}", 1);
528+
assert!(true, "{}", 1);
529+
assert!(true, "{} asdasd", 1);
525530
}"#
526531
.trim(),
527532
expect_file!["./test_data/highlight_strings.html"],

0 commit comments

Comments
 (0)