From 0d063b8d212dd6c54da0aa8608154c980107bd07 Mon Sep 17 00:00:00 2001 From: Brandon Date: Wed, 24 Mar 2021 00:00:38 -0700 Subject: Fix MISSING: command error with macros --- crates/hir_expand/src/lib.rs | 7 +++++++ crates/ide/src/annotations.rs | 45 +++++++++++++++++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 8 deletions(-) diff --git a/crates/hir_expand/src/lib.rs b/crates/hir_expand/src/lib.rs index b8045fda9..d7391ebad 100644 --- a/crates/hir_expand/src/lib.rs +++ b/crates/hir_expand/src/lib.rs @@ -207,6 +207,13 @@ impl HirFileId { } false } + + pub fn is_macro_file(&self) -> bool { + match self.0 { + HirFileIdRepr::MacroFile(_) => true, + HirFileIdRepr::FileId(_) => false, + } + } } #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] diff --git a/crates/ide/src/annotations.rs b/crates/ide/src/annotations.rs index 72492f826..9e78ed6a0 100644 --- a/crates/ide/src/annotations.rs +++ b/crates/ide/src/annotations.rs @@ -1,5 +1,5 @@ use either::Either; -use hir::{HasSource, Semantics}; +use hir::{HasSource, InFile, Semantics}; use ide_db::{ base_db::{FileId, FilePosition, FileRange}, helpers::visit_file_defs, @@ -80,19 +80,19 @@ pub(crate) fn annotations( Either::Left(def) => { let node = match def { hir::ModuleDef::Const(konst) => { - konst.source(db).and_then(|node| range_and_position_of(&node.value)) + konst.source(db).and_then(|node| range_and_position_of(&node)) } hir::ModuleDef::Trait(trait_) => { - trait_.source(db).and_then(|node| range_and_position_of(&node.value)) + trait_.source(db).and_then(|node| range_and_position_of(&node)) } hir::ModuleDef::Adt(hir::Adt::Struct(strukt)) => { - strukt.source(db).and_then(|node| range_and_position_of(&node.value)) + strukt.source(db).and_then(|node| range_and_position_of(&node)) } hir::ModuleDef::Adt(hir::Adt::Enum(enum_)) => { - enum_.source(db).and_then(|node| range_and_position_of(&node.value)) + enum_.source(db).and_then(|node| range_and_position_of(&node)) } hir::ModuleDef::Adt(hir::Adt::Union(union)) => { - union.source(db).and_then(|node| range_and_position_of(&node.value)) + union.source(db).and_then(|node| range_and_position_of(&node)) } _ => None, }; @@ -120,8 +120,18 @@ pub(crate) fn annotations( }); } - fn range_and_position_of(node: &dyn NameOwner) -> Option<(TextSize, TextRange)> { - Some((node.name()?.syntax().text_range().start(), node.syntax().text_range())) + fn range_and_position_of( + node: &InFile, + ) -> Option<(TextSize, TextRange)> { + if node.file_id.is_macro_file() { + // Macro generated files should not contain annotations. + None + } else { + Some(( + node.value.name()?.syntax().text_range().start(), + node.value.syntax().text_range(), + )) + } } } Either::Right(_) => (), @@ -961,6 +971,25 @@ mod tests { struct Foo; //- /lib.rs // this file comes last since `check` checks the first file only +"#, + expect![[r#" + [] + "#]], + ); + } + + #[test] + fn test_no_annotations_macro_struct_def() { + check( + r#" +//- /lib.rs +macro_rules! m { + () => { + struct A {} + }; +} + +m!(); "#, expect![[r#" [] -- cgit v1.2.3