use crate::error::Span;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum TokenKind {
Ident,
Integer,
Float,
String,
ByteString,
Char,
LParen,
RParen,
LBrace,
RBrace,
LBracket,
RBracket,
Colon,
Comma,
Hash,
Bang,
Eq,
Whitespace,
LineComment,
BlockComment,
Eof,
Error,
}
impl TokenKind {
#[must_use]
pub const fn is_trivia(self) -> bool {
matches!(
self,
TokenKind::Whitespace | TokenKind::LineComment | TokenKind::BlockComment
)
}
}
#[derive(Debug, Clone)]
pub struct Token<'a> {
pub kind: TokenKind,
pub text: &'a str,
pub span: Span,
}
#[cfg(test)]
mod tests {
use super::*;
use crate::error::Position;
#[test]
fn token_kind_is_trivia() {
assert!(TokenKind::Whitespace.is_trivia());
assert!(TokenKind::LineComment.is_trivia());
assert!(TokenKind::BlockComment.is_trivia());
assert!(!TokenKind::Ident.is_trivia());
assert!(!TokenKind::Integer.is_trivia());
assert!(!TokenKind::LParen.is_trivia());
assert!(!TokenKind::Eof.is_trivia());
assert!(!TokenKind::Error.is_trivia());
}
#[test]
fn token_kind_copy() {
let kind = TokenKind::Ident;
let kind2 = kind; assert_eq!(kind, kind2);
}
#[test]
fn token_clone() {
let token = Token {
kind: TokenKind::Ident,
text: "foo",
span: Span {
start: Position { line: 1, col: 1 },
end: Position { line: 1, col: 4 },
start_offset: 0,
end_offset: 3,
},
};
let token2 = token.clone();
assert_eq!(token.kind, token2.kind);
assert_eq!(token.text, token2.text);
assert_eq!(token.span, token2.span);
}
}