keymap.rs

 1use std::ops::Range;
 2
 3use tree_sitter::{Query, QueryMatch};
 4
 5use crate::MigrationPatterns;
 6
 7pub const KEYMAP_PATTERNS: MigrationPatterns =
 8    &[(crate::patterns::KEYMAP_CONTEXT_PATTERN, rename_context_key)];
 9
10fn rename_context_key(
11    contents: &str,
12    mat: &QueryMatch,
13    query: &Query,
14) -> Option<(Range<usize>, String)> {
15    let context_predicate_ix = query.capture_index_for_name("context_predicate")?;
16    let context_predicate_range = mat
17        .nodes_for_capture_index(context_predicate_ix)
18        .next()?
19        .byte_range();
20    let old_predicate = contents.get(context_predicate_range.clone())?.to_string();
21    let mut new_predicate = old_predicate.clone();
22
23    const REPLACEMENTS: &[(&str, &str)] = &[
24        (
25            "edit_prediction_conflict && !showing_completions",
26            "(edit_prediction && in_leading_whitespace)",
27        ),
28        (
29            "edit_prediction_conflict && showing_completions",
30            "(edit_prediction && showing_completions)",
31        ),
32        (
33            "edit_prediction_conflict",
34            "(edit_prediction && (showing_completions || in_leading_whitespace))",
35        ),
36    ];
37
38    for (old, new) in REPLACEMENTS {
39        new_predicate = new_predicate.replace(old, new);
40    }
41
42    if new_predicate != old_predicate {
43        Some((context_predicate_range, new_predicate))
44    } else {
45        None
46    }
47}