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_enable_preview_from_code_navigation_setting,
10)];
11
12fn rename_enable_preview_from_code_navigation_setting(
13 contents: &str,
14 mat: &QueryMatch,
15 query: &Query,
16) -> Option<(Range<usize>, String)> {
17 if !is_enable_preview_from_code_navigation(contents, mat, query) {
18 return None;
19 }
20
21 let setting_name_ix = query.capture_index_for_name("setting_name")?;
22 let setting_name_range = mat
23 .nodes_for_capture_index(setting_name_ix)
24 .next()?
25 .byte_range();
26
27 Some((
28 setting_name_range,
29 "enable_keep_preview_on_code_navigation".to_string(),
30 ))
31}
32
33fn is_enable_preview_from_code_navigation(contents: &str, mat: &QueryMatch, query: &Query) -> bool {
34 let parent_key_ix = match query.capture_index_for_name("parent_key") {
35 Some(ix) => ix,
36 None => return false,
37 };
38 let parent_range = match mat.nodes_for_capture_index(parent_key_ix).next() {
39 Some(node) => node.byte_range(),
40 None => return false,
41 };
42 if contents.get(parent_range) != Some("preview_tabs") {
43 return false;
44 }
45
46 let setting_name_ix = match query.capture_index_for_name("setting_name") {
47 Some(ix) => ix,
48 None => return false,
49 };
50 let setting_name_range = match mat.nodes_for_capture_index(setting_name_ix).next() {
51 Some(node) => node.byte_range(),
52 None => return false,
53 };
54 contents.get(setting_name_range) == Some("enable_preview_from_code_navigation")
55}