Skip to content

Commit a7422a9

Browse files
Provide a setting to disable showing rename conflicts
1 parent b4de9df commit a7422a9

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
@@ -9,6 +9,7 @@ use ide_db::{
99
SnippetCap,
1010
assists::ExprFillDefaultMode,
1111
imports::{import_assets::ImportPathConfig, insert_use::InsertUseConfig},
12+
rename::RenameConfig,
1213
};
1314

1415
use crate::AssistKind;
@@ -27,6 +28,7 @@ pub struct AssistConfig {
2728
pub code_action_grouping: bool,
2829
pub expr_fill_default: ExprFillDefaultMode,
2930
pub prefer_self_ty: bool,
31+
pub rename_config: RenameConfig,
3032
}
3133

3234
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
fn assists(

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

@@ -334,6 +345,7 @@ fn rename_mod(
334345

335346
fn rename_reference(
336347
sema: &Semantics<'_, RootDatabase>,
348+
config: &RenameConfig,
337349
def: Definition,
338350
new_name: &str,
339351
rename_definition: RenameDefinition,
@@ -396,7 +408,8 @@ fn rename_reference(
396408
if rename_definition == RenameDefinition::Yes {
397409
// This needs to come after the references edits, because we change the annotation of existing edits
398410
// if a conflict is detected.
399-
let (file_id, edit) = source_edit_from_def(sema, def, &new_name, &mut source_change)?;
411+
let (file_id, edit) =
412+
source_edit_from_def(sema, config, def, &new_name, &mut source_change)?;
400413
source_change.insert_source_edit(file_id, edit);
401414
}
402415
Ok(source_change)
@@ -554,6 +567,7 @@ fn source_edit_from_name_ref(
554567

555568
fn source_edit_from_def(
556569
sema: &Semantics<'_, RootDatabase>,
570+
config: &RenameConfig,
557571
def: Definition,
558572
new_name: &Name,
559573
source_change: &mut SourceChange,
@@ -562,21 +576,22 @@ fn source_edit_from_def(
562576
if let Definition::Local(local) = def {
563577
let mut file_id = None;
564578

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

581596
for source in local.sources(sema.db) {
582597
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 ide_db::{MiniCore, ra_fixture::RaFixtureAnalysis};
7577
use macros::UpmapFromRaFixture;
@@ -828,10 +830,11 @@ impl Analysis {
828830
/// name.
829831
pub fn rename(
830832
&self,
833+
config: &RenameConfig,
831834
position: FilePosition,
832835
new_name: &str,
833836
) -> Cancellable<Result<SourceChange, RenameError>> {
834-
self.with_db(|db| rename::rename(db, position, new_name))
837+
self.with_db(|db| rename::rename(db, config, position, new_name))
835838
}
836839

837840
pub fn prepare_rename(
@@ -843,10 +846,11 @@ impl Analysis {
843846

844847
pub fn will_rename_file(
845848
&self,
849+
config: &RenameConfig,
846850
file_id: FileId,
847851
new_name_stem: &str,
848852
) -> Cancellable<Option<SourceChange>> {
849-
self.with_db(|db| rename::will_rename_file(db, file_id, new_name_stem))
853+
self.with_db(|db| rename::will_rename_file(db, config, file_id, new_name_stem))
850854
}
851855

852856
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;
@@ -98,6 +101,7 @@ pub(crate) fn prepare_rename(
98101
// ![Rename](https://user-images.githubusercontent.com/48062697/113065582-055aae80-91b1-11eb-8ade-2b58e6d81883.gif)
99102
pub(crate) fn rename(
100103
db: &RootDatabase,
104+
config: &RenameConfig,
101105
position: FilePosition,
102106
new_name: &str,
103107
) -> RenameResult<SourceChange> {
@@ -165,7 +169,7 @@ pub(crate) fn rename(
165169
return rename_to_self(&sema, local);
166170
}
167171
}
168-
def.rename(&sema, new_name.as_str(), rename_def)
172+
def.rename(&sema, config, new_name.as_str(), rename_def)
169173
})),
170174
};
171175

@@ -178,13 +182,14 @@ pub(crate) fn rename(
178182
/// Called by the client when it is about to rename a file.
179183
pub(crate) fn will_rename_file(
180184
db: &RootDatabase,
185+
config: &RenameConfig,
181186
file_id: FileId,
182187
new_name_stem: &str,
183188
) -> Option<SourceChange> {
184189
let sema = Semantics::new(db);
185190
let module = sema.file_to_module_def(file_id)?;
186191
let def = Definition::Module(module);
187-
let mut change = def.rename(&sema, new_name_stem, RenameDefinition::Yes).ok()?;
192+
let mut change = def.rename(&sema, config, new_name_stem, RenameDefinition::Yes).ok()?;
188193
change.file_system_edits.clear();
189194
Some(change)
190195
}
@@ -579,6 +584,7 @@ fn text_edit_from_self_param(self_param: &ast::SelfParam, new_name: String) -> O
579584
#[cfg(test)]
580585
mod tests {
581586
use expect_test::{Expect, expect};
587+
use ide_db::rename::RenameConfig;
582588
use ide_db::source_change::SourceChange;
583589
use ide_db::text_edit::TextEdit;
584590
use itertools::Itertools;
@@ -589,6 +595,8 @@ mod tests {
589595

590596
use super::{RangeInfo, RenameError};
591597

598+
const TEST_CONFIG: RenameConfig = RenameConfig { show_conflicts: true };
599+
592600
#[track_caller]
593601
fn check(
594602
new_name: &str,
@@ -603,7 +611,7 @@ mod tests {
603611
panic!("Prepare rename to '{new_name}' was failed: {err}")
604612
}
605613
let rename_result = analysis
606-
.rename(position, new_name)
614+
.rename(&TEST_CONFIG, position, new_name)
607615
.unwrap_or_else(|err| panic!("Rename to '{new_name}' was cancelled: {err}"));
608616
match rename_result {
609617
Ok(source_change) => {
@@ -635,7 +643,7 @@ mod tests {
635643
#[track_caller]
636644
fn check_conflicts(new_name: &str, #[rust_analyzer::rust_fixture] ra_fixture: &str) {
637645
let (analysis, position, conflicts) = fixture::annotations(ra_fixture);
638-
let source_change = analysis.rename(position, new_name).unwrap().unwrap();
646+
let source_change = analysis.rename(&TEST_CONFIG, position, new_name).unwrap().unwrap();
639647
let expected_conflicts = conflicts
640648
.into_iter()
641649
.map(|(file_range, _)| (file_range.file_id, file_range.range))
@@ -662,8 +670,10 @@ mod tests {
662670
expect: Expect,
663671
) {
664672
let (analysis, position) = fixture::position(ra_fixture);
665-
let source_change =
666-
analysis.rename(position, new_name).unwrap().expect("Expect returned a RenameError");
673+
let source_change = analysis
674+
.rename(&TEST_CONFIG, position, new_name)
675+
.unwrap()
676+
.expect("Expect returned a RenameError");
667677
expect.assert_eq(&filter_expect(source_change))
668678
}
669679

@@ -674,7 +684,7 @@ mod tests {
674684
) {
675685
let (analysis, position) = fixture::position(ra_fixture);
676686
let source_change = analysis
677-
.will_rename_file(position.file_id, new_name)
687+
.will_rename_file(&TEST_CONFIG, position.file_id, new_name)
678688
.unwrap()
679689
.expect("Expect returned a RenameError");
680690
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
@@ -27,6 +27,7 @@ use ide::{
2727
use ide_db::{
2828
EditionedFileId, LineIndexDatabase, MiniCore, SnippetCap,
2929
base_db::{SourceDatabase, salsa::Database},
30+
rename::RenameConfig,
3031
};
3132
use itertools::Itertools;
3233
use load_cargo::{LoadCargoConfig, ProcMacroServerChoice, load_workspace};
@@ -1153,6 +1154,7 @@ impl flags::AnalysisStats {
11531154
style_lints: false,
11541155
term_search_fuel: 400,
11551156
term_search_borrowck: true,
1157+
rename_config: RenameConfig { show_conflicts: true },
11561158
},
11571159
ide::AssistResolveStrategy::All,
11581160
analysis.editioned_file_id_to_vfs(file_id),

0 commit comments

Comments
 (0)