settings.rs

  1use collections::HashMap;
  2use std::{ops::Range, sync::LazyLock};
  3use tree_sitter::{Query, QueryMatch};
  4
  5use crate::MigrationPatterns;
  6use crate::patterns::{
  7    SETTINGS_LANGUAGES_PATTERN, SETTINGS_NESTED_KEY_VALUE_PATTERN, SETTINGS_ROOT_KEY_VALUE_PATTERN,
  8};
  9
 10pub const SETTINGS_PATTERNS: MigrationPatterns = &[
 11    (SETTINGS_ROOT_KEY_VALUE_PATTERN, replace_setting_name),
 12    (
 13        SETTINGS_NESTED_KEY_VALUE_PATTERN,
 14        replace_edit_prediction_provider_setting,
 15    ),
 16    (SETTINGS_LANGUAGES_PATTERN, replace_setting_in_languages),
 17];
 18
 19fn replace_setting_name(
 20    contents: &str,
 21    mat: &QueryMatch,
 22    query: &Query,
 23) -> Option<(Range<usize>, String)> {
 24    let setting_capture_ix = query.capture_index_for_name("name")?;
 25    let setting_name_range = mat
 26        .nodes_for_capture_index(setting_capture_ix)
 27        .next()?
 28        .byte_range();
 29    let setting_name = contents.get(setting_name_range.clone())?;
 30    let new_setting_name = SETTINGS_STRING_REPLACE.get(&setting_name)?;
 31    Some((setting_name_range, new_setting_name.to_string()))
 32}
 33
 34pub static SETTINGS_STRING_REPLACE: LazyLock<HashMap<&'static str, &'static str>> =
 35    LazyLock::new(|| {
 36        HashMap::from_iter([
 37            (
 38                "show_inline_completions_in_menu",
 39                "show_edit_predictions_in_menu",
 40            ),
 41            ("show_inline_completions", "show_edit_predictions"),
 42            (
 43                "inline_completions_disabled_in",
 44                "edit_predictions_disabled_in",
 45            ),
 46            ("inline_completions", "edit_predictions"),
 47        ])
 48    });
 49
 50pub fn replace_edit_prediction_provider_setting(
 51    contents: &str,
 52    mat: &QueryMatch,
 53    query: &Query,
 54) -> Option<(Range<usize>, String)> {
 55    let parent_object_capture_ix = query.capture_index_for_name("parent_key")?;
 56    let parent_object_range = mat
 57        .nodes_for_capture_index(parent_object_capture_ix)
 58        .next()?
 59        .byte_range();
 60    let parent_object_name = contents.get(parent_object_range)?;
 61
 62    let setting_name_ix = query.capture_index_for_name("setting_name")?;
 63    let setting_range = mat
 64        .nodes_for_capture_index(setting_name_ix)
 65        .next()?
 66        .byte_range();
 67    let setting_name = contents.get(setting_range.clone())?;
 68
 69    if parent_object_name == "features" && setting_name == "inline_completion_provider" {
 70        return Some((setting_range, "edit_prediction_provider".into()));
 71    }
 72
 73    None
 74}
 75
 76fn replace_setting_in_languages(
 77    contents: &str,
 78    mat: &QueryMatch,
 79    query: &Query,
 80) -> Option<(Range<usize>, String)> {
 81    let setting_capture_ix = query.capture_index_for_name("setting_name")?;
 82    let setting_name_range = mat
 83        .nodes_for_capture_index(setting_capture_ix)
 84        .next()?
 85        .byte_range();
 86    let setting_name = contents.get(setting_name_range.clone())?;
 87    let new_setting_name = LANGUAGE_SETTINGS_REPLACE.get(&setting_name)?;
 88
 89    Some((setting_name_range, new_setting_name.to_string()))
 90}
 91
 92static LANGUAGE_SETTINGS_REPLACE: LazyLock<HashMap<&'static str, &'static str>> =
 93    LazyLock::new(|| {
 94        HashMap::from_iter([
 95            ("show_inline_completions", "show_edit_predictions"),
 96            (
 97                "inline_completions_disabled_in",
 98                "edit_predictions_disabled_in",
 99            ),
100        ])
101    });