rajac-ast 0.1.1

Abstract syntax tree definitions for the rajac Java compiler
Documentation
use super::ast::*;
use super::ast_type::{AstType, AstTypeId};

#[derive(Debug, Default)]
pub struct AstArena {
    pub stmts: Vec<Stmt>,
    pub exprs: Vec<TypedExpr>,
    pub types: Vec<AstType>,
    pub params: Vec<Param>,
    pub methods: Vec<Method>,
    pub fields: Vec<Field>,
    pub class_decls: Vec<ClassDecl>,
    pub class_members: Vec<ClassMember>,
}

impl AstArena {
    pub fn new() -> Self {
        Self::default()
    }

    pub fn alloc_stmt(&mut self, stmt: Stmt) -> StmtId {
        let id = StmtId(self.stmts.len() as u32);
        self.stmts.push(stmt);
        id
    }

    pub fn alloc_expr(&mut self, expr: Expr) -> ExprId {
        let id = ExprId(self.exprs.len() as u32);
        self.exprs.push(TypedExpr::new(expr));
        id
    }

    pub fn alloc_type(&mut self, ty: AstType) -> AstTypeId {
        let id = AstTypeId(self.types.len() as u32);
        self.types.push(ty);
        id
    }

    pub fn alloc_param(&mut self, param: Param) -> ParamId {
        let id = ParamId(self.params.len() as u32);
        self.params.push(param);
        id
    }

    pub fn alloc_method(&mut self, method: Method) -> MethodId {
        let id = MethodId(self.methods.len() as u32);
        self.methods.push(method);
        id
    }

    pub fn alloc_field(&mut self, field: Field) -> FieldId {
        let id = FieldId(self.fields.len() as u32);
        self.fields.push(field);
        id
    }

    pub fn alloc_class_decl(&mut self, class: ClassDecl) -> ClassDeclId {
        let id = ClassDeclId(self.class_decls.len() as u32);
        self.class_decls.push(class);
        id
    }

    pub fn alloc_class_member(&mut self, member: ClassMember) -> ClassMemberId {
        let id = ClassMemberId(self.class_members.len() as u32);
        self.class_members.push(member);
        id
    }

    pub fn stmt(&self, id: StmtId) -> &Stmt {
        &self.stmts[id.0 as usize]
    }

    pub fn expr(&self, id: ExprId) -> &Expr {
        &self.exprs[id.0 as usize].expr
    }

    pub fn expr_mut(&mut self, id: ExprId) -> &mut Expr {
        &mut self.exprs[id.0 as usize].expr
    }

    pub fn expr_typed(&self, id: ExprId) -> &TypedExpr {
        &self.exprs[id.0 as usize]
    }

    pub fn expr_typed_mut(&mut self, id: ExprId) -> &mut TypedExpr {
        &mut self.exprs[id.0 as usize]
    }

    pub fn ty(&self, id: AstTypeId) -> &AstType {
        &self.types[id.0 as usize]
    }

    pub fn ty_mut(&mut self, id: AstTypeId) -> &mut AstType {
        &mut self.types[id.0 as usize]
    }

    pub fn param(&self, id: ParamId) -> &Param {
        &self.params[id.0 as usize]
    }

    pub fn method(&self, id: MethodId) -> &Method {
        &self.methods[id.0 as usize]
    }

    pub fn field(&self, id: FieldId) -> &Field {
        &self.fields[id.0 as usize]
    }

    pub fn class_decl(&self, id: ClassDeclId) -> &ClassDecl {
        &self.class_decls[id.0 as usize]
    }

    pub fn class_member(&self, id: ClassMemberId) -> &ClassMember {
        &self.class_members[id.0 as usize]
    }
}