From 22e1c7a112832a18509d400841b3d162228372bf Mon Sep 17 00:00:00 2001 From: Ville Penttinen Date: Sun, 24 Mar 2019 22:53:41 +0200 Subject: Add convenience functions to SourceChange for creating single edits --- crates/ra_ide_api/src/assists.rs | 11 ++------ crates/ra_ide_api/src/diagnostics.rs | 27 ++++++------------ crates/ra_ide_api/src/lib.rs | 55 ++++++++++++++++++++++++++++-------- crates/ra_ide_api/src/typing.rs | 14 +++++---- 4 files changed, 63 insertions(+), 44 deletions(-) (limited to 'crates') diff --git a/crates/ra_ide_api/src/assists.rs b/crates/ra_ide_api/src/assists.rs index 3c0475a51..9a8c23a15 100644 --- a/crates/ra_ide_api/src/assists.rs +++ b/crates/ra_ide_api/src/assists.rs @@ -17,14 +17,9 @@ pub(crate) fn assists(db: &RootDatabase, frange: FileRange) -> Vec { let file_id = frange.file_id; let file_edit = SourceFileEdit { file_id, edit: action.edit }; let id = label.id; - let change = SourceChange { - label: label.label, - source_file_edits: vec![file_edit], - file_system_edits: vec![], - cursor_position: action - .cursor_position - .map(|offset| FilePosition { offset, file_id }), - }; + let change = SourceChange::source_edit(label.label, file_edit).with_cursor_opt( + action.cursor_position.map(|offset| FilePosition { offset, file_id }), + ); Assist { id, change } }) .collect() diff --git a/crates/ra_ide_api/src/diagnostics.rs b/crates/ra_ide_api/src/diagnostics.rs index b9dc424c6..b0f23773e 100644 --- a/crates/ra_ide_api/src/diagnostics.rs +++ b/crates/ra_ide_api/src/diagnostics.rs @@ -71,12 +71,10 @@ fn check_unnecessary_braces_in_use_statement( range, message: format!("Unnecessary braces in use statement"), severity: Severity::WeakWarning, - fix: Some(SourceChange { - label: "Remove unnecessary braces".to_string(), - source_file_edits: vec![SourceFileEdit { file_id, edit }], - file_system_edits: Vec::new(), - cursor_position: None, - }), + fix: Some(SourceChange::source_edit( + "Remove unnecessary braces", + SourceFileEdit { file_id, edit }, + )), }); } @@ -119,12 +117,10 @@ fn check_struct_shorthand_initialization( range: named_field.syntax().range(), message: format!("Shorthand struct initialization"), severity: Severity::WeakWarning, - fix: Some(SourceChange { - label: "use struct shorthand initialization".to_string(), - source_file_edits: vec![SourceFileEdit { file_id, edit }], - file_system_edits: Vec::new(), - cursor_position: None, - }), + fix: Some(SourceChange::source_edit( + "use struct shorthand initialization", + SourceFileEdit { file_id, edit }, + )), }); } } @@ -144,12 +140,7 @@ fn check_module( Problem::UnresolvedModule { candidate } => { let create_file = FileSystemEdit::CreateFile { source_root, path: candidate.clone() }; - let fix = SourceChange { - label: "create module".to_string(), - source_file_edits: Vec::new(), - file_system_edits: vec![create_file], - cursor_position: None, - }; + let fix = SourceChange::system_edit("create module", create_file); Diagnostic { range: name_node.range(), message: "unresolved module".to_string(), diff --git a/crates/ra_ide_api/src/lib.rs b/crates/ra_ide_api/src/lib.rs index 99f18b6b8..4e4001750 100644 --- a/crates/ra_ide_api/src/lib.rs +++ b/crates/ra_ide_api/src/lib.rs @@ -97,6 +97,44 @@ pub struct SourceChange { pub cursor_position: Option, } +impl SourceChange { + pub fn source_edits>(label: L, edits: Vec) -> Self { + SourceChange { + label: label.into(), + source_file_edits: edits, + file_system_edits: vec![], + cursor_position: None, + } + } + + pub fn system_edits>(label: L, edits: Vec) -> Self { + SourceChange { + label: label.into(), + source_file_edits: vec![], + file_system_edits: edits, + cursor_position: None, + } + } + + pub fn source_edit>(label: L, edit: SourceFileEdit) -> Self { + SourceChange::source_edits(label, vec![edit]) + } + + pub fn system_edit>(label: L, edit: FileSystemEdit) -> Self { + SourceChange::system_edits(label, vec![edit]) + } + + pub fn with_cursor(mut self, cursor_position: FilePosition) -> Self { + self.cursor_position = Some(cursor_position); + self + } + + pub fn with_cursor_opt(mut self, cursor_position: Option) -> Self { + self.cursor_position = cursor_position; + self + } +} + #[derive(Debug)] pub struct SourceFileEdit { pub file_id: FileId, @@ -285,12 +323,7 @@ impl Analysis { file_id: frange.file_id, edit: join_lines::join_lines(&file, frange.range), }; - SourceChange { - label: "join lines".to_string(), - source_file_edits: vec![file_edit], - file_system_edits: vec![], - cursor_position: None, - } + SourceChange::source_edit("join lines", file_edit) } /// Returns an edit which should be applied when opening a new line, fixing @@ -305,12 +338,10 @@ impl Analysis { pub fn on_eq_typed(&self, position: FilePosition) -> Option { let file = self.db.parse(position.file_id); let edit = typing::on_eq_typed(&file, position.offset)?; - Some(SourceChange { - label: "add semicolon".to_string(), - source_file_edits: vec![SourceFileEdit { edit, file_id: position.file_id }], - file_system_edits: vec![], - cursor_position: None, - }) + Some(SourceChange::source_edit( + "add semicolon", + SourceFileEdit { edit, file_id: position.file_id }, + )) } /// Returns an edit which should be applied when a dot ('.') is typed on a blank line, indenting the line appropriately. diff --git a/crates/ra_ide_api/src/typing.rs b/crates/ra_ide_api/src/typing.rs index 94b228466..424084468 100644 --- a/crates/ra_ide_api/src/typing.rs +++ b/crates/ra_ide_api/src/typing.rs @@ -31,12 +31,14 @@ pub(crate) fn on_enter(db: &RootDatabase, position: FilePosition) -> Option(file: &'a SourceFile, node: &SyntaxNode) -> Option<&'a str> { -- cgit v1.2.3