1 //! This module provides an SSR assist. It is not desirable to include this
2 //! assist in ide_assists because that would require the ide_assists crate
3 //! depend on the ide_ssr crate.
5 use ide_assists::{Assist, AssistId, AssistKind, AssistResolveStrategy, GroupLabel};
6 use ide_db::{base_db::FileRange, label::Label, source_change::SourceChange, RootDatabase};
8 pub(crate) fn ssr_assists(
10 resolve: &AssistResolveStrategy,
13 let mut ssr_assists = Vec::with_capacity(2);
15 let (match_finder, comment_range) = match ide_ssr::ssr_from_comment(db, frange) {
16 Some(ssr_data) => ssr_data,
17 None => return ssr_assists,
19 let id = AssistId("ssr", AssistKind::RefactorRewrite);
21 let (source_change_for_file, source_change_for_workspace) = if resolve.should_resolve(&id) {
22 let edits = match_finder.edits();
24 let source_change_for_file = {
25 let text_edit_for_file = edits.get(&frange.file_id).cloned().unwrap_or_default();
26 SourceChange::from_text_edit(frange.file_id, text_edit_for_file)
29 let source_change_for_workspace = SourceChange::from(match_finder.edits());
31 (Some(source_change_for_file), Some(source_change_for_workspace))
37 ("Apply SSR in file", source_change_for_file),
38 ("Apply SSR in workspace", source_change_for_workspace),
41 for (label, source_change) in assists.into_iter() {
44 label: Label::new(label.to_string()),
45 group: Some(GroupLabel("Apply SSR".into())),
46 target: comment_range,
50 ssr_assists.push(assist);
60 use expect_test::expect;
61 use ide_assists::{Assist, AssistResolveStrategy};
63 base_db::{fixture::WithFixture, salsa::Durability, FileRange},
64 symbol_index::SymbolsDatabase,
67 use rustc_hash::FxHashSet;
69 use super::ssr_assists;
71 fn get_assists(ra_fixture: &str, resolve: AssistResolveStrategy) -> Vec<Assist> {
72 let (mut db, file_id, range_or_offset) = RootDatabase::with_range_or_offset(ra_fixture);
73 let mut local_roots = FxHashSet::default();
74 local_roots.insert(ide_db::base_db::fixture::WORKSPACE);
75 db.set_local_roots_with_durability(Arc::new(local_roots), Durability::HIGH);
76 ssr_assists(&db, &resolve, FileRange { file_id, range: range_or_offset.into() })
80 fn not_applicable_comment_not_ssr() {
87 let assists = get_assists(ra_fixture, AssistResolveStrategy::All);
89 assert_eq!(0, assists.len());
93 fn resolve_edits_true() {
94 let assists = get_assists(
105 AssistResolveStrategy::All,
108 assert_eq!(2, assists.len());
109 let mut assists = assists.into_iter();
111 let apply_in_file_assist = assists.next().unwrap();
118 label: "Apply SSR in file",
139 file_system_edits: [],
145 .assert_debug_eq(&apply_in_file_assist);
147 let apply_in_workspace_assist = assists.next().unwrap();
154 label: "Apply SSR in workspace",
185 file_system_edits: [],
191 .assert_debug_eq(&apply_in_workspace_assist);
195 fn resolve_edits_false() {
196 let assists = get_assists(
207 AssistResolveStrategy::None,
210 assert_eq!(2, assists.len());
211 let mut assists = assists.into_iter();
213 let apply_in_file_assist = assists.next().unwrap();
220 label: "Apply SSR in file",
230 .assert_debug_eq(&apply_in_file_assist);
232 let apply_in_workspace_assist = assists.next().unwrap();
239 label: "Apply SSR in workspace",
249 .assert_debug_eq(&apply_in_workspace_assist);