Skip to content

Commit 455dacf

Browse files
Ryan Mehrirmehri01
authored andcommitted
fix: only trigger assist on Name
1 parent 91ac1d6 commit 455dacf

File tree

1 file changed

+29
-12
lines changed

1 file changed

+29
-12
lines changed

crates/ide-assists/src/handlers/bool_to_enum.rs

Lines changed: 29 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,9 @@ struct BoolNodeData {
8585

8686
/// Attempts to find an appropriate node to apply the action to.
8787
fn find_bool_node(ctx: &AssistContext<'_>) -> Option<BoolNodeData> {
88-
if let Some(let_stmt) = ctx.find_node_at_offset::<ast::LetStmt>() {
88+
let name: ast::Name = ctx.find_node_at_offset()?;
89+
90+
if let Some(let_stmt) = name.syntax().ancestors().find_map(ast::LetStmt::cast) {
8991
let bind_pat = match let_stmt.pat()? {
9092
ast::Pat::IdentPat(pat) => pat,
9193
_ => {
@@ -101,12 +103,12 @@ fn find_bool_node(ctx: &AssistContext<'_>) -> Option<BoolNodeData> {
101103

102104
Some(BoolNodeData {
103105
target_node: let_stmt.syntax().clone(),
104-
name: bind_pat.name()?,
106+
name,
105107
ty_annotation: let_stmt.ty(),
106108
initializer: let_stmt.initializer(),
107109
definition: Definition::Local(def),
108110
})
109-
} else if let Some(const_) = ctx.find_node_at_offset::<ast::Const>() {
111+
} else if let Some(const_) = name.syntax().ancestors().find_map(ast::Const::cast) {
110112
let def = ctx.sema.to_def(&const_)?;
111113
if !def.ty(ctx.db()).is_bool() {
112114
cov_mark::hit!(not_applicable_non_bool_const);
@@ -115,12 +117,12 @@ fn find_bool_node(ctx: &AssistContext<'_>) -> Option<BoolNodeData> {
115117

116118
Some(BoolNodeData {
117119
target_node: const_.syntax().clone(),
118-
name: const_.name()?,
120+
name,
119121
ty_annotation: const_.ty(),
120122
initializer: const_.body(),
121123
definition: Definition::Const(def),
122124
})
123-
} else if let Some(static_) = ctx.find_node_at_offset::<ast::Static>() {
125+
} else if let Some(static_) = name.syntax().ancestors().find_map(ast::Static::cast) {
124126
let def = ctx.sema.to_def(&static_)?;
125127
if !def.ty(ctx.db()).is_bool() {
126128
cov_mark::hit!(not_applicable_non_bool_static);
@@ -129,14 +131,14 @@ fn find_bool_node(ctx: &AssistContext<'_>) -> Option<BoolNodeData> {
129131

130132
Some(BoolNodeData {
131133
target_node: static_.syntax().clone(),
132-
name: static_.name()?,
134+
name,
133135
ty_annotation: static_.ty(),
134136
initializer: static_.body(),
135137
definition: Definition::Static(def),
136138
})
137-
} else if let Some(field_name) = ctx.find_node_at_offset::<ast::Name>() {
138-
let field = field_name.syntax().ancestors().find_map(ast::RecordField::cast)?;
139-
if field.name()? != field_name {
139+
} else {
140+
let field = name.syntax().ancestors().find_map(ast::RecordField::cast)?;
141+
if field.name()? != name {
140142
return None;
141143
}
142144

@@ -148,13 +150,11 @@ fn find_bool_node(ctx: &AssistContext<'_>) -> Option<BoolNodeData> {
148150
}
149151
Some(BoolNodeData {
150152
target_node: strukt.syntax().clone(),
151-
name: field_name,
153+
name,
152154
ty_annotation: field.ty(),
153155
initializer: None,
154156
definition: Definition::Field(def),
155157
})
156-
} else {
157-
None
158158
}
159159
}
160160

@@ -528,6 +528,18 @@ fn main() {
528528
)
529529
}
530530

531+
#[test]
532+
fn local_variable_cursor_not_on_ident() {
533+
check_assist_not_applicable(
534+
bool_to_enum,
535+
r#"
536+
fn main() {
537+
let foo = $0true;
538+
}
539+
"#,
540+
)
541+
}
542+
531543
#[test]
532544
fn local_variable_non_ident_pat() {
533545
cov_mark::check!(not_applicable_in_non_ident_pat);
@@ -762,4 +774,9 @@ fn main() {
762774
"#,
763775
)
764776
}
777+
778+
#[test]
779+
fn not_applicable_to_other_names() {
780+
check_assist_not_applicable(bool_to_enum, "fn $0main() {}")
781+
}
765782
}

0 commit comments

Comments
 (0)