Unnamed repository; edit this file 'description' to name the repository.
Merge #10641
10641: fix: make `expand_macro` multi-token mapping aware r=spookyvision a=spookyvision Co-authored-by: Anatol Ulrich <[email protected]> Co-authored-by: Anatol Ulrich <[email protected]>
bors[bot] 2021-10-27
parent c48730c · parent b420939 · commit a3830df
-rw-r--r--crates/ide/src/expand_macro.rs40
1 files changed, 28 insertions, 12 deletions
diff --git a/crates/ide/src/expand_macro.rs b/crates/ide/src/expand_macro.rs
index 5f34ba8391..c389d895f2 100644
--- a/crates/ide/src/expand_macro.rs
+++ b/crates/ide/src/expand_macro.rs
@@ -32,19 +32,32 @@ pub(crate) fn expand_macro(db: &RootDatabase, position: FilePosition) -> Option<
_ => 0,
})?;
- let descended = sema.descend_into_macros_single(tok.clone());
- if let Some(attr) = descended.ancestors().find_map(ast::Attr::cast) {
- if let Some((path, tt)) = attr.as_simple_call() {
- if path == "derive" {
- let mut tt = tt.syntax().children_with_tokens().skip(1).join("");
- tt.pop();
- let expansions = sema.expand_derive_macro(&attr)?;
- return Some(ExpandedMacro {
- name: tt,
- expansion: expansions.into_iter().map(insert_whitespaces).join(""),
- });
- }
+ // due to how Rust Analyzer works internally, we need to special case derive attributes,
+ // otherwise they might not get found, e.g. here with the cursor at $0 `#[attr]` would expand:
+ // ```
+ // #[attr]
+ // #[derive($0Foo)]
+ // struct Bar;
+ // ```
+
+ let derive = sema.descend_into_macros(tok.clone()).iter().find_map(|descended| {
+ let attr = descended.ancestors().find_map(ast::Attr::cast)?;
+ let (path, tt) = attr.as_simple_call()?;
+ if path == "derive" {
+ let mut tt = tt.syntax().children_with_tokens().skip(1).join("");
+ tt.pop();
+ let expansions = sema.expand_derive_macro(&attr)?;
+ Some(ExpandedMacro {
+ name: tt,
+ expansion: expansions.into_iter().map(insert_whitespaces).join(""),
+ })
+ } else {
+ None
}
+ });
+
+ if derive.is_some() {
+ return derive;
}
// FIXME: Intermix attribute and bang! expansions
@@ -353,9 +366,12 @@ fn main() {
fn macro_expand_derive() {
check(
r#"
+//- proc_macros: identity
+
#[rustc_builtin_macro]
pub macro Clone {}
+#[proc_macros::identity]
#[derive(C$0lone)]
struct Foo {}
"#,