mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-29 02:03:53 +00:00
Add line macro and tests
This commit is contained in:
parent
1637a8a590
commit
c4aa8b63bc
@ -4810,3 +4810,22 @@ fn no_such_field_diagnostics() {
|
||||
"###
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn infer_builtin_macros_line() {
|
||||
assert_snapshot!(
|
||||
infer(r#"
|
||||
#[rustc_builtin_macro]
|
||||
macro_rules! line {() => {}}
|
||||
|
||||
fn main() {
|
||||
let x = line!();
|
||||
}
|
||||
"#),
|
||||
@r###"
|
||||
![0; 1) '6': i32
|
||||
[64; 88) '{ ...!(); }': ()
|
||||
[74; 75) 'x': i32
|
||||
"###
|
||||
);
|
||||
}
|
||||
|
@ -1,14 +1,28 @@
|
||||
//! Builtin macro
|
||||
use crate::{ast, name, AstId, BuiltinMacro, CrateId, MacroDefId};
|
||||
use crate::db::AstDatabase;
|
||||
use crate::{
|
||||
ast::{self, AstNode},
|
||||
name, AstId, BuiltinMacro, CrateId, HirFileId, MacroCallId, MacroDefId, MacroFileKind,
|
||||
TextUnit,
|
||||
};
|
||||
|
||||
use crate::quote;
|
||||
|
||||
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
|
||||
pub enum BuiltinExpander {
|
||||
Line
|
||||
Line,
|
||||
}
|
||||
|
||||
impl BuiltinExpander {
|
||||
pub fn expand(&self, _tt: &tt::Subtree) -> Result<tt::Subtree, mbe::ExpandError> {
|
||||
Err(mbe::ExpandError::UnexpectedToken)
|
||||
pub fn expand(
|
||||
&self,
|
||||
db: &dyn AstDatabase,
|
||||
id: MacroCallId,
|
||||
tt: &tt::Subtree,
|
||||
) -> Result<tt::Subtree, mbe::ExpandError> {
|
||||
match self {
|
||||
BuiltinExpander::Line => line_expand(db, id, tt),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -18,9 +32,53 @@ pub fn find_builtin_macro(
|
||||
ast_id: AstId<ast::MacroCall>,
|
||||
) -> Option<MacroDefId> {
|
||||
// FIXME: Better registering method
|
||||
if ident == &name::LINE {
|
||||
Some(MacroDefId::BuiltinMacro(BuiltinMacro { expander: BuiltinExpander::Line, krate, ast_id }))
|
||||
if ident == &name::LINE_MACRO {
|
||||
Some(MacroDefId::BuiltinMacro(BuiltinMacro {
|
||||
expander: BuiltinExpander::Line,
|
||||
krate,
|
||||
ast_id,
|
||||
}))
|
||||
} else {
|
||||
None
|
||||
}
|
||||
}
|
||||
|
||||
fn to_line_number(db: &dyn AstDatabase, file: HirFileId, pos: TextUnit) -> usize {
|
||||
// FIXME: Use expansion info
|
||||
let file_id = file.original_file(db);
|
||||
let text = db.file_text(file_id);
|
||||
let mut line_num = 1;
|
||||
|
||||
// Count line end
|
||||
for (i, c) in text.chars().enumerate() {
|
||||
if i == pos.to_usize() {
|
||||
break;
|
||||
}
|
||||
if c == '\n' {
|
||||
line_num += 1;
|
||||
}
|
||||
}
|
||||
|
||||
line_num
|
||||
}
|
||||
|
||||
fn line_expand(
|
||||
db: &dyn AstDatabase,
|
||||
id: MacroCallId,
|
||||
_tt: &tt::Subtree,
|
||||
) -> Result<tt::Subtree, mbe::ExpandError> {
|
||||
let loc = db.lookup_intern_macro(id);
|
||||
let macro_call = loc.ast_id.to_node(db);
|
||||
|
||||
let arg = macro_call.token_tree().ok_or_else(|| mbe::ExpandError::UnexpectedToken)?;
|
||||
let arg_start = arg.syntax().text_range().start();
|
||||
|
||||
let file = id.as_file(MacroFileKind::Expr);
|
||||
let line_num = to_line_number(db, file, arg_start);
|
||||
|
||||
let expanded = quote! {
|
||||
#line_num
|
||||
};
|
||||
|
||||
Ok(expanded)
|
||||
}
|
||||
|
@ -28,7 +28,7 @@ impl TokenExpander {
|
||||
) -> Result<tt::Subtree, mbe::ExpandError> {
|
||||
match self {
|
||||
TokenExpander::MacroRules(it) => it.expand(tt),
|
||||
TokenExpander::Builtin(it) => it.expand(tt),
|
||||
TokenExpander::Builtin(it) => it.expand(db, id, tt),
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user