Skip to main content

oak_mojo/parser/
element_type.rs

1use crate::lexer::MojoTokenType;
2use oak_core::UniversalElementRole;
3use serde::{Deserialize, Serialize};
4
5#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
6pub enum MojoElementType {
7    // Tokens (mapped from MojoTokenType)
8    Fn,
9    Struct,
10    Var,
11    Let,
12    If,
13    Else,
14    While,
15    For,
16    In,
17    Return,
18    Break,
19    Continue,
20    Import,
21    From,
22    True,
23    False,
24    None,
25    Identifier,
26    Integer,
27    Float,
28    String,
29    Plus,
30    Minus,
31    Star,
32    Slash,
33    Percent,
34    Equal,
35    EqualEqual,
36    NotEqual,
37    Less,
38    LessEqual,
39    Greater,
40    GreaterEqual,
41    And,
42    Or,
43    Not,
44    LeftParen,
45    RightParen,
46    LeftBracket,
47    RightBracket,
48    LeftBrace,
49    RightBrace,
50    Comma,
51    Dot,
52    Colon,
53    Semicolon,
54    Arrow,
55    Whitespace,
56    Newline,
57    Comment,
58    Indent,
59    Dedent,
60    EndOfStream,
61
62    // Statements
63    FunctionDef,
64    StructDef,
65    VariableDecl,
66    Assignment,
67    IfStatement,
68    WhileStatement,
69    ForStatement,
70    ReturnStatement,
71    ExpressionStatement,
72
73    // Expressions
74    BinaryExpr,
75    UnaryExpr,
76    CallExpr,
77    LiteralExpr,
78    IdentifierExpr,
79    MemberExpr,
80    ListExpr,
81
82    // Components
83    ParamList,
84    ArgList,
85    Block,
86
87    // Special
88    Root,
89    Grouping,
90    Error,
91}
92
93impl MojoElementType {
94    /// 是否为琐碎节点(空白、注释等)
95    pub fn is_trivia(&self) -> bool {
96        matches!(self, MojoElementType::Whitespace | MojoElementType::Newline | MojoElementType::Comment)
97    }
98}
99
100impl From<MojoTokenType> for MojoElementType {
101    fn from(token: MojoTokenType) -> Self {
102        match token {
103            MojoTokenType::Fn => MojoElementType::Fn,
104            MojoTokenType::Struct => MojoElementType::Struct,
105            MojoTokenType::Var => MojoElementType::Var,
106            MojoTokenType::Let => MojoElementType::Let,
107            MojoTokenType::If => MojoElementType::If,
108            MojoTokenType::Else => MojoElementType::Else,
109            MojoTokenType::While => MojoElementType::While,
110            MojoTokenType::For => MojoElementType::For,
111            MojoTokenType::In => MojoElementType::In,
112            MojoTokenType::Return => MojoElementType::Return,
113            MojoTokenType::Break => MojoElementType::Break,
114            MojoTokenType::Continue => MojoElementType::Continue,
115            MojoTokenType::Import => MojoElementType::Import,
116            MojoTokenType::From => MojoElementType::From,
117            MojoTokenType::True => MojoElementType::True,
118            MojoTokenType::False => MojoElementType::False,
119            MojoTokenType::None => MojoElementType::None,
120            MojoTokenType::Identifier => MojoElementType::Identifier,
121            MojoTokenType::Integer => MojoElementType::Integer,
122            MojoTokenType::Float => MojoElementType::Float,
123            MojoTokenType::String => MojoElementType::String,
124            MojoTokenType::Plus => MojoElementType::Plus,
125            MojoTokenType::Minus => MojoElementType::Minus,
126            MojoTokenType::Star => MojoElementType::Star,
127            MojoTokenType::Slash => MojoElementType::Slash,
128            MojoTokenType::Percent => MojoElementType::Percent,
129            MojoTokenType::Equal => MojoElementType::Equal,
130            MojoTokenType::EqualEqual => MojoElementType::EqualEqual,
131            MojoTokenType::NotEqual => MojoElementType::NotEqual,
132            MojoTokenType::Less => MojoElementType::Less,
133            MojoTokenType::LessEqual => MojoElementType::LessEqual,
134            MojoTokenType::Greater => MojoElementType::Greater,
135            MojoTokenType::GreaterEqual => MojoElementType::GreaterEqual,
136            MojoTokenType::And => MojoElementType::And,
137            MojoTokenType::Or => MojoElementType::Or,
138            MojoTokenType::Not => MojoElementType::Not,
139            MojoTokenType::LeftParen => MojoElementType::LeftParen,
140            MojoTokenType::RightParen => MojoElementType::RightParen,
141            MojoTokenType::LeftBracket => MojoElementType::LeftBracket,
142            MojoTokenType::RightBracket => MojoElementType::RightBracket,
143            MojoTokenType::LeftBrace => MojoElementType::LeftBrace,
144            MojoTokenType::RightBrace => MojoElementType::RightBrace,
145            MojoTokenType::Comma => MojoElementType::Comma,
146            MojoTokenType::Dot => MojoElementType::Dot,
147            MojoTokenType::Colon => MojoElementType::Colon,
148            MojoTokenType::Semicolon => MojoElementType::Semicolon,
149            MojoTokenType::Arrow => MojoElementType::Arrow,
150            MojoTokenType::Whitespace => MojoElementType::Whitespace,
151            MojoTokenType::Newline => MojoElementType::Newline,
152            MojoTokenType::Comment => MojoElementType::Comment,
153            MojoTokenType::Indent => MojoElementType::Indent,
154            MojoTokenType::Dedent => MojoElementType::Dedent,
155            MojoTokenType::EndOfStream => MojoElementType::EndOfStream,
156            MojoTokenType::Error => MojoElementType::Error,
157        }
158    }
159}
160
161impl oak_core::ElementType for MojoElementType {
162    type Role = UniversalElementRole;
163
164    fn role(&self) -> Self::Role {
165        UniversalElementRole::None
166    }
167}