weavatrix-parse 0.3.5

Dependency-free source tokenizer and structural extractor for repository intelligence
Documentation
use super::*;

#[test]
fn nested_template_text_never_becomes_a_call() {
    let source = r"function exactUsage(files) {
  return `${files ? ` in ${plural(files)} file(s)` : ''}`
}
";
    let facts = extract(source, Language::JavaScript);
    assert!(
        !facts
            .references
            .iter()
            .any(|reference| reference.name == "file"),
        "`file(s)` is literal template text, got {:?}",
        facts.references
    );
    let plural = facts
        .references
        .iter()
        .find(|reference| reference.name == "plural")
        .expect("call in a nested interpolation");
    assert_eq!(plural.kind, ReferenceKind::Call);
    assert_eq!(plural.owner.as_deref(), Some("exactUsage"));
    assert_eq!(plural.span.line, 2);
}

#[test]
fn template_interpolations_keep_all_calls_and_exact_spans() {
    let source = r"function describe(blob, name, edge, graph) {
  const mentioned = new RegExp(`x${escRe(name)}y`).test(blob)
  return `${compileKind(edge) ? labelOf(graph, edge.id) : ''}`
}
";
    let facts = extract(source, Language::JavaScript);
    let calls = facts
        .references
        .iter()
        .filter(|reference| reference.kind == ReferenceKind::Call)
        .collect::<Vec<_>>();
    for (name, line) in [
        ("RegExp", 2),
        ("escRe", 2),
        ("test", 2),
        ("compileKind", 3),
        ("labelOf", 3),
    ] {
        let reference = calls
            .iter()
            .find(|reference| reference.name == name)
            .unwrap_or_else(|| panic!("missing {name}, got {calls:?}"));
        assert_eq!(reference.span.line, line);
        assert_eq!(
            &source[reference.span.start..reference.span.end],
            name,
            "relocated span must name the original call"
        );
        assert_eq!(reference.owner.as_deref(), Some("describe"));
    }
}