diff options
author | Lukas Wirth <[email protected]> | 2021-01-14 21:43:36 +0000 |
---|---|---|
committer | Lukas Wirth <[email protected]> | 2021-01-14 21:43:36 +0000 |
commit | d5095329a1c12e93653d8de4a93f0b4f5cad4c6e (patch) | |
tree | 1de73ddefe48cc9f82cb4f063eaddc069adf83bc /crates/ide/src/references | |
parent | e23bfafb32a235fdb60ba279ea68b5aa381c2110 (diff) |
Phase out SourceFileEdits in favour of a plain HashMap
Diffstat (limited to 'crates/ide/src/references')
-rw-r--r-- | crates/ide/src/references/rename.rs | 195 |
1 files changed, 95 insertions, 100 deletions
diff --git a/crates/ide/src/references/rename.rs b/crates/ide/src/references/rename.rs index cd9c7c7e5..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 | SourceFileEdits, TextRange, TextSize, | 24 | TextRange, TextSize, |
25 | }; | 25 | }; |
26 | 26 | ||
27 | type RenameResult<T> = Result<T, RenameError>; | 27 | type RenameResult<T> = Result<T, RenameError>; |
@@ -249,8 +249,8 @@ fn rename_mod( | |||
249 | if IdentifierKind::Ident != check_identifier(new_name)? { | 249 | if IdentifierKind::Ident != check_identifier(new_name)? { |
250 | bail!("Invalid name `{0}`: cannot rename module to {0}", new_name); | 250 | bail!("Invalid name `{0}`: cannot rename module to {0}", new_name); |
251 | } | 251 | } |
252 | let mut source_file_edits = SourceFileEdits::default(); | 252 | |
253 | let mut file_system_edits = Vec::new(); | 253 | let mut source_change = SourceChange::default(); |
254 | 254 | ||
255 | let src = module.definition_source(sema.db); | 255 | let src = module.definition_source(sema.db); |
256 | let file_id = src.file_id.original_file(sema.db); | 256 | let file_id = src.file_id.original_file(sema.db); |
@@ -264,7 +264,7 @@ fn rename_mod( | |||
264 | }; | 264 | }; |
265 | let dst = AnchoredPathBuf { anchor: file_id, path }; | 265 | let dst = AnchoredPathBuf { anchor: file_id, path }; |
266 | let move_file = FileSystemEdit::MoveFile { src: file_id, dst }; | 266 | let move_file = FileSystemEdit::MoveFile { src: file_id, dst }; |
267 | file_system_edits.push(move_file); | 267 | source_change.push_file_system_edit(move_file); |
268 | } | 268 | } |
269 | ModuleSource::Module(..) => {} | 269 | ModuleSource::Module(..) => {} |
270 | } | 270 | } |
@@ -272,17 +272,19 @@ fn rename_mod( | |||
272 | if let Some(src) = module.declaration_source(sema.db) { | 272 | if let Some(src) = module.declaration_source(sema.db) { |
273 | let file_id = src.file_id.original_file(sema.db); | 273 | let file_id = src.file_id.original_file(sema.db); |
274 | let name = src.value.name().unwrap(); | 274 | let name = src.value.name().unwrap(); |
275 | source_file_edits | 275 | source_change.insert_source_edit( |
276 | .insert(file_id, TextEdit::replace(name.syntax().text_range(), new_name.into())); | 276 | file_id, |
277 | TextEdit::replace(name.syntax().text_range(), new_name.into()), | ||
278 | ); | ||
277 | } | 279 | } |
278 | 280 | ||
279 | let RangeInfo { range, info: refs } = find_all_refs(sema, position)?; | 281 | let RangeInfo { range, info: refs } = find_all_refs(sema, position)?; |
280 | let ref_edits = refs.references().iter().map(|(&file_id, references)| { | 282 | let ref_edits = refs.references().iter().map(|(&file_id, references)| { |
281 | source_edit_from_references(sema, file_id, references, new_name) | 283 | source_edit_from_references(sema, file_id, references, new_name) |
282 | }); | 284 | }); |
283 | source_file_edits.extend(ref_edits); | 285 | source_change.extend(ref_edits); |
284 | 286 | ||
285 | Ok(RangeInfo::new(range, SourceChange::from_edits(source_file_edits, file_system_edits))) | 287 | Ok(RangeInfo::new(range, source_change)) |
286 | } | 288 | } |
287 | 289 | ||
288 | fn rename_to_self( | 290 | fn rename_to_self( |
@@ -331,13 +333,16 @@ fn rename_to_self( | |||
331 | 333 | ||
332 | let RangeInfo { range, info: refs } = find_all_refs(sema, position)?; | 334 | let RangeInfo { range, info: refs } = find_all_refs(sema, position)?; |
333 | 335 | ||
334 | let mut edits = SourceFileEdits::default(); | 336 | let mut source_change = SourceChange::default(); |
335 | edits.extend(refs.references().iter().map(|(&file_id, references)| { | 337 | source_change.extend(refs.references().iter().map(|(&file_id, references)| { |
336 | source_edit_from_references(sema, file_id, references, "self") | 338 | source_edit_from_references(sema, file_id, references, "self") |
337 | })); | 339 | })); |
338 | edits.insert(position.file_id, TextEdit::replace(param_range, String::from(self_param))); | 340 | source_change.insert_source_edit( |
341 | position.file_id, | ||
342 | TextEdit::replace(param_range, String::from(self_param)), | ||
343 | ); | ||
339 | 344 | ||
340 | Ok(RangeInfo::new(range, edits.into())) | 345 | Ok(RangeInfo::new(range, source_change)) |
341 | } | 346 | } |
342 | 347 | ||
343 | fn text_edit_from_self_param( | 348 | fn text_edit_from_self_param( |
@@ -391,7 +396,7 @@ fn rename_self_to_param( | |||
391 | .ok_or_else(|| format_err!("No surrounding method declaration found"))?; | 396 | .ok_or_else(|| format_err!("No surrounding method declaration found"))?; |
392 | let search_range = fn_def.syntax().text_range(); | 397 | let search_range = fn_def.syntax().text_range(); |
393 | 398 | ||
394 | let mut edits = SourceFileEdits::default(); | 399 | let mut source_change = SourceChange::default(); |
395 | 400 | ||
396 | for (idx, _) in text.match_indices("self") { | 401 | for (idx, _) in text.match_indices("self") { |
397 | let offset: TextSize = idx.try_into().unwrap(); | 402 | let offset: TextSize = idx.try_into().unwrap(); |
@@ -405,18 +410,18 @@ fn rename_self_to_param( | |||
405 | } else { | 410 | } else { |
406 | TextEdit::replace(usage.text_range(), String::from(new_name)) | 411 | TextEdit::replace(usage.text_range(), String::from(new_name)) |
407 | }; | 412 | }; |
408 | edits.insert(position.file_id, edit); | 413 | source_change.insert_source_edit(position.file_id, edit); |
409 | } | 414 | } |
410 | } | 415 | } |
411 | 416 | ||
412 | if edits.len() > 1 && ident_kind == IdentifierKind::Underscore { | 417 | if source_change.source_file_edits.len() > 1 && ident_kind == IdentifierKind::Underscore { |
413 | 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"); |
414 | } | 419 | } |
415 | 420 | ||
416 | let range = ast::SelfParam::cast(self_token.parent()) | 421 | let range = ast::SelfParam::cast(self_token.parent()) |
417 | .map_or(self_token.text_range(), |p| p.syntax().text_range()); | 422 | .map_or(self_token.text_range(), |p| p.syntax().text_range()); |
418 | 423 | ||
419 | Ok(RangeInfo::new(range, edits.into())) | 424 | Ok(RangeInfo::new(range, source_change)) |
420 | } | 425 | } |
421 | 426 | ||
422 | fn rename_reference( | 427 | fn rename_reference( |
@@ -453,12 +458,12 @@ fn rename_reference( | |||
453 | (IdentifierKind::Ident, _) | (IdentifierKind::Underscore, _) => mark::hit!(rename_ident), | 458 | (IdentifierKind::Ident, _) | (IdentifierKind::Underscore, _) => mark::hit!(rename_ident), |
454 | } | 459 | } |
455 | 460 | ||
456 | let mut edits = SourceFileEdits::default(); | 461 | let mut source_change = SourceChange::default(); |
457 | edits.extend(refs.into_iter().map(|(file_id, references)| { | 462 | source_change.extend(refs.into_iter().map(|(file_id, references)| { |
458 | source_edit_from_references(sema, file_id, &references, new_name) | 463 | source_edit_from_references(sema, file_id, &references, new_name) |
459 | })); | 464 | })); |
460 | 465 | ||
461 | Ok(RangeInfo::new(range, edits.into())) | 466 | Ok(RangeInfo::new(range, source_change)) |
462 | } | 467 | } |
463 | 468 | ||
464 | #[cfg(test)] | 469 | #[cfg(test)] |
@@ -480,7 +485,7 @@ mod tests { | |||
480 | Ok(source_change) => { | 485 | Ok(source_change) => { |
481 | let mut text_edit_builder = TextEdit::builder(); | 486 | let mut text_edit_builder = TextEdit::builder(); |
482 | let mut file_id: Option<FileId> = None; | 487 | let mut file_id: Option<FileId> = None; |
483 | for edit in source_change.info.source_file_edits.edits { | 488 | for edit in source_change.info.source_file_edits { |
484 | file_id = Some(edit.0); | 489 | file_id = Some(edit.0); |
485 | for indel in edit.1.into_iter() { | 490 | for indel in edit.1.into_iter() { |
486 | text_edit_builder.replace(indel.delete, indel.insert); | 491 | text_edit_builder.replace(indel.delete, indel.insert); |
@@ -882,18 +887,16 @@ mod foo$0; | |||
882 | RangeInfo { | 887 | RangeInfo { |
883 | range: 4..7, | 888 | range: 4..7, |
884 | info: SourceChange { | 889 | info: SourceChange { |
885 | source_file_edits: SourceFileEdits { | 890 | source_file_edits: { |
886 | edits: { | 891 | FileId( |
887 | FileId( | 892 | 1, |
888 | 1, | 893 | ): TextEdit { |
889 | ): TextEdit { | 894 | indels: [ |
890 | indels: [ | 895 | Indel { |
891 | Indel { | 896 | insert: "foo2", |
892 | insert: "foo2", | 897 | delete: 4..7, |
893 | delete: 4..7, | 898 | }, |
894 | }, | 899 | ], |
895 | ], | ||
896 | }, | ||
897 | }, | 900 | }, |
898 | }, | 901 | }, |
899 | file_system_edits: [ | 902 | file_system_edits: [ |
@@ -936,28 +939,26 @@ use crate::foo$0::FooContent; | |||
936 | RangeInfo { | 939 | RangeInfo { |
937 | range: 11..14, | 940 | range: 11..14, |
938 | info: SourceChange { | 941 | info: SourceChange { |
939 | source_file_edits: SourceFileEdits { | 942 | source_file_edits: { |
940 | edits: { | 943 | FileId( |
941 | FileId( | 944 | 0, |
942 | 0, | 945 | ): TextEdit { |
943 | ): TextEdit { | 946 | indels: [ |
944 | indels: [ | 947 | Indel { |
945 | Indel { | 948 | insert: "quux", |
946 | insert: "quux", | 949 | delete: 8..11, |
947 | delete: 8..11, | 950 | }, |
948 | }, | 951 | ], |
949 | ], | 952 | }, |
950 | }, | 953 | FileId( |
951 | FileId( | 954 | 2, |
952 | 2, | 955 | ): TextEdit { |
953 | ): TextEdit { | 956 | indels: [ |
954 | indels: [ | 957 | Indel { |
955 | Indel { | 958 | insert: "quux", |
956 | insert: "quux", | 959 | delete: 11..14, |
957 | delete: 11..14, | 960 | }, |
958 | }, | 961 | ], |
959 | ], | ||
960 | }, | ||
961 | }, | 962 | }, |
962 | }, | 963 | }, |
963 | file_system_edits: [ | 964 | file_system_edits: [ |
@@ -994,18 +995,16 @@ mod fo$0o; | |||
994 | RangeInfo { | 995 | RangeInfo { |
995 | range: 4..7, | 996 | range: 4..7, |
996 | info: SourceChange { | 997 | info: SourceChange { |
997 | source_file_edits: SourceFileEdits { | 998 | source_file_edits: { |
998 | edits: { | 999 | FileId( |
999 | FileId( | 1000 | 0, |
1000 | 0, | 1001 | ): TextEdit { |
1001 | ): TextEdit { | 1002 | indels: [ |
1002 | indels: [ | 1003 | Indel { |
1003 | Indel { | 1004 | insert: "foo2", |
1004 | insert: "foo2", | 1005 | delete: 4..7, |
1005 | delete: 4..7, | 1006 | }, |
1006 | }, | 1007 | ], |
1007 | ], | ||
1008 | }, | ||
1009 | }, | 1008 | }, |
1010 | }, | 1009 | }, |
1011 | file_system_edits: [ | 1010 | file_system_edits: [ |
@@ -1043,18 +1042,16 @@ mod outer { mod fo$0o; } | |||
1043 | RangeInfo { | 1042 | RangeInfo { |
1044 | range: 16..19, | 1043 | range: 16..19, |
1045 | info: SourceChange { | 1044 | info: SourceChange { |
1046 | source_file_edits: SourceFileEdits { | 1045 | source_file_edits: { |
1047 | edits: { | 1046 | FileId( |
1048 | FileId( | 1047 | 0, |
1049 | 0, | 1048 | ): TextEdit { |
1050 | ): TextEdit { | 1049 | indels: [ |
1051 | indels: [ | 1050 | Indel { |
1052 | Indel { | 1051 | insert: "bar", |
1053 | insert: "bar", | 1052 | delete: 16..19, |
1054 | delete: 16..19, | 1053 | }, |
1055 | }, | 1054 | ], |
1056 | ], | ||
1057 | }, | ||
1058 | }, | 1055 | }, |
1059 | }, | 1056 | }, |
1060 | file_system_edits: [ | 1057 | file_system_edits: [ |
@@ -1115,28 +1112,26 @@ pub mod foo$0; | |||
1115 | RangeInfo { | 1112 | RangeInfo { |
1116 | range: 8..11, | 1113 | range: 8..11, |
1117 | info: SourceChange { | 1114 | info: SourceChange { |
1118 | source_file_edits: SourceFileEdits { | 1115 | source_file_edits: { |
1119 | edits: { | 1116 | FileId( |
1120 | FileId( | 1117 | 0, |
1121 | 0, | 1118 | ): TextEdit { |
1122 | ): TextEdit { | 1119 | indels: [ |
1123 | indels: [ | 1120 | Indel { |
1124 | Indel { | 1121 | insert: "foo2", |
1125 | insert: "foo2", | 1122 | delete: 27..30, |
1126 | delete: 27..30, | 1123 | }, |
1127 | }, | 1124 | ], |
1128 | ], | 1125 | }, |
1129 | }, | 1126 | FileId( |
1130 | FileId( | 1127 | 1, |
1131 | 1, | 1128 | ): TextEdit { |
1132 | ): TextEdit { | 1129 | indels: [ |
1133 | indels: [ | 1130 | Indel { |
1134 | Indel { | 1131 | insert: "foo2", |
1135 | insert: "foo2", | 1132 | delete: 8..11, |
1136 | delete: 8..11, | 1133 | }, |
1137 | }, | 1134 | ], |
1138 | ], | ||
1139 | }, | ||
1140 | }, | 1135 | }, |
1141 | }, | 1136 | }, |
1142 | file_system_edits: [ | 1137 | file_system_edits: [ |