diff --git a/libconlang/src/ast.rs b/libconlang/src/ast.rs index 174791c..e983998 100644 --- a/libconlang/src/ast.rs +++ b/libconlang/src/ast.rs @@ -10,30 +10,31 @@ //! - [Ty] and [TyKind]: Type qualifiers //! - [Path]: Path expressions use crate::common::*; + pub mod ast_impl; -#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, PartialOrd, Ord)] +#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)] pub enum Mutability { #[default] Not, Mut, } -#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, PartialOrd, Ord)] +#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)] pub enum Visibility { #[default] Private, Public, } -#[derive(Clone, Debug, Default, PartialEq, Eq, PartialOrd, Ord)] +#[derive(Clone, Debug, Default, PartialEq, Eq)] pub struct File { pub items: Vec, } // Items /// Stores an [ItemKind] and associated metadata -#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)] +#[derive(Clone, Debug, PartialEq, Eq)] pub struct Item { pub extents: Span, pub vis: Visibility, @@ -41,7 +42,7 @@ pub struct Item { } /// Stores a concrete Item -#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)] +#[derive(Clone, Debug, PartialEq, Eq)] pub enum ItemKind { /// A [constant](Const) Const(Const), @@ -60,7 +61,7 @@ pub enum ItemKind { } /// Stores a `const` value -#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)] +#[derive(Clone, Debug, PartialEq, Eq)] pub struct Const { pub name: Identifier, pub ty: Box, @@ -68,7 +69,7 @@ pub struct Const { } /// Stores a `static` variable -#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)] +#[derive(Clone, Debug, PartialEq, Eq)] pub struct Static { pub mutable: Mutability, pub name: Identifier, @@ -77,20 +78,20 @@ pub struct Static { } /// Stores a collection of [Items](Item) -#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)] +#[derive(Clone, Debug, PartialEq, Eq)] pub struct Module { pub name: Identifier, pub kind: ModuleKind, } -#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)] +#[derive(Clone, Debug, PartialEq, Eq)] pub enum ModuleKind { Inline(File), Outline, } /// Contains code, and the interface to that code -#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)] +#[derive(Clone, Debug, PartialEq, Eq)] pub struct Function { pub name: Identifier, pub args: Vec, @@ -98,53 +99,53 @@ pub struct Function { pub rety: Option>, } -#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)] +#[derive(Clone, Debug, PartialEq, Eq)] pub struct Param { pub mutability: Mutability, pub name: Identifier, pub ty: Box, } -#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)] +#[derive(Clone, Debug, PartialEq, Eq)] pub struct Struct { pub name: Identifier, pub kind: StructKind, } -#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)] +#[derive(Clone, Debug, PartialEq, Eq)] pub enum StructKind { Empty, Tuple(Vec), Struct(Vec), } -#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)] +#[derive(Clone, Debug, PartialEq, Eq)] pub struct StructMember { pub vis: Visibility, pub name: Identifier, pub ty: Ty, } -#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)] +#[derive(Clone, Debug, PartialEq, Eq)] pub struct Enum { pub name: Identifier, pub kind: EnumKind, } -#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)] +#[derive(Clone, Debug, PartialEq, Eq)] pub enum EnumKind { /// Represents an enum with no variants NoVariants, Variants(Vec), } -#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)] +#[derive(Clone, Debug, PartialEq, Eq)] pub struct Variant { pub name: Identifier, pub kind: VariantKind, } -#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)] +#[derive(Clone, Debug, PartialEq, Eq)] pub enum VariantKind { Plain, CLike(u128), @@ -152,27 +153,27 @@ pub enum VariantKind { Struct(Vec), } -#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)] +#[derive(Clone, Debug, PartialEq, Eq)] pub struct Impl { pub target: Ty, pub body: Vec, } -/// TODO: `impl` Trait for { } -#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)] +// TODO: `impl` Trait for { } +#[derive(Clone, Debug, PartialEq, Eq)] pub enum ImplKind { Type(Box), Trait { impl_trait: Path, for_type: Box }, } /// # Static Type Information -#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)] +#[derive(Clone, Debug, PartialEq, Eq)] pub struct Ty { pub extents: Span, pub kind: TyKind, } -#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)] +#[derive(Clone, Debug, PartialEq, Eq)] pub enum TyKind { Never, Empty, @@ -182,30 +183,30 @@ pub enum TyKind { Fn(TyFn), } -#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)] +#[derive(Clone, Debug, PartialEq, Eq)] pub struct TyTuple { pub types: Vec, } -#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)] +#[derive(Clone, Debug, PartialEq, Eq)] pub struct TyRef { pub count: usize, pub to: Path, } -#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)] +#[derive(Clone, Debug, PartialEq, Eq)] pub struct TyFn { pub args: TyTuple, pub rety: Option>, } // Path -#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)] +#[derive(Clone, Debug, PartialEq, Eq)] pub struct Path { pub absolute: bool, pub parts: Vec, } -#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)] +#[derive(Clone, Debug, PartialEq, Eq)] pub enum PathPart { SuperKw, SelfKw, @@ -213,24 +214,24 @@ pub enum PathPart { } // TODO: Capture token? -#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)] +#[derive(Clone, Debug, PartialEq, Eq)] pub struct Identifier(pub String); /// Stores an abstract statement, and associated metadata -#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)] +#[derive(Clone, Debug, PartialEq, Eq)] pub struct Stmt { pub extents: Span, pub kind: StmtKind, pub semi: Semi, } -#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)] +#[derive(Clone, Debug, PartialEq, Eq)] pub enum Semi { Terminated, Unterminated, } -#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)] +#[derive(Clone, Debug, PartialEq, Eq)] pub enum StmtKind { Empty, Local(Let), @@ -238,7 +239,7 @@ pub enum StmtKind { Expr(Box), } -#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)] +#[derive(Clone, Debug, PartialEq, Eq)] pub struct Let { pub mutable: Mutability, pub name: Identifier, @@ -247,13 +248,13 @@ pub struct Let { } /// Stores an abstract expression, and associated metadata -#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)] +#[derive(Clone, Debug, PartialEq, Eq)] pub struct Expr { pub extents: Span, pub kind: ExprKind, } -#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)] +#[derive(Clone, Debug, PartialEq, Eq)] pub enum ExprKind { /// An [Assign]ment expression: [`Expr`] ([`AssignKind`] [`Expr`])\+ Assign(Box), @@ -300,14 +301,14 @@ pub enum ExprKind { Continue(Continue), } -#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)] +#[derive(Clone, Debug, PartialEq, Eq)] pub struct Assign { pub head: Expr, pub op: AssignKind, pub tail: Box, } -#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord)] +#[derive(Clone, Copy, Debug, PartialEq, Eq)] pub enum AssignKind { /// Standard Assignment with no read-back Plain, @@ -323,13 +324,13 @@ pub enum AssignKind { Rem, } -#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)] +#[derive(Clone, Debug, PartialEq, Eq)] pub struct Binary { pub head: Box, pub tail: Vec<(BinaryKind, Expr)>, } -#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord)] +#[derive(Clone, Copy, Debug, PartialEq, Eq)] pub enum BinaryKind { Lt, LtEq, @@ -355,13 +356,13 @@ pub enum BinaryKind { Dot, } -#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)] +#[derive(Clone, Debug, PartialEq, Eq)] pub struct Unary { pub ops: Vec, pub tail: Box, } -#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)] +#[derive(Clone, Debug, PartialEq, Eq)] pub enum UnaryKind { Deref, Neg, @@ -372,36 +373,36 @@ pub enum UnaryKind { Tilde, } -#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)] +#[derive(Clone, Debug, PartialEq, Eq)] pub struct Member { pub head: Box, pub tail: Vec, } -#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)] +#[derive(Clone, Debug, PartialEq, Eq)] pub enum MemberKind { Dot, } -#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)] +#[derive(Clone, Debug, PartialEq, Eq)] pub struct Call { pub callee: Box, pub args: Vec, } /// Index operator: Member (`[` Expr `]`)* -#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)] +#[derive(Clone, Debug, PartialEq, Eq)] pub struct Index { pub head: Box, pub indices: Vec, } -#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)] +#[derive(Clone, Debug, PartialEq, Eq)] pub struct Indices { pub exprs: Vec, } -#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)] +#[derive(Clone, Debug, PartialEq, Eq)] pub enum Literal { Bool(bool), Char(char), @@ -409,54 +410,54 @@ pub enum Literal { String(String), } -#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)] +#[derive(Clone, Debug, PartialEq, Eq)] pub struct Array { pub values: Vec, } -#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)] +#[derive(Clone, Debug, PartialEq, Eq)] pub struct ArrayRep { pub value: Box, pub repeat: Box, } -#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)] +#[derive(Clone, Debug, PartialEq, Eq)] pub struct AddrOf { pub count: usize, pub mutable: Mutability, pub expr: Box, } -#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)] +#[derive(Clone, Debug, PartialEq, Eq)] pub struct Block { pub stmts: Vec, } -#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)] +#[derive(Clone, Debug, PartialEq, Eq)] pub struct Group { pub expr: Box, } -#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)] +#[derive(Clone, Debug, PartialEq, Eq)] pub struct Tuple { pub exprs: Vec, } -#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)] +#[derive(Clone, Debug, PartialEq, Eq)] pub struct While { pub cond: Box, pub pass: Box, pub fail: Else, } -#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)] +#[derive(Clone, Debug, PartialEq, Eq)] pub struct If { pub cond: Box, pub pass: Box, pub fail: Else, } -#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)] +#[derive(Clone, Debug, PartialEq, Eq)] pub struct For { pub bind: Identifier, // TODO: Patterns? pub cond: Box, @@ -464,20 +465,20 @@ pub struct For { pub fail: Else, } -#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)] +#[derive(Clone, Debug, PartialEq, Eq)] pub struct Else { pub body: Option>, } -#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)] +#[derive(Clone, Debug, PartialEq, Eq)] pub struct Break { pub body: Option>, } -#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)] +#[derive(Clone, Debug, PartialEq, Eq)] pub struct Return { pub body: Option>, } -#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, PartialOrd, Ord)] +#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)] pub struct Continue;