merman-editor-core 0.8.0-alpha.3

Protocol-neutral editor intelligence core for Merman.
Documentation
use merman_analysis::{DiagnosticFix, DiagnosticFixEdit, SourceMap};
use merman_editor_core::{Position, code_actions_from_fixes};

#[test]
fn code_action_planner_sorts_non_overlapping_edits() {
    let map = SourceMap::new("0123456789");
    let later = map.span(5, 6).unwrap();
    let earlier = map.span(1, 2).unwrap();
    let fix = DiagnosticFix::new(
        "Sort edits",
        vec![
            DiagnosticFixEdit::new(later, "late"),
            DiagnosticFixEdit::new(earlier, "early"),
        ],
    )
    .preferred();

    let actions = code_actions_from_fixes([&fix]);

    assert_eq!(actions.len(), 1);
    assert!(actions[0].is_preferred);
    assert_eq!(actions[0].title, "Sort edits");
    assert_eq!(actions[0].edits[0].range.start, Position::new(0, 1));
    assert_eq!(actions[0].edits[0].new_text, "early");
    assert_eq!(actions[0].edits[1].range.start, Position::new(0, 5));
    assert_eq!(actions[0].edits[1].new_text, "late");
}

#[test]
fn code_action_planner_rejects_overlapping_edits() {
    let map = SourceMap::new("0123456789");
    let left = map.span(0, 4).unwrap();
    let right = map.span(2, 5).unwrap();
    let fix = DiagnosticFix::new(
        "Reject overlapping edits",
        vec![
            DiagnosticFixEdit::new(right, "right"),
            DiagnosticFixEdit::new(left, "left"),
        ],
    );

    let actions = code_actions_from_fixes([&fix]);

    assert!(actions.is_empty());
}