From a656b891fba4b89775adbc93114a20c99afe5f36 Mon Sep 17 00:00:00 2001 From: Wilco Kusee Date: Sat, 23 Mar 2019 16:55:47 +0100 Subject: Remove LocalEdit usage --- crates/ra_ide_api/src/lib.rs | 29 +++++--------- crates/ra_ide_api/src/typing.rs | 81 ++++++++++++++++++++++---------------- crates/ra_ide_api_light/src/lib.rs | 15 ------- 3 files changed, 55 insertions(+), 70 deletions(-) (limited to 'crates') diff --git a/crates/ra_ide_api/src/lib.rs b/crates/ra_ide_api/src/lib.rs index c2ef61ae2..0e7b47e3c 100644 --- a/crates/ra_ide_api/src/lib.rs +++ b/crates/ra_ide_api/src/lib.rs @@ -72,7 +72,7 @@ pub use crate::{ folding_ranges::{Fold, FoldKind}, }; pub use ra_ide_api_light::{ - HighlightedRange, Severity, StructureNode, LocalEdit, + HighlightedRange, Severity, StructureNode, }; pub use ra_db::{ Canceled, CrateGraph, CrateId, FileId, FilePosition, FileRange, SourceRootId, @@ -295,9 +295,7 @@ impl Analysis { /// Returns an edit which should be applied when opening a new line, fixing /// up minor stuff like continuing the comment. pub fn on_enter(&self, position: FilePosition) -> Option { - let file = self.db.parse(position.file_id); - let edit = typing::on_enter(&file, position.offset)?; - Some(SourceChange::from_local_edit(position.file_id, edit)) + typing::on_enter(&self.db, position) } /// Returns an edit which should be applied after `=` was typed. Primarily, @@ -306,14 +304,17 @@ 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::from_local_edit(position.file_id, edit)) + 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, + }) } /// Returns an edit which should be applied when a dot ('.') is typed on a blank line, indenting the line appropriately. pub fn on_dot_typed(&self, position: FilePosition) -> Option { - let file = self.db.parse(position.file_id); - let edit = typing::on_dot_typed(&file, position.offset)?; - Some(SourceChange::from_local_edit(position.file_id, edit)) + typing::on_dot_typed(&self.db, position) } /// Returns a tree representation of symbols in the file. Useful to draw a @@ -435,18 +436,6 @@ impl Analysis { } } -impl SourceChange { - pub(crate) fn from_local_edit(file_id: FileId, edit: LocalEdit) -> SourceChange { - let file_edit = SourceFileEdit { file_id, edit: edit.edit }; - SourceChange { - label: edit.label, - source_file_edits: vec![file_edit], - file_system_edits: vec![], - cursor_position: edit.cursor_position.map(|offset| FilePosition { offset, file_id }), - } - } -} - #[test] fn analysis_is_send() { fn is_send() {} diff --git a/crates/ra_ide_api/src/typing.rs b/crates/ra_ide_api/src/typing.rs index b7e023d60..94b228466 100644 --- a/crates/ra_ide_api/src/typing.rs +++ b/crates/ra_ide_api/src/typing.rs @@ -5,31 +5,37 @@ use ra_syntax::{ ast::{self, AstToken}, }; use ra_fmt::leading_indent; -use crate::LocalEdit; -use ra_text_edit::TextEditBuilder; +use ra_text_edit::{TextEdit, TextEditBuilder}; +use ra_db::{FilePosition, SourceDatabase}; +use crate::{db::RootDatabase, SourceChange, SourceFileEdit}; -pub fn on_enter(file: &SourceFile, offset: TextUnit) -> Option { - let comment = - find_leaf_at_offset(file.syntax(), offset).left_biased().and_then(ast::Comment::cast)?; +pub(crate) fn on_enter(db: &RootDatabase, position: FilePosition) -> Option { + let file = db.parse(position.file_id); + let comment = find_leaf_at_offset(file.syntax(), position.offset) + .left_biased() + .and_then(ast::Comment::cast)?; if let ast::CommentFlavor::Multiline = comment.flavor() { return None; } let prefix = comment.prefix(); - if offset < comment.syntax().range().start() + TextUnit::of_str(prefix) + TextUnit::from(1) { + if position.offset + < comment.syntax().range().start() + TextUnit::of_str(prefix) + TextUnit::from(1) + { return None; } - let indent = node_indent(file, comment.syntax())?; + let indent = node_indent(&file, comment.syntax())?; let inserted = format!("\n{}{} ", indent, prefix); - let cursor_position = offset + TextUnit::of_str(&inserted); + let cursor_position = position.offset + TextUnit::of_str(&inserted); let mut edit = TextEditBuilder::default(); - edit.insert(offset, inserted); - Some(LocalEdit { + edit.insert(position.offset, inserted); + Some(SourceChange { label: "on enter".to_string(), - edit: edit.finish(), - cursor_position: Some(cursor_position), + source_file_edits: vec![SourceFileEdit { edit: edit.finish(), file_id: position.file_id }], + file_system_edits: vec![], + cursor_position: Some(FilePosition { offset: cursor_position, file_id: position.file_id }), }) } @@ -53,7 +59,7 @@ fn node_indent<'a>(file: &'a SourceFile, node: &SyntaxNode) -> Option<&'a str> { Some(&text[pos..]) } -pub fn on_eq_typed(file: &SourceFile, eq_offset: TextUnit) -> Option { +pub fn on_eq_typed(file: &SourceFile, eq_offset: TextUnit) -> Option { assert_eq!(file.syntax().text().char_at(eq_offset), Some('=')); let let_stmt: &ast::LetStmt = find_node_at_offset(file.syntax(), eq_offset)?; if let_stmt.has_semi() { @@ -73,17 +79,14 @@ pub fn on_eq_typed(file: &SourceFile, eq_offset: TextUnit) -> Option let offset = let_stmt.syntax().range().end(); let mut edit = TextEditBuilder::default(); edit.insert(offset, ";".to_string()); - Some(LocalEdit { - label: "add semicolon".to_string(), - edit: edit.finish(), - cursor_position: None, - }) + Some(edit.finish()) } -pub fn on_dot_typed(file: &SourceFile, dot_offset: TextUnit) -> Option { - assert_eq!(file.syntax().text().char_at(dot_offset), Some('.')); +pub(crate) fn on_dot_typed(db: &RootDatabase, position: FilePosition) -> Option { + let file = db.parse(position.file_id); + assert_eq!(file.syntax().text().char_at(position.offset), Some('.')); - let whitespace = find_leaf_at_offset(file.syntax(), dot_offset) + let whitespace = find_leaf_at_offset(file.syntax(), position.offset) .left_biased() .and_then(ast::Whitespace::cast)?; @@ -104,15 +107,18 @@ pub fn on_dot_typed(file: &SourceFile, dot_offset: TextUnit) -> Option Option Option { let (offset, before) = extract_offset(before); - let file = SourceFile::parse(&before); - let result = on_enter(&file, offset)?; - let actual = result.edit.apply(&before); - let actual = add_cursor(&actual, result.cursor_position.unwrap()); + let (analysis, file_id) = single_file(&before); + let result = analysis.on_enter(FilePosition { offset, file_id })?; + + assert_eq!(result.source_file_edits.len(), 1); + let actual = result.source_file_edits[0].edit.apply(&before); + let actual = add_cursor(&actual, result.cursor_position.unwrap().offset); Some(actual) } diff --git a/crates/ra_ide_api_light/src/lib.rs b/crates/ra_ide_api_light/src/lib.rs index 0d928745f..1c5fa0837 100644 --- a/crates/ra_ide_api_light/src/lib.rs +++ b/crates/ra_ide_api_light/src/lib.rs @@ -17,13 +17,6 @@ pub use crate::{ structure::{file_structure, StructureNode}, }; -#[derive(Debug)] -pub struct LocalEdit { - pub label: String, - pub edit: ra_text_edit::TextEdit, - pub cursor_position: Option, -} - #[derive(Debug)] pub struct HighlightedRange { pub range: TextRange, @@ -36,14 +29,6 @@ pub enum Severity { WeakWarning, } -#[derive(Debug)] -pub struct Diagnostic { - pub range: TextRange, - pub msg: String, - pub severity: Severity, - pub fix: Option, -} - pub fn matching_brace(file: &SourceFile, offset: TextUnit) -> Option { const BRACES: &[SyntaxKind] = &[L_CURLY, R_CURLY, L_BRACK, R_BRACK, L_PAREN, R_PAREN, L_ANGLE, R_ANGLE]; -- cgit v1.2.3