bonsai-ninja-lang-csharp 0.2.2

C# language adapter.
use super::*;

fn parse_import_specs(src: &str) -> Vec<ImportSpec> {
    let language = language_from_pack(PACK_NAME).expect("csharp grammar");
    let mut parser = tree_sitter::Parser::new();
    parser.set_language(&language).expect("set csharp grammar");
    let tree = parser.parse(src.as_bytes(), None).expect("parse csharp source");
    parse_imports(&tree, src.as_bytes(), FileId::new(0))
}

#[test]
fn using_static_emits_statement_import_and_local_wildcard_binding() {
    let imports = parse_import_specs("using static App.Util;\n");

    assert!(imports.iter().any(|spec| {
        spec.module == "App.Util"
            && spec.alias.is_none()
            && !spec.is_wildcard
            && spec.original_name.is_none()
            && spec.scope == ImportScope::Module
    }));
    assert!(imports.iter().any(|spec| {
        spec.module == "App.Util"
            && spec.alias.is_none()
            && spec.is_wildcard
            && spec.original_name.is_none()
            && spec.scope == ImportScope::Local
    }));
}

#[test]
fn using_static_classification_comes_from_the_grammar_token() {
    let imports = parse_import_specs("using /* trivia */ static App.Util;\n");

    assert!(imports
        .iter()
        .any(|spec| { spec.module == "App.Util" && spec.is_wildcard && spec.scope == ImportScope::Local }));
}

#[test]
fn ordinary_using_does_not_emit_local_wildcard_binding() {
    let imports = parse_import_specs("using App;\n");

    assert!(imports.iter().any(|spec| {
        spec.module == "App"
            && spec.alias.is_none()
            && !spec.is_wildcard
            && spec.original_name.is_none()
            && spec.scope == ImportScope::Module
    }));
    assert!(
        imports.iter().all(|spec| spec.scope != ImportScope::Local),
        "ordinary namespace usings should not import callable members: {imports:?}"
    );
}