]> git.lizzy.rs Git - rust.git/commitdiff
fix: Fix expand_macro always expanding the first listed derive
authorLukas Wirth <lukastw97@gmail.com>
Tue, 22 Feb 2022 11:32:15 +0000 (12:32 +0100)
committerLukas Wirth <lukastw97@gmail.com>
Tue, 22 Feb 2022 11:32:27 +0000 (12:32 +0100)
crates/hir_expand/src/lib.rs
crates/ide/src/expand_macro.rs
crates/ide_assists/src/handlers/replace_derive_with_manual_impl.rs

index cc38faa13693c64d2227339fe52afa974e7ccd3b..ba0f10151246519037a551231995e38bd905fb42 100644 (file)
@@ -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);
index f7326747253a0580eb1261e901f9fa4c52fb292e..7bb6b24a23deefa1dd1cf56ffc505fc9af55fa1d 100644 (file)
@@ -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< >{}
+
+            "#]],
+        );
     }
 }
index 8ac05bf5ff51c460ecfa750cd319d3f645159b64..27f2960c7ed4352ddf8738439f8b18890cdd2250 100644 (file)
@@ -49,7 +49,7 @@ pub(crate) fn replace_derive_with_manual_impl(
     let attr = ctx.find_node_at_offset_with_descend::<ast::Attr>()?;
     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;
     }