use std::fmt;
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub enum StringPart {
Literal(String),
Expression(String), }
#[derive(Debug, Clone, PartialEq)]
pub enum Token {
Fn,
Let,
Mut,
Const,
Static,
Struct,
Enum,
Trait,
Impl,
Match,
If,
Else,
For,
In,
While,
Loop,
Return,
Break,
Continue,
Use,
Mod,
Extern,
Thread,
Async,
Await,
Defer,
Pub,
Self_,
Unsafe,
As,
Where,
Type,
Dyn,
Bound,
Int,
Int32,
Uint,
Float,
Bool,
String,
IntLiteral(i64), IntLiteralSuffixed(i64, String), FloatLiteral(f64),
StringLiteral(String),
InterpolatedString(Vec<StringPart>), CharLiteral(char),
BoolLiteral(bool),
Ident(String),
Plus,
Minus,
Star,
Slash,
Percent,
Eq,
Ne,
Lt,
Le,
Gt,
Ge,
And,
Or,
Not,
Caret, Shl, Shr,
Assign,
PlusAssign, MinusAssign, StarAssign, SlashAssign, PercentAssign, AndAssign, OrAssign, XorAssign, ShlAssign, ShrAssign, Arrow, LeftArrow, FatArrow,
At, Decorator(String),
LParen,
RParen,
LBrace,
RBrace,
LBracket,
RBracket,
Comma,
Dot,
DotDot, DotDotEq, Colon,
ColonColon, Semicolon,
Question,
Ampersand, Pipe, PipeOp, Underscore, Bang,
Eof,
Newline,
DocComment(String), }
impl fmt::Display for Token {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match self {
Token::Ident(s) => write!(f, "Ident({})", s),
Token::IntLiteral(n) => write!(f, "Int({})", n),
Token::IntLiteralSuffixed(n, ref s) => write!(f, "Int({}{})", n, s),
Token::StringLiteral(s) => write!(f, "String(\"{}\")", s),
_ => write!(f, "{:?}", self),
}
}
}
impl Eq for Token {}
impl std::hash::Hash for Token {
fn hash<H: std::hash::Hasher>(&self, state: &mut H) {
std::mem::discriminant(self).hash(state);
match self {
Token::IntLiteral(n) => n.hash(state),
Token::IntLiteralSuffixed(n, ref s) => {
n.hash(state);
s.hash(state);
}
Token::FloatLiteral(f) => f.to_bits().hash(state), Token::StringLiteral(s) => s.hash(state),
Token::InterpolatedString(parts) => parts.hash(state),
Token::CharLiteral(c) => c.hash(state),
Token::BoolLiteral(b) => b.hash(state),
Token::Ident(s) => s.hash(state),
Token::DocComment(s) => s.hash(state),
Token::Decorator(s) => s.hash(state),
_ => {} }
}
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct TokenWithLocation {
pub token: Token,
pub line: usize,
pub column: usize,
}