From 2e124d15fb72482257c8ef10369df77ee24d6a85 Mon Sep 17 00:00:00 2001 From: Lukas Wirth Date: Tue, 22 Feb 2022 12:32:15 +0100 Subject: [PATCH 1/1] fix: Fix expand_macro always expanding the first listed derive --- crates/hir_expand/src/lib.rs | 3 ++- crates/ide/src/expand_macro.rs | 17 +++++++++++++++-- .../handlers/replace_derive_with_manual_impl.rs | 2 +- 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/crates/hir_expand/src/lib.rs b/crates/hir_expand/src/lib.rs index cc38faa1369..ba0f1015124 100644 --- a/crates/hir_expand/src/lib.rs +++ b/crates/hir_expand/src/lib.rs @@ -310,7 +310,8 @@ pub fn is_attr_macro(&self, db: &dyn db::AstDatabase) -> bool { } /// Return whether this file is the pseudo expansion of the derive attribute. - pub fn is_derive_attr_macro(&self, db: &dyn db::AstDatabase) -> bool { + /// See [`crate::builtin_attr_macro::derive_attr_expand`]. + pub fn is_derive_attr_pseudo_expansion(&self, db: &dyn db::AstDatabase) -> bool { match self.0 { HirFileIdRepr::MacroFile(macro_file) => { let loc: MacroCallLoc = db.lookup_intern_macro_call(macro_file.macro_call_id); diff --git a/crates/ide/src/expand_macro.rs b/crates/ide/src/expand_macro.rs index f7326747253..7bb6b24a23d 100644 --- a/crates/ide/src/expand_macro.rs +++ b/crates/ide/src/expand_macro.rs @@ -42,7 +42,7 @@ pub(crate) fn expand_macro(db: &RootDatabase, position: FilePosition) -> Option< let derive = sema.descend_into_macros(tok.clone()).into_iter().find_map(|descended| { let hir_file = sema.hir_file_for(&descended.parent()?); - if !hir_file.is_derive_attr_macro(db) { + if !hir_file.is_derive_attr_pseudo_expansion(db) { return None; } @@ -55,7 +55,7 @@ pub(crate) fn expand_macro(db: &RootDatabase, position: FilePosition) -> Option< .token_tree()? .token_trees_and_tokens() .filter_map(NodeOrToken::into_token) - .take_while(|it| it == &token) + .take_while(|it| it != &token) .filter(|it| it.kind() == T![,]) .count(); Some(ExpandedMacro { @@ -384,5 +384,18 @@ impl < >core::marker::Copy for Foo< >{} "#]], ); + check( + r#" +//- minicore: copy, clone, derive + +#[derive(Copy, Cl$0one)] +struct Foo {} +"#, + expect![[r#" + Clone + impl < >core::clone::Clone for Foo< >{} + + "#]], + ); } } diff --git a/crates/ide_assists/src/handlers/replace_derive_with_manual_impl.rs b/crates/ide_assists/src/handlers/replace_derive_with_manual_impl.rs index 8ac05bf5ff5..27f2960c7ed 100644 --- a/crates/ide_assists/src/handlers/replace_derive_with_manual_impl.rs +++ b/crates/ide_assists/src/handlers/replace_derive_with_manual_impl.rs @@ -49,7 +49,7 @@ pub(crate) fn replace_derive_with_manual_impl( let attr = ctx.find_node_at_offset_with_descend::()?; let path = attr.path()?; let hir_file = ctx.sema.hir_file_for(attr.syntax()); - if !hir_file.is_derive_attr_macro(ctx.db()) { + if !hir_file.is_derive_attr_pseudo_expansion(ctx.db()) { return None; } -- 2.44.0