mirror of
https://github.com/rust-lang/rust-analyzer
synced 2025-01-13 21:54:42 +00:00
Add dummy implementations of env! and option_env! builtins
They don't do anything except return the correct type. Also refactor the builtin macro tests a bit.
This commit is contained in:
parent
cdc9d682b0
commit
2058f704cb
3 changed files with 99 additions and 43 deletions
|
@ -26,6 +26,13 @@ macro_rules! register_builtin {
|
|||
};
|
||||
expander(db, id, tt)
|
||||
}
|
||||
|
||||
fn by_name(ident: &name::Name) -> Option<BuiltinFnLikeExpander> {
|
||||
match ident {
|
||||
$( id if id == &name::name![$name] => Some(BuiltinFnLikeExpander::$kind), )*
|
||||
_ => return None,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub fn find_builtin_macro(
|
||||
|
@ -33,10 +40,7 @@ macro_rules! register_builtin {
|
|||
krate: CrateId,
|
||||
ast_id: AstId<ast::MacroCall>,
|
||||
) -> Option<MacroDefId> {
|
||||
let kind = match ident {
|
||||
$( id if id == &name::name![$name] => BuiltinFnLikeExpander::$kind, )*
|
||||
_ => return None,
|
||||
};
|
||||
let kind = BuiltinFnLikeExpander::by_name(ident)?;
|
||||
|
||||
Some(MacroDefId { krate: Some(krate), ast_id: Some(ast_id), kind: MacroDefKind::BuiltIn(kind) })
|
||||
}
|
||||
|
@ -50,6 +54,8 @@ register_builtin! {
|
|||
(line, Line) => line_expand,
|
||||
(stringify, Stringify) => stringify_expand,
|
||||
(format_args, FormatArgs) => format_args_expand,
|
||||
(env, Env) => env_expand,
|
||||
(option_env, OptionEnv) => option_env_expand,
|
||||
// format_args_nl only differs in that it adds a newline in the end,
|
||||
// so we use the same stub expansion for now
|
||||
(format_args_nl, FormatArgsNl) => format_args_expand
|
||||
|
@ -121,6 +127,28 @@ fn stringify_expand(
|
|||
Ok(expanded)
|
||||
}
|
||||
|
||||
fn env_expand(
|
||||
_db: &dyn AstDatabase,
|
||||
_id: MacroCallId,
|
||||
_tt: &tt::Subtree,
|
||||
) -> Result<tt::Subtree, mbe::ExpandError> {
|
||||
// dummy implementation for type-checking purposes
|
||||
let expanded = quote! { "" };
|
||||
|
||||
Ok(expanded)
|
||||
}
|
||||
|
||||
fn option_env_expand(
|
||||
_db: &dyn AstDatabase,
|
||||
_id: MacroCallId,
|
||||
_tt: &tt::Subtree,
|
||||
) -> Result<tt::Subtree, mbe::ExpandError> {
|
||||
// dummy implementation for type-checking purposes
|
||||
let expanded = quote! { std::option::Option::None::<&str> };
|
||||
|
||||
Ok(expanded)
|
||||
}
|
||||
|
||||
fn to_col_number(db: &dyn AstDatabase, file: HirFileId, pos: TextUnit) -> usize {
|
||||
// FIXME: Use expansion info
|
||||
let file_id = file.original_file(db);
|
||||
|
@ -248,10 +276,11 @@ fn format_args_expand(
|
|||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
use crate::{test_db::TestDB, MacroCallKind, MacroCallLoc};
|
||||
use crate::{name::AsName, test_db::TestDB, MacroCallKind, MacroCallLoc};
|
||||
use ra_db::{fixture::WithFixture, SourceDatabase};
|
||||
use ra_syntax::ast::NameOwner;
|
||||
|
||||
fn expand_builtin_macro(s: &str, expander: BuiltinFnLikeExpander) -> String {
|
||||
fn expand_builtin_macro(s: &str) -> String {
|
||||
let (db, file_id) = TestDB::with_single_file(&s);
|
||||
let parsed = db.parse(file_id);
|
||||
let macro_calls: Vec<_> =
|
||||
|
@ -259,6 +288,9 @@ mod tests {
|
|||
|
||||
let ast_id_map = db.ast_id_map(file_id.into());
|
||||
|
||||
let expander =
|
||||
BuiltinFnLikeExpander::by_name(¯o_calls[0].name().unwrap().as_name()).unwrap();
|
||||
|
||||
// the first one should be a macro_rules
|
||||
let def = MacroDefId {
|
||||
krate: Some(CrateId(0)),
|
||||
|
@ -284,25 +316,23 @@ mod tests {
|
|||
fn test_column_expand() {
|
||||
let expanded = expand_builtin_macro(
|
||||
r#"
|
||||
#[rustc_builtin_macro]
|
||||
macro_rules! column {() => {}}
|
||||
column!()
|
||||
"#,
|
||||
BuiltinFnLikeExpander::Column,
|
||||
#[rustc_builtin_macro]
|
||||
macro_rules! column {() => {}}
|
||||
column!()
|
||||
"#,
|
||||
);
|
||||
|
||||
assert_eq!(expanded, "9");
|
||||
assert_eq!(expanded, "13");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_line_expand() {
|
||||
let expanded = expand_builtin_macro(
|
||||
r#"
|
||||
#[rustc_builtin_macro]
|
||||
macro_rules! line {() => {}}
|
||||
line!()
|
||||
"#,
|
||||
BuiltinFnLikeExpander::Line,
|
||||
#[rustc_builtin_macro]
|
||||
macro_rules! line {() => {}}
|
||||
line!()
|
||||
"#,
|
||||
);
|
||||
|
||||
assert_eq!(expanded, "4");
|
||||
|
@ -312,25 +342,49 @@ mod tests {
|
|||
fn test_stringify_expand() {
|
||||
let expanded = expand_builtin_macro(
|
||||
r#"
|
||||
#[rustc_builtin_macro]
|
||||
macro_rules! stringify {() => {}}
|
||||
stringify!(a b c)
|
||||
"#,
|
||||
BuiltinFnLikeExpander::Stringify,
|
||||
#[rustc_builtin_macro]
|
||||
macro_rules! stringify {() => {}}
|
||||
stringify!(a b c)
|
||||
"#,
|
||||
);
|
||||
|
||||
assert_eq!(expanded, "\"a b c\"");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_env_expand() {
|
||||
let expanded = expand_builtin_macro(
|
||||
r#"
|
||||
#[rustc_builtin_macro]
|
||||
macro_rules! env {() => {}}
|
||||
env!("TEST_ENV_VAR")
|
||||
"#,
|
||||
);
|
||||
|
||||
assert_eq!(expanded, "\"\"");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_option_env_expand() {
|
||||
let expanded = expand_builtin_macro(
|
||||
r#"
|
||||
#[rustc_builtin_macro]
|
||||
macro_rules! option_env {() => {}}
|
||||
option_env!("TEST_ENV_VAR")
|
||||
"#,
|
||||
);
|
||||
|
||||
assert_eq!(expanded, "std::option::Option::None:: <&str>");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_file_expand() {
|
||||
let expanded = expand_builtin_macro(
|
||||
r#"
|
||||
#[rustc_builtin_macro]
|
||||
macro_rules! file {() => {}}
|
||||
file!()
|
||||
"#,
|
||||
BuiltinFnLikeExpander::File,
|
||||
#[rustc_builtin_macro]
|
||||
macro_rules! file {() => {}}
|
||||
file!()
|
||||
"#,
|
||||
);
|
||||
|
||||
assert_eq!(expanded, "\"\"");
|
||||
|
@ -340,14 +394,13 @@ mod tests {
|
|||
fn test_compile_error_expand() {
|
||||
let expanded = expand_builtin_macro(
|
||||
r#"
|
||||
#[rustc_builtin_macro]
|
||||
macro_rules! compile_error {
|
||||
($msg:expr) => ({ /* compiler built-in */ });
|
||||
($msg:expr,) => ({ /* compiler built-in */ })
|
||||
}
|
||||
compile_error!("error!");
|
||||
"#,
|
||||
BuiltinFnLikeExpander::CompileError,
|
||||
#[rustc_builtin_macro]
|
||||
macro_rules! compile_error {
|
||||
($msg:expr) => ({ /* compiler built-in */ });
|
||||
($msg:expr,) => ({ /* compiler built-in */ })
|
||||
}
|
||||
compile_error!("error!");
|
||||
"#,
|
||||
);
|
||||
|
||||
assert_eq!(expanded, r#"loop{"error!"}"#);
|
||||
|
@ -357,14 +410,13 @@ mod tests {
|
|||
fn test_format_args_expand() {
|
||||
let expanded = expand_builtin_macro(
|
||||
r#"
|
||||
#[rustc_builtin_macro]
|
||||
macro_rules! format_args {
|
||||
($fmt:expr) => ({ /* compiler built-in */ });
|
||||
($fmt:expr, $($args:tt)*) => ({ /* compiler built-in */ })
|
||||
}
|
||||
format_args!("{} {:?}", arg1(a, b, c), arg2);
|
||||
"#,
|
||||
BuiltinFnLikeExpander::FormatArgs,
|
||||
#[rustc_builtin_macro]
|
||||
macro_rules! format_args {
|
||||
($fmt:expr) => ({ /* compiler built-in */ });
|
||||
($fmt:expr, $($args:tt)*) => ({ /* compiler built-in */ })
|
||||
}
|
||||
format_args!("{} {:?}", arg1(a, b, c), arg2);
|
||||
"#,
|
||||
);
|
||||
|
||||
assert_eq!(
|
||||
|
|
|
@ -170,6 +170,8 @@ pub mod known {
|
|||
stringify,
|
||||
format_args,
|
||||
format_args_nl,
|
||||
env,
|
||||
option_env,
|
||||
// Builtin derives
|
||||
Copy,
|
||||
Clone,
|
||||
|
|
|
@ -102,6 +102,8 @@ macro_rules! __quote {
|
|||
( : ) => {$crate::__quote!(@PUNCT ':')};
|
||||
( :: ) => {$crate::__quote!(@PUNCT ':', ':')};
|
||||
( . ) => {$crate::__quote!(@PUNCT '.')};
|
||||
( < ) => {$crate::__quote!(@PUNCT '<')};
|
||||
( > ) => {$crate::__quote!(@PUNCT '>')};
|
||||
|
||||
( $first:tt $($tail:tt)+ ) => {
|
||||
{
|
||||
|
|
Loading…
Reference in a new issue