settings.rs

 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}