From 2b52bffaefe71a63f7f943c849407cd14237a50b Mon Sep 17 00:00:00 2001 From: winstxnhdw Date: Tue, 9 Jul 2024 22:17:07 +0100 Subject: [PATCH 1/3] feat: do not add new enum if it already exists --- .../ide-assists/src/handlers/bool_to_enum.rs | 41 ++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/crates/ide-assists/src/handlers/bool_to_enum.rs b/crates/ide-assists/src/handlers/bool_to_enum.rs index f094c5c09f..36ad608468 100644 --- a/crates/ide-assists/src/handlers/bool_to_enum.rs +++ b/crates/ide-assists/src/handlers/bool_to_enum.rs @@ -461,7 +461,17 @@ fn add_enum_def( usages: &UsageSearchResult, target_node: SyntaxNode, target_module: &hir::Module, -) { +) -> Option<()> { + if ctx + .find_node_at_offset::()? + .syntax() + .children() + .filter_map(|node| ast::Enum::cast(node).and_then(|e| ctx.sema.to_def(&e))) + .any(|def| def.name(ctx.db()).as_str() == Some("Bool")) + { + return None; + } + let make_enum_pub = usages .iter() .flat_map(|(_, refs)| refs) @@ -480,6 +490,8 @@ fn add_enum_def( insert_before.text_range().start(), format!("{}\n\n{indent}", enum_def.syntax().text()), ); + + Some(()) } /// Finds where to put the new enum definition. @@ -553,6 +565,33 @@ fn function(foo: Bool, bar: bool) { ) } + #[test] + fn no_duplicate_enums() { + check_assist( + bool_to_enum, + r#" +#[derive(PartialEq, Eq)] +enum Bool { True, False } + +fn function(foo: bool, $0bar: bool) { + if bar { + println!("bar"); + } +} +"#, + r#" +#[derive(PartialEq, Eq)] +enum Bool { True, False } + +fn function(foo: bool, bar: Bool) { + if bar == Bool::True { + println!("bar"); + } +} +"#, + ) + } + #[test] fn parameter_with_last_param_usage() { check_assist( From 120526ad68629fcf3115b0a9d298ca3677660c4e Mon Sep 17 00:00:00 2001 From: winstxnhdw Date: Tue, 9 Jul 2024 22:29:22 +0100 Subject: [PATCH 2/3] style: prefer type inference - unrelated to the PR but I wanted to change this in #17467 --- crates/ide-assists/src/handlers/bool_to_enum.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/ide-assists/src/handlers/bool_to_enum.rs b/crates/ide-assists/src/handlers/bool_to_enum.rs index 36ad608468..0534a7139e 100644 --- a/crates/ide-assists/src/handlers/bool_to_enum.rs +++ b/crates/ide-assists/src/handlers/bool_to_enum.rs @@ -96,7 +96,7 @@ struct BoolNodeData { /// Attempts to find an appropriate node to apply the action to. fn find_bool_node(ctx: &AssistContext<'_>) -> Option { - let name: ast::Name = ctx.find_node_at_offset()?; + let name = ctx.find_node_at_offset::()?; if let Some(ident_pat) = name.syntax().parent().and_then(ast::IdentPat::cast) { let def = ctx.sema.to_def(&ident_pat)?; From c4bcec214afb3ac6ea0a8914b8e7deeec7453cf9 Mon Sep 17 00:00:00 2001 From: winstxnhdw Date: Wed, 10 Jul 2024 21:13:13 +0100 Subject: [PATCH 3/3] refactor: search for enum semantically --- crates/ide-assists/src/handlers/bool_to_enum.rs | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/crates/ide-assists/src/handlers/bool_to_enum.rs b/crates/ide-assists/src/handlers/bool_to_enum.rs index 0534a7139e..ab25e0167b 100644 --- a/crates/ide-assists/src/handlers/bool_to_enum.rs +++ b/crates/ide-assists/src/handlers/bool_to_enum.rs @@ -462,12 +462,15 @@ fn add_enum_def( target_node: SyntaxNode, target_module: &hir::Module, ) -> Option<()> { + let insert_before = node_to_insert_before(target_node); + if ctx - .find_node_at_offset::()? - .syntax() - .children() - .filter_map(|node| ast::Enum::cast(node).and_then(|e| ctx.sema.to_def(&e))) - .any(|def| def.name(ctx.db()).as_str() == Some("Bool")) + .sema + .scope(&insert_before)? + .module() + .scope(ctx.db(), Some(*target_module)) + .iter() + .any(|(name, _)| name.as_str() == Some("Bool")) { return None; } @@ -482,7 +485,6 @@ fn add_enum_def( .any(|module| module.nearest_non_block_module(ctx.db()) != *target_module); let enum_def = make_bool_enum(make_enum_pub); - let insert_before = node_to_insert_before(target_node); let indent = IndentLevel::from_node(&insert_before); enum_def.reindent_to(indent);