diff options
Diffstat (limited to 'crates/hir_expand/src')
-rw-r--r-- | crates/hir_expand/src/builtin_macro.rs | 48 | ||||
-rw-r--r-- | crates/hir_expand/src/db.rs | 1 |
2 files changed, 28 insertions, 21 deletions
diff --git a/crates/hir_expand/src/builtin_macro.rs b/crates/hir_expand/src/builtin_macro.rs index 7bb42be6c..16c3c4d69 100644 --- a/crates/hir_expand/src/builtin_macro.rs +++ b/crates/hir_expand/src/builtin_macro.rs | |||
@@ -86,7 +86,6 @@ pub fn find_builtin_macro( | |||
86 | register_builtin! { | 86 | register_builtin! { |
87 | LAZY: | 87 | LAZY: |
88 | (column, Column) => column_expand, | 88 | (column, Column) => column_expand, |
89 | (compile_error, CompileError) => compile_error_expand, | ||
90 | (file, File) => file_expand, | 89 | (file, File) => file_expand, |
91 | (line, Line) => line_expand, | 90 | (line, Line) => line_expand, |
92 | (assert, Assert) => assert_expand, | 91 | (assert, Assert) => assert_expand, |
@@ -97,6 +96,7 @@ register_builtin! { | |||
97 | (format_args_nl, FormatArgsNl) => format_args_expand, | 96 | (format_args_nl, FormatArgsNl) => format_args_expand, |
98 | 97 | ||
99 | EAGER: | 98 | EAGER: |
99 | (compile_error, CompileError) => compile_error_expand, | ||
100 | (concat, Concat) => concat_expand, | 100 | (concat, Concat) => concat_expand, |
101 | (include, Include) => include_expand, | 101 | (include, Include) => include_expand, |
102 | (include_bytes, IncludeBytes) => include_bytes_expand, | 102 | (include_bytes, IncludeBytes) => include_bytes_expand, |
@@ -213,25 +213,6 @@ fn file_expand( | |||
213 | ExpandResult::ok(expanded) | 213 | ExpandResult::ok(expanded) |
214 | } | 214 | } |
215 | 215 | ||
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 | |||
235 | fn format_args_expand( | 216 | fn format_args_expand( |
236 | _db: &dyn AstDatabase, | 217 | _db: &dyn AstDatabase, |
237 | _id: LazyMacroId, | 218 | _id: LazyMacroId, |
@@ -280,6 +261,30 @@ fn unquote_str(lit: &tt::Literal) -> Option<String> { | |||
280 | token.value().map(|it| it.into_owned()) | 261 | token.value().map(|it| it.into_owned()) |
281 | } | 262 | } |
282 | 263 | ||
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 | |||
283 | fn concat_expand( | 288 | fn concat_expand( |
284 | _db: &dyn AstDatabase, | 289 | _db: &dyn AstDatabase, |
285 | _arg_id: EagerMacroId, | 290 | _arg_id: EagerMacroId, |
@@ -646,7 +651,8 @@ mod tests { | |||
646 | "#, | 651 | "#, |
647 | ); | 652 | ); |
648 | 653 | ||
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, ""); | ||
650 | } | 656 | } |
651 | 657 | ||
652 | #[test] | 658 | #[test] |
diff --git a/crates/hir_expand/src/db.rs b/crates/hir_expand/src/db.rs index 4fd0ba290..842a177db 100644 --- a/crates/hir_expand/src/db.rs +++ b/crates/hir_expand/src/db.rs | |||
@@ -207,6 +207,7 @@ fn macro_expand_with_arg( | |||
207 | } else { | 207 | } else { |
208 | return ExpandResult { | 208 | return ExpandResult { |
209 | value: Some(db.lookup_intern_eager_expansion(id).subtree), | 209 | value: Some(db.lookup_intern_eager_expansion(id).subtree), |
210 | // FIXME: There could be errors here! | ||
210 | err: None, | 211 | err: None, |
211 | }; | 212 | }; |
212 | } | 213 | } |