use core::fmt;
use oak_core::{Source, Token, TokenType, UniversalElementRole, UniversalTokenRole};
pub type GoToken = Token<GoTokenType>;
#[derive(Clone, Copy, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum GoTokenType {
SourceFile,
PackageClause,
ImportDeclaration,
ImportSpec,
FunctionDeclaration,
ParameterList,
ParameterDecl,
Block,
VariableDeclaration,
VariableSpec,
ConstDeclaration,
ConstSpec,
TypeDeclaration,
TypeSpec,
StructType,
FieldDeclList,
FieldDecl,
InterfaceType,
MethodSpecList,
MethodSpec,
ExpressionList,
AssignmentStatement,
ShortVarDecl,
ReturnStatement,
IfStatement,
ForStatement,
SwitchStatement,
ExprCaseClause,
TypeSwitchStatement,
TypeCaseClause,
SelectStatement,
CommClause,
GoStatement,
DeferStatement,
CallExpression,
IndexExpression,
SelectorExpression,
SliceExpression,
TypeAssertion,
UnaryExpression,
BinaryExpression,
LiteralValue,
ElementList,
KeyedElement,
IntLiteral,
FloatLiteral,
StringLiteral,
RuneLiteral,
BoolLiteral,
Identifier,
Break,
Case,
Chan,
Const,
Continue,
Default,
Defer,
Else,
Fallthrough,
For,
Func,
Go,
Goto,
If,
Import,
Interface,
Map,
Package,
Range,
Return,
Select,
Struct,
Switch,
Type,
Var,
Bool,
Byte,
Complex64,
Complex128,
ErrorType,
Float32,
Float64,
Int,
Int8,
Int16,
Int32,
Int64,
Rune,
String,
Uint,
Uint8,
Uint16,
Uint32,
Uint64,
Uintptr,
NilLiteral,
NumberLiteral,
CharLiteral,
Plus,
Minus,
Star,
Slash,
Percent,
Ampersand,
Pipe,
Caret,
LeftShift,
RightShift,
AmpersandCaret,
PlusAssign,
MinusAssign,
StarAssign,
SlashAssign,
PercentAssign,
AmpersandAssign,
PipeAssign,
CaretAssign,
XorAssign,
LeftShiftAssign,
RightShiftAssign,
AmpersandCaretAssign,
AndAssign,
OrAssign,
AndNotAssign,
AndNot,
LogicalAnd,
LogicalOr,
And,
Or,
Arrow,
LeftArrow,
Increment,
Decrement,
Equal,
Less,
Greater,
Assign,
LogicalNot,
Not,
NotEqual,
LessEqual,
GreaterEqual,
ColonAssign,
Define,
Ellipsis,
LeftParen,
RightParen,
LeftBracket,
RightBracket,
LeftBrace,
RightBrace,
Comma,
Period,
Dot,
Semicolon,
Colon,
Whitespace,
Comment,
Eof,
Error,
}
impl GoTokenType {
pub fn is_ignored(&self) -> bool {
matches!(self, Self::Whitespace | Self::Comment)
}
pub fn is_keyword(&self) -> bool {
matches!(
self,
Self::Break
| Self::Case
| Self::Chan
| Self::Const
| Self::Continue
| Self::Default
| Self::Defer
| Self::Else
| Self::Fallthrough
| Self::For
| Self::Func
| Self::Go
| Self::Goto
| Self::If
| Self::Import
| Self::Interface
| Self::Map
| Self::Package
| Self::Range
| Self::Return
| Self::Select
| Self::Struct
| Self::Switch
| Self::Type
| Self::Var
)
}
}
impl fmt::Debug for GoTokenType {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{:?}", self)
}
}
impl TokenType for GoTokenType {
type Role = UniversalTokenRole;
const END_OF_STREAM: Self = Self::Eof;
fn is_ignored(&self) -> bool {
matches!(self, Self::Whitespace | Self::Comment)
}
fn role(&self) -> Self::Role {
match self {
Self::Eof => UniversalTokenRole::Eof,
Self::Identifier => UniversalTokenRole::Name,
Self::StringLiteral | Self::IntLiteral | Self::FloatLiteral | Self::RuneLiteral | Self::BoolLiteral | Self::NilLiteral | Self::NumberLiteral | Self::CharLiteral => UniversalTokenRole::Literal,
Self::Break
| Self::Case
| Self::Chan
| Self::Const
| Self::Continue
| Self::Default
| Self::Defer
| Self::Else
| Self::Fallthrough
| Self::For
| Self::Func
| Self::Go
| Self::Goto
| Self::If
| Self::Import
| Self::Interface
| Self::Map
| Self::Package
| Self::Range
| Self::Return
| Self::Select
| Self::Struct
| Self::Switch
| Self::Type
| Self::Var => UniversalTokenRole::Keyword,
Self::Whitespace => UniversalTokenRole::Whitespace,
Self::Comment => UniversalTokenRole::Comment,
Self::Error => UniversalTokenRole::Error,
_ => UniversalTokenRole::None,
}
}
}