fix: Fix expand_macro always expanding the first listed derive

This commit is contained in:
Lukas Wirth 2022-02-22 12:32:15 +01:00
parent b494795a42
commit 2e124d15fb
3 changed files with 18 additions and 4 deletions

View File

@ -310,7 +310,8 @@ impl HirFileId {
} }
/// Return whether this file is the pseudo expansion of the derive attribute. /// 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 { match self.0 {
HirFileIdRepr::MacroFile(macro_file) => { HirFileIdRepr::MacroFile(macro_file) => {
let loc: MacroCallLoc = db.lookup_intern_macro_call(macro_file.macro_call_id); let loc: MacroCallLoc = db.lookup_intern_macro_call(macro_file.macro_call_id);

View 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 derive = sema.descend_into_macros(tok.clone()).into_iter().find_map(|descended| {
let hir_file = sema.hir_file_for(&descended.parent()?); 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; return None;
} }
@ -55,7 +55,7 @@ pub(crate) fn expand_macro(db: &RootDatabase, position: FilePosition) -> Option<
.token_tree()? .token_tree()?
.token_trees_and_tokens() .token_trees_and_tokens()
.filter_map(NodeOrToken::into_token) .filter_map(NodeOrToken::into_token)
.take_while(|it| it == &token) .take_while(|it| it != &token)
.filter(|it| it.kind() == T![,]) .filter(|it| it.kind() == T![,])
.count(); .count();
Some(ExpandedMacro { 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< >{}
"#]],
);
} }
} }

View 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 attr = ctx.find_node_at_offset_with_descend::<ast::Attr>()?;
let path = attr.path()?; let path = attr.path()?;
let hir_file = ctx.sema.hir_file_for(attr.syntax()); 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; return None;
} }