1use oak_core::{ElementType, TokenType, UniversalElementRole, UniversalTokenRole};
2use serde::{Deserialize, Serialize};
3
4#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
5pub enum MatlabSyntaxKind {
6 Whitespace,
8 Newline,
9 Comment,
10 BlockComment,
11
12 Identifier,
14 Number,
15 String,
16 Character,
17
18 Function,
20 End,
21 If,
22 Else,
23 Elseif,
24 While,
25 For,
26 Break,
27 Continue,
28 Return,
29 Switch,
30 Case,
31 Otherwise,
32 Try,
33 Catch,
34 Global,
35 Persistent,
36 Classdef,
37 Properties,
38 Methods,
39 Events,
40
41 Plus, Minus, Times, Divide, Power, LeftDivide, DotTimes, DotDivide, DotPower, DotLeftDivide, Equal, NotEqual, Less, Greater, LessEqual, GreaterEqual, And, Or, Not, AndAnd, OrOr, Assign, LeftParen, RightParen, LeftBracket, RightBracket, LeftBrace, RightBrace, Semicolon, Comma, Dot, Colon, Question, At, Transpose, DotTranspose, Operator,
91 Delimiter,
92
93 Error,
95
96 Script,
98 FunctionDef,
99 ClassDef,
100 Block,
101 Expression,
102 Statement,
103
104 Eof,
106}
107
108impl MatlabSyntaxKind {
109 pub fn is_token(&self) -> bool {
110 !self.is_element()
111 }
112
113 pub fn is_element(&self) -> bool {
114 matches!(self, Self::Script | Self::FunctionDef | Self::ClassDef | Self::Block | Self::Expression | Self::Statement)
115 }
116}
117
118impl TokenType for MatlabSyntaxKind {
119 const END_OF_STREAM: Self = Self::Eof;
120 type Role = UniversalTokenRole;
121
122 fn role(&self) -> Self::Role {
123 match self {
124 Self::Whitespace | Self::Newline => UniversalTokenRole::Whitespace,
125 Self::Comment | Self::BlockComment => UniversalTokenRole::Comment,
126 Self::Eof => UniversalTokenRole::Eof,
127 _ => UniversalTokenRole::None,
128 }
129 }
130
131 fn is_comment(&self) -> bool {
132 matches!(self, Self::Comment | Self::BlockComment)
133 }
134
135 fn is_whitespace(&self) -> bool {
136 matches!(self, Self::Whitespace | Self::Newline)
137 }
138}
139
140impl ElementType for MatlabSyntaxKind {
141 type Role = UniversalElementRole;
142
143 fn role(&self) -> Self::Role {
144 match self {
145 Self::Error => UniversalElementRole::Error,
146 Self::Script => UniversalElementRole::Root,
147 Self::FunctionDef | Self::ClassDef => UniversalElementRole::Detail,
148 _ => UniversalElementRole::None,
149 }
150 }
151}