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
bit-aloo 3 weeks ago
parent 91224ad · commit 120fe10
-rw-r--r--crates/ide-db/src/imports/insert_use.rs34
-rw-r--r--crates/ide-diagnostics/src/handlers/json_is_not_rust.rs22
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)