use super::span::HirId;
use super::symbol::Symbol;
use crate::ast::Visibility;
#[derive(Debug, Clone, PartialEq)]
pub struct HirModule {
pub id: HirId,
pub name: Symbol,
pub decls: Vec<HirDecl>,
}
#[derive(Debug, Clone, PartialEq)]
pub enum HirDecl {
Type(HirTypeDecl),
Trait(HirTraitDecl),
Function(HirFunctionDecl),
Module(HirModuleDecl),
}
#[derive(Debug, Clone, PartialEq)]
pub struct HirTypeDecl {
pub id: HirId,
pub name: Symbol,
pub visibility: Visibility,
pub type_params: Vec<HirTypeParam>,
pub body: HirTypeDef,
}
#[derive(Debug, Clone, PartialEq)]
pub struct HirTraitDecl {
pub id: HirId,
pub name: Symbol,
pub visibility: Visibility,
pub type_params: Vec<HirTypeParam>,
pub bounds: Vec<HirType>,
pub items: Vec<HirTraitItem>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct HirFunctionDecl {
pub id: HirId,
pub name: Symbol,
pub visibility: Visibility,
pub type_params: Vec<HirTypeParam>,
pub params: Vec<HirParam>,
pub return_type: HirType,
pub body: Option<HirExpr>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct HirModuleDecl {
pub id: HirId,
pub name: Symbol,
pub visibility: Visibility,
pub decls: Vec<HirDecl>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct HirTypeParam {
pub name: Symbol,
pub bounds: Vec<HirType>,
}
#[derive(Debug, Clone, PartialEq)]
pub enum HirTypeDef {
Alias(HirType),
Struct(Vec<HirField>),
Enum(Vec<HirVariant>),
Gene(Vec<HirStatement>),
}
#[derive(Debug, Clone, PartialEq)]
pub struct HirField {
pub name: Symbol,
pub ty: HirType,
pub visibility: Visibility,
}
#[derive(Debug, Clone, PartialEq)]
pub struct HirVariant {
pub name: Symbol,
pub payload: Option<HirType>,
}
#[derive(Debug, Clone, PartialEq)]
pub enum HirTraitItem {
Method(HirFunctionDecl),
AssocType(HirAssocType),
}
#[derive(Debug, Clone, PartialEq)]
pub struct HirAssocType {
pub name: Symbol,
pub bounds: Vec<HirType>,
pub default: Option<HirType>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct HirParam {
pub pat: HirPat,
pub ty: HirType,
}
#[derive(Debug, Clone, PartialEq)]
pub struct HirStatement {
pub id: HirId,
pub kind: HirStatementKind,
}
#[derive(Debug, Clone, PartialEq)]
pub enum HirStatementKind {
Has {
subject: Symbol,
property: Symbol,
},
Is {
subject: Symbol,
type_name: Symbol,
},
DerivesFrom {
subject: Symbol,
parent: Symbol,
},
Requires {
subject: Symbol,
dependency: Symbol,
},
Uses {
subject: Symbol,
resource: Symbol,
},
}
#[derive(Debug, Clone, PartialEq)]
pub enum HirExpr {
Literal(HirLiteral),
Var(Symbol),
Binary(Box<HirBinaryExpr>),
Unary(Box<HirUnaryExpr>),
Call(Box<HirCallExpr>),
MethodCall(Box<HirMethodCallExpr>),
Field(Box<HirFieldExpr>),
Index(Box<HirIndexExpr>),
Block(Box<HirBlockExpr>),
If(Box<HirIfExpr>),
Match(Box<HirMatchExpr>),
Lambda(Box<HirLambdaExpr>),
}
#[derive(Debug, Clone, PartialEq)]
pub enum HirLiteral {
Bool(bool),
Int(i64),
Float(f64),
String(String),
Unit,
}
#[derive(Debug, Clone, PartialEq)]
pub struct HirBinaryExpr {
pub left: HirExpr,
pub op: HirBinaryOp,
pub right: HirExpr,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum HirBinaryOp {
Add,
Sub,
Mul,
Div,
Mod,
Eq,
Ne,
Lt,
Le,
Gt,
Ge,
And,
Or,
}
#[derive(Debug, Clone, PartialEq)]
pub struct HirUnaryExpr {
pub op: HirUnaryOp,
pub operand: HirExpr,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum HirUnaryOp {
Neg,
Not,
}
#[derive(Debug, Clone, PartialEq)]
pub struct HirCallExpr {
pub func: HirExpr,
pub args: Vec<HirExpr>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct HirMethodCallExpr {
pub receiver: HirExpr,
pub method: Symbol,
pub args: Vec<HirExpr>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct HirFieldExpr {
pub base: HirExpr,
pub field: Symbol,
}
#[derive(Debug, Clone, PartialEq)]
pub struct HirIndexExpr {
pub base: HirExpr,
pub index: HirExpr,
}
#[derive(Debug, Clone, PartialEq)]
pub struct HirBlockExpr {
pub stmts: Vec<HirStmt>,
pub expr: Option<HirExpr>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct HirIfExpr {
pub cond: HirExpr,
pub then_branch: HirExpr,
pub else_branch: Option<HirExpr>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct HirMatchExpr {
pub scrutinee: HirExpr,
pub arms: Vec<HirMatchArm>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct HirMatchArm {
pub pat: HirPat,
pub guard: Option<HirExpr>,
pub body: HirExpr,
}
#[derive(Debug, Clone, PartialEq)]
pub struct HirLambdaExpr {
pub params: Vec<HirParam>,
pub return_type: Option<HirType>,
pub body: HirExpr,
}
#[derive(Debug, Clone, PartialEq)]
pub enum HirStmt {
Val(HirValStmt),
Var(HirVarStmt),
Assign(HirAssignStmt),
Expr(HirExpr),
Return(Option<HirExpr>),
Break(Option<HirExpr>),
}
#[derive(Debug, Clone, PartialEq)]
pub struct HirValStmt {
pub pat: HirPat,
pub ty: Option<HirType>,
pub init: HirExpr,
}
#[derive(Debug, Clone, PartialEq)]
pub struct HirVarStmt {
pub pat: HirPat,
pub ty: Option<HirType>,
pub init: HirExpr,
}
#[derive(Debug, Clone, PartialEq)]
pub struct HirAssignStmt {
pub lhs: HirExpr,
pub rhs: HirExpr,
}
#[derive(Debug, Clone, PartialEq, Default)]
pub enum HirType {
Named(HirNamedType),
Tuple(Vec<HirType>),
Array(Box<HirArrayType>),
Function(Box<HirFunctionType>),
Ref(Box<HirRefType>),
Optional(Box<HirType>),
Var(u32),
#[default]
Error,
}
#[derive(Debug, Clone, PartialEq)]
pub struct HirNamedType {
pub name: Symbol,
pub args: Vec<HirType>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct HirArrayType {
pub elem: HirType,
pub size: Option<usize>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct HirFunctionType {
pub params: Vec<HirType>,
pub ret: HirType,
}
#[derive(Debug, Clone, PartialEq)]
pub struct HirRefType {
pub mutable: bool,
pub ty: HirType,
}
#[derive(Debug, Clone, PartialEq)]
pub enum HirPat {
Wildcard,
Var(Symbol),
Literal(HirLiteral),
Constructor(HirConstructorPat),
Tuple(Vec<HirPat>),
Or(Vec<HirPat>),
}
#[derive(Debug, Clone, PartialEq)]
pub struct HirConstructorPat {
pub name: Symbol,
pub fields: Vec<HirPat>,
}
impl HirModule {
pub fn new(name: Symbol) -> Self {
Self {
id: HirId::new(),
name,
decls: Vec::new(),
}
}
}