Skip to main content

oak_solidity/lexer/
token_type.rs

1use oak_core::{TokenType, UniversalTokenRole};
2#[cfg(feature = "serde")]
3use serde::{Deserialize, Serialize};
4
5/// Solidity token types.
6#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
7#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
8pub enum SolidityTokenType {
9    /// End of file.
10    Eof,
11    /// Whitespace.
12    Whitespace,
13    /// Comment.
14    Comment,
15    /// Identifier.
16    Identifier,
17    /// String literal.
18    String,
19    /// Number literal.
20    Number,
21    /// "pragma" keyword.
22    Pragma,
23    /// "contract" keyword.
24    Contract,
25}
26
27impl TokenType for SolidityTokenType {
28    type Role = UniversalTokenRole;
29    const END_OF_STREAM: Self = Self::Eof;
30
31    fn is_ignored(&self) -> bool {
32        matches!(self, Self::Whitespace | Self::Comment)
33    }
34
35    fn role(&self) -> Self::Role {
36        match self {
37            Self::Eof => UniversalTokenRole::Eof,
38            Self::Whitespace => UniversalTokenRole::Whitespace,
39            Self::Comment => UniversalTokenRole::Comment,
40            Self::Identifier => UniversalTokenRole::Name,
41            Self::String | Self::Number => UniversalTokenRole::Literal,
42            Self::Pragma | Self::Contract => UniversalTokenRole::Keyword,
43        }
44    }
45}