mod definitions;
mod expressions;
mod numbers;
mod types;
#[cfg(test)]
mod tests;
use crate::location::Span;
use serde::{Deserialize, Serialize};
pub use definitions::{
Definition, EnumDef, EnumVariant, FieldDef, File, FnDef, FnParam, FnSig, FunctionDef, ImplDef,
LetBinding, ModuleDef, Statement, StructDef, StructField, TraitDef, UseItems, UseStmt,
FORMAT_VERSION,
};
pub use expressions::{
ArrayPatternElement, BindingPattern, BlockStatement, ClosureParam, Expr, Literal, MatchArm,
Pattern, StructPatternField,
};
pub use numbers::{NumberLiteral, NumberSourceKind, NumberValue, NumericSuffix};
pub use types::{
AttributeAnnotation, ExternAbi, FunctionAttribute, GenericConstraint, GenericParam, TupleField,
Type,
};
#[non_exhaustive]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum Visibility {
Public,
Private,
}
#[non_exhaustive]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, Default)]
pub enum ParamConvention {
#[default]
Let,
Mut,
Sink,
}
#[non_exhaustive]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum PrimitiveType {
String,
I32,
I64,
F32,
F64,
Boolean,
Path,
Regex,
Never,
}
#[non_exhaustive]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum BinaryOperator {
Add,
Sub,
Mul,
Div,
Mod,
Lt,
Gt,
Le,
Ge,
Eq,
Ne,
And,
Or,
Range,
}
impl BinaryOperator {
#[must_use]
pub const fn precedence(&self) -> u8 {
match self {
Self::Range => 0,
Self::Or => 1,
Self::And => 2,
Self::Eq | Self::Ne => 3,
Self::Lt | Self::Gt | Self::Le | Self::Ge => 4,
Self::Add | Self::Sub => 5,
Self::Mul | Self::Div | Self::Mod => 6,
}
}
#[must_use]
pub const fn is_left_associative(&self) -> bool {
true
}
}
#[non_exhaustive]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum UnaryOperator {
Neg,
Not,
}
#[non_exhaustive]
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub struct Ident {
pub name: String,
pub span: Span,
}
impl Ident {
pub fn new(name: impl Into<String>, span: Span) -> Self {
Self {
name: name.into(),
span,
}
}
}