1use collections::HashMap;
2use std::{ops::Range, sync::LazyLock};
3use tree_sitter::{Query, QueryMatch};
4
5use crate::MigrationPatterns;
6use crate::patterns::{
7 SETTINGS_LANGUAGES_PATTERN, SETTINGS_NESTED_KEY_VALUE_PATTERN, SETTINGS_ROOT_KEY_VALUE_PATTERN,
8};
9
10pub const SETTINGS_PATTERNS: MigrationPatterns = &[
11 (SETTINGS_ROOT_KEY_VALUE_PATTERN, replace_setting_name),
12 (
13 SETTINGS_NESTED_KEY_VALUE_PATTERN,
14 replace_edit_prediction_provider_setting,
15 ),
16 (SETTINGS_LANGUAGES_PATTERN, replace_setting_in_languages),
17];
18
19fn replace_setting_name(
20 contents: &str,
21 mat: &QueryMatch,
22 query: &Query,
23) -> Option<(Range<usize>, String)> {
24 let setting_capture_ix = query.capture_index_for_name("name")?;
25 let setting_name_range = mat
26 .nodes_for_capture_index(setting_capture_ix)
27 .next()?
28 .byte_range();
29 let setting_name = contents.get(setting_name_range.clone())?;
30 let new_setting_name = SETTINGS_STRING_REPLACE.get(&setting_name)?;
31 Some((setting_name_range, new_setting_name.to_string()))
32}
33
34pub static SETTINGS_STRING_REPLACE: LazyLock<HashMap<&'static str, &'static str>> =
35 LazyLock::new(|| {
36 HashMap::from_iter([
37 (
38 "show_inline_completions_in_menu",
39 "show_edit_predictions_in_menu",
40 ),
41 ("show_inline_completions", "show_edit_predictions"),
42 (
43 "inline_completions_disabled_in",
44 "edit_predictions_disabled_in",
45 ),
46 ("inline_completions", "edit_predictions"),
47 ])
48 });
49
50pub fn replace_edit_prediction_provider_setting(
51 contents: &str,
52 mat: &QueryMatch,
53 query: &Query,
54) -> Option<(Range<usize>, String)> {
55 let parent_object_capture_ix = query.capture_index_for_name("parent_key")?;
56 let parent_object_range = mat
57 .nodes_for_capture_index(parent_object_capture_ix)
58 .next()?
59 .byte_range();
60 let parent_object_name = contents.get(parent_object_range)?;
61
62 let setting_name_ix = query.capture_index_for_name("setting_name")?;
63 let setting_range = mat
64 .nodes_for_capture_index(setting_name_ix)
65 .next()?
66 .byte_range();
67 let setting_name = contents.get(setting_range.clone())?;
68
69 if parent_object_name == "features" && setting_name == "inline_completion_provider" {
70 return Some((setting_range, "edit_prediction_provider".into()));
71 }
72
73 None
74}
75
76fn replace_setting_in_languages(
77 contents: &str,
78 mat: &QueryMatch,
79 query: &Query,
80) -> Option<(Range<usize>, String)> {
81 let setting_capture_ix = query.capture_index_for_name("setting_name")?;
82 let setting_name_range = mat
83 .nodes_for_capture_index(setting_capture_ix)
84 .next()?
85 .byte_range();
86 let setting_name = contents.get(setting_name_range.clone())?;
87 let new_setting_name = LANGUAGE_SETTINGS_REPLACE.get(&setting_name)?;
88
89 Some((setting_name_range, new_setting_name.to_string()))
90}
91
92static LANGUAGE_SETTINGS_REPLACE: LazyLock<HashMap<&'static str, &'static str>> =
93 LazyLock::new(|| {
94 HashMap::from_iter([
95 ("show_inline_completions", "show_edit_predictions"),
96 (
97 "inline_completions_disabled_in",
98 "edit_predictions_disabled_in",
99 ),
100 ])
101 });