From b831b17b3dbc475420924834b250f07bccd673d0 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Fri, 7 Feb 2020 14:53:50 +0100 Subject: [PATCH 1/7] Simplify --- crates/ra_assists/src/assist_ctx.rs | 16 ++------- crates/ra_assists/src/lib.rs | 55 ++++++++++++++--------------- 2 files changed, 29 insertions(+), 42 deletions(-) diff --git a/crates/ra_assists/src/assist_ctx.rs b/crates/ra_assists/src/assist_ctx.rs index f32072dbdb6..b2381bd971d 100644 --- a/crates/ra_assists/src/assist_ctx.rs +++ b/crates/ra_assists/src/assist_ctx.rs @@ -69,23 +69,11 @@ impl<'a> Clone for AssistCtx<'a> { } impl<'a> AssistCtx<'a> { - pub(crate) fn with_ctx( - db: &RootDatabase, - frange: FileRange, - should_compute_edit: bool, - f: F, - ) -> T - where - F: FnOnce(AssistCtx) -> T, - { + pub fn new(db: &RootDatabase, frange: FileRange, should_compute_edit: bool) -> AssistCtx { let parse = db.parse(frange.file_id); - - let ctx = AssistCtx { db, frange, source_file: parse.tree(), should_compute_edit }; - f(ctx) + AssistCtx { db, frange, source_file: parse.tree(), should_compute_edit } } -} -impl<'a> AssistCtx<'a> { pub(crate) fn add_assist( self, id: AssistId, diff --git a/crates/ra_assists/src/lib.rs b/crates/ra_assists/src/lib.rs index 3f3df3f969b..fcdfe6c14db 100644 --- a/crates/ra_assists/src/lib.rs +++ b/crates/ra_assists/src/lib.rs @@ -37,6 +37,7 @@ pub struct AssistAction { pub label: Option, pub edit: TextEdit, pub cursor_position: Option, + // FIXME: This belongs to `AssistLabel` pub target: Option, } @@ -60,16 +61,15 @@ impl ResolvedAssist { /// Assists are returned in the "unresolved" state, that is only labels are /// returned, without actual edits. pub fn unresolved_assists(db: &RootDatabase, range: FileRange) -> Vec { - AssistCtx::with_ctx(db, range, false, |ctx| { - assists::all() - .iter() - .filter_map(|f| f(ctx.clone())) - .map(|a| match a { - Assist::Unresolved { label } => label, - Assist::Resolved { .. } => unreachable!(), - }) - .collect() - }) + let ctx = AssistCtx::new(db, range, false); + assists::all() + .iter() + .filter_map(|f| f(ctx.clone())) + .map(|a| match a { + Assist::Unresolved { label } => label, + Assist::Resolved { .. } => unreachable!(), + }) + .collect() } /// Return all the assists applicable at the given position. @@ -77,18 +77,17 @@ pub fn unresolved_assists(db: &RootDatabase, range: FileRange) -> Vec Vec { - AssistCtx::with_ctx(db, range, true, |ctx| { - let mut a = assists::all() - .iter() - .filter_map(|f| f(ctx.clone())) - .map(|a| match a { - Assist::Resolved { assist } => assist, - Assist::Unresolved { .. } => unreachable!(), - }) - .collect(); - sort_assists(&mut a); - a - }) + let ctx = AssistCtx::new(db, range, true); + let mut a = assists::all() + .iter() + .filter_map(|f| f(ctx.clone())) + .map(|a| match a { + Assist::Resolved { assist } => assist, + Assist::Unresolved { .. } => unreachable!(), + }) + .collect(); + sort_assists(&mut a); + a } fn sort_assists(assists: &mut Vec) { @@ -192,7 +191,7 @@ mod helpers { let frange = FileRange { file_id, range: TextRange::offset_len(before_cursor_pos, 0.into()) }; let assist = - AssistCtx::with_ctx(&db, frange, true, assist).expect("code action is not applicable"); + assist(AssistCtx::new(&db, frange, true)).expect("code action is not applicable"); let action = match assist { Assist::Unresolved { .. } => unreachable!(), Assist::Resolved { assist } => assist.get_first_action(), @@ -219,7 +218,7 @@ mod helpers { let (db, file_id) = with_single_file(&before); let frange = FileRange { file_id, range }; let assist = - AssistCtx::with_ctx(&db, frange, true, assist).expect("code action is not applicable"); + assist(AssistCtx::new(&db, frange, true)).expect("code action is not applicable"); let action = match assist { Assist::Unresolved { .. } => unreachable!(), Assist::Resolved { assist } => assist.get_first_action(), @@ -242,7 +241,7 @@ mod helpers { let frange = FileRange { file_id, range: TextRange::offset_len(before_cursor_pos, 0.into()) }; let assist = - AssistCtx::with_ctx(&db, frange, true, assist).expect("code action is not applicable"); + assist(AssistCtx::new(&db, frange, true)).expect("code action is not applicable"); let action = match assist { Assist::Unresolved { .. } => unreachable!(), Assist::Resolved { assist } => assist.get_first_action(), @@ -261,7 +260,7 @@ mod helpers { let (db, file_id) = with_single_file(&before); let frange = FileRange { file_id, range }; let assist = - AssistCtx::with_ctx(&db, frange, true, assist).expect("code action is not applicable"); + assist(AssistCtx::new(&db, frange, true)).expect("code action is not applicable"); let action = match assist { Assist::Unresolved { .. } => unreachable!(), Assist::Resolved { assist } => assist.get_first_action(), @@ -279,7 +278,7 @@ mod helpers { let (db, file_id) = with_single_file(&before); let frange = FileRange { file_id, range: TextRange::offset_len(before_cursor_pos, 0.into()) }; - let assist = AssistCtx::with_ctx(&db, frange, true, assist); + let assist = assist(AssistCtx::new(&db, frange, true)); assert!(assist.is_none()); } @@ -290,7 +289,7 @@ mod helpers { let (range, before) = extract_range(before); let (db, file_id) = with_single_file(&before); let frange = FileRange { file_id, range }; - let assist = AssistCtx::with_ctx(&db, frange, true, assist); + let assist = assist(AssistCtx::new(&db, frange, true)); assert!(assist.is_none()); } } From 2d95047f7c273f9e97c33b93487c9091ec6abcb7 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Fri, 7 Feb 2020 14:55:47 +0100 Subject: [PATCH 2/7] Cleanup --- crates/ra_assists/src/lib.rs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/crates/ra_assists/src/lib.rs b/crates/ra_assists/src/lib.rs index fcdfe6c14db..b71df7e5d56 100644 --- a/crates/ra_assists/src/lib.rs +++ b/crates/ra_assists/src/lib.rs @@ -11,6 +11,8 @@ mod marks; mod doc_tests; pub mod ast_transform; +use std::cmp::Ordering; + use either::Either; use ra_db::FileRange; use ra_ide_db::RootDatabase; @@ -85,13 +87,12 @@ pub fn resolved_assists(db: &RootDatabase, range: FileRange) -> Vec assist, Assist::Unresolved { .. } => unreachable!(), }) - .collect(); + .collect::>(); sort_assists(&mut a); a } -fn sort_assists(assists: &mut Vec) { - use std::cmp::Ordering; +fn sort_assists(assists: &mut [ResolvedAssist]) { assists.sort_by(|a, b| match (a.get_first_action().target, b.get_first_action().target) { (Some(a), Some(b)) => a.len().cmp(&b.len()), (Some(_), None) => Ordering::Less, From 6ac9c4ad6ae2ce246a8c70d468ae2dabb484a03d Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Fri, 7 Feb 2020 15:04:50 +0100 Subject: [PATCH 3/7] Cleanup --- crates/ra_assists/src/assist_ctx.rs | 7 +++---- crates/ra_assists/src/lib.rs | 8 ++++++++ 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/crates/ra_assists/src/assist_ctx.rs b/crates/ra_assists/src/assist_ctx.rs index b2381bd971d..44d6f680816 100644 --- a/crates/ra_assists/src/assist_ctx.rs +++ b/crates/ra_assists/src/assist_ctx.rs @@ -57,7 +57,7 @@ pub(crate) struct AssistCtx<'a> { should_compute_edit: bool, } -impl<'a> Clone for AssistCtx<'a> { +impl Clone for AssistCtx<'_> { fn clone(&self) -> Self { AssistCtx { db: self.db, @@ -80,8 +80,7 @@ impl<'a> AssistCtx<'a> { label: impl Into, f: impl FnOnce(&mut ActionBuilder), ) -> Option { - let label = AssistLabel { label: label.into(), id }; - assert!(label.label.chars().nth(0).unwrap().is_uppercase()); + let label = AssistLabel::new(label.into(), id); let assist = if self.should_compute_edit { let action = { @@ -103,7 +102,7 @@ impl<'a> AssistCtx<'a> { label: impl Into, f: impl FnOnce() -> Vec, ) -> Option { - let label = AssistLabel { label: label.into(), id }; + let label = AssistLabel::new(label.into(), id); let assist = if self.should_compute_edit { let actions = f(); assert!(!actions.is_empty(), "Assist cannot have no"); diff --git a/crates/ra_assists/src/lib.rs b/crates/ra_assists/src/lib.rs index b71df7e5d56..d476088a236 100644 --- a/crates/ra_assists/src/lib.rs +++ b/crates/ra_assists/src/lib.rs @@ -34,6 +34,14 @@ pub struct AssistLabel { pub id: AssistId, } +impl AssistLabel { + pub(crate) fn new(label: String, id: AssistId) -> AssistLabel { + // FIXME: make fields private, so that this invariant can't be broken + assert!(label.chars().nth(0).unwrap().is_uppercase()); + AssistLabel { label: label.into(), id } + } +} + #[derive(Debug, Clone)] pub struct AssistAction { pub label: Option, From ce44547cfb4f16761bf5cbef87088f117fc07bdf Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Fri, 7 Feb 2020 15:10:19 +0100 Subject: [PATCH 4/7] Cleanup imports --- crates/ra_assists/src/assists/auto_import.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/ra_assists/src/assists/auto_import.rs b/crates/ra_assists/src/assists/auto_import.rs index 10c4b7d7c34..18ea98105a9 100644 --- a/crates/ra_assists/src/assists/auto_import.rs +++ b/crates/ra_assists/src/assists/auto_import.rs @@ -1,4 +1,5 @@ use hir::ModPath; +use ra_ide_db::imports_locator::ImportsLocator; use ra_syntax::{ ast::{self, AstNode}, SyntaxNode, @@ -8,7 +9,6 @@ use crate::{ assist_ctx::{ActionBuilder, Assist, AssistCtx}, auto_import_text_edit, AssistId, }; -use ra_ide_db::imports_locator::ImportsLocator; // Assist: auto_import // From aa64a84b493aa9c0b22f36b472a445d622cd2172 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Fri, 7 Feb 2020 15:12:51 +0100 Subject: [PATCH 5/7] Cleanups --- crates/ra_assists/src/assists/auto_import.rs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/crates/ra_assists/src/assists/auto_import.rs b/crates/ra_assists/src/assists/auto_import.rs index 18ea98105a9..84b5474f9d5 100644 --- a/crates/ra_assists/src/assists/auto_import.rs +++ b/crates/ra_assists/src/assists/auto_import.rs @@ -9,6 +9,7 @@ use crate::{ assist_ctx::{ActionBuilder, Assist, AssistCtx}, auto_import_text_edit, AssistId, }; +use std::collections::BTreeSet; // Assist: auto_import // @@ -60,7 +61,8 @@ pub(crate) fn auto_import(ctx: AssistCtx) -> Option { .filter_map(|module_def| module_with_name_to_import.find_use_path(ctx.db, module_def)) .filter(|use_path| !use_path.segments.is_empty()) .take(20) - .collect::>(); + .collect::>(); + if proposed_imports.is_empty() { return None; } @@ -82,9 +84,10 @@ fn import_to_action(import: ModPath, position: &SyntaxNode, anchor: &SyntaxNode) #[cfg(test)] mod tests { - use super::*; use crate::helpers::{check_assist, check_assist_not_applicable}; + use super::*; + #[test] fn applicable_when_found_an_import() { check_assist( From 561b4b11ff1d87ea1ff2477dcba6ae1f396573a3 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Fri, 7 Feb 2020 15:53:31 +0100 Subject: [PATCH 6/7] Name assist handlers --- crates/ra_assists/src/assist_ctx.rs | 2 + .../{assists => handlers}/add_custom_impl.rs | 0 .../src/{assists => handlers}/add_derive.rs | 0 .../add_explicit_type.rs | 0 .../src/{assists => handlers}/add_impl.rs | 0 .../src/{assists => handlers}/add_import.rs | 0 .../add_missing_impl_members.rs | 0 .../src/{assists => handlers}/add_new.rs | 0 .../{assists => handlers}/apply_demorgan.rs | 0 .../src/{assists => handlers}/auto_import.rs | 0 .../change_visibility.rs | 0 .../src/{assists => handlers}/early_return.rs | 2 +- .../{assists => handlers}/fill_match_arms.rs | 0 .../src/{assists => handlers}/flip_binexpr.rs | 0 .../src/{assists => handlers}/flip_comma.rs | 0 .../{assists => handlers}/flip_trait_bound.rs | 0 .../inline_local_variable.rs | 0 .../introduce_variable.rs | 0 .../src/{assists => handlers}/invert_if.rs | 0 .../{assists => handlers}/merge_match_arms.rs | 0 .../src/{assists => handlers}/move_bounds.rs | 0 .../src/{assists => handlers}/move_guard.rs | 0 .../src/{assists => handlers}/raw_string.rs | 0 .../src/{assists => handlers}/remove_dbg.rs | 0 .../replace_if_let_with_match.rs | 0 .../src/{assists => handlers}/split_import.rs | 0 crates/ra_assists/src/lib.rs | 46 ++++++------------- xtask/src/codegen.rs | 2 +- xtask/tests/tidy-tests/docs.rs | 2 +- 29 files changed, 19 insertions(+), 35 deletions(-) rename crates/ra_assists/src/{assists => handlers}/add_custom_impl.rs (100%) rename crates/ra_assists/src/{assists => handlers}/add_derive.rs (100%) rename crates/ra_assists/src/{assists => handlers}/add_explicit_type.rs (100%) rename crates/ra_assists/src/{assists => handlers}/add_impl.rs (100%) rename crates/ra_assists/src/{assists => handlers}/add_import.rs (100%) rename crates/ra_assists/src/{assists => handlers}/add_missing_impl_members.rs (100%) rename crates/ra_assists/src/{assists => handlers}/add_new.rs (100%) rename crates/ra_assists/src/{assists => handlers}/apply_demorgan.rs (100%) rename crates/ra_assists/src/{assists => handlers}/auto_import.rs (100%) rename crates/ra_assists/src/{assists => handlers}/change_visibility.rs (100%) rename crates/ra_assists/src/{assists => handlers}/early_return.rs (99%) rename crates/ra_assists/src/{assists => handlers}/fill_match_arms.rs (100%) rename crates/ra_assists/src/{assists => handlers}/flip_binexpr.rs (100%) rename crates/ra_assists/src/{assists => handlers}/flip_comma.rs (100%) rename crates/ra_assists/src/{assists => handlers}/flip_trait_bound.rs (100%) rename crates/ra_assists/src/{assists => handlers}/inline_local_variable.rs (100%) rename crates/ra_assists/src/{assists => handlers}/introduce_variable.rs (100%) rename crates/ra_assists/src/{assists => handlers}/invert_if.rs (100%) rename crates/ra_assists/src/{assists => handlers}/merge_match_arms.rs (100%) rename crates/ra_assists/src/{assists => handlers}/move_bounds.rs (100%) rename crates/ra_assists/src/{assists => handlers}/move_guard.rs (100%) rename crates/ra_assists/src/{assists => handlers}/raw_string.rs (100%) rename crates/ra_assists/src/{assists => handlers}/remove_dbg.rs (100%) rename crates/ra_assists/src/{assists => handlers}/replace_if_let_with_match.rs (100%) rename crates/ra_assists/src/{assists => handlers}/split_import.rs (100%) diff --git a/crates/ra_assists/src/assist_ctx.rs b/crates/ra_assists/src/assist_ctx.rs index 44d6f680816..81f999090a1 100644 --- a/crates/ra_assists/src/assist_ctx.rs +++ b/crates/ra_assists/src/assist_ctx.rs @@ -19,6 +19,8 @@ pub(crate) enum Assist { Resolved { assist: ResolvedAssist }, } +pub(crate) type AssistHandler = fn(AssistCtx) -> Option; + /// `AssistCtx` allows to apply an assist or check if it could be applied. /// /// Assists use a somewhat over-engineered approach, given the current needs. The diff --git a/crates/ra_assists/src/assists/add_custom_impl.rs b/crates/ra_assists/src/handlers/add_custom_impl.rs similarity index 100% rename from crates/ra_assists/src/assists/add_custom_impl.rs rename to crates/ra_assists/src/handlers/add_custom_impl.rs diff --git a/crates/ra_assists/src/assists/add_derive.rs b/crates/ra_assists/src/handlers/add_derive.rs similarity index 100% rename from crates/ra_assists/src/assists/add_derive.rs rename to crates/ra_assists/src/handlers/add_derive.rs diff --git a/crates/ra_assists/src/assists/add_explicit_type.rs b/crates/ra_assists/src/handlers/add_explicit_type.rs similarity index 100% rename from crates/ra_assists/src/assists/add_explicit_type.rs rename to crates/ra_assists/src/handlers/add_explicit_type.rs diff --git a/crates/ra_assists/src/assists/add_impl.rs b/crates/ra_assists/src/handlers/add_impl.rs similarity index 100% rename from crates/ra_assists/src/assists/add_impl.rs rename to crates/ra_assists/src/handlers/add_impl.rs diff --git a/crates/ra_assists/src/assists/add_import.rs b/crates/ra_assists/src/handlers/add_import.rs similarity index 100% rename from crates/ra_assists/src/assists/add_import.rs rename to crates/ra_assists/src/handlers/add_import.rs diff --git a/crates/ra_assists/src/assists/add_missing_impl_members.rs b/crates/ra_assists/src/handlers/add_missing_impl_members.rs similarity index 100% rename from crates/ra_assists/src/assists/add_missing_impl_members.rs rename to crates/ra_assists/src/handlers/add_missing_impl_members.rs diff --git a/crates/ra_assists/src/assists/add_new.rs b/crates/ra_assists/src/handlers/add_new.rs similarity index 100% rename from crates/ra_assists/src/assists/add_new.rs rename to crates/ra_assists/src/handlers/add_new.rs diff --git a/crates/ra_assists/src/assists/apply_demorgan.rs b/crates/ra_assists/src/handlers/apply_demorgan.rs similarity index 100% rename from crates/ra_assists/src/assists/apply_demorgan.rs rename to crates/ra_assists/src/handlers/apply_demorgan.rs diff --git a/crates/ra_assists/src/assists/auto_import.rs b/crates/ra_assists/src/handlers/auto_import.rs similarity index 100% rename from crates/ra_assists/src/assists/auto_import.rs rename to crates/ra_assists/src/handlers/auto_import.rs diff --git a/crates/ra_assists/src/assists/change_visibility.rs b/crates/ra_assists/src/handlers/change_visibility.rs similarity index 100% rename from crates/ra_assists/src/assists/change_visibility.rs rename to crates/ra_assists/src/handlers/change_visibility.rs diff --git a/crates/ra_assists/src/assists/early_return.rs b/crates/ra_assists/src/handlers/early_return.rs similarity index 99% rename from crates/ra_assists/src/assists/early_return.rs rename to crates/ra_assists/src/handlers/early_return.rs index 8f30dc58608..8eb3bd47380 100644 --- a/crates/ra_assists/src/assists/early_return.rs +++ b/crates/ra_assists/src/handlers/early_return.rs @@ -10,7 +10,7 @@ use ra_syntax::{ use crate::{ assist_ctx::{Assist, AssistCtx}, - assists::invert_if::invert_boolean_expression, + handlers::invert_if::invert_boolean_expression, AssistId, }; diff --git a/crates/ra_assists/src/assists/fill_match_arms.rs b/crates/ra_assists/src/handlers/fill_match_arms.rs similarity index 100% rename from crates/ra_assists/src/assists/fill_match_arms.rs rename to crates/ra_assists/src/handlers/fill_match_arms.rs diff --git a/crates/ra_assists/src/assists/flip_binexpr.rs b/crates/ra_assists/src/handlers/flip_binexpr.rs similarity index 100% rename from crates/ra_assists/src/assists/flip_binexpr.rs rename to crates/ra_assists/src/handlers/flip_binexpr.rs diff --git a/crates/ra_assists/src/assists/flip_comma.rs b/crates/ra_assists/src/handlers/flip_comma.rs similarity index 100% rename from crates/ra_assists/src/assists/flip_comma.rs rename to crates/ra_assists/src/handlers/flip_comma.rs diff --git a/crates/ra_assists/src/assists/flip_trait_bound.rs b/crates/ra_assists/src/handlers/flip_trait_bound.rs similarity index 100% rename from crates/ra_assists/src/assists/flip_trait_bound.rs rename to crates/ra_assists/src/handlers/flip_trait_bound.rs diff --git a/crates/ra_assists/src/assists/inline_local_variable.rs b/crates/ra_assists/src/handlers/inline_local_variable.rs similarity index 100% rename from crates/ra_assists/src/assists/inline_local_variable.rs rename to crates/ra_assists/src/handlers/inline_local_variable.rs diff --git a/crates/ra_assists/src/assists/introduce_variable.rs b/crates/ra_assists/src/handlers/introduce_variable.rs similarity index 100% rename from crates/ra_assists/src/assists/introduce_variable.rs rename to crates/ra_assists/src/handlers/introduce_variable.rs diff --git a/crates/ra_assists/src/assists/invert_if.rs b/crates/ra_assists/src/handlers/invert_if.rs similarity index 100% rename from crates/ra_assists/src/assists/invert_if.rs rename to crates/ra_assists/src/handlers/invert_if.rs diff --git a/crates/ra_assists/src/assists/merge_match_arms.rs b/crates/ra_assists/src/handlers/merge_match_arms.rs similarity index 100% rename from crates/ra_assists/src/assists/merge_match_arms.rs rename to crates/ra_assists/src/handlers/merge_match_arms.rs diff --git a/crates/ra_assists/src/assists/move_bounds.rs b/crates/ra_assists/src/handlers/move_bounds.rs similarity index 100% rename from crates/ra_assists/src/assists/move_bounds.rs rename to crates/ra_assists/src/handlers/move_bounds.rs diff --git a/crates/ra_assists/src/assists/move_guard.rs b/crates/ra_assists/src/handlers/move_guard.rs similarity index 100% rename from crates/ra_assists/src/assists/move_guard.rs rename to crates/ra_assists/src/handlers/move_guard.rs diff --git a/crates/ra_assists/src/assists/raw_string.rs b/crates/ra_assists/src/handlers/raw_string.rs similarity index 100% rename from crates/ra_assists/src/assists/raw_string.rs rename to crates/ra_assists/src/handlers/raw_string.rs diff --git a/crates/ra_assists/src/assists/remove_dbg.rs b/crates/ra_assists/src/handlers/remove_dbg.rs similarity index 100% rename from crates/ra_assists/src/assists/remove_dbg.rs rename to crates/ra_assists/src/handlers/remove_dbg.rs diff --git a/crates/ra_assists/src/assists/replace_if_let_with_match.rs b/crates/ra_assists/src/handlers/replace_if_let_with_match.rs similarity index 100% rename from crates/ra_assists/src/assists/replace_if_let_with_match.rs rename to crates/ra_assists/src/handlers/replace_if_let_with_match.rs diff --git a/crates/ra_assists/src/assists/split_import.rs b/crates/ra_assists/src/handlers/split_import.rs similarity index 100% rename from crates/ra_assists/src/assists/split_import.rs rename to crates/ra_assists/src/handlers/split_import.rs diff --git a/crates/ra_assists/src/lib.rs b/crates/ra_assists/src/lib.rs index d476088a236..7b08e8fd7f4 100644 --- a/crates/ra_assists/src/lib.rs +++ b/crates/ra_assists/src/lib.rs @@ -19,8 +19,8 @@ use ra_ide_db::RootDatabase; use ra_syntax::{TextRange, TextUnit}; use ra_text_edit::TextEdit; -pub(crate) use crate::assist_ctx::{Assist, AssistCtx}; -pub use crate::assists::add_import::auto_import_text_edit; +pub(crate) use crate::assist_ctx::{Assist, AssistCtx, AssistHandler}; +pub use crate::handlers::add_import::auto_import_text_edit; /// Unique identifier of the assist, should not be shown to the user /// directly. @@ -72,7 +72,7 @@ impl ResolvedAssist { /// returned, without actual edits. pub fn unresolved_assists(db: &RootDatabase, range: FileRange) -> Vec { let ctx = AssistCtx::new(db, range, false); - assists::all() + handlers::all() .iter() .filter_map(|f| f(ctx.clone())) .map(|a| match a { @@ -88,7 +88,7 @@ pub fn unresolved_assists(db: &RootDatabase, range: FileRange) -> Vec Vec { let ctx = AssistCtx::new(db, range, true); - let mut a = assists::all() + let mut a = handlers::all() .iter() .filter_map(|f| f(ctx.clone())) .map(|a| match a { @@ -109,8 +109,8 @@ fn sort_assists(assists: &mut [ResolvedAssist]) { }); } -mod assists { - use crate::{Assist, AssistCtx}; +mod handlers { + use crate::AssistHandler; mod add_derive; mod add_explicit_type; @@ -138,7 +138,7 @@ mod assists { mod move_bounds; mod early_return; - pub(crate) fn all() -> &'static [fn(AssistCtx) -> Option] { + pub(crate) fn all() -> &'static [AssistHandler] { &[ add_derive::add_derive, add_explicit_type::add_explicit_type, @@ -183,7 +183,7 @@ mod helpers { use ra_syntax::TextRange; use test_utils::{add_cursor, assert_eq_text, extract_offset, extract_range}; - use crate::{Assist, AssistCtx}; + use crate::{Assist, AssistCtx, AssistHandler}; pub(crate) fn with_single_file(text: &str) -> (RootDatabase, FileId) { let (mut db, file_id) = RootDatabase::with_single_file(text); @@ -194,7 +194,7 @@ mod helpers { (db, file_id) } - pub(crate) fn check_assist(assist: fn(AssistCtx) -> Option, before: &str, after: &str) { + pub(crate) fn check_assist(assist: AssistHandler, before: &str, after: &str) { let (before_cursor_pos, before) = extract_offset(before); let (db, file_id) = with_single_file(&before); let frange = @@ -218,11 +218,7 @@ mod helpers { assert_eq_text!(after, &actual); } - pub(crate) fn check_assist_range( - assist: fn(AssistCtx) -> Option, - before: &str, - after: &str, - ) { + pub(crate) fn check_assist_range(assist: AssistHandler, before: &str, after: &str) { let (range, before) = extract_range(before); let (db, file_id) = with_single_file(&before); let frange = FileRange { file_id, range }; @@ -240,11 +236,7 @@ mod helpers { assert_eq_text!(after, &actual); } - pub(crate) fn check_assist_target( - assist: fn(AssistCtx) -> Option, - before: &str, - target: &str, - ) { + pub(crate) fn check_assist_target(assist: AssistHandler, before: &str, target: &str) { let (before_cursor_pos, before) = extract_offset(before); let (db, file_id) = with_single_file(&before); let frange = @@ -260,11 +252,7 @@ mod helpers { assert_eq_text!(&before[range.start().to_usize()..range.end().to_usize()], target); } - pub(crate) fn check_assist_range_target( - assist: fn(AssistCtx) -> Option, - before: &str, - target: &str, - ) { + pub(crate) fn check_assist_range_target(assist: AssistHandler, before: &str, target: &str) { let (range, before) = extract_range(before); let (db, file_id) = with_single_file(&before); let frange = FileRange { file_id, range }; @@ -279,10 +267,7 @@ mod helpers { assert_eq_text!(&before[range.start().to_usize()..range.end().to_usize()], target); } - pub(crate) fn check_assist_not_applicable( - assist: fn(AssistCtx) -> Option, - before: &str, - ) { + pub(crate) fn check_assist_not_applicable(assist: AssistHandler, before: &str) { let (before_cursor_pos, before) = extract_offset(before); let (db, file_id) = with_single_file(&before); let frange = @@ -291,10 +276,7 @@ mod helpers { assert!(assist.is_none()); } - pub(crate) fn check_assist_range_not_applicable( - assist: fn(AssistCtx) -> Option, - before: &str, - ) { + pub(crate) fn check_assist_range_not_applicable(assist: AssistHandler, before: &str) { let (range, before) = extract_range(before); let (db, file_id) = with_single_file(&before); let frange = FileRange { file_id, range }; diff --git a/xtask/src/codegen.rs b/xtask/src/codegen.rs index efa638e0603..a53d573359a 100644 --- a/xtask/src/codegen.rs +++ b/xtask/src/codegen.rs @@ -25,7 +25,7 @@ const ERR_INLINE_TESTS_DIR: &str = "crates/ra_syntax/test_data/parser/inline/err pub const SYNTAX_KINDS: &str = "crates/ra_parser/src/syntax_kind/generated.rs"; pub const AST: &str = "crates/ra_syntax/src/ast/generated.rs"; -const ASSISTS_DIR: &str = "crates/ra_assists/src/assists"; +const ASSISTS_DIR: &str = "crates/ra_assists/src/handlers"; const ASSISTS_TESTS: &str = "crates/ra_assists/src/doc_tests/generated.rs"; const ASSISTS_DOCS: &str = "docs/user/assists.md"; diff --git a/xtask/tests/tidy-tests/docs.rs b/xtask/tests/tidy-tests/docs.rs index 8a005d6c4dc..6a69e7d6a0f 100644 --- a/xtask/tests/tidy-tests/docs.rs +++ b/xtask/tests/tidy-tests/docs.rs @@ -6,7 +6,7 @@ use xtask::project_root; fn is_exclude_dir(p: &Path) -> bool { // Test hopefully don't really need comments, and for assists we already // have special comments which are source of doc tests and user docs. - let exclude_dirs = ["tests", "test_data", "assists"]; + let exclude_dirs = ["tests", "test_data", "handlers"]; let mut cur_path = p; while let Some(path) = cur_path.parent() { if exclude_dirs.iter().any(|dir| path.ends_with(dir)) { From d00add1f1fec59494c3c1a99c27937ae3891458d Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Fri, 7 Feb 2020 15:57:38 +0100 Subject: [PATCH 7/7] Introduce assists utils --- .../ra_assists/src/handlers/apply_demorgan.rs | 3 +-- .../ra_assists/src/handlers/early_return.rs | 2 +- crates/ra_assists/src/handlers/invert_if.rs | 25 ++--------------- crates/ra_assists/src/lib.rs | 1 + crates/ra_assists/src/utils.rs | 27 +++++++++++++++++++ 5 files changed, 32 insertions(+), 26 deletions(-) create mode 100644 crates/ra_assists/src/utils.rs diff --git a/crates/ra_assists/src/handlers/apply_demorgan.rs b/crates/ra_assists/src/handlers/apply_demorgan.rs index ba08a8223b9..239807e2431 100644 --- a/crates/ra_assists/src/handlers/apply_demorgan.rs +++ b/crates/ra_assists/src/handlers/apply_demorgan.rs @@ -1,7 +1,6 @@ -use super::invert_if::invert_boolean_expression; use ra_syntax::ast::{self, AstNode}; -use crate::{Assist, AssistCtx, AssistId}; +use crate::{utils::invert_boolean_expression, Assist, AssistCtx, AssistId}; // Assist: apply_demorgan // diff --git a/crates/ra_assists/src/handlers/early_return.rs b/crates/ra_assists/src/handlers/early_return.rs index 8eb3bd47380..22f88884f4a 100644 --- a/crates/ra_assists/src/handlers/early_return.rs +++ b/crates/ra_assists/src/handlers/early_return.rs @@ -10,7 +10,7 @@ use ra_syntax::{ use crate::{ assist_ctx::{Assist, AssistCtx}, - handlers::invert_if::invert_boolean_expression, + utils::invert_boolean_expression, AssistId, }; diff --git a/crates/ra_assists/src/handlers/invert_if.rs b/crates/ra_assists/src/handlers/invert_if.rs index 983392f21ee..a594e7e0c38 100644 --- a/crates/ra_assists/src/handlers/invert_if.rs +++ b/crates/ra_assists/src/handlers/invert_if.rs @@ -1,7 +1,7 @@ -use ra_syntax::ast::{self, make, AstNode}; +use ra_syntax::ast::{self, AstNode}; use ra_syntax::T; -use crate::{Assist, AssistCtx, AssistId}; +use crate::{utils::invert_boolean_expression, Assist, AssistCtx, AssistId}; // Assist: invert_if // @@ -51,27 +51,6 @@ pub(crate) fn invert_if(ctx: AssistCtx) -> Option { None } -pub(crate) fn invert_boolean_expression(expr: ast::Expr) -> ast::Expr { - if let Some(expr) = invert_special_case(&expr) { - return expr; - } - make::expr_prefix(T![!], expr) -} - -pub(crate) fn invert_special_case(expr: &ast::Expr) -> Option { - match expr { - ast::Expr::BinExpr(bin) => match bin.op_kind()? { - ast::BinOp::NegatedEqualityTest => bin.replace_op(T![==]).map(|it| it.into()), - ast::BinOp::EqualityTest => bin.replace_op(T![!=]).map(|it| it.into()), - _ => None, - }, - ast::Expr::PrefixExpr(pe) if pe.op_kind()? == ast::PrefixOp::Not => pe.expr(), - // FIXME: - // ast::Expr::Literal(true | false ) - _ => None, - } -} - #[cfg(test)] mod tests { use super::*; diff --git a/crates/ra_assists/src/lib.rs b/crates/ra_assists/src/lib.rs index 7b08e8fd7f4..eca6dec4b0f 100644 --- a/crates/ra_assists/src/lib.rs +++ b/crates/ra_assists/src/lib.rs @@ -9,6 +9,7 @@ mod assist_ctx; mod marks; #[cfg(test)] mod doc_tests; +mod utils; pub mod ast_transform; use std::cmp::Ordering; diff --git a/crates/ra_assists/src/utils.rs b/crates/ra_assists/src/utils.rs new file mode 100644 index 00000000000..0d57222956f --- /dev/null +++ b/crates/ra_assists/src/utils.rs @@ -0,0 +1,27 @@ +//! Assorted functions shared by several assists. + +use ra_syntax::{ + ast::{self, make}, + T, +}; + +pub(crate) fn invert_boolean_expression(expr: ast::Expr) -> ast::Expr { + if let Some(expr) = invert_special_case(&expr) { + return expr; + } + make::expr_prefix(T![!], expr) +} + +fn invert_special_case(expr: &ast::Expr) -> Option { + match expr { + ast::Expr::BinExpr(bin) => match bin.op_kind()? { + ast::BinOp::NegatedEqualityTest => bin.replace_op(T![==]).map(|it| it.into()), + ast::BinOp::EqualityTest => bin.replace_op(T![!=]).map(|it| it.into()), + _ => None, + }, + ast::Expr::PrefixExpr(pe) if pe.op_kind()? == ast::PrefixOp::Not => pe.expr(), + // FIXME: + // ast::Expr::Literal(true | false ) + _ => None, + } +}