diff options
Diffstat (limited to 'crates/ide/src')
-rw-r--r-- | crates/ide/src/diagnostics.rs | 17 | ||||
-rw-r--r-- | crates/ide/src/diagnostics/field_shorthand.rs | 7 | ||||
-rw-r--r-- | crates/ide/src/diagnostics/fixes.rs | 26 | ||||
-rw-r--r-- | crates/ide/src/lib.rs | 4 | ||||
-rw-r--r-- | crates/ide/src/references/rename.rs | 239 | ||||
-rw-r--r-- | crates/ide/src/typing.rs | 8 |
6 files changed, 132 insertions, 169 deletions
diff --git a/crates/ide/src/diagnostics.rs b/crates/ide/src/diagnostics.rs index 055c0a79c..2e5395b51 100644 --- a/crates/ide/src/diagnostics.rs +++ b/crates/ide/src/diagnostics.rs | |||
@@ -13,8 +13,7 @@ use hir::{ | |||
13 | diagnostics::{Diagnostic as _, DiagnosticCode, DiagnosticSinkBuilder}, | 13 | diagnostics::{Diagnostic as _, DiagnosticCode, DiagnosticSinkBuilder}, |
14 | Semantics, | 14 | Semantics, |
15 | }; | 15 | }; |
16 | use ide_db::base_db::SourceDatabase; | 16 | use ide_db::{base_db::SourceDatabase, RootDatabase}; |
17 | use ide_db::RootDatabase; | ||
18 | use itertools::Itertools; | 17 | use itertools::Itertools; |
19 | use rustc_hash::FxHashSet; | 18 | use rustc_hash::FxHashSet; |
20 | use syntax::{ | 19 | use syntax::{ |
@@ -23,7 +22,7 @@ use syntax::{ | |||
23 | }; | 22 | }; |
24 | use text_edit::TextEdit; | 23 | use text_edit::TextEdit; |
25 | 24 | ||
26 | use crate::{FileId, Label, SourceChange, SourceFileEdit}; | 25 | use crate::{FileId, Label, SourceChange}; |
27 | 26 | ||
28 | use self::fixes::DiagnosticWithFix; | 27 | use self::fixes::DiagnosticWithFix; |
29 | 28 | ||
@@ -220,7 +219,7 @@ fn check_unnecessary_braces_in_use_statement( | |||
220 | Diagnostic::hint(use_range, "Unnecessary braces in use statement".to_string()) | 219 | Diagnostic::hint(use_range, "Unnecessary braces in use statement".to_string()) |
221 | .with_fix(Some(Fix::new( | 220 | .with_fix(Some(Fix::new( |
222 | "Remove unnecessary braces", | 221 | "Remove unnecessary braces", |
223 | SourceFileEdit { file_id, edit }.into(), | 222 | SourceChange::from_text_edit(file_id, edit), |
224 | use_range, | 223 | use_range, |
225 | ))), | 224 | ))), |
226 | ); | 225 | ); |
@@ -265,13 +264,11 @@ mod tests { | |||
265 | .unwrap(); | 264 | .unwrap(); |
266 | let fix = diagnostic.fix.unwrap(); | 265 | let fix = diagnostic.fix.unwrap(); |
267 | let actual = { | 266 | let actual = { |
268 | let file_id = fix.source_change.source_file_edits.first().unwrap().file_id; | 267 | let file_id = *fix.source_change.source_file_edits.keys().next().unwrap(); |
269 | let mut actual = analysis.file_text(file_id).unwrap().to_string(); | 268 | let mut actual = analysis.file_text(file_id).unwrap().to_string(); |
270 | 269 | ||
271 | // Go from the last one to the first one, so that ranges won't be affected by previous edits. | 270 | for edit in fix.source_change.source_file_edits.values() { |
272 | // FIXME: https://github.com/rust-analyzer/rust-analyzer/issues/4901#issuecomment-644675309 | 271 | edit.apply(&mut actual); |
273 | for edit in fix.source_change.source_file_edits.iter().rev() { | ||
274 | edit.edit.apply(&mut actual); | ||
275 | } | 272 | } |
276 | actual | 273 | actual |
277 | }; | 274 | }; |
@@ -616,7 +613,7 @@ fn test_fn() { | |||
616 | Fix { | 613 | Fix { |
617 | label: "Create module", | 614 | label: "Create module", |
618 | source_change: SourceChange { | 615 | source_change: SourceChange { |
619 | source_file_edits: [], | 616 | source_file_edits: {}, |
620 | file_system_edits: [ | 617 | file_system_edits: [ |
621 | CreateFile { | 618 | CreateFile { |
622 | dst: AnchoredPathBuf { | 619 | dst: AnchoredPathBuf { |
diff --git a/crates/ide/src/diagnostics/field_shorthand.rs b/crates/ide/src/diagnostics/field_shorthand.rs index 16c6ea827..5c89e2170 100644 --- a/crates/ide/src/diagnostics/field_shorthand.rs +++ b/crates/ide/src/diagnostics/field_shorthand.rs | |||
@@ -1,8 +1,7 @@ | |||
1 | //! Suggests shortening `Foo { field: field }` to `Foo { field }` in both | 1 | //! Suggests shortening `Foo { field: field }` to `Foo { field }` in both |
2 | //! expressions and patterns. | 2 | //! expressions and patterns. |
3 | 3 | ||
4 | use ide_db::base_db::FileId; | 4 | use ide_db::{base_db::FileId, source_change::SourceChange}; |
5 | use ide_db::source_change::SourceFileEdit; | ||
6 | use syntax::{ast, match_ast, AstNode, SyntaxNode}; | 5 | use syntax::{ast, match_ast, AstNode, SyntaxNode}; |
7 | use text_edit::TextEdit; | 6 | use text_edit::TextEdit; |
8 | 7 | ||
@@ -50,7 +49,7 @@ fn check_expr_field_shorthand( | |||
50 | Diagnostic::hint(field_range, "Shorthand struct initialization".to_string()).with_fix( | 49 | Diagnostic::hint(field_range, "Shorthand struct initialization".to_string()).with_fix( |
51 | Some(Fix::new( | 50 | Some(Fix::new( |
52 | "Use struct shorthand initialization", | 51 | "Use struct shorthand initialization", |
53 | SourceFileEdit { file_id, edit }.into(), | 52 | SourceChange::from_text_edit(file_id, edit), |
54 | field_range, | 53 | field_range, |
55 | )), | 54 | )), |
56 | ), | 55 | ), |
@@ -89,7 +88,7 @@ fn check_pat_field_shorthand( | |||
89 | acc.push(Diagnostic::hint(field_range, "Shorthand struct pattern".to_string()).with_fix( | 88 | acc.push(Diagnostic::hint(field_range, "Shorthand struct pattern".to_string()).with_fix( |
90 | Some(Fix::new( | 89 | Some(Fix::new( |
91 | "Use struct field shorthand", | 90 | "Use struct field shorthand", |
92 | SourceFileEdit { file_id, edit }.into(), | 91 | SourceChange::from_text_edit(file_id, edit), |
93 | field_range, | 92 | field_range, |
94 | )), | 93 | )), |
95 | )); | 94 | )); |
diff --git a/crates/ide/src/diagnostics/fixes.rs b/crates/ide/src/diagnostics/fixes.rs index d7ad88ed5..e4335119b 100644 --- a/crates/ide/src/diagnostics/fixes.rs +++ b/crates/ide/src/diagnostics/fixes.rs | |||
@@ -8,9 +8,9 @@ use hir::{ | |||
8 | }, | 8 | }, |
9 | HasSource, HirDisplay, InFile, Semantics, VariantDef, | 9 | HasSource, HirDisplay, InFile, Semantics, VariantDef, |
10 | }; | 10 | }; |
11 | use ide_db::base_db::{AnchoredPathBuf, FileId}; | ||
12 | use ide_db::{ | 11 | use ide_db::{ |
13 | source_change::{FileSystemEdit, SourceFileEdit}, | 12 | base_db::{AnchoredPathBuf, FileId}, |
13 | source_change::{FileSystemEdit, SourceChange}, | ||
14 | RootDatabase, | 14 | RootDatabase, |
15 | }; | 15 | }; |
16 | use syntax::{ | 16 | use syntax::{ |
@@ -88,7 +88,7 @@ impl DiagnosticWithFix for MissingFields { | |||
88 | }; | 88 | }; |
89 | Some(Fix::new( | 89 | Some(Fix::new( |
90 | "Fill struct fields", | 90 | "Fill struct fields", |
91 | SourceFileEdit { file_id: self.file.original_file(sema.db), edit }.into(), | 91 | SourceChange::from_text_edit(self.file.original_file(sema.db), edit), |
92 | sema.original_range(&field_list_parent.syntax()).range, | 92 | sema.original_range(&field_list_parent.syntax()).range, |
93 | )) | 93 | )) |
94 | } | 94 | } |
@@ -101,8 +101,7 @@ impl DiagnosticWithFix for MissingOkOrSomeInTailExpr { | |||
101 | let tail_expr_range = tail_expr.syntax().text_range(); | 101 | let tail_expr_range = tail_expr.syntax().text_range(); |
102 | let replacement = format!("{}({})", self.required, tail_expr.syntax()); | 102 | let replacement = format!("{}({})", self.required, tail_expr.syntax()); |
103 | let edit = TextEdit::replace(tail_expr_range, replacement); | 103 | let edit = TextEdit::replace(tail_expr_range, replacement); |
104 | let source_change = | 104 | let source_change = SourceChange::from_text_edit(self.file.original_file(sema.db), edit); |
105 | SourceFileEdit { file_id: self.file.original_file(sema.db), edit }.into(); | ||
106 | let name = if self.required == "Ok" { "Wrap with Ok" } else { "Wrap with Some" }; | 105 | let name = if self.required == "Ok" { "Wrap with Ok" } else { "Wrap with Some" }; |
107 | Some(Fix::new(name, source_change, tail_expr_range)) | 106 | Some(Fix::new(name, source_change, tail_expr_range)) |
108 | } | 107 | } |
@@ -122,8 +121,7 @@ impl DiagnosticWithFix for RemoveThisSemicolon { | |||
122 | .text_range(); | 121 | .text_range(); |
123 | 122 | ||
124 | let edit = TextEdit::delete(semicolon); | 123 | let edit = TextEdit::delete(semicolon); |
125 | let source_change = | 124 | let source_change = SourceChange::from_text_edit(self.file.original_file(sema.db), edit); |
126 | SourceFileEdit { file_id: self.file.original_file(sema.db), edit }.into(); | ||
127 | 125 | ||
128 | Some(Fix::new("Remove this semicolon", source_change, semicolon)) | 126 | Some(Fix::new("Remove this semicolon", source_change, semicolon)) |
129 | } | 127 | } |
@@ -204,15 +202,11 @@ fn missing_record_expr_field_fix( | |||
204 | new_field = format!(",{}", new_field); | 202 | new_field = format!(",{}", new_field); |
205 | } | 203 | } |
206 | 204 | ||
207 | let source_change = SourceFileEdit { | 205 | let source_change = SourceChange::from_text_edit( |
208 | file_id: def_file_id, | 206 | def_file_id, |
209 | edit: TextEdit::insert(last_field_syntax.text_range().end(), new_field), | 207 | TextEdit::insert(last_field_syntax.text_range().end(), new_field), |
210 | }; | 208 | ); |
211 | return Some(Fix::new( | 209 | return Some(Fix::new("Create field", source_change, record_expr_field.syntax().text_range())); |
212 | "Create field", | ||
213 | source_change.into(), | ||
214 | record_expr_field.syntax().text_range(), | ||
215 | )); | ||
216 | 210 | ||
217 | fn record_field_list(field_def_list: ast::FieldList) -> Option<ast::RecordFieldList> { | 211 | fn record_field_list(field_def_list: ast::FieldList) -> Option<ast::RecordFieldList> { |
218 | match field_def_list { | 212 | match field_def_list { |
diff --git a/crates/ide/src/lib.rs b/crates/ide/src/lib.rs index 1e03832ec..afd552008 100644 --- a/crates/ide/src/lib.rs +++ b/crates/ide/src/lib.rs | |||
@@ -98,7 +98,7 @@ pub use ide_db::{ | |||
98 | label::Label, | 98 | label::Label, |
99 | line_index::{LineCol, LineIndex}, | 99 | line_index::{LineCol, LineIndex}, |
100 | search::SearchScope, | 100 | search::SearchScope, |
101 | source_change::{FileSystemEdit, SourceChange, SourceFileEdit}, | 101 | source_change::{FileSystemEdit, SourceChange}, |
102 | symbol_index::Query, | 102 | symbol_index::Query, |
103 | RootDatabase, | 103 | RootDatabase, |
104 | }; | 104 | }; |
@@ -553,7 +553,7 @@ impl Analysis { | |||
553 | let rule: ssr::SsrRule = query.parse()?; | 553 | let rule: ssr::SsrRule = query.parse()?; |
554 | let mut match_finder = ssr::MatchFinder::in_context(db, resolve_context, selections); | 554 | let mut match_finder = ssr::MatchFinder::in_context(db, resolve_context, selections); |
555 | match_finder.add_rule(rule)?; | 555 | match_finder.add_rule(rule)?; |
556 | let edits = if parse_only { Vec::new() } else { match_finder.edits() }; | 556 | let edits = if parse_only { Default::default() } else { match_finder.edits() }; |
557 | Ok(SourceChange::from(edits)) | 557 | Ok(SourceChange::from(edits)) |
558 | }) | 558 | }) |
559 | } | 559 | } |
diff --git a/crates/ide/src/references/rename.rs b/crates/ide/src/references/rename.rs index c3ae568c2..039efb26f 100644 --- a/crates/ide/src/references/rename.rs +++ b/crates/ide/src/references/rename.rs | |||
@@ -21,7 +21,7 @@ use text_edit::TextEdit; | |||
21 | 21 | ||
22 | use crate::{ | 22 | use crate::{ |
23 | FilePosition, FileSystemEdit, RangeInfo, ReferenceKind, ReferenceSearchResult, SourceChange, | 23 | FilePosition, FileSystemEdit, RangeInfo, ReferenceKind, ReferenceSearchResult, SourceChange, |
24 | SourceFileEdit, TextRange, TextSize, | 24 | TextRange, TextSize, |
25 | }; | 25 | }; |
26 | 26 | ||
27 | type RenameResult<T> = Result<T, RenameError>; | 27 | type RenameResult<T> = Result<T, RenameError>; |
@@ -58,7 +58,7 @@ pub(crate) fn prepare_rename( | |||
58 | rename_self_to_param(&sema, position, self_token, "dummy") | 58 | rename_self_to_param(&sema, position, self_token, "dummy") |
59 | } else { | 59 | } else { |
60 | let RangeInfo { range, .. } = find_all_refs(&sema, position)?; | 60 | let RangeInfo { range, .. } = find_all_refs(&sema, position)?; |
61 | Ok(RangeInfo::new(range, SourceChange::from(vec![]))) | 61 | Ok(RangeInfo::new(range, SourceChange::default())) |
62 | } | 62 | } |
63 | .map(|info| RangeInfo::new(info.range, ())) | 63 | .map(|info| RangeInfo::new(info.range, ())) |
64 | } | 64 | } |
@@ -176,7 +176,7 @@ fn source_edit_from_references( | |||
176 | file_id: FileId, | 176 | file_id: FileId, |
177 | references: &[FileReference], | 177 | references: &[FileReference], |
178 | new_name: &str, | 178 | new_name: &str, |
179 | ) -> SourceFileEdit { | 179 | ) -> (FileId, TextEdit) { |
180 | let mut edit = TextEdit::builder(); | 180 | let mut edit = TextEdit::builder(); |
181 | for reference in references { | 181 | for reference in references { |
182 | let mut replacement_text = String::new(); | 182 | let mut replacement_text = String::new(); |
@@ -209,8 +209,7 @@ fn source_edit_from_references( | |||
209 | }; | 209 | }; |
210 | edit.replace(range, replacement_text); | 210 | edit.replace(range, replacement_text); |
211 | } | 211 | } |
212 | 212 | (file_id, edit.finish()) | |
213 | SourceFileEdit { file_id, edit: edit.finish() } | ||
214 | } | 213 | } |
215 | 214 | ||
216 | fn edit_text_range_for_record_field_expr_or_pat( | 215 | fn edit_text_range_for_record_field_expr_or_pat( |
@@ -250,8 +249,8 @@ fn rename_mod( | |||
250 | if IdentifierKind::Ident != check_identifier(new_name)? { | 249 | if IdentifierKind::Ident != check_identifier(new_name)? { |
251 | bail!("Invalid name `{0}`: cannot rename module to {0}", new_name); | 250 | bail!("Invalid name `{0}`: cannot rename module to {0}", new_name); |
252 | } | 251 | } |
253 | let mut source_file_edits = Vec::new(); | 252 | |
254 | let mut file_system_edits = Vec::new(); | 253 | let mut source_change = SourceChange::default(); |
255 | 254 | ||
256 | let src = module.definition_source(sema.db); | 255 | let src = module.definition_source(sema.db); |
257 | let file_id = src.file_id.original_file(sema.db); | 256 | let file_id = src.file_id.original_file(sema.db); |
@@ -265,7 +264,7 @@ fn rename_mod( | |||
265 | }; | 264 | }; |
266 | let dst = AnchoredPathBuf { anchor: file_id, path }; | 265 | let dst = AnchoredPathBuf { anchor: file_id, path }; |
267 | let move_file = FileSystemEdit::MoveFile { src: file_id, dst }; | 266 | let move_file = FileSystemEdit::MoveFile { src: file_id, dst }; |
268 | file_system_edits.push(move_file); | 267 | source_change.push_file_system_edit(move_file); |
269 | } | 268 | } |
270 | ModuleSource::Module(..) => {} | 269 | ModuleSource::Module(..) => {} |
271 | } | 270 | } |
@@ -273,20 +272,19 @@ fn rename_mod( | |||
273 | if let Some(src) = module.declaration_source(sema.db) { | 272 | if let Some(src) = module.declaration_source(sema.db) { |
274 | let file_id = src.file_id.original_file(sema.db); | 273 | let file_id = src.file_id.original_file(sema.db); |
275 | let name = src.value.name().unwrap(); | 274 | let name = src.value.name().unwrap(); |
276 | let edit = SourceFileEdit { | 275 | source_change.insert_source_edit( |
277 | file_id, | 276 | file_id, |
278 | edit: TextEdit::replace(name.syntax().text_range(), new_name.into()), | 277 | TextEdit::replace(name.syntax().text_range(), new_name.into()), |
279 | }; | 278 | ); |
280 | source_file_edits.push(edit); | ||
281 | } | 279 | } |
282 | 280 | ||
283 | let RangeInfo { range, info: refs } = find_all_refs(sema, position)?; | 281 | let RangeInfo { range, info: refs } = find_all_refs(sema, position)?; |
284 | let ref_edits = refs.references().iter().map(|(&file_id, references)| { | 282 | let ref_edits = refs.references().iter().map(|(&file_id, references)| { |
285 | source_edit_from_references(sema, file_id, references, new_name) | 283 | source_edit_from_references(sema, file_id, references, new_name) |
286 | }); | 284 | }); |
287 | source_file_edits.extend(ref_edits); | 285 | source_change.extend(ref_edits); |
288 | 286 | ||
289 | Ok(RangeInfo::new(range, SourceChange::from_edits(source_file_edits, file_system_edits))) | 287 | Ok(RangeInfo::new(range, source_change)) |
290 | } | 288 | } |
291 | 289 | ||
292 | fn rename_to_self( | 290 | fn rename_to_self( |
@@ -335,20 +333,16 @@ fn rename_to_self( | |||
335 | 333 | ||
336 | let RangeInfo { range, info: refs } = find_all_refs(sema, position)?; | 334 | let RangeInfo { range, info: refs } = find_all_refs(sema, position)?; |
337 | 335 | ||
338 | let mut edits = refs | 336 | let mut source_change = SourceChange::default(); |
339 | .references() | 337 | source_change.extend(refs.references().iter().map(|(&file_id, references)| { |
340 | .iter() | 338 | source_edit_from_references(sema, file_id, references, "self") |
341 | .map(|(&file_id, references)| { | 339 | })); |
342 | source_edit_from_references(sema, file_id, references, "self") | 340 | source_change.insert_source_edit( |
343 | }) | 341 | position.file_id, |
344 | .collect::<Vec<_>>(); | 342 | TextEdit::replace(param_range, String::from(self_param)), |
345 | 343 | ); | |
346 | edits.push(SourceFileEdit { | ||
347 | file_id: position.file_id, | ||
348 | edit: TextEdit::replace(param_range, String::from(self_param)), | ||
349 | }); | ||
350 | 344 | ||
351 | Ok(RangeInfo::new(range, SourceChange::from(edits))) | 345 | Ok(RangeInfo::new(range, source_change)) |
352 | } | 346 | } |
353 | 347 | ||
354 | fn text_edit_from_self_param( | 348 | fn text_edit_from_self_param( |
@@ -402,7 +396,7 @@ fn rename_self_to_param( | |||
402 | .ok_or_else(|| format_err!("No surrounding method declaration found"))?; | 396 | .ok_or_else(|| format_err!("No surrounding method declaration found"))?; |
403 | let search_range = fn_def.syntax().text_range(); | 397 | let search_range = fn_def.syntax().text_range(); |
404 | 398 | ||
405 | let mut edits: Vec<SourceFileEdit> = vec![]; | 399 | let mut source_change = SourceChange::default(); |
406 | 400 | ||
407 | for (idx, _) in text.match_indices("self") { | 401 | for (idx, _) in text.match_indices("self") { |
408 | let offset: TextSize = idx.try_into().unwrap(); | 402 | let offset: TextSize = idx.try_into().unwrap(); |
@@ -416,18 +410,18 @@ fn rename_self_to_param( | |||
416 | } else { | 410 | } else { |
417 | TextEdit::replace(usage.text_range(), String::from(new_name)) | 411 | TextEdit::replace(usage.text_range(), String::from(new_name)) |
418 | }; | 412 | }; |
419 | edits.push(SourceFileEdit { file_id: position.file_id, edit }); | 413 | source_change.insert_source_edit(position.file_id, edit); |
420 | } | 414 | } |
421 | } | 415 | } |
422 | 416 | ||
423 | if edits.len() > 1 && ident_kind == IdentifierKind::Underscore { | 417 | if source_change.source_file_edits.len() > 1 && ident_kind == IdentifierKind::Underscore { |
424 | bail!("Cannot rename reference to `_` as it is being referenced multiple times"); | 418 | bail!("Cannot rename reference to `_` as it is being referenced multiple times"); |
425 | } | 419 | } |
426 | 420 | ||
427 | let range = ast::SelfParam::cast(self_token.parent()) | 421 | let range = ast::SelfParam::cast(self_token.parent()) |
428 | .map_or(self_token.text_range(), |p| p.syntax().text_range()); | 422 | .map_or(self_token.text_range(), |p| p.syntax().text_range()); |
429 | 423 | ||
430 | Ok(RangeInfo::new(range, SourceChange::from(edits))) | 424 | Ok(RangeInfo::new(range, source_change)) |
431 | } | 425 | } |
432 | 426 | ||
433 | fn rename_reference( | 427 | fn rename_reference( |
@@ -464,14 +458,12 @@ fn rename_reference( | |||
464 | (IdentifierKind::Ident, _) | (IdentifierKind::Underscore, _) => mark::hit!(rename_ident), | 458 | (IdentifierKind::Ident, _) | (IdentifierKind::Underscore, _) => mark::hit!(rename_ident), |
465 | } | 459 | } |
466 | 460 | ||
467 | let edit = refs | 461 | let mut source_change = SourceChange::default(); |
468 | .into_iter() | 462 | source_change.extend(refs.into_iter().map(|(file_id, references)| { |
469 | .map(|(file_id, references)| { | 463 | source_edit_from_references(sema, file_id, &references, new_name) |
470 | source_edit_from_references(sema, file_id, &references, new_name) | 464 | })); |
471 | }) | ||
472 | .collect::<Vec<_>>(); | ||
473 | 465 | ||
474 | Ok(RangeInfo::new(range, SourceChange::from(edit))) | 466 | Ok(RangeInfo::new(range, source_change)) |
475 | } | 467 | } |
476 | 468 | ||
477 | #[cfg(test)] | 469 | #[cfg(test)] |
@@ -494,8 +486,8 @@ mod tests { | |||
494 | let mut text_edit_builder = TextEdit::builder(); | 486 | let mut text_edit_builder = TextEdit::builder(); |
495 | let mut file_id: Option<FileId> = None; | 487 | let mut file_id: Option<FileId> = None; |
496 | for edit in source_change.info.source_file_edits { | 488 | for edit in source_change.info.source_file_edits { |
497 | file_id = Some(edit.file_id); | 489 | file_id = Some(edit.0); |
498 | for indel in edit.edit.into_iter() { | 490 | for indel in edit.1.into_iter() { |
499 | text_edit_builder.replace(indel.delete, indel.insert); | 491 | text_edit_builder.replace(indel.delete, indel.insert); |
500 | } | 492 | } |
501 | } | 493 | } |
@@ -895,21 +887,18 @@ mod foo$0; | |||
895 | RangeInfo { | 887 | RangeInfo { |
896 | range: 4..7, | 888 | range: 4..7, |
897 | info: SourceChange { | 889 | info: SourceChange { |
898 | source_file_edits: [ | 890 | source_file_edits: { |
899 | SourceFileEdit { | 891 | FileId( |
900 | file_id: FileId( | 892 | 1, |
901 | 1, | 893 | ): TextEdit { |
902 | ), | 894 | indels: [ |
903 | edit: TextEdit { | 895 | Indel { |
904 | indels: [ | 896 | insert: "foo2", |
905 | Indel { | 897 | delete: 4..7, |
906 | insert: "foo2", | 898 | }, |
907 | delete: 4..7, | 899 | ], |
908 | }, | ||
909 | ], | ||
910 | }, | ||
911 | }, | 900 | }, |
912 | ], | 901 | }, |
913 | file_system_edits: [ | 902 | file_system_edits: [ |
914 | MoveFile { | 903 | MoveFile { |
915 | src: FileId( | 904 | src: FileId( |
@@ -950,34 +939,28 @@ use crate::foo$0::FooContent; | |||
950 | RangeInfo { | 939 | RangeInfo { |
951 | range: 11..14, | 940 | range: 11..14, |
952 | info: SourceChange { | 941 | info: SourceChange { |
953 | source_file_edits: [ | 942 | source_file_edits: { |
954 | SourceFileEdit { | 943 | FileId( |
955 | file_id: FileId( | 944 | 0, |
956 | 0, | 945 | ): TextEdit { |
957 | ), | 946 | indels: [ |
958 | edit: TextEdit { | 947 | Indel { |
959 | indels: [ | 948 | insert: "quux", |
960 | Indel { | 949 | delete: 8..11, |
961 | insert: "quux", | 950 | }, |
962 | delete: 8..11, | 951 | ], |
963 | }, | ||
964 | ], | ||
965 | }, | ||
966 | }, | 952 | }, |
967 | SourceFileEdit { | 953 | FileId( |
968 | file_id: FileId( | 954 | 2, |
969 | 2, | 955 | ): TextEdit { |
970 | ), | 956 | indels: [ |
971 | edit: TextEdit { | 957 | Indel { |
972 | indels: [ | 958 | insert: "quux", |
973 | Indel { | 959 | delete: 11..14, |
974 | insert: "quux", | 960 | }, |
975 | delete: 11..14, | 961 | ], |
976 | }, | ||
977 | ], | ||
978 | }, | ||
979 | }, | 962 | }, |
980 | ], | 963 | }, |
981 | file_system_edits: [ | 964 | file_system_edits: [ |
982 | MoveFile { | 965 | MoveFile { |
983 | src: FileId( | 966 | src: FileId( |
@@ -1012,21 +995,18 @@ mod fo$0o; | |||
1012 | RangeInfo { | 995 | RangeInfo { |
1013 | range: 4..7, | 996 | range: 4..7, |
1014 | info: SourceChange { | 997 | info: SourceChange { |
1015 | source_file_edits: [ | 998 | source_file_edits: { |
1016 | SourceFileEdit { | 999 | FileId( |
1017 | file_id: FileId( | 1000 | 0, |
1018 | 0, | 1001 | ): TextEdit { |
1019 | ), | 1002 | indels: [ |
1020 | edit: TextEdit { | 1003 | Indel { |
1021 | indels: [ | 1004 | insert: "foo2", |
1022 | Indel { | 1005 | delete: 4..7, |
1023 | insert: "foo2", | 1006 | }, |
1024 | delete: 4..7, | 1007 | ], |
1025 | }, | ||
1026 | ], | ||
1027 | }, | ||
1028 | }, | 1008 | }, |
1029 | ], | 1009 | }, |
1030 | file_system_edits: [ | 1010 | file_system_edits: [ |
1031 | MoveFile { | 1011 | MoveFile { |
1032 | src: FileId( | 1012 | src: FileId( |
@@ -1062,21 +1042,18 @@ mod outer { mod fo$0o; } | |||
1062 | RangeInfo { | 1042 | RangeInfo { |
1063 | range: 16..19, | 1043 | range: 16..19, |
1064 | info: SourceChange { | 1044 | info: SourceChange { |
1065 | source_file_edits: [ | 1045 | source_file_edits: { |
1066 | SourceFileEdit { | 1046 | FileId( |
1067 | file_id: FileId( | 1047 | 0, |
1068 | 0, | 1048 | ): TextEdit { |
1069 | ), | 1049 | indels: [ |
1070 | edit: TextEdit { | 1050 | Indel { |
1071 | indels: [ | 1051 | insert: "bar", |
1072 | Indel { | 1052 | delete: 16..19, |
1073 | insert: "bar", | 1053 | }, |
1074 | delete: 16..19, | 1054 | ], |
1075 | }, | ||
1076 | ], | ||
1077 | }, | ||
1078 | }, | 1055 | }, |
1079 | ], | 1056 | }, |
1080 | file_system_edits: [ | 1057 | file_system_edits: [ |
1081 | MoveFile { | 1058 | MoveFile { |
1082 | src: FileId( | 1059 | src: FileId( |
@@ -1135,34 +1112,28 @@ pub mod foo$0; | |||
1135 | RangeInfo { | 1112 | RangeInfo { |
1136 | range: 8..11, | 1113 | range: 8..11, |
1137 | info: SourceChange { | 1114 | info: SourceChange { |
1138 | source_file_edits: [ | 1115 | source_file_edits: { |
1139 | SourceFileEdit { | 1116 | FileId( |
1140 | file_id: FileId( | 1117 | 0, |
1141 | 1, | 1118 | ): TextEdit { |
1142 | ), | 1119 | indels: [ |
1143 | edit: TextEdit { | 1120 | Indel { |
1144 | indels: [ | 1121 | insert: "foo2", |
1145 | Indel { | 1122 | delete: 27..30, |
1146 | insert: "foo2", | 1123 | }, |
1147 | delete: 8..11, | 1124 | ], |
1148 | }, | ||
1149 | ], | ||
1150 | }, | ||
1151 | }, | 1125 | }, |
1152 | SourceFileEdit { | 1126 | FileId( |
1153 | file_id: FileId( | 1127 | 1, |
1154 | 0, | 1128 | ): TextEdit { |
1155 | ), | 1129 | indels: [ |
1156 | edit: TextEdit { | 1130 | Indel { |
1157 | indels: [ | 1131 | insert: "foo2", |
1158 | Indel { | 1132 | delete: 8..11, |
1159 | insert: "foo2", | 1133 | }, |
1160 | delete: 27..30, | 1134 | ], |
1161 | }, | ||
1162 | ], | ||
1163 | }, | ||
1164 | }, | 1135 | }, |
1165 | ], | 1136 | }, |
1166 | file_system_edits: [ | 1137 | file_system_edits: [ |
1167 | MoveFile { | 1138 | MoveFile { |
1168 | src: FileId( | 1139 | src: FileId( |
diff --git a/crates/ide/src/typing.rs b/crates/ide/src/typing.rs index 88c905003..e3c3aebac 100644 --- a/crates/ide/src/typing.rs +++ b/crates/ide/src/typing.rs | |||
@@ -15,8 +15,10 @@ | |||
15 | 15 | ||
16 | mod on_enter; | 16 | mod on_enter; |
17 | 17 | ||
18 | use ide_db::base_db::{FilePosition, SourceDatabase}; | 18 | use ide_db::{ |
19 | use ide_db::{source_change::SourceFileEdit, RootDatabase}; | 19 | base_db::{FilePosition, SourceDatabase}, |
20 | RootDatabase, | ||
21 | }; | ||
20 | use syntax::{ | 22 | use syntax::{ |
21 | algo::find_node_at_offset, | 23 | algo::find_node_at_offset, |
22 | ast::{self, edit::IndentLevel, AstToken}, | 24 | ast::{self, edit::IndentLevel, AstToken}, |
@@ -56,7 +58,7 @@ pub(crate) fn on_char_typed( | |||
56 | let file = &db.parse(position.file_id).tree(); | 58 | let file = &db.parse(position.file_id).tree(); |
57 | assert_eq!(file.syntax().text().char_at(position.offset), Some(char_typed)); | 59 | assert_eq!(file.syntax().text().char_at(position.offset), Some(char_typed)); |
58 | let edit = on_char_typed_inner(file, position.offset, char_typed)?; | 60 | let edit = on_char_typed_inner(file, position.offset, char_typed)?; |
59 | Some(SourceFileEdit { file_id: position.file_id, edit }.into()) | 61 | Some(SourceChange::from_text_edit(position.file_id, edit)) |
60 | } | 62 | } |
61 | 63 | ||
62 | fn on_char_typed_inner(file: &SourceFile, offset: TextSize, char_typed: char) -> Option<TextEdit> { | 64 | fn on_char_typed_inner(file: &SourceFile, offset: TextSize, char_typed: char) -> Option<TextEdit> { |