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 SETTINGS_NESTED_KEY_VALUE_PATTERN,
9 rename_restore_on_startup_values,
10)];
11
12fn rename_restore_on_startup_values(
13 contents: &str,
14 mat: &QueryMatch,
15 query: &Query,
16) -> Option<(Range<usize>, String)> {
17 if !is_restore_on_startup_setting(contents, mat, query) {
18 return None;
19 }
20
21 let setting_value_ix = query.capture_index_for_name("setting_value")?;
22 let setting_value_range = mat
23 .nodes_for_capture_index(setting_value_ix)
24 .next()?
25 .byte_range();
26 let setting_value = contents.get(setting_value_range.clone())?;
27
28 // The value includes quotes, so we check for the quoted string
29 let new_value = match setting_value.trim() {
30 "\"none\"" => "\"empty_tab\"",
31 "\"welcome\"" => "\"launchpad\"",
32 _ => return None,
33 };
34
35 Some((setting_value_range, new_value.to_string()))
36}
37
38fn is_restore_on_startup_setting(contents: &str, mat: &QueryMatch, query: &Query) -> bool {
39 // Check that the parent key is "workspace" (since restore_on_startup is under workspace settings)
40 // Actually, restore_on_startup can be at the root level too, so we need to handle both cases
41 // The SETTINGS_NESTED_KEY_VALUE_PATTERN captures parent_key and setting_name
42
43 let setting_name_ix = match query.capture_index_for_name("setting_name") {
44 Some(ix) => ix,
45 None => return false,
46 };
47 let setting_name_range = match mat.nodes_for_capture_index(setting_name_ix).next() {
48 Some(node) => node.byte_range(),
49 None => return false,
50 };
51 contents.get(setting_name_range) == Some("restore_on_startup")
52}