@@ -86,7 +86,6 @@ pub fn find_builtin_macro(
8686register_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-
235216fn 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+
283288fn 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]
0 commit comments