mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-10-01 11:31:15 +00:00
Merge #11629
11629: fix: Fix macro-calls expanding to items in if/while conditions r=Veykril a=Veykril Fixes https://github.com/rust-analyzer/rust-analyzer/issues/11617 Co-authored-by: Lukas Wirth <lukastw97@gmail.com>
This commit is contained in:
commit
b032993733
@ -507,14 +507,14 @@ impl ExprCollector<'_> {
|
|||||||
}
|
}
|
||||||
ast::Expr::MacroCall(e) => {
|
ast::Expr::MacroCall(e) => {
|
||||||
let macro_ptr = AstPtr::new(&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| {
|
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),
|
Some(it) => this.collect_expr(it),
|
||||||
None => this.alloc_expr(Expr::Missing, syntax_ptr.clone()),
|
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) => {
|
ast::Expr::MacroStmts(e) => {
|
||||||
e.statements().for_each(|s| self.collect_stmt(s));
|
e.statements().for_each(|s| self.collect_stmt(s));
|
||||||
@ -531,7 +531,7 @@ impl ExprCollector<'_> {
|
|||||||
|
|
||||||
fn collect_macro_call<F: FnMut(&mut Self, Option<T>), T: ast::AstNode>(
|
fn collect_macro_call<F: FnMut(&mut Self, Option<T>), T: ast::AstNode>(
|
||||||
&mut self,
|
&mut self,
|
||||||
e: ast::MacroCall,
|
mcall: ast::MacroCall,
|
||||||
syntax_ptr: AstPtr<ast::MacroCall>,
|
syntax_ptr: AstPtr<ast::MacroCall>,
|
||||||
record_diagnostics: bool,
|
record_diagnostics: bool,
|
||||||
mut collector: F,
|
mut collector: F,
|
||||||
@ -539,8 +539,8 @@ impl ExprCollector<'_> {
|
|||||||
// File containing the macro call. Expansion errors will be attached here.
|
// File containing the macro call. Expansion errors will be attached here.
|
||||||
let outer_file = self.expander.current_file_id;
|
let outer_file = self.expander.current_file_id;
|
||||||
|
|
||||||
let macro_call = self.expander.to_source(AstPtr::new(&e));
|
let macro_call_ptr = self.expander.to_source(AstPtr::new(&mcall));
|
||||||
let res = self.expander.enter_expand(self.db, e);
|
let res = self.expander.enter_expand(self.db, mcall);
|
||||||
|
|
||||||
let res = match res {
|
let res = match res {
|
||||||
Ok(res) => res,
|
Ok(res) => res,
|
||||||
@ -575,7 +575,7 @@ impl ExprCollector<'_> {
|
|||||||
|
|
||||||
match res.value {
|
match res.value {
|
||||||
Some((mark, expansion)) => {
|
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));
|
let id = collector(self, Some(expansion));
|
||||||
self.expander.exit(self.db, mark);
|
self.expander.exit(self.db, mark);
|
||||||
|
@ -890,19 +890,27 @@ impl ExpandTo {
|
|||||||
MACRO_PAT => ExpandTo::Pattern,
|
MACRO_PAT => ExpandTo::Pattern,
|
||||||
MACRO_TYPE => ExpandTo::Type,
|
MACRO_TYPE => ExpandTo::Type,
|
||||||
|
|
||||||
ARG_LIST | TRY_EXPR | TUPLE_EXPR | PAREN_EXPR | ARRAY_EXPR | FOR_EXPR | PATH_EXPR
|
ARG_LIST | ARRAY_EXPR | AWAIT_EXPR | BIN_EXPR | BREAK_EXPR | CALL_EXPR | CAST_EXPR
|
||||||
| CLOSURE_EXPR | BREAK_EXPR | RETURN_EXPR | MATCH_EXPR | MATCH_ARM | MATCH_GUARD
|
| CLOSURE_EXPR | FIELD_EXPR | FOR_EXPR | IF_EXPR | INDEX_EXPR | LET_EXPR
|
||||||
| RECORD_EXPR_FIELD | CALL_EXPR | INDEX_EXPR | METHOD_CALL_EXPR | FIELD_EXPR
|
| MATCH_ARM | MATCH_EXPR | MATCH_GUARD | METHOD_CALL_EXPR | PAREN_EXPR | PATH_EXPR
|
||||||
| AWAIT_EXPR | CAST_EXPR | REF_EXPR | PREFIX_EXPR | RANGE_EXPR | BIN_EXPR
|
| PREFIX_EXPR | RANGE_EXPR | RECORD_EXPR_FIELD | REF_EXPR | RETURN_EXPR | TRY_EXPR
|
||||||
| LET_EXPR => ExpandTo::Expr,
|
| TUPLE_EXPR | WHILE_EXPR => ExpandTo::Expr,
|
||||||
LET_STMT => {
|
|
||||||
// FIXME: Handle LHS Pattern
|
|
||||||
ExpandTo::Expr
|
|
||||||
}
|
|
||||||
|
|
||||||
_ => {
|
_ => {
|
||||||
// Unknown , Just guess it is `Items`
|
match ast::LetStmt::cast(parent) {
|
||||||
ExpandTo::Items
|
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
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
!0..6 '1isize': isize
|
!0..6 '1isize': isize
|
||||||
|
!0..6 '1isize': isize
|
||||||
39..442 '{ ...!(); }': ()
|
39..442 '{ ...!(); }': ()
|
||||||
73..94 'spam!(...am!())': {unknown}
|
73..94 'spam!(...am!())': {unknown}
|
||||||
100..119 'for _ ...!() {}': ()
|
100..119 'for _ ...!() {}': ()
|
||||||
@ -197,7 +198,6 @@ fn expr_macro_def_expanded_in_various_places() {
|
|||||||
117..119 '{}': ()
|
117..119 '{}': ()
|
||||||
124..134 '|| spam!()': || -> isize
|
124..134 '|| spam!()': || -> isize
|
||||||
140..156 'while ...!() {}': ()
|
140..156 'while ...!() {}': ()
|
||||||
146..153 'spam!()': bool
|
|
||||||
154..156 '{}': ()
|
154..156 '{}': ()
|
||||||
161..174 'break spam!()': !
|
161..174 'break spam!()': !
|
||||||
180..194 'return 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
|
||||||
!0..6 '1isize': isize
|
!0..6 '1isize': isize
|
||||||
|
!0..6 '1isize': isize
|
||||||
53..456 '{ ...!(); }': ()
|
53..456 '{ ...!(); }': ()
|
||||||
87..108 'spam!(...am!())': {unknown}
|
87..108 'spam!(...am!())': {unknown}
|
||||||
114..133 'for _ ...!() {}': ()
|
114..133 'for _ ...!() {}': ()
|
||||||
@ -278,7 +279,6 @@ fn expr_macro_rules_expanded_in_various_places() {
|
|||||||
131..133 '{}': ()
|
131..133 '{}': ()
|
||||||
138..148 '|| spam!()': || -> isize
|
138..148 '|| spam!()': || -> isize
|
||||||
154..170 'while ...!() {}': ()
|
154..170 'while ...!() {}': ()
|
||||||
160..167 'spam!()': bool
|
|
||||||
168..170 '{}': ()
|
168..170 '{}': ()
|
||||||
175..188 'break spam!()': !
|
175..188 'break spam!()': !
|
||||||
194..208 'return spam!()': !
|
194..208 'return spam!()': !
|
||||||
|
Loading…
x
Reference in New Issue
Block a user