#![allow(missing_docs)]
#[derive(Debug, Clone, Hash, PartialEq, Eq)]
#[cfg_attr(test, derive(serde::Serialize, serde::Deserialize))]
pub struct Token {
kind: TokenKind,
len: u16,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, variantly::Variantly)]
#[cfg_attr(test, derive(serde::Serialize, serde::Deserialize))]
pub enum TokenKind {
Whitespace,
SingleLineComment,
MultiLineComment {
is_terminated: bool,
},
Unknown,
Ident,
Literial(LiteralKind),
ControlFlow(ControlFlowKind),
Punctuation(PunctuationKind),
Modifier(ModifierKind),
Operator(OperatorKind),
Declaration(DeclarationKind),
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, variantly::Variantly)]
#[cfg_attr(test, derive(serde::Serialize, serde::Deserialize))]
pub enum ModifierKind {
VisibilityPublic,
InstanceAccess,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, variantly::Variantly)]
#[cfg_attr(test, derive(serde::Serialize, serde::Deserialize))]
pub enum LiteralKind {
Int {
base: Base,
is_empty: bool,
},
Double {
base: Base,
empty_exponent: bool,
},
Str { is_terminated: bool },
Boolean(bool),
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, variantly::Variantly)]
#[cfg_attr(test, derive(serde::Serialize, serde::Deserialize))]
pub enum Base {
Binary = 2,
Octal = 8,
Decimal = 10,
Hexadecimal = 16,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, variantly::Variantly)]
#[cfg_attr(test, derive(serde::Serialize, serde::Deserialize))]
pub enum PunctuationKind {
OpenParen,
CloseParen,
OpenBrace,
CloseBrace,
Dot,
Comma,
Colon,
Arrow,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, variantly::Variantly)]
#[cfg_attr(test, derive(serde::Serialize, serde::Deserialize))]
pub enum OperatorKind {
Assignment,
#[variantly(rename = "equal")]
Eq,
#[variantly(rename = "notequal")]
NotEq,
Lt,
Gt,
LtEq,
GtEq,
Minus,
And,
Or,
Not,
Plus,
Mul,
Divide,
Mod,
MethodChaining,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, variantly::Variantly)]
#[cfg_attr(test, derive(serde::Serialize, serde::Deserialize))]
pub enum DeclarationKind {
VariableDeclaration {
is_mutable: bool,
},
Function,
Class,
Trait,
TraitImpl,
Enum,
EnumVariant,
Alias,
Import,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[cfg_attr(test, derive(serde::Serialize, serde::Deserialize))]
pub enum ControlFlowKind {
If,
Else,
While,
ForLoopOpen,
ForLoopClose,
Match,
MatchArmDefault,
MatchArmCondition,
Break,
Continue,
Return,
Throw,
Try,
Catch,
}
impl Token {
pub const fn new(kind: TokenKind, len: u16) -> Self {
Token { kind, len }
}
pub const fn kind(&self) -> &TokenKind {
&self.kind
}
pub const fn into_kind(self) -> TokenKind {
self.kind
}
pub const fn len_repr(&self) -> u16 {
self.len
}
}
impl TokenKind {
pub fn is(&self, other: &Self) -> bool {
match (self, other) {
(TokenKind::Literial(a), TokenKind::Literial(b)) => {
std::mem::discriminant(a) == std::mem::discriminant(b)
}
(TokenKind::ControlFlow(a), TokenKind::ControlFlow(b)) => {
std::mem::discriminant(a) == std::mem::discriminant(b)
}
(TokenKind::Punctuation(a), TokenKind::Punctuation(b)) => {
std::mem::discriminant(a) == std::mem::discriminant(b)
}
(TokenKind::Modifier(a), TokenKind::Modifier(b)) => {
std::mem::discriminant(a) == std::mem::discriminant(b)
}
(TokenKind::Operator(a), TokenKind::Operator(b)) => {
std::mem::discriminant(a) == std::mem::discriminant(b)
}
(TokenKind::Declaration(a), TokenKind::Declaration(b)) => {
std::mem::discriminant(a) == std::mem::discriminant(b)
}
_ => std::mem::discriminant(self) == std::mem::discriminant(other),
}
}
}