diff --git a/crates/hir_def/src/body/tests.rs b/crates/hir_def/src/body/tests.rs index 6dba9817d4..de77d5fc98 100644 --- a/crates/hir_def/src/body/tests.rs +++ b/crates/hir_def/src/body/tests.rs @@ -134,3 +134,31 @@ fn f() { "#, ); } + +#[test] +fn dollar_crate_in_builtin_macro() { + check_diagnostics( + r#" +#[macro_export] +#[rustc_builtin_macro] +macro_rules! format_args {} + +#[macro_export] +macro_rules! arg { + () => {} +} + +#[macro_export] +macro_rules! outer { + () => { + $crate::format_args!( "", $crate::arg!(1) ) + }; +} + +fn f() { + outer!(); + //^^^^^^^^ leftover tokens +} + "#, + ) +} diff --git a/crates/hir_def/src/test_db.rs b/crates/hir_def/src/test_db.rs index 00fe711fea..59c788b188 100644 --- a/crates/hir_def/src/test_db.rs +++ b/crates/hir_def/src/test_db.rs @@ -157,9 +157,16 @@ impl TestDB { db.diagnostics(|d| { let src = d.display_source(); let root = db.parse_or_expand(src.file_id).unwrap(); - // FIXME: macros... + + // Place all diagnostics emitted in macro files on the original caller. + // Note that this does *not* match IDE behavior. + let mut src = src.map(|ptr| ptr.to_node(&root)); + while let Some(exp) = src.file_id.call_node(db) { + src = exp; + } + let file_id = src.file_id.original_file(db); - let range = src.value.to_node(&root).text_range(); + let range = src.value.text_range(); let message = d.message().to_owned(); actual.entry(file_id).or_default().push((range, message)); });