From 2b8674b37ed533fba65b82da35a33c77775df278 Mon Sep 17 00:00:00 2001 From: Jonas Schievink Date: Wed, 10 Mar 2021 19:43:03 +0100 Subject: Implement builtin `cfg!` macro --- crates/hir_expand/src/builtin_macro.rs | 14 ++++++++++++++ 1 file changed, 14 insertions(+) (limited to 'crates/hir_expand/src/builtin_macro.rs') diff --git a/crates/hir_expand/src/builtin_macro.rs b/crates/hir_expand/src/builtin_macro.rs index eb57ea7d6..b34f1a4f2 100644 --- a/crates/hir_expand/src/builtin_macro.rs +++ b/crates/hir_expand/src/builtin_macro.rs @@ -5,6 +5,7 @@ use crate::{ }; use base_db::{AnchoredPath, FileId}; +use cfg::CfgExpr; use either::Either; use mbe::{parse_exprs_with_sep, parse_to_token_tree, ExpandResult}; use parser::FragmentKind; @@ -97,6 +98,7 @@ register_builtin! { (format_args_nl, FormatArgsNl) => format_args_expand, (llvm_asm, LlvmAsm) => asm_expand, (asm, Asm) => asm_expand, + (cfg, Cfg) => cfg_expand, EAGER: (compile_error, CompileError) => compile_error_expand, @@ -258,6 +260,18 @@ fn asm_expand( ExpandResult::ok(expanded) } +fn cfg_expand( + db: &dyn AstDatabase, + id: LazyMacroId, + tt: &tt::Subtree, +) -> ExpandResult { + let loc = db.lookup_intern_macro(id); + let expr = CfgExpr::parse(tt); + let enabled = db.crate_graph()[loc.krate].cfg_options.check(&expr) != Some(false); + let expanded = if enabled { quote!(true) } else { quote!(false) }; + ExpandResult::ok(expanded) +} + fn unquote_str(lit: &tt::Literal) -> Option { let lit = ast::make::tokens::literal(&lit.to_string()); let token = ast::String::cast(lit)?; -- cgit v1.2.3