1use collections::HashMap;
2use std::{ops::Range, sync::LazyLock};
3use tree_sitter::{Query, QueryMatch};
4
5use crate::MigrationPatterns;
6use crate::patterns::KEYMAP_ACTION_STRING_PATTERN;
7
8pub const KEYMAP_PATTERNS: MigrationPatterns =
9 &[(KEYMAP_ACTION_STRING_PATTERN, replace_string_action)];
10
11fn replace_string_action(
12 contents: &str,
13 mat: &QueryMatch,
14 query: &Query,
15) -> Option<(Range<usize>, String)> {
16 let action_name_ix = query.capture_index_for_name("action_name")?;
17 let action_name_node = mat.nodes_for_capture_index(action_name_ix).next()?;
18 let action_name_range = action_name_node.byte_range();
19 let action_name = contents.get(action_name_range.clone())?;
20
21 if let Some(new_action_name) = STRING_REPLACE.get(&action_name) {
22 return Some((action_name_range, new_action_name.to_string()));
23 }
24
25 if let Some((new_action_name, options)) = STRING_TO_ARRAY_REPLACE.get(action_name) {
26 let full_string_range = action_name_node.parent()?.byte_range();
27 let mut options_parts = Vec::new();
28 for (key, value) in options.iter() {
29 options_parts.push(format!("\"{}\": {}", key, value));
30 }
31 let options_str = options_parts.join(", ");
32 let replacement = format!("[\"{}\", {{ {} }}]", new_action_name, options_str);
33 return Some((full_string_range, replacement));
34 }
35
36 None
37}
38
39static STRING_REPLACE: LazyLock<HashMap<&str, &str>> = LazyLock::new(|| {
40 HashMap::from_iter([
41 (
42 "editor::GoToPrevDiagnostic",
43 "editor::GoToPreviousDiagnostic",
44 ),
45 ("editor::ContextMenuPrev", "editor::ContextMenuPrevious"),
46 ("search::SelectPrevMatch", "search::SelectPreviousMatch"),
47 ("file_finder::SelectPrev", "file_finder::SelectPrevious"),
48 ("menu::SelectPrev", "menu::SelectPrevious"),
49 ("editor::TabPrev", "editor::Backtab"),
50 ("pane::ActivatePrevItem", "pane::ActivatePreviousItem"),
51 ("vim::MoveToPrev", "vim::MoveToPrevious"),
52 ("vim::MoveToPrevMatch", "vim::MoveToPreviousMatch"),
53 ])
54});
55
56/// "editor::GoToPrevHunk" -> ["editor::GoToPreviousHunk", { "center_cursor": true }]
57static STRING_TO_ARRAY_REPLACE: LazyLock<HashMap<&str, (&str, HashMap<&str, bool>)>> =
58 LazyLock::new(|| {
59 HashMap::from_iter([
60 (
61 "editor::GoToHunk",
62 (
63 "editor::GoToHunk",
64 HashMap::from_iter([("center_cursor", true)]),
65 ),
66 ),
67 (
68 "editor::GoToPrevHunk",
69 (
70 "editor::GoToPreviousHunk",
71 HashMap::from_iter([("center_cursor", true)]),
72 ),
73 ),
74 ])
75 });