pr47 0.0.3

A semi-experimental programming language. Still working in progress.
Documentation
use crate::syntax::id::Identifier;
use crate::util::location::{SingleLineRange, SourceLocation};
use crate::syntax::ty::CSTType;

#[derive(Debug)]
pub enum CSTExpr {
    LiteralExpr(CSTLiteralExpr),
    StringLiteralExpr(CSTStringLiteralExpr),
    IdRefExpr(CSTIdRefExpr),
    UnaryExpr(CSTUnaryExpr),
    BinaryExpr(CSTBinaryExpr),
    AssignExpr(CSTAssignExpr),
    FuncCallExpr(CSTFuncCallExpr),
    SubscriptExpr(CSTSubscriptExpr),
    FieldRefExpr(CSTFieldRefExpr),
    MethodCallExpr(CSTMethodCallExpr),
    AsExpr(CSTAsExpr)
}

#[derive(Debug)]
pub struct CSTLiteralExpr {
    pub content: LiteralExprContent,
    pub range: SingleLineRange
}

#[derive(Debug)]
pub enum LiteralExprContent {
    Byte(u8),
    Int(i64),
    Float(f64),
    Char(char),
    Boolean(bool)
}

#[derive(Debug)]
pub struct CSTIdRefExpr {
    pub id: Identifier
}

#[derive(Debug)]
pub struct CSTStringLiteralExpr {
    pub value: String,
    pub range: SingleLineRange
}

#[derive(Debug)]
pub enum UnaryOp {
    BitNot,
    Not,
    Negate
}

impl UnaryOp {
    pub fn as_str(&self) -> &'static str {
        use UnaryOp::*;
        match self {
            BitNot => "~",
            Not => "!",
            Negate => "-"
        }
    }
}

#[derive(Debug)]
pub struct CSTUnaryExpr {
    pub op: UnaryOp,
    pub operand: Box<CSTExpr>,

    pub op_loc: SourceLocation
}

#[derive(Debug)]
pub enum BinaryOp {
    BitAnd, BitOr, BitXor,
    Add, Sub,
    Mul, Div, Mod,
    Lt, Gt, Eq, LEq, GEq, NEq,
    And, Or, Xor
}

impl BinaryOp {
    pub fn as_str(&self) -> &'static str {
        use BinaryOp::*;
        match self {
            BitAnd => "&",
            BitOr => "|",
            BitXor => "^",
            Add => "+",
            Sub => "-",
            Mul => "*",
            Div => "/",
            Mod => "%",
            Lt => "<",
            Gt => ">",
            Eq => "==",
            LEq => "<=",
            GEq => ">=",
            NEq => "!=",
            And => "&&",
            Or => "||",
            Xor => "^^"
        }
    }
}

#[derive(Debug)]
pub struct CSTBinaryExpr {
    pub op: BinaryOp,
    pub lhs: Box<CSTExpr>,
    pub rhs: Box<CSTExpr>,

    pub op_loc: SingleLineRange
}

#[derive(Debug)]
pub struct CSTAssignExpr {
    pub lhs: Box<CSTExpr>,
    pub rhs: Box<CSTExpr>,

    pub op_loc: SourceLocation
}

#[derive(Debug)]
pub struct CSTFuncCallExpr {
    pub func: Box<CSTExpr>,
    pub args: Vec<Box<CSTExpr>>,

    pub left_paren: SourceLocation,
    pub right_paren: SourceLocation
}

#[derive(Debug)]
pub struct CSTSubscriptExpr {
    pub base: Box<CSTExpr>,
    pub idx: Box<CSTExpr>,

    pub left_bracket: SourceLocation,
    pub right_bracket: SourceLocation
}

#[derive(Debug)]
pub struct CSTFieldRefExpr {
    pub base: Box<CSTExpr>,
    pub id: Identifier,

    pub dot_loc: SourceLocation
}

#[derive(Debug)]
pub struct CSTMethodCallExpr {
    pub base: Box<CSTExpr>,
    pub func_id: Identifier,
    pub args: Vec<Box<CSTExpr>>,

    pub dot_loc: SourceLocation,
    pub left_paren: SourceLocation,
    pub right_paren: SourceLocation
}

#[derive(Debug)]
pub struct CSTAsExpr {
    pub operand: Box<CSTExpr>,
    pub dest_type: CSTType,

    pub as_range: SingleLineRange
}