Skip to main content

oak_matlab/kind/
mod.rs

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    // 基础标记
7    Whitespace,
8    Newline,
9    Comment,
10    BlockComment,
11
12    // 标识符和字面量
13    Identifier,
14    Number,
15    String,
16    Character,
17
18    // 关键字
19    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    // 运算符
42    Plus,          // +
43    Minus,         // -
44    Times,         // *
45    Divide,        // /
46    Power,         // ^
47    LeftDivide,    // \
48    DotTimes,      // .*
49    DotDivide,     // ./
50    DotPower,      // .^
51    DotLeftDivide, // .\
52
53    // 比较运算符
54    Equal,        // ==
55    NotEqual,     // ~=
56    Less,         // <
57    Greater,      // >
58    LessEqual,    // <=
59    GreaterEqual, // >=
60
61    // 逻辑运算符
62    And,    // &
63    Or,     // |
64    Not,    // ~
65    AndAnd, // &&
66    OrOr,   // ||
67
68    // 赋值运算符
69    Assign, // =
70
71    // 分隔符
72    LeftParen,    // (
73    RightParen,   // )
74    LeftBracket,  // [
75    RightBracket, // ]
76    LeftBrace,    // {
77    RightBrace,   // }
78    Semicolon,    // ;
79    Comma,        // ,
80    Dot,          // .
81    Colon,        // :
82    Question,     // ?
83    At,           // @
84
85    // 特殊运算符
86    Transpose,    // '
87    DotTranspose, // .'
88
89    // 泛化类型
90    Operator,
91    Delimiter,
92
93    // 错误处理
94    Error,
95
96    // 文档结构
97    Script,
98    FunctionDef,
99    ClassDef,
100    Block,
101    Expression,
102    Statement,
103
104    // EOF
105    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}