rusty-javac 0.2.2

A Java compiler written in Rust.
Documentation
use crate::parser::type_decl;
use crate::parser::{JavaSyntaxKind, Parser};

pub(crate) fn compilation_unit(p: &mut Parser) {
    use JavaSyntaxKind::*;
    let m = p.start();
    if p.at(PackageKw) {
        package_decl(p);
    }
    while p.at(ImportKw) {
        import_decl(p);
    }
    while p.at_any(&[
        ClassKw,
        InterfaceKw,
        EnumKw,
        RecordKw,
        At,
        PublicKw,
        ProtectedKw,
        PrivateKw,
        AbstractKw,
        FinalKw,
        StaticKw,
        StrictfpKw,
        SealedKw,
        NonSealedKw,
    ]) {
        type_decl::type_decl(p);
    }
    m.complete(p, CompilationUnit);
}

pub(crate) fn package_decl(p: &mut Parser) {
    use JavaSyntaxKind::*;
    let m = p.start();
    p.expect(PackageKw);
    qualified_name(p);
    p.expect(Semi);
    m.complete(p, PackageDecl);
}

pub(crate) fn import_decl(p: &mut Parser) {
    use JavaSyntaxKind::*;
    let m = p.start();
    p.expect(ImportKw);
    p.eat(StaticKw);
    qualified_name(p);
    if p.at(Dot) && p.look(1) == Star {
        p.bump();
        p.bump();
    }
    p.expect(Semi);
    m.complete(p, ImportDecl);
}

pub(crate) fn modifier_list(p: &mut Parser) {
    use JavaSyntaxKind::*;
    let m = p.start();
    let mods = [
        PublicKw,
        ProtectedKw,
        PrivateKw,
        AbstractKw,
        FinalKw,
        StaticKw,
        StrictfpKw,
        SealedKw,
        NonSealedKw,
        NativeKw,
        SynchronizedKw,
        TransientKw,
        VolatileKw,
        DefaultKw,
    ];
    loop {
        if p.at_any(&mods) {
            p.bump();
        } else if p.at(At) && p.look(1) != InterfaceKw {
            annotation(p);
        } else {
            break;
        }
    }
    m.complete(p, ModifierList);
}

pub(crate) fn qualified_name(p: &mut Parser) {
    use JavaSyntaxKind::*;
    let m = p.start();
    p.expect(Ident);
    while p.at(Dot) && p.look(1) == Ident {
        p.bump();
        p.expect(Ident);
    }
    m.complete(p, QualifiedName);
}

pub(crate) fn annotation(p: &mut Parser) {
    use JavaSyntaxKind::*;
    let m = p.start();
    p.expect(At);
    qualified_name(p);
    if p.at(LParen) {
        crate::parser::expr::argument_list(p);
    }
    m.complete(p, Annotation);
}