Unnamed repository; edit this file 'description' to name the repository.
-rw-r--r--crates/ide-assists/src/handlers/fix_visibility.rs43
-rw-r--r--crates/syntax/src/ast/syntax_factory/constructors.rs6
2 files changed, 38 insertions, 11 deletions
diff --git a/crates/ide-assists/src/handlers/fix_visibility.rs b/crates/ide-assists/src/handlers/fix_visibility.rs
index 0fd8057a39..5134b98f1b 100644
--- a/crates/ide-assists/src/handlers/fix_visibility.rs
+++ b/crates/ide-assists/src/handlers/fix_visibility.rs
@@ -2,7 +2,7 @@ use hir::{HasSource, HasVisibility, ModuleDef, PathResolution, ScopeDef, db::Hir
use ide_db::FileId;
use syntax::{
AstNode, TextRange,
- ast::{self, HasVisibility as _, edit_in_place::HasVisibilityEdit, make},
+ ast::{self, HasVisibility as _, syntax_factory::SyntaxFactory},
};
use crate::{AssistContext, AssistId, Assists};
@@ -59,10 +59,12 @@ fn add_vis_to_referenced_module_def(acc: &mut Assists, ctx: &AssistContext<'_>)
let (vis_owner, target, target_file, target_name) = target_data_for_def(ctx.db(), def)?;
+ let make = SyntaxFactory::without_mappings();
+
let missing_visibility = if current_module.krate(ctx.db()) == target_module.krate(ctx.db()) {
- make::visibility_pub_crate()
+ make.visibility_pub_crate()
} else {
- make::visibility_pub()
+ make.visibility_pub()
};
let assist_label = match target_name {
@@ -75,15 +77,36 @@ fn add_vis_to_referenced_module_def(acc: &mut Assists, ctx: &AssistContext<'_>)
}
};
- acc.add(AssistId::quick_fix("fix_visibility"), assist_label, target, |edit| {
- edit.edit_file(target_file);
-
- let vis_owner = edit.make_mut(vis_owner);
- vis_owner.set_visibility(Some(missing_visibility.clone_for_update()));
+ acc.add(AssistId::quick_fix("fix_visibility"), assist_label, target, |builder| {
+ let mut editor = builder.make_editor(vis_owner.syntax());
+
+ if let Some(current_visibility) = vis_owner.visibility() {
+ editor.replace(current_visibility.syntax(), missing_visibility.syntax());
+ } else {
+ let vis_before = vis_owner
+ .syntax()
+ .children_with_tokens()
+ .find(|it| {
+ !matches!(
+ it.kind(),
+ syntax::SyntaxKind::WHITESPACE
+ | syntax::SyntaxKind::COMMENT
+ | syntax::SyntaxKind::ATTR
+ )
+ })
+ .unwrap_or_else(|| vis_owner.syntax().first_child_or_token().unwrap());
+
+ editor.insert_all(
+ syntax::syntax_editor::Position::before(vis_before),
+ vec![missing_visibility.syntax().clone().into(), make.whitespace(" ").into()],
+ );
+ }
- if let Some((cap, vis)) = ctx.config.snippet_cap.zip(vis_owner.visibility()) {
- edit.add_tabstop_before(cap, vis);
+ if let Some(cap) = ctx.config.snippet_cap {
+ editor.add_annotation(missing_visibility.syntax(), builder.make_tabstop_before(cap));
}
+
+ builder.add_file_edits(target_file, editor);
})
}
diff --git a/crates/syntax/src/ast/syntax_factory/constructors.rs b/crates/syntax/src/ast/syntax_factory/constructors.rs
index 6e17d262a7..27182191c3 100644
--- a/crates/syntax/src/ast/syntax_factory/constructors.rs
+++ b/crates/syntax/src/ast/syntax_factory/constructors.rs
@@ -79,8 +79,12 @@ impl SyntaxFactory {
make::path_concat(first, second).clone_for_update()
}
+ pub fn visibility_pub_crate(&self) -> ast::Visibility {
+ make::visibility_pub_crate().clone_for_update()
+ }
+
pub fn visibility_pub(&self) -> ast::Visibility {
- make::visibility_pub()
+ make::visibility_pub().clone_for_update()
}
pub fn struct_(