Unnamed repository; edit this file 'description' to name the repository.
Merge #11530
11530: fix: Fix expand_macro always expanding the first listed derive r=Veykril a=Veykril bors r+ Co-authored-by: Lukas Wirth <[email protected]>
bors[bot] 2022-02-22
parent bd2b6c4 · parent 2e124d1 · commit 7ce06d4
-rw-r--r--crates/hir_expand/src/lib.rs3
-rw-r--r--crates/ide/src/expand_macro.rs17
-rw-r--r--crates/ide_assists/src/handlers/replace_derive_with_manual_impl.rs2
3 files changed, 18 insertions, 4 deletions
diff --git a/crates/hir_expand/src/lib.rs b/crates/hir_expand/src/lib.rs
index cc38faa136..ba0f101512 100644
--- a/crates/hir_expand/src/lib.rs
+++ b/crates/hir_expand/src/lib.rs
@@ -310,7 +310,8 @@ impl HirFileId {
}
/// 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 f732674725..7bb6b24a23 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 @@ struct 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 8ac05bf5ff..27f2960c7e 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::<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;
}