From 6198eb74b2947deffa00dcd2e9e38a70f9fe6284 Mon Sep 17 00:00:00 2001 From: Jonas Schievink Date: Sat, 3 Apr 2021 03:12:55 +0200 Subject: Implement edition-dependent builtin `panic!` macro --- crates/hir_expand/src/builtin_macro.rs | 25 +++++++++++++++++++++++-- crates/hir_expand/src/name.rs | 2 ++ crates/hir_expand/src/quote.rs | 1 + 3 files changed, 26 insertions(+), 2 deletions(-) (limited to 'crates') diff --git a/crates/hir_expand/src/builtin_macro.rs b/crates/hir_expand/src/builtin_macro.rs index 4d52904b9..3aa3d8997 100644 --- a/crates/hir_expand/src/builtin_macro.rs +++ b/crates/hir_expand/src/builtin_macro.rs @@ -1,10 +1,10 @@ //! Builtin macro use crate::{ db::AstDatabase, name, quote, AstId, CrateId, EagerMacroId, LazyMacroId, MacroCallId, - MacroDefId, MacroDefKind, TextSize, + MacroCallLoc, MacroDefId, MacroDefKind, TextSize, }; -use base_db::{AnchoredPath, FileId}; +use base_db::{AnchoredPath, Edition, FileId}; use cfg::CfgExpr; use either::Either; use mbe::{parse_exprs_with_sep, parse_to_token_tree, ExpandResult}; @@ -111,6 +111,8 @@ register_builtin! { (llvm_asm, LlvmAsm) => asm_expand, (asm, Asm) => asm_expand, (cfg, Cfg) => cfg_expand, + (core_panic, CorePanic) => panic_expand, + (std_panic, StdPanic) => panic_expand, EAGER: (compile_error, CompileError) => compile_error_expand, @@ -284,6 +286,25 @@ fn cfg_expand( ExpandResult::ok(expanded) } +fn panic_expand( + db: &dyn AstDatabase, + id: LazyMacroId, + tt: &tt::Subtree, +) -> ExpandResult { + let loc: MacroCallLoc = db.lookup_intern_macro(id); + // Expand to a macro call `$crate::panic::panic_{edition}` + let krate = tt::Ident { text: "$crate".into(), id: tt::TokenId::unspecified() }; + let mut call = if db.crate_graph()[loc.krate].edition == Edition::Edition2021 { + quote!(#krate::panic::panic_2021!) + } else { + quote!(#krate::panic::panic_2015!) + }; + + // Pass the original arguments + call.token_trees.push(tt::TokenTree::Subtree(tt.clone())); + ExpandResult::ok(call) +} + fn unquote_str(lit: &tt::Literal) -> Option { let lit = ast::make::tokens::literal(&lit.to_string()); let token = ast::String::cast(lit)?; diff --git a/crates/hir_expand/src/name.rs b/crates/hir_expand/src/name.rs index 203ebbe85..a0f8766b0 100644 --- a/crates/hir_expand/src/name.rs +++ b/crates/hir_expand/src/name.rs @@ -208,6 +208,8 @@ pub mod known { line, module_path, assert, + core_panic, + std_panic, stringify, concat, include, diff --git a/crates/hir_expand/src/quote.rs b/crates/hir_expand/src/quote.rs index 08bc5aa49..c82487ef0 100644 --- a/crates/hir_expand/src/quote.rs +++ b/crates/hir_expand/src/quote.rs @@ -104,6 +104,7 @@ macro_rules! __quote { ( . ) => {$crate::__quote!(@PUNCT '.')}; ( < ) => {$crate::__quote!(@PUNCT '<')}; ( > ) => {$crate::__quote!(@PUNCT '>')}; + ( ! ) => {$crate::__quote!(@PUNCT '!')}; ( $first:tt $($tail:tt)+ ) => { { -- cgit v1.2.3