Skip to content

Commit 13ec077

Browse files
bors[bot]Veykril
andauthored
Merge #10437
10437: fix: Fix extract_variable not allowing to extract macro calls r=Veykril a=Veykril Fixes #6866 bors r+ Co-authored-by: Lukas Wirth <[email protected]>
2 parents 60c5449 + a359a1f commit 13ec077

File tree

1 file changed

+20
-11
lines changed

1 file changed

+20
-11
lines changed

crates/ide_assists/src/handlers/extract_variable.rs

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use stdx::format_to;
22
use syntax::{
33
ast::{self, AstNode},
4+
NodeOrToken,
45
SyntaxKind::{
56
BLOCK_EXPR, BREAK_EXPR, CLOSURE_EXPR, COMMENT, LOOP_EXPR, MATCH_ARM, MATCH_GUARD,
67
PATH_EXPR, RETURN_EXPR,
@@ -30,20 +31,26 @@ pub(crate) fn extract_variable(acc: &mut Assists, ctx: &AssistContext) -> Option
3031
if ctx.frange.range.is_empty() {
3132
return None;
3233
}
33-
let node = ctx.covering_element();
34-
if node.kind() == COMMENT {
35-
cov_mark::hit!(extract_var_in_comment_is_not_applicable);
36-
return None;
37-
}
34+
let node = match ctx.covering_element() {
35+
NodeOrToken::Node(it) => it,
36+
NodeOrToken::Token(it) if it.kind() == COMMENT => {
37+
cov_mark::hit!(extract_var_in_comment_is_not_applicable);
38+
return None;
39+
}
40+
NodeOrToken::Token(it) => it.parent()?,
41+
};
42+
let node = node.ancestors().take_while(|anc| anc.text_range() == node.text_range()).last()?;
3843
let to_extract = node
39-
.ancestors()
40-
.take_while(|it| it.text_range().contains_range(ctx.frange.range))
44+
.descendants()
45+
.take_while(|it| ctx.frange.range.contains_range(it.text_range()))
4146
.find_map(valid_target_expr)?;
47+
4248
if let Some(ty_info) = ctx.sema.type_of_expr(&to_extract) {
4349
if ty_info.adjusted().is_unit() {
4450
return None;
4551
}
4652
}
53+
4754
let anchor = Anchor::from(&to_extract)?;
4855
let indent = anchor.syntax().prev_sibling_or_token()?.as_token()?.clone();
4956
let target = to_extract.syntax().text_range();
@@ -146,8 +153,11 @@ enum Anchor {
146153

147154
impl Anchor {
148155
fn from(to_extract: &ast::Expr) -> Option<Anchor> {
149-
to_extract.syntax().ancestors().take_while(|it| !ast::Item::can_cast(it.kind())).find_map(
150-
|node| {
156+
to_extract
157+
.syntax()
158+
.ancestors()
159+
.take_while(|it| !ast::Item::can_cast(it.kind()) || ast::MacroCall::can_cast(it.kind()))
160+
.find_map(|node| {
151161
if let Some(expr) =
152162
node.parent().and_then(ast::StmtList::cast).and_then(|it| it.tail_expr())
153163
{
@@ -181,8 +191,7 @@ impl Anchor {
181191
return Some(Anchor::Before(node));
182192
}
183193
None
184-
},
185-
)
194+
})
186195
}
187196

188197
fn syntax(&self) -> &SyntaxNode {

0 commit comments

Comments
 (0)