Merge branch 'master' of https://github.com/rust-analyzer/rust-analyzer into feature/themes

This commit is contained in:
Seivan Heidari 2019-11-25 09:17:03 +01:00
commit a7394b44c8
2 changed files with 55 additions and 5 deletions

View file

@ -46,6 +46,7 @@ macro_rules! register_builtin {
register_builtin! {
(COLUMN_MACRO, Column) => column_expand,
(COMPILE_ERROR_MACRO, CompileError) => compile_error_expand,
(FILE_MACRO, File) => file_expand,
(LINE_MACRO, Line) => line_expand,
(STRINGIFY_MACRO, Stringify) => stringify_expand
@ -57,16 +58,21 @@ fn to_line_number(db: &dyn AstDatabase, file: HirFileId, pos: TextUnit) -> usize
let text = db.file_text(file_id);
let mut line_num = 1;
let pos = pos.to_usize();
if pos > text.len() {
// FIXME: `pos` at the moment could be an offset inside the "wrong" file
// in this case, when we know it's wrong, we return a dummy value
return 0;
}
// Count line end
for (i, c) in text.chars().enumerate() {
if i == pos.to_usize() {
if i == pos {
break;
}
if c == '\n' {
line_num += 1;
}
}
line_num
}
@ -118,15 +124,21 @@ fn to_col_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 col_num = 1;
for c in text[..pos.to_usize()].chars().rev() {
let pos = pos.to_usize();
if pos > text.len() {
// FIXME: `pos` at the moment could be an offset inside the "wrong" file
// in this case we return a dummy value so that we don't `panic!`
return 0;
}
let mut col_num = 1;
for c in text[..pos].chars().rev() {
if c == '\n' {
break;
}
col_num = col_num + 1;
}
col_num
}
@ -172,6 +184,26 @@ fn file_expand(
Ok(expanded)
}
fn compile_error_expand(
_db: &dyn AstDatabase,
_id: MacroCallId,
tt: &tt::Subtree,
) -> Result<tt::Subtree, mbe::ExpandError> {
if tt.count() == 1 {
match &tt.token_trees[0] {
tt::TokenTree::Leaf(tt::Leaf::Literal(it)) => {
let s = it.text.as_str();
if s.contains(r#"""#) {
return Ok(quote! { loop { #it }});
}
}
_ => {}
};
}
Err(mbe::ExpandError::BindingError("Must be a string".into()))
}
#[cfg(test)]
mod tests {
use super::*;
@ -259,4 +291,21 @@ mod tests {
assert_eq!(expanded, "\"\"");
}
#[test]
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,
);
assert_eq!(expanded, r#"loop{"error!"}"#);
}
}

View file

@ -144,5 +144,6 @@ pub const BOX_TYPE: Name = Name::new_inline_ascii(3, b"Box");
// Builtin Macros
pub const FILE_MACRO: Name = Name::new_inline_ascii(4, b"file");
pub const COLUMN_MACRO: Name = Name::new_inline_ascii(6, b"column");
pub const COMPILE_ERROR_MACRO: Name = Name::new_inline_ascii(13, b"compile_error");
pub const LINE_MACRO: Name = Name::new_inline_ascii(4, b"line");
pub const STRINGIFY_MACRO: Name = Name::new_inline_ascii(9, b"stringify");