From bb47c5f56c2f6d389879973d6b98fa487b4457fb Mon Sep 17 00:00:00 2001 From: Lukas Wirth Date: Sat, 5 Mar 2022 21:58:51 +0100 Subject: [PATCH 1/3] fix: Fix macro-calls expanding to items in if/while conditions --- crates/hir_def/src/body/lower.rs | 16 ++++++++-------- crates/hir_expand/src/lib.rs | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/crates/hir_def/src/body/lower.rs b/crates/hir_def/src/body/lower.rs index 06ad7ce4cd..195f21cedc 100644 --- a/crates/hir_def/src/body/lower.rs +++ b/crates/hir_def/src/body/lower.rs @@ -500,14 +500,14 @@ impl ExprCollector<'_> { } ast::Expr::MacroCall(e) => { let macro_ptr = AstPtr::new(&e); - let mut ids = vec![]; + let mut ids = None; self.collect_macro_call(e, macro_ptr, true, |this, expansion| { - ids.push(match expansion { + ids.get_or_insert(match expansion { Some(it) => this.collect_expr(it), None => this.alloc_expr(Expr::Missing, syntax_ptr.clone()), - }) + }); }); - ids[0] + ids.unwrap_or_else(|| self.alloc_expr(Expr::Missing, syntax_ptr.clone())) } ast::Expr::MacroStmts(e) => { e.statements().for_each(|s| self.collect_stmt(s)); @@ -523,7 +523,7 @@ impl ExprCollector<'_> { fn collect_macro_call), T: ast::AstNode>( &mut self, - e: ast::MacroCall, + mcall: ast::MacroCall, syntax_ptr: AstPtr, record_diagnostics: bool, mut collector: F, @@ -531,8 +531,8 @@ impl ExprCollector<'_> { // File containing the macro call. Expansion errors will be attached here. let outer_file = self.expander.current_file_id; - let macro_call = self.expander.to_source(AstPtr::new(&e)); - let res = self.expander.enter_expand(self.db, e); + let macro_call_ptr = self.expander.to_source(AstPtr::new(&mcall)); + let res = self.expander.enter_expand(self.db, mcall); let res = match res { Ok(res) => res, @@ -567,7 +567,7 @@ impl ExprCollector<'_> { match res.value { Some((mark, expansion)) => { - self.source_map.expansions.insert(macro_call, self.expander.current_file_id); + self.source_map.expansions.insert(macro_call_ptr, self.expander.current_file_id); let id = collector(self, Some(expansion)); self.expander.exit(self.db, mark); diff --git a/crates/hir_expand/src/lib.rs b/crates/hir_expand/src/lib.rs index ba0f101512..649a160b33 100644 --- a/crates/hir_expand/src/lib.rs +++ b/crates/hir_expand/src/lib.rs @@ -894,7 +894,7 @@ impl ExpandTo { | CLOSURE_EXPR | BREAK_EXPR | RETURN_EXPR | MATCH_EXPR | MATCH_ARM | MATCH_GUARD | RECORD_EXPR_FIELD | CALL_EXPR | INDEX_EXPR | METHOD_CALL_EXPR | FIELD_EXPR | AWAIT_EXPR | CAST_EXPR | REF_EXPR | PREFIX_EXPR | RANGE_EXPR | BIN_EXPR - | LET_EXPR => ExpandTo::Expr, + | LET_EXPR | IF_EXPR | WHILE_EXPR => ExpandTo::Expr, LET_STMT => { // FIXME: Handle LHS Pattern ExpandTo::Expr From a548958cdfb417156badcc529268d34b6cae82f9 Mon Sep 17 00:00:00 2001 From: Lukas Wirth Date: Sat, 5 Mar 2022 22:04:06 +0100 Subject: [PATCH 2/3] fix macro-calls always expanding to expressions in LetStmt --- crates/hir_expand/src/lib.rs | 32 ++++++++++++++++++++------------ 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/crates/hir_expand/src/lib.rs b/crates/hir_expand/src/lib.rs index 649a160b33..bdb01ca170 100644 --- a/crates/hir_expand/src/lib.rs +++ b/crates/hir_expand/src/lib.rs @@ -890,19 +890,27 @@ impl ExpandTo { MACRO_PAT => ExpandTo::Pattern, MACRO_TYPE => ExpandTo::Type, - ARG_LIST | TRY_EXPR | TUPLE_EXPR | PAREN_EXPR | ARRAY_EXPR | FOR_EXPR | PATH_EXPR - | CLOSURE_EXPR | BREAK_EXPR | RETURN_EXPR | MATCH_EXPR | MATCH_ARM | MATCH_GUARD - | RECORD_EXPR_FIELD | CALL_EXPR | INDEX_EXPR | METHOD_CALL_EXPR | FIELD_EXPR - | AWAIT_EXPR | CAST_EXPR | REF_EXPR | PREFIX_EXPR | RANGE_EXPR | BIN_EXPR - | LET_EXPR | IF_EXPR | WHILE_EXPR => ExpandTo::Expr, - LET_STMT => { - // FIXME: Handle LHS Pattern - ExpandTo::Expr - } - + ARG_LIST | ARRAY_EXPR | AWAIT_EXPR | BIN_EXPR | BREAK_EXPR | CALL_EXPR | CAST_EXPR + | CLOSURE_EXPR | FIELD_EXPR | FOR_EXPR | IF_EXPR | INDEX_EXPR | LET_EXPR + | MATCH_ARM | MATCH_EXPR | MATCH_GUARD | METHOD_CALL_EXPR | PAREN_EXPR | PATH_EXPR + | PREFIX_EXPR | RANGE_EXPR | RECORD_EXPR_FIELD | REF_EXPR | RETURN_EXPR | TRY_EXPR + | TUPLE_EXPR | WHILE_EXPR => ExpandTo::Expr, _ => { - // Unknown , Just guess it is `Items` - ExpandTo::Items + match ast::LetStmt::cast(parent) { + Some(let_stmt) => { + if let Some(true) = let_stmt.initializer().map(|it| it.syntax() == syn) { + ExpandTo::Expr + } else if let Some(true) = let_stmt.ty().map(|it| it.syntax() == syn) { + ExpandTo::Type + } else { + ExpandTo::Pattern + } + } + None => { + // Unknown , Just guess it is `Items` + ExpandTo::Items + } + } } } } From a148c49f1c5b1e30dfc112edbf79ca4cbabc5946 Mon Sep 17 00:00:00 2001 From: Lukas Wirth Date: Sat, 5 Mar 2022 22:44:49 +0100 Subject: [PATCH 3/3] Fix test fixture --- crates/hir_ty/src/tests/macros.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/hir_ty/src/tests/macros.rs b/crates/hir_ty/src/tests/macros.rs index 344e7293c5..a61175f273 100644 --- a/crates/hir_ty/src/tests/macros.rs +++ b/crates/hir_ty/src/tests/macros.rs @@ -190,6 +190,7 @@ fn expr_macro_def_expanded_in_various_places() { !0..6 '1isize': isize !0..6 '1isize': isize !0..6 '1isize': isize + !0..6 '1isize': isize 39..442 '{ ...!(); }': () 73..94 'spam!(...am!())': {unknown} 100..119 'for _ ...!() {}': () @@ -197,7 +198,6 @@ fn expr_macro_def_expanded_in_various_places() { 117..119 '{}': () 124..134 '|| spam!()': || -> isize 140..156 'while ...!() {}': () - 146..153 'spam!()': bool 154..156 '{}': () 161..174 'break spam!()': ! 180..194 'return spam!()': ! @@ -271,6 +271,7 @@ fn expr_macro_rules_expanded_in_various_places() { !0..6 '1isize': isize !0..6 '1isize': isize !0..6 '1isize': isize + !0..6 '1isize': isize 53..456 '{ ...!(); }': () 87..108 'spam!(...am!())': {unknown} 114..133 'for _ ...!() {}': () @@ -278,7 +279,6 @@ fn expr_macro_rules_expanded_in_various_places() { 131..133 '{}': () 138..148 '|| spam!()': || -> isize 154..170 'while ...!() {}': () - 160..167 'spam!()': bool 168..170 '{}': () 175..188 'break spam!()': ! 194..208 'return spam!()': !