Skip to content

Commit 6f235ad

Browse files
Provide a setting to disable showing rename conflicts
1 parent 3816d0a commit 6f235ad

File tree

14 files changed

+119
-35
lines changed

14 files changed

+119
-35
lines changed

crates/ide-assists/src/assist_config.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
//! assists if we are allowed to.
66
77
use hir::ImportPathConfig;
8+
use ide_db::rename::RenameConfig;
89
use ide_db::{SnippetCap, assists::ExprFillDefaultMode, imports::insert_use::InsertUseConfig};
910

1011
use crate::AssistKind;
@@ -23,6 +24,7 @@ pub struct AssistConfig {
2324
pub code_action_grouping: bool,
2425
pub expr_fill_default: ExprFillDefaultMode,
2526
pub prefer_self_ty: bool,
27+
pub rename_config: RenameConfig,
2628
}
2729

2830
impl AssistConfig {

crates/ide-assists/src/handlers/remove_underscore.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,9 @@ pub(crate) fn remove_underscore(acc: &mut Assists, ctx: &AssistContext<'_>) -> O
6262
"Remove underscore from a used variable",
6363
text_range,
6464
|builder| {
65-
let changes = def.rename(&ctx.sema, new_name, RenameDefinition::Yes).unwrap();
65+
let changes = def
66+
.rename(&ctx.sema, &ctx.config.rename_config, new_name, RenameDefinition::Yes)
67+
.unwrap();
6668
builder.source_change = changes;
6769
},
6870
)

crates/ide-assists/src/tests.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ use ide_db::{
77
assists::ExprFillDefaultMode,
88
base_db::SourceDatabase,
99
imports::insert_use::{ImportGranularity, InsertUseConfig},
10+
rename::RenameConfig,
1011
source_change::FileSystemEdit,
1112
};
1213
use stdx::{format_to, trim_indent};
@@ -38,6 +39,7 @@ pub(crate) const TEST_CONFIG: AssistConfig = AssistConfig {
3839
code_action_grouping: true,
3940
expr_fill_default: ExprFillDefaultMode::Todo,
4041
prefer_self_ty: false,
42+
rename_config: RenameConfig { show_conflicts: true },
4143
};
4244

4345
pub(crate) const TEST_CONFIG_NO_GROUPING: AssistConfig = AssistConfig {
@@ -59,6 +61,7 @@ pub(crate) const TEST_CONFIG_NO_GROUPING: AssistConfig = AssistConfig {
5961
code_action_grouping: false,
6062
expr_fill_default: ExprFillDefaultMode::Todo,
6163
prefer_self_ty: false,
64+
rename_config: RenameConfig { show_conflicts: true },
6265
};
6366

6467
pub(crate) const TEST_CONFIG_NO_SNIPPET_CAP: AssistConfig = AssistConfig {
@@ -80,6 +83,7 @@ pub(crate) const TEST_CONFIG_NO_SNIPPET_CAP: AssistConfig = AssistConfig {
8083
code_action_grouping: true,
8184
expr_fill_default: ExprFillDefaultMode::Todo,
8285
prefer_self_ty: false,
86+
rename_config: RenameConfig { show_conflicts: true },
8387
};
8488

8589
pub(crate) const TEST_CONFIG_IMPORT_ONE: AssistConfig = AssistConfig {
@@ -101,6 +105,7 @@ pub(crate) const TEST_CONFIG_IMPORT_ONE: AssistConfig = AssistConfig {
101105
code_action_grouping: true,
102106
expr_fill_default: ExprFillDefaultMode::Todo,
103107
prefer_self_ty: false,
108+
rename_config: RenameConfig { show_conflicts: true },
104109
};
105110

106111
pub(crate) fn with_single_file(text: &str) -> (RootDatabase, EditionedFileId) {

crates/ide-db/src/rename.rs

Lines changed: 34 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,11 @@ use crate::{
4545
traits::convert_to_def_in_trait,
4646
};
4747

48+
#[derive(Clone, Debug, PartialEq, Eq)]
49+
pub struct RenameConfig {
50+
pub show_conflicts: bool,
51+
}
52+
4853
pub type Result<T, E = RenameError> = std::result::Result<T, E>;
4954

5055
#[derive(Debug)]
@@ -79,6 +84,7 @@ impl Definition {
7984
pub fn rename(
8085
&self,
8186
sema: &Semantics<'_, RootDatabase>,
87+
config: &RenameConfig,
8288
new_name: &str,
8389
rename_definition: RenameDefinition,
8490
) -> Result<SourceChange> {
@@ -109,10 +115,15 @@ impl Definition {
109115
bail!("Cannot rename a builtin attr.")
110116
}
111117
Definition::SelfType(_) => bail!("Cannot rename `Self`"),
112-
Definition::Macro(mac) => {
113-
rename_reference(sema, Definition::Macro(mac), new_name, rename_definition, edition)
114-
}
115-
def => rename_reference(sema, def, new_name, rename_definition, edition),
118+
Definition::Macro(mac) => rename_reference(
119+
sema,
120+
config,
121+
Definition::Macro(mac),
122+
new_name,
123+
rename_definition,
124+
edition,
125+
),
126+
def => rename_reference(sema, config, def, new_name, rename_definition, edition),
116127
}
117128
}
118129

@@ -335,6 +346,7 @@ fn rename_mod(
335346

336347
fn rename_reference(
337348
sema: &Semantics<'_, RootDatabase>,
349+
config: &RenameConfig,
338350
def: Definition,
339351
new_name: &str,
340352
rename_definition: RenameDefinition,
@@ -397,7 +409,8 @@ fn rename_reference(
397409
if rename_definition == RenameDefinition::Yes {
398410
// This needs to come after the references edits, because we change the annotation of existing edits
399411
// if a conflict is detected.
400-
let (file_id, edit) = source_edit_from_def(sema, def, &new_name, &mut source_change)?;
412+
let (file_id, edit) =
413+
source_edit_from_def(sema, config, def, &new_name, &mut source_change)?;
401414
source_change.insert_source_edit(file_id, edit);
402415
}
403416
Ok(source_change)
@@ -555,6 +568,7 @@ fn source_edit_from_name_ref(
555568

556569
fn source_edit_from_def(
557570
sema: &Semantics<'_, RootDatabase>,
571+
config: &RenameConfig,
558572
def: Definition,
559573
new_name: &Name,
560574
source_change: &mut SourceChange,
@@ -563,21 +577,22 @@ fn source_edit_from_def(
563577
if let Definition::Local(local) = def {
564578
let mut file_id = None;
565579

566-
let conflict_annotation = if !sema.rename_conflicts(&local, new_name).is_empty() {
567-
Some(
568-
source_change.insert_annotation(ChangeAnnotation {
569-
label: "This rename will change the program's meaning".to_owned(),
570-
needs_confirmation: true,
571-
description: Some(
572-
"Some variable(s) will shadow the renamed variable \
580+
let conflict_annotation =
581+
if config.show_conflicts && !sema.rename_conflicts(&local, new_name).is_empty() {
582+
Some(
583+
source_change.insert_annotation(ChangeAnnotation {
584+
label: "This rename will change the program's meaning".to_owned(),
585+
needs_confirmation: true,
586+
description: Some(
587+
"Some variable(s) will shadow the renamed variable \
573588
or be shadowed by it if the rename is performed"
574-
.to_owned(),
575-
),
576-
}),
577-
)
578-
} else {
579-
None
580-
};
589+
.to_owned(),
590+
),
591+
}),
592+
)
593+
} else {
594+
None
595+
};
581596

582597
for source in local.sources(sema.db) {
583598
let source = match source.source.clone().original_ast_node_rooted(sema.db) {

crates/ide-diagnostics/src/handlers/incorrect_case.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,12 @@ fn fixes(ctx: &DiagnosticsContext<'_>, d: &hir::IncorrectCase) -> Option<Vec<Ass
4444
let label = format!("Rename to {}", d.suggested_text);
4545
let mut res = unresolved_fix("change_case", &label, frange.range);
4646
if ctx.resolve.should_resolve(&res.id) {
47-
let source_change = def.rename(&ctx.sema, &d.suggested_text, RenameDefinition::Yes);
47+
let source_change = def.rename(
48+
&ctx.sema,
49+
&ctx.config.rename_config,
50+
&d.suggested_text,
51+
RenameDefinition::Yes,
52+
);
4853
res.source_change = Some(source_change.ok().unwrap_or_default());
4954
}
5055

crates/ide-diagnostics/src/lib.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ use ide_db::{
9696
generated::lints::{CLIPPY_LINT_GROUPS, DEFAULT_LINT_GROUPS, DEFAULT_LINTS, Lint, LintGroup},
9797
imports::insert_use::InsertUseConfig,
9898
label::Label,
99+
rename::RenameConfig,
99100
source_change::SourceChange,
100101
syntax_helpers::node_ext::parse_tt_as_comma_sep_paths,
101102
};
@@ -236,6 +237,7 @@ pub struct DiagnosticsConfig {
236237
pub prefer_absolute: bool,
237238
pub term_search_fuel: u64,
238239
pub term_search_borrowck: bool,
240+
pub rename_config: RenameConfig,
239241
}
240242

241243
impl DiagnosticsConfig {
@@ -264,6 +266,7 @@ impl DiagnosticsConfig {
264266
prefer_absolute: false,
265267
term_search_fuel: 400,
266268
term_search_borrowck: true,
269+
rename_config: RenameConfig { show_conflicts: true },
267270
}
268271
}
269272
}

crates/ide/src/lib.rs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,9 @@ use ide_db::{
6969
CrateOrigin, CrateWorkspaceData, Env, FileSet, RootQueryDb, SourceDatabase, VfsPath,
7070
salsa::Cancelled,
7171
},
72-
prime_caches, symbol_index,
72+
prime_caches,
73+
rename::RenameConfig,
74+
symbol_index,
7375
};
7476
use syntax::SourceFile;
7577
use triomphe::Arc;
@@ -777,10 +779,11 @@ impl Analysis {
777779
/// name.
778780
pub fn rename(
779781
&self,
782+
config: &RenameConfig,
780783
position: FilePosition,
781784
new_name: &str,
782785
) -> Cancellable<Result<SourceChange, RenameError>> {
783-
self.with_db(|db| rename::rename(db, position, new_name))
786+
self.with_db(|db| rename::rename(db, config, position, new_name))
784787
}
785788

786789
pub fn prepare_rename(
@@ -792,10 +795,11 @@ impl Analysis {
792795

793796
pub fn will_rename_file(
794797
&self,
798+
config: &RenameConfig,
795799
file_id: FileId,
796800
new_name_stem: &str,
797801
) -> Cancellable<Option<SourceChange>> {
798-
self.with_db(|db| rename::will_rename_file(db, file_id, new_name_stem))
802+
self.with_db(|db| rename::will_rename_file(db, config, file_id, new_name_stem))
799803
}
800804

801805
pub fn structural_search_replace(

crates/ide/src/rename.rs

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,10 @@ use hir::{AsAssocItem, InFile, Name, Semantics, sym};
88
use ide_db::{
99
FileId, FileRange, RootDatabase,
1010
defs::{Definition, NameClass, NameRefClass},
11-
rename::{IdentifierKind, RenameDefinition, bail, format_err, source_edit_from_references},
11+
rename::{
12+
IdentifierKind, RenameConfig, RenameDefinition, bail, format_err,
13+
source_edit_from_references,
14+
},
1215
source_change::SourceChangeBuilder,
1316
};
1417
use itertools::Itertools;
@@ -78,6 +81,7 @@ pub(crate) fn prepare_rename(
7881
// ![Rename](https://user-images.githubusercontent.com/48062697/113065582-055aae80-91b1-11eb-8ade-2b58e6d81883.gif)
7982
pub(crate) fn rename(
8083
db: &RootDatabase,
84+
config: &RenameConfig,
8185
position: FilePosition,
8286
new_name: &str,
8387
) -> RenameResult<SourceChange> {
@@ -145,7 +149,7 @@ pub(crate) fn rename(
145149
return rename_to_self(&sema, local);
146150
}
147151
}
148-
def.rename(&sema, new_name.as_str(), rename_def)
152+
def.rename(&sema, config, new_name.as_str(), rename_def)
149153
})
150154
.collect(),
151155
};
@@ -159,13 +163,14 @@ pub(crate) fn rename(
159163
/// Called by the client when it is about to rename a file.
160164
pub(crate) fn will_rename_file(
161165
db: &RootDatabase,
166+
config: &RenameConfig,
162167
file_id: FileId,
163168
new_name_stem: &str,
164169
) -> Option<SourceChange> {
165170
let sema = Semantics::new(db);
166171
let module = sema.file_to_module_def(file_id)?;
167172
let def = Definition::Module(module);
168-
let mut change = def.rename(&sema, new_name_stem, RenameDefinition::Yes).ok()?;
173+
let mut change = def.rename(&sema, config, new_name_stem, RenameDefinition::Yes).ok()?;
169174
change.file_system_edits.clear();
170175
Some(change)
171176
}
@@ -493,6 +498,7 @@ fn text_edit_from_self_param(self_param: &ast::SelfParam, new_name: String) -> O
493498
#[cfg(test)]
494499
mod tests {
495500
use expect_test::{Expect, expect};
501+
use ide_db::rename::RenameConfig;
496502
use ide_db::source_change::SourceChange;
497503
use ide_db::text_edit::TextEdit;
498504
use itertools::Itertools;
@@ -503,6 +509,8 @@ mod tests {
503509

504510
use super::{RangeInfo, RenameError};
505511

512+
const TEST_CONFIG: RenameConfig = RenameConfig { show_conflicts: true };
513+
506514
#[track_caller]
507515
fn check(
508516
new_name: &str,
@@ -517,7 +525,7 @@ mod tests {
517525
}
518526
}
519527
let rename_result = analysis
520-
.rename(position, new_name)
528+
.rename(&TEST_CONFIG, position, new_name)
521529
.unwrap_or_else(|err| panic!("Rename to '{new_name}' was cancelled: {err}"));
522530
match rename_result {
523531
Ok(source_change) => {
@@ -549,7 +557,7 @@ mod tests {
549557
#[track_caller]
550558
fn check_conflicts(new_name: &str, #[rust_analyzer::rust_fixture] ra_fixture: &str) {
551559
let (analysis, position, conflicts) = fixture::annotations(ra_fixture);
552-
let source_change = analysis.rename(position, new_name).unwrap().unwrap();
560+
let source_change = analysis.rename(&TEST_CONFIG, position, new_name).unwrap().unwrap();
553561
let expected_conflicts = conflicts
554562
.into_iter()
555563
.map(|(file_range, _)| (file_range.file_id, file_range.range))
@@ -576,8 +584,10 @@ mod tests {
576584
expect: Expect,
577585
) {
578586
let (analysis, position) = fixture::position(ra_fixture);
579-
let source_change =
580-
analysis.rename(position, new_name).unwrap().expect("Expect returned a RenameError");
587+
let source_change = analysis
588+
.rename(&TEST_CONFIG, position, new_name)
589+
.unwrap()
590+
.expect("Expect returned a RenameError");
581591
expect.assert_eq(&filter_expect(source_change))
582592
}
583593

@@ -588,7 +598,7 @@ mod tests {
588598
) {
589599
let (analysis, position) = fixture::position(ra_fixture);
590600
let source_change = analysis
591-
.will_rename_file(position.file_id, new_name)
601+
.will_rename_file(&TEST_CONFIG, position.file_id, new_name)
592602
.unwrap()
593603
.expect("Expect returned a RenameError");
594604
expect.assert_eq(&filter_expect(source_change))

crates/rust-analyzer/src/cli/analysis_stats.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ use ide::{
2626
use ide_db::{
2727
EditionedFileId, LineIndexDatabase, SnippetCap,
2828
base_db::{SourceDatabase, salsa::Database},
29+
rename::RenameConfig,
2930
};
3031
use itertools::Itertools;
3132
use load_cargo::{LoadCargoConfig, ProcMacroServerChoice, load_workspace};
@@ -1140,6 +1141,7 @@ impl flags::AnalysisStats {
11401141
style_lints: false,
11411142
term_search_fuel: 400,
11421143
term_search_borrowck: true,
1144+
rename_config: RenameConfig { show_conflicts: true },
11431145
},
11441146
ide::AssistResolveStrategy::All,
11451147
analysis.editioned_file_id_to_vfs(file_id),

0 commit comments

Comments
 (0)