mirror of
https://github.com/rust-lang/rust-analyzer
synced 2024-12-26 04:53:34 +00:00
Implement builtin cfg!
macro
This commit is contained in:
parent
f0e78f2ed6
commit
2b8674b37e
5 changed files with 20 additions and 2 deletions
1
Cargo.lock
generated
1
Cargo.lock
generated
|
@ -524,6 +524,7 @@ name = "hir_expand"
|
||||||
version = "0.0.0"
|
version = "0.0.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"base_db",
|
"base_db",
|
||||||
|
"cfg",
|
||||||
"either",
|
"either",
|
||||||
"la-arena",
|
"la-arena",
|
||||||
"log",
|
"log",
|
||||||
|
|
|
@ -16,6 +16,7 @@ rustc-hash = "1.0.0"
|
||||||
la-arena = { version = "0.2.0", path = "../../lib/arena" }
|
la-arena = { version = "0.2.0", path = "../../lib/arena" }
|
||||||
|
|
||||||
base_db = { path = "../base_db", version = "0.0.0" }
|
base_db = { path = "../base_db", version = "0.0.0" }
|
||||||
|
cfg = { path = "../cfg", version = "0.0.0" }
|
||||||
syntax = { path = "../syntax", version = "0.0.0" }
|
syntax = { path = "../syntax", version = "0.0.0" }
|
||||||
parser = { path = "../parser", version = "0.0.0" }
|
parser = { path = "../parser", version = "0.0.0" }
|
||||||
profile = { path = "../profile", version = "0.0.0" }
|
profile = { path = "../profile", version = "0.0.0" }
|
||||||
|
|
|
@ -5,6 +5,7 @@ use crate::{
|
||||||
};
|
};
|
||||||
|
|
||||||
use base_db::{AnchoredPath, FileId};
|
use base_db::{AnchoredPath, FileId};
|
||||||
|
use cfg::CfgExpr;
|
||||||
use either::Either;
|
use either::Either;
|
||||||
use mbe::{parse_exprs_with_sep, parse_to_token_tree, ExpandResult};
|
use mbe::{parse_exprs_with_sep, parse_to_token_tree, ExpandResult};
|
||||||
use parser::FragmentKind;
|
use parser::FragmentKind;
|
||||||
|
@ -97,6 +98,7 @@ register_builtin! {
|
||||||
(format_args_nl, FormatArgsNl) => format_args_expand,
|
(format_args_nl, FormatArgsNl) => format_args_expand,
|
||||||
(llvm_asm, LlvmAsm) => asm_expand,
|
(llvm_asm, LlvmAsm) => asm_expand,
|
||||||
(asm, Asm) => asm_expand,
|
(asm, Asm) => asm_expand,
|
||||||
|
(cfg, Cfg) => cfg_expand,
|
||||||
|
|
||||||
EAGER:
|
EAGER:
|
||||||
(compile_error, CompileError) => compile_error_expand,
|
(compile_error, CompileError) => compile_error_expand,
|
||||||
|
@ -258,6 +260,18 @@ fn asm_expand(
|
||||||
ExpandResult::ok(expanded)
|
ExpandResult::ok(expanded)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn cfg_expand(
|
||||||
|
db: &dyn AstDatabase,
|
||||||
|
id: LazyMacroId,
|
||||||
|
tt: &tt::Subtree,
|
||||||
|
) -> ExpandResult<tt::Subtree> {
|
||||||
|
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<String> {
|
fn unquote_str(lit: &tt::Literal) -> Option<String> {
|
||||||
let lit = ast::make::tokens::literal(&lit.to_string());
|
let lit = ast::make::tokens::literal(&lit.to_string());
|
||||||
let token = ast::String::cast(lit)?;
|
let token = ast::String::cast(lit)?;
|
||||||
|
|
|
@ -154,6 +154,7 @@ pub mod known {
|
||||||
macro_rules,
|
macro_rules,
|
||||||
derive,
|
derive,
|
||||||
doc,
|
doc,
|
||||||
|
cfg,
|
||||||
cfg_attr,
|
cfg_attr,
|
||||||
// Components of known path (value or mod name)
|
// Components of known path (value or mod name)
|
||||||
std,
|
std,
|
||||||
|
|
|
@ -188,8 +188,9 @@ macro_rules! impl_to_to_tokentrees {
|
||||||
|
|
||||||
impl_to_to_tokentrees! {
|
impl_to_to_tokentrees! {
|
||||||
u32 => self { tt::Literal{text: self.to_string().into(), id: tt::TokenId::unspecified()} };
|
u32 => self { tt::Literal{text: self.to_string().into(), id: tt::TokenId::unspecified()} };
|
||||||
usize => self { tt::Literal{text: self.to_string().into(), id: tt::TokenId::unspecified()}};
|
usize => self { tt::Literal{text: self.to_string().into(), id: tt::TokenId::unspecified()} };
|
||||||
i32 => self { tt::Literal{text: self.to_string().into(), id: tt::TokenId::unspecified()}};
|
i32 => self { tt::Literal{text: self.to_string().into(), id: tt::TokenId::unspecified()} };
|
||||||
|
bool => self { tt::Ident{text: self.to_string().into(), id: tt::TokenId::unspecified()} };
|
||||||
tt::Leaf => self { self };
|
tt::Leaf => self { self };
|
||||||
tt::Literal => self { self };
|
tt::Literal => self { self };
|
||||||
tt::Ident => self { self };
|
tt::Ident => self { self };
|
||||||
|
|
Loading…
Reference in a new issue