1use std::ops::Range;
2use tree_sitter::{Query, QueryMatch};
3
4use crate::MigrationPatterns;
5use crate::patterns::SETTINGS_NESTED_KEY_VALUE_PATTERN;
6
7pub const SETTINGS_PATTERNS: MigrationPatterns = &[
8 (
9 SETTINGS_NESTED_KEY_VALUE_PATTERN,
10 replace_tab_close_button_setting_key,
11 ),
12 (
13 SETTINGS_NESTED_KEY_VALUE_PATTERN,
14 replace_tab_close_button_setting_value,
15 ),
16];
17
18fn replace_tab_close_button_setting_key(
19 contents: &str,
20 mat: &QueryMatch,
21 query: &Query,
22) -> Option<(Range<usize>, String)> {
23 let parent_object_capture_ix = query.capture_index_for_name("parent_key")?;
24 let parent_object_range = mat
25 .nodes_for_capture_index(parent_object_capture_ix)
26 .next()?
27 .byte_range();
28 let parent_object_name = contents.get(parent_object_range)?;
29
30 let setting_name_ix = query.capture_index_for_name("setting_name")?;
31 let setting_range = mat
32 .nodes_for_capture_index(setting_name_ix)
33 .next()?
34 .byte_range();
35 let setting_name = contents.get(setting_range.clone())?;
36
37 if parent_object_name == "tabs" && setting_name == "always_show_close_button" {
38 return Some((setting_range, "show_close_button".into()));
39 }
40
41 None
42}
43
44fn replace_tab_close_button_setting_value(
45 contents: &str,
46 mat: &QueryMatch,
47 query: &Query,
48) -> Option<(Range<usize>, String)> {
49 let parent_object_capture_ix = query.capture_index_for_name("parent_key")?;
50 let parent_object_range = mat
51 .nodes_for_capture_index(parent_object_capture_ix)
52 .next()?
53 .byte_range();
54 let parent_object_name = contents.get(parent_object_range)?;
55
56 let setting_name_ix = query.capture_index_for_name("setting_name")?;
57 let setting_name_range = mat
58 .nodes_for_capture_index(setting_name_ix)
59 .next()?
60 .byte_range();
61 let setting_name = contents.get(setting_name_range)?;
62
63 let setting_value_ix = query.capture_index_for_name("setting_value")?;
64 let setting_value_range = mat
65 .nodes_for_capture_index(setting_value_ix)
66 .next()?
67 .byte_range();
68 let setting_value = contents.get(setting_value_range.clone())?;
69
70 if parent_object_name == "tabs" && setting_name == "always_show_close_button" {
71 match setting_value {
72 "true" => {
73 return Some((setting_value_range, "\"always\"".to_string()));
74 }
75 "false" => {
76 return Some((setting_value_range, "\"hover\"".to_string()));
77 }
78 _ => {}
79 }
80 }
81
82 None
83}