Unnamed repository; edit this file 'description' to name the repository.
add insert_uses_with_editor to insert_use and accordingly migrate json_in_items to SyntaxEditor
| -rw-r--r-- | crates/ide-db/src/imports/insert_use.rs | 34 | ||||
| -rw-r--r-- | crates/ide-diagnostics/src/handlers/json_is_not_rust.rs | 22 |
2 files changed, 48 insertions, 8 deletions
diff --git a/crates/ide-db/src/imports/insert_use.rs b/crates/ide-db/src/imports/insert_use.rs index ebd557aaf6..4b0373271c 100644 --- a/crates/ide-db/src/imports/insert_use.rs +++ b/crates/ide-db/src/imports/insert_use.rs @@ -160,11 +160,43 @@ pub fn insert_use_with_editor( insert_use_with_alias_option_with_editor(scope, path, cfg, None, syntax_editor); } -pub fn insert_use_as_alias( +pub fn insert_uses_with_editor( + scope: &ImportScope, + paths: impl IntoIterator<Item = ast::Path>, + cfg: &InsertUseConfig, + syntax_editor: &SyntaxEditor, +) { + let paths = paths.into_iter().collect::<Vec<_>>(); + if paths.len() > 1 + && scope.as_syntax_node().parent().is_none() + && scope.required_cfgs.is_empty() + && !scope.as_syntax_node().children().any(|node| ast::Use::cast(node).is_some()) + { + let make = syntax_editor.make(); + let elements = paths + .into_iter() + .flat_map(|path| { + let use_tree = make.use_tree(path, None, None, false); + let use_item = make.use_(None, None, use_tree); + [use_item.syntax().clone().into(), make.whitespace("\n").into()] + }) + .chain([make.whitespace("\n").into()]) + .collect(); + syntax_editor.insert_all(Position::first_child_of(scope.as_syntax_node()), elements); + return; + } + + for path in paths { + insert_use_with_editor(scope, path, cfg, syntax_editor); + } +} + +pub fn insert_use_as_alias_with_editor( scope: &ImportScope, path: ast::Path, cfg: &InsertUseConfig, edition: span::Edition, + editor: &SyntaxEditor, ) { let text: &str = "use foo as _"; let parse = syntax::SourceFile::parse(text, edition); diff --git a/crates/ide-diagnostics/src/handlers/json_is_not_rust.rs b/crates/ide-diagnostics/src/handlers/json_is_not_rust.rs index 20bfcc2dee..24f1e3ad83 100644 --- a/crates/ide-diagnostics/src/handlers/json_is_not_rust.rs +++ b/crates/ide-diagnostics/src/handlers/json_is_not_rust.rs @@ -2,12 +2,11 @@ //! example. use hir::{FindPathConfig, PathResolution, Semantics}; +use ide_db::imports::insert_use::insert_uses_with_editor; use ide_db::text_edit::TextEdit; use ide_db::{ - EditionedFileId, FileRange, FxHashMap, RootDatabase, - helpers::mod_path_to_ast, - imports::insert_use::{ImportScope, insert_use}, - source_change::SourceChangeBuilder, + EditionedFileId, FileRange, FxHashMap, RootDatabase, helpers::mod_path_to_ast, + imports::insert_use::ImportScope, source_change::SourceChangeBuilder, }; use itertools::Itertools; use stdx::{format_to, never}; @@ -138,7 +137,7 @@ pub(crate) fn json_in_items( .stable() .with_fixes(Some(vec![{ let mut scb = SourceChangeBuilder::new(vfs_file_id); - let scope = scb.make_import_scope_mut(import_scope); + let editor = scb.make_editor(import_scope.as_syntax_node()); let current_module = semantics_scope.module(); let cfg = FindPathConfig { @@ -148,6 +147,7 @@ pub(crate) fn json_in_items( allow_unstable: true, }; + let mut imports_to_insert = Vec::new(); if !scope_has("Serialize") && let Some(PathResolution::Def(it)) = serialize_resolved && let Some(it) = current_module.find_use_path( @@ -157,7 +157,7 @@ pub(crate) fn json_in_items( cfg, ) { - insert_use(&scope, mod_path_to_ast(&it, edition), &config.insert_use); + imports_to_insert.push(mod_path_to_ast(&it, edition)); } if !scope_has("Deserialize") && let Some(PathResolution::Def(it)) = deserialize_resolved @@ -168,8 +168,16 @@ pub(crate) fn json_in_items( cfg, ) { - insert_use(&scope, mod_path_to_ast(&it, edition), &config.insert_use); + imports_to_insert.push(mod_path_to_ast(&it, edition)); } + + insert_uses_with_editor( + &import_scope, + imports_to_insert, + &config.insert_use, + &editor, + ); + scb.add_file_edits(vfs_file_id, editor); let mut sc = scb.finish(); sc.insert_source_edit(vfs_file_id, edit.finish()); fix("convert_json_to_struct", "Convert JSON to struct", sc, range) |