use crate::core::Located;
#[derive(Clone, Debug)]
pub struct Module {
pub statements: Vec<TopLevelStatement>,
}
pub type TopLevelStatement = Located<TopLevelStatementObj>;
#[derive(Clone, Debug)]
pub enum TopLevelStatementObj {
Import {
symbols: Vec<ImportSymbol>,
},
ImportFrom {
level: usize,
path: Vec<String>,
symbols: Vec<ImportSymbol>,
},
Constant {
name: String,
value: Expression,
},
ClassDef {
name: String,
body: Vec<ClassDefStatement>,
bases: Vec<TyExpression>,
decorator_list: Vec<Expression>,
},
FunctionDef(FunctionDef),
Expression(Expression),
}
#[derive(Clone, Debug)]
pub struct ImportSymbol {
pub symbol: String,
pub alias: Option<String>,
}
pub type ClassDefStatement = Located<ClassDefStatementObj>;
#[derive(Clone, Debug)]
pub enum ClassDefStatementObj {
FieldDef {
name: String,
ty: Option<TyExpression>,
value: Option<Expression>,
},
MethodDef(FunctionDef),
}
#[derive(Clone, Debug)]
pub struct FunctionDef {
pub name: String,
pub params: Params,
pub body: Vec<Statement>,
pub decorator_list: Vec<Expression>,
pub returns: Option<TyExpression>,
}
#[derive(Clone, Debug)]
pub struct Params {
pub is_instance_method: bool,
pub params: Vec<Param>,
}
pub type Param = Located<ParamObj>;
#[derive(Clone, Debug)]
pub struct ParamObj {
pub arg: String,
pub annotation: TyExpression,
}
pub type Expression = Located<ExpressionObj>;
#[derive(Clone, Debug)]
pub enum ExpressionObj {
BinOp {
left: Box<Expression>,
op: Operator,
right: Box<Expression>,
},
Index {
value: Box<Expression>,
index: Box<Expression>,
},
UnOp {
op: UnaryOperator,
value: Box<Expression>,
},
Attribute {
value: Box<Expression>,
name: String,
},
Call {
function: Box<Expression>,
args: Args,
},
Ternary {
test: Box<Expression>,
body: Box<Expression>,
orelse: Box<Expression>,
},
Int(i128),
Float(f64),
List(Vec<Expression>),
Tuple(Vec<Expression>),
Comprehension {
element: Box<Expression>,
parts: Vec<ComprehensionPart>,
},
Str(String),
FStr {
parts: Vec<FStrPart>,
},
Id(String),
Bool(bool),
None,
Iter {
value: Box<Expression>,
},
}
#[derive(Clone, Debug)]
pub struct Args {
pub pos: Vec<Expression>,
pub kw: Vec<(String, Expression)>,
}
#[derive(Clone, Debug)]
pub enum ComprehensionPart {
For {
target: Expression,
iter: Expression,
},
If {
cond: Expression,
},
}
#[derive(Clone, Debug)]
pub enum FStrPart {
Str(String),
ExpressionObj(Expression),
}
pub type TyExpression = Located<TyExpressionObj>;
#[derive(Clone, Debug)]
pub enum TyExpressionObj {
Generic {
base: Vec<String>,
params: Vec<TyExpression>,
},
Const(u64),
}
pub type Statement = Located<StatementObj>;
#[derive(Clone, Debug)]
pub enum StatementObj {
Break,
Continue,
Return {
value: Option<Expression>,
},
Pass,
Assert {
test: Expression,
msg: Option<Expression>,
},
Assign {
target: Expression,
value: Expression,
},
OpAssign {
target: Expression,
op: Operator,
value: Expression,
},
TyAssign {
target: Expression,
ty: TyExpression,
value: Option<Expression>,
},
ExpressionObj {
expression: Expression,
},
If {
test: Expression,
body: Vec<Statement>,
orelse: Option<Vec<Statement>>,
},
While {
test: Expression,
body: Vec<Statement>,
},
For {
target: Expression,
iter: Expression,
body: Vec<Statement>,
},
}
#[derive(Clone, Debug)]
pub enum Operator {
Add,
Sub,
Mul,
Div,
Mod,
Pow,
LShift,
RShift,
BitOr,
BitXor,
BitAnd,
FloorDiv,
And,
Or,
Eq,
NotEq,
Lt,
Lte,
Gt,
Gte,
In,
NotIn,
}
#[derive(Clone, Debug)]
pub enum UnaryOperator {
Pos,
Neg,
Not,
Inv,
}