Unnamed repository; edit this file 'description' to name the repository.
-rw-r--r--crates/hir/src/semantics.rs7
-rw-r--r--crates/ide/src/expand_macro.rs17
2 files changed, 21 insertions, 3 deletions
diff --git a/crates/hir/src/semantics.rs b/crates/hir/src/semantics.rs
index e55b693ef0..98f5739600 100644
--- a/crates/hir/src/semantics.rs
+++ b/crates/hir/src/semantics.rs
@@ -641,11 +641,14 @@ impl<'db> SemanticsImpl<'db> {
})
}
- pub fn expand_derive_macro(&self, attr: &ast::Attr) -> Option<Vec<ExpandResult<SyntaxNode>>> {
+ pub fn expand_derive_macro(
+ &self,
+ attr: &ast::Attr,
+ ) -> Option<Vec<Option<ExpandResult<SyntaxNode>>>> {
let res: Vec<_> = self
.derive_macro_calls(attr)?
.into_iter()
- .flat_map(|call| {
+ .map(|call| {
let file_id = call?.left()?;
let ExpandResult { value, err } = self.db.parse_macro_expansion(file_id);
let root_node = value.0.syntax_node();
diff --git a/crates/ide/src/expand_macro.rs b/crates/ide/src/expand_macro.rs
index ba8b3aa9ca..44285d9315 100644
--- a/crates/ide/src/expand_macro.rs
+++ b/crates/ide/src/expand_macro.rs
@@ -63,7 +63,7 @@ pub(crate) fn expand_macro(db: &RootDatabase, position: FilePosition) -> Option<
.take_while(|it| it != &token)
.filter(|it| it.kind() == T![,])
.count();
- let ExpandResult { err, value: expansion } = expansions.get(idx)?.clone();
+ let ExpandResult { err, value: expansion } = expansions.get(idx)?.clone()?;
let expansion_file_id = sema.hir_file_for(&expansion).macro_file()?;
let expansion_span_map = db.expansion_span_map(expansion_file_id);
let mut expansion = format(
@@ -848,4 +848,19 @@ struct S {
u32"#]],
);
}
+
+ #[test]
+ fn regression_21489() {
+ check(
+ r#"
+//- proc_macros: derive_identity
+//- minicore: derive, fmt
+#[derive(Debug, proc_macros::DeriveIdentity$0)]
+struct Foo;
+ "#,
+ expect![[r#"
+ proc_macros::DeriveIdentity
+ struct Foo;"#]],
+ );
+ }
}