perl-module-token-parser 0.12.2

Parse Perl module tokens at a cursor offset for import/reference workflows
Documentation
use perl_module_reference::{extract_module_reference, find_module_reference};
use perl_module_token_parser::parse_module_token;

#[test]
fn parser_and_reference_coordinates_match_for_use_statement() {
    let source = "use App::Config::Loader;\n";
    let line = source.lines().next().unwrap_or("");
    let start = line.find("App::Config::Loader").unwrap_or(0);

    let span = parse_module_token(line, start);
    assert!(span.is_some(), "valid token span");
    let span = span.unwrap_or(perl_module_token_parser::ModuleTokenSpan { start: 0, end: 0 });

    let reference = find_module_reference(source, span.start);
    assert!(reference.is_some(), "cursor match in source");
    if let Some(reference) = reference {
        assert_eq!(reference.module_start, span.start);
        assert_eq!(reference.module_end, span.end);
        assert_eq!(reference.canonical_module_name(), "App::Config::Loader");
    }

    let extracted = extract_module_reference(source, span.start);
    assert_eq!(extracted, Some("App::Config::Loader".to_string()));
}

#[test]
fn parser_with_legacy_separator_still_informs_reference_extraction() {
    let source = "use Foo'Bar;\n";
    let line = source.lines().next().unwrap_or("");
    let start = line.find("Foo").unwrap_or(0);

    let span = parse_module_token(line, start);
    assert!(span.is_some(), "valid legacy token span");
    let span = span.unwrap_or(perl_module_token_parser::ModuleTokenSpan { start: 0, end: 0 });

    let extracted = extract_module_reference(source, start + 3);

    let span2 = parse_module_token(line, start)
        .unwrap_or(perl_module_token_parser::ModuleTokenSpan { start: 0, end: 0 });
    assert_eq!(span, span2);
    assert_eq!(extracted, Some("Foo::Bar".to_string()));
    assert_eq!(span.start, start);
}