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