use crate::lexer::CrystalTokenType;
use oak_core::{ElementType, UniversalElementRole};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)]
pub enum CrystalElementType {
Root,
Program,
SourceFile,
ClassDef,
ModuleDef,
MethodDef,
Block,
IfExpr,
UnlessExpr,
CaseExpr,
WhenClause,
WhileExpr,
UntilExpr,
ForExpr,
BeginExpr,
RescueClause,
EnsureClause,
CallExpr,
IndexExpr,
MemberExpr,
BinaryExpr,
UnaryExpr,
AssignExpr,
LiteralExpr,
IdentifierExpr,
ArrayExpr,
HashExpr,
HashPair,
BlockExpr,
LambdaExpr,
YieldExpr,
ReturnExpr,
BreakExpr,
NextExpr,
SuperExpr,
SelfExpr,
ParenExpr,
TypeExpr,
GenericType,
UnionType,
TupleType,
NamedTupleType,
ProcType,
Pattern,
IdentifierPattern,
LiteralPattern,
ArrayPattern,
HashPattern,
TuplePattern,
ParamList,
Param,
SplatParam,
DoubleSplatParam,
BlockParam,
Annotation,
MacroDef,
MacroCall,
MacroExpr,
Alias,
Include,
Extend,
Require,
Private,
Protected,
Public,
Abstract,
Virtual,
Override,
StructDef,
EnumDef,
UnionDef,
LibDef,
RaiseExpr,
RangeExpr,
ExclusiveRangeExpr,
RegexLiteral,
StringInterpolation,
InterpolationExpr,
SymbolLiteral,
ConstantRef,
InstanceVar,
ClassVar,
GlobalVar,
Getter,
Setter,
OperatorDef,
}
impl ElementType for CrystalElementType {
type Role = UniversalElementRole;
fn role(&self) -> Self::Role {
match self {
Self::Root => UniversalElementRole::Root,
_ => UniversalElementRole::None,
}
}
}
impl From<CrystalTokenType> for CrystalElementType {
fn from(token: CrystalTokenType) -> Self {
match token {
CrystalTokenType::Error => Self::Root, _ => Self::Root,
}
}
}