Skip to content

Commit 883c8d1

Browse files
Make compile_error! lazy and emit a diagnostic
1 parent 4634bfb commit 883c8d1

File tree

3 files changed

+34
-21
lines changed

3 files changed

+34
-21
lines changed

crates/hir_def/src/body/tests.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,9 @@ macro_rules! env {}
8484
#[rustc_builtin_macro]
8585
macro_rules! include {}
8686
87+
#[rustc_builtin_macro]
88+
macro_rules! compile_error {}
89+
8790
#[rustc_builtin_macro]
8891
macro_rules! format_args {
8992
() => {}
@@ -103,6 +106,9 @@ fn f() {
103106
env!("OUT_DIR");
104107
//^^^^^^^^^^^^^^^ `OUT_DIR` not set, enable "load out dirs from check" to fix
105108
109+
compile_error!("compile_error works");
110+
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `compile_error!` called: compile_error works
111+
106112
// Lazy:
107113
108114
format_args!();

crates/hir_expand/src/builtin_macro.rs

Lines changed: 27 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,6 @@ pub fn find_builtin_macro(
8686
register_builtin! {
8787
LAZY:
8888
(column, Column) => column_expand,
89-
(compile_error, CompileError) => compile_error_expand,
9089
(file, File) => file_expand,
9190
(line, Line) => line_expand,
9291
(assert, Assert) => assert_expand,
@@ -97,6 +96,7 @@ register_builtin! {
9796
(format_args_nl, FormatArgsNl) => format_args_expand,
9897

9998
EAGER:
99+
(compile_error, CompileError) => compile_error_expand,
100100
(concat, Concat) => concat_expand,
101101
(include, Include) => include_expand,
102102
(include_bytes, IncludeBytes) => include_bytes_expand,
@@ -213,25 +213,6 @@ fn file_expand(
213213
ExpandResult::ok(expanded)
214214
}
215215

216-
fn compile_error_expand(
217-
_db: &dyn AstDatabase,
218-
_id: LazyMacroId,
219-
tt: &tt::Subtree,
220-
) -> ExpandResult<tt::Subtree> {
221-
if tt.count() == 1 {
222-
if let tt::TokenTree::Leaf(tt::Leaf::Literal(it)) = &tt.token_trees[0] {
223-
let s = it.text.as_str();
224-
if s.contains('"') {
225-
return ExpandResult::ok(quote! { loop { #it }});
226-
}
227-
};
228-
}
229-
230-
ExpandResult::only_err(mbe::ExpandError::BindingError(
231-
"`compile_error!` argument be a string".into(),
232-
))
233-
}
234-
235216
fn format_args_expand(
236217
_db: &dyn AstDatabase,
237218
_id: LazyMacroId,
@@ -280,6 +261,30 @@ fn unquote_str(lit: &tt::Literal) -> Option<String> {
280261
token.value().map(|it| it.into_owned())
281262
}
282263

264+
fn compile_error_expand(
265+
_db: &dyn AstDatabase,
266+
_id: EagerMacroId,
267+
tt: &tt::Subtree,
268+
) -> ExpandResult<Option<(tt::Subtree, FragmentKind)>> {
269+
let err = match &*tt.token_trees {
270+
[tt::TokenTree::Leaf(tt::Leaf::Literal(it))] => {
271+
let text = it.text.as_str();
272+
if text.starts_with('"') && text.ends_with('"') {
273+
// FIXME: does not handle raw strings
274+
mbe::ExpandError::Other(format!(
275+
"`compile_error!` called: {}",
276+
&text[1..text.len() - 1]
277+
))
278+
} else {
279+
mbe::ExpandError::BindingError("`compile_error!` argument must be a string".into())
280+
}
281+
}
282+
_ => mbe::ExpandError::BindingError("`compile_error!` argument must be a string".into()),
283+
};
284+
285+
ExpandResult { value: Some((quote! {}, FragmentKind::Items)), err: Some(err) }
286+
}
287+
283288
fn concat_expand(
284289
_db: &dyn AstDatabase,
285290
_arg_id: EagerMacroId,
@@ -646,7 +651,8 @@ mod tests {
646651
"#,
647652
);
648653

649-
assert_eq!(expanded, r#"loop{"error!"}"#);
654+
// This expands to nothing (since it's in item position), but emits an error.
655+
assert_eq!(expanded, "");
650656
}
651657

652658
#[test]

crates/hir_expand/src/db.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,7 @@ fn macro_expand_with_arg(
207207
} else {
208208
return ExpandResult {
209209
value: Some(db.lookup_intern_eager_expansion(id).subtree),
210+
// FIXME: There could be errors here!
210211
err: None,
211212
};
212213
}

0 commit comments

Comments
 (0)