ast: Do not promise PartialOrd/Ord (breaking change)

This commit is contained in:
John 2024-02-27 20:41:15 -06:00
parent 87c8d43d11
commit 0c1b3bfe39

View File

@ -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<Item>,
}
// 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<Ty>,
@ -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<Param>,
@ -98,53 +99,53 @@ pub struct Function {
pub rety: Option<Box<Ty>>,
}
#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct Param {
pub mutability: Mutability,
pub name: Identifier,
pub ty: Box<Ty>,
}
#[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<Ty>),
Struct(Vec<StructMember>),
}
#[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<Variant>),
}
#[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<StructMember>),
}
#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct Impl {
pub target: Ty,
pub body: Vec<Item>,
}
/// TODO: `impl` Trait for <Target> { }
#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]
// TODO: `impl` Trait for <Target> { }
#[derive(Clone, Debug, PartialEq, Eq)]
pub enum ImplKind {
Type(Box<Ty>),
Trait { impl_trait: Path, for_type: Box<Ty> },
}
/// # 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<Ty>,
}
#[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<Box<Ty>>,
}
// Path
#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct Path {
pub absolute: bool,
pub parts: Vec<PathPart>,
}
#[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<Expr>),
}
#[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<Assign>),
@ -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<Expr>,
}
#[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<Expr>,
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<UnaryKind>,
pub tail: Box<Expr>,
}
#[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<Expr>,
pub tail: Vec<Expr>,
}
#[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<Expr>,
pub args: Vec<Tuple>,
}
/// Index operator: Member (`[` Expr `]`)*
#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct Index {
pub head: Box<Expr>,
pub indices: Vec<Indices>,
}
#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct Indices {
pub exprs: Vec<Expr>,
}
#[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<Expr>,
}
#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct ArrayRep {
pub value: Box<Expr>,
pub repeat: Box<Expr>,
}
#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct AddrOf {
pub count: usize,
pub mutable: Mutability,
pub expr: Box<Expr>,
}
#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct Block {
pub stmts: Vec<Stmt>,
}
#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct Group {
pub expr: Box<Expr>,
}
#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct Tuple {
pub exprs: Vec<Expr>,
}
#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct While {
pub cond: Box<Expr>,
pub pass: Box<Block>,
pub fail: Else,
}
#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct If {
pub cond: Box<Expr>,
pub pass: Box<Block>,
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<Expr>,
@ -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<Box<Expr>>,
}
#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct Break {
pub body: Option<Box<Expr>>,
}
#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct Return {
pub body: Option<Box<Expr>>,
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, PartialOrd, Ord)]
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
pub struct Continue;