use oak_core::{ElementType, UniversalElementRole};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum GoElementType {
SourceFile,
PackageClause,
ImportDeclaration,
ImportSpec,
FunctionDeclaration,
Receiver,
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 GoElementType {
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
)
}
pub fn is_literal(&self) -> bool {
matches!(self, Self::IntLiteral | Self::FloatLiteral | Self::StringLiteral | Self::RuneLiteral | Self::BoolLiteral | Self::NilLiteral | Self::NumberLiteral | Self::CharLiteral)
}
pub fn is_operator(&self) -> bool {
matches!(
self,
Self::Plus
| Self::Minus
| Self::Star
| Self::Slash
| Self::Percent
| Self::Ampersand
| Self::Pipe
| Self::Caret
| Self::LeftShift
| Self::RightShift
| Self::AmpersandCaret
| Self::PlusAssign
| Self::MinusAssign
| Self::StarAssign
| Self::SlashAssign
| Self::PercentAssign
| Self::AmpersandAssign
| Self::PipeAssign
| Self::CaretAssign
| Self::XorAssign
| Self::LeftShiftAssign
| Self::RightShiftAssign
| Self::AmpersandCaretAssign
| Self::AndAssign
| Self::OrAssign
| Self::AndNotAssign
| Self::AndNot
| Self::LogicalAnd
| Self::LogicalOr
| Self::And
| Self::Or
| Self::Arrow
| Self::LeftArrow
| Self::Increment
| Self::Decrement
| Self::Equal
| Self::Less
| Self::Greater
| Self::Assign
| Self::LogicalNot
| Self::Not
| Self::NotEqual
| Self::LessEqual
| Self::GreaterEqual
| Self::ColonAssign
| Self::Define
| Self::Ellipsis
)
}
}
impl ElementType for GoElementType {
type Role = UniversalElementRole;
fn role(&self) -> Self::Role {
match self {
Self::Error => UniversalElementRole::Error,
_ => UniversalElementRole::None,
}
}
}
impl From<crate::lexer::token_type::GoTokenType> for GoElementType {
fn from(token: crate::lexer::token_type::GoTokenType) -> Self {
unsafe { std::mem::transmute(token) }
}
}