Skip to main content

oak_scss/kind/
mod.rs

1use oak_core::{ElementType, TokenType, UniversalElementRole, UniversalTokenRole};
2use serde::{Deserialize, Serialize};
3
4/// 统一 SCSS 语法种类(包含节点与词法)
5#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
6pub enum ScssSyntaxKind {
7    // 节点种类
8    SourceFile,
9    ErrorNode,
10    Selector,
11    Property,
12    Variable,
13    Ruleset,
14    Declaration,
15
16    // 基础词法种类
17    Whitespace,
18    Newline,
19    Comment,
20    Error,
21    Eof,
22
23    // 标识符和字面量
24    Identifier,
25    IntegerLiteral,
26    FloatLiteral,
27    StringLiteral,
28    CharLiteral,
29    BooleanLiteral,
30
31    // SCSS 关键字
32    Import,
33    Include,
34    Mixin,
35    Function,
36    Return,
37    If,
38    Else,
39    For,
40    While,
41    Each,
42    In,
43    From,
44    To,
45    Through,
46    Default,
47    Important,
48    Optional,
49    Global,
50    Null,
51    True,
52    False,
53
54    // 临时保留的 Scala 关键字(为了兼容现有 lexer)
55    Abstract,
56    Case,
57    Catch,
58    Class,
59    Def,
60    Do,
61    Extends,
62    Final,
63    Finally,
64    ForSome,
65    Implicit,
66    Lazy,
67    Match,
68    New,
69    Object,
70    Override,
71    Package,
72    Private,
73    Protected,
74    Sealed,
75    Super,
76    This,
77    Throw,
78    Trait,
79    Try,
80    Type,
81    Val,
82    Var,
83    With,
84    Yield,
85
86    // 操作符
87    Plus,       // +
88    Minus,      // -
89    Star,       // *
90    Slash,      // /
91    Percent,    // %
92    Eq,         // =
93    EqEq,       // ==
94    Ne,         // !=
95    Lt,         // <
96    Le,         // <=
97    Gt,         // >
98    Ge,         // >=
99    And,        // &
100    Or,         // |
101    Xor,        // ^
102    AndAnd,     // &&
103    OrOr,       // ||
104    Not,        // !
105    Bang,       // ! (alternative name)
106    Tilde,      // ~
107    LShift,     // <<
108    RShift,     // >>
109    URShift,    // >>>
110    PlusEq,     // +=
111    MinusEq,    // -=
112    StarEq,     // *=
113    SlashEq,    // /=
114    PercentEq,  // %=
115    AndEq,      // &=
116    OrEq,       // |=
117    XorEq,      // ^=
118    LShiftEq,   // <<=
119    RShiftEq,   // >>=
120    URShiftEq,  // >>>=
121    Arrow,      // =>
122    LeftArrow,  // <-
123    Colon,      // :
124    ColonColon, // ::
125    Semicolon,  // ;
126    Dot,        // .
127    Comma,      // ,
128    Question,   // ?
129    At,         // @
130    Hash,       // #
131    Dollar,     // $
132
133    // 分隔符
134    LeftParen,    // (
135    RightParen,   // )
136    LeftBracket,  // [
137    RightBracket, // ]
138    LeftBrace,    // {
139    RightBrace,   // }
140
141    // 注释
142    LineComment,
143    BlockComment,
144    DocComment,
145}
146
147impl TokenType for ScssSyntaxKind {
148    type Role = UniversalTokenRole;
149
150    const END_OF_STREAM: Self = Self::Eof;
151
152    fn role(&self) -> Self::Role {
153        match self {
154            Self::Whitespace | Self::Newline => UniversalTokenRole::Whitespace,
155            Self::Comment | Self::LineComment | Self::BlockComment | Self::DocComment => UniversalTokenRole::Comment,
156            Self::Error => UniversalTokenRole::Error,
157            Self::Eof => UniversalTokenRole::None,
158            Self::Identifier => UniversalTokenRole::Name,
159            Self::IntegerLiteral | Self::FloatLiteral | Self::StringLiteral | Self::CharLiteral | Self::BooleanLiteral | Self::True | Self::False | Self::Null => UniversalTokenRole::Literal,
160            Self::Import
161            | Self::Include
162            | Self::Mixin
163            | Self::Function
164            | Self::Return
165            | Self::If
166            | Self::Else
167            | Self::For
168            | Self::While
169            | Self::Each
170            | Self::In
171            | Self::From
172            | Self::To
173            | Self::Through
174            | Self::Default
175            | Self::Important
176            | Self::Optional
177            | Self::Global => UniversalTokenRole::Keyword,
178            Self::Plus
179            | Self::Minus
180            | Self::Star
181            | Self::Slash
182            | Self::Percent
183            | Self::Eq
184            | Self::EqEq
185            | Self::Ne
186            | Self::Lt
187            | Self::Le
188            | Self::Gt
189            | Self::Ge
190            | Self::And
191            | Self::Or
192            | Self::Xor
193            | Self::AndAnd
194            | Self::OrOr
195            | Self::Not
196            | Self::Bang
197            | Self::Tilde
198            | Self::LShift
199            | Self::RShift
200            | Self::URShift
201            | Self::PlusEq
202            | Self::MinusEq
203            | Self::StarEq
204            | Self::SlashEq
205            | Self::PercentEq
206            | Self::AndEq
207            | Self::OrEq
208            | Self::XorEq
209            | Self::LShiftEq
210            | Self::RShiftEq
211            | Self::URShiftEq
212            | Self::Arrow
213            | Self::LeftArrow => UniversalTokenRole::Operator,
214            Self::LeftParen | Self::RightParen | Self::LeftBracket | Self::RightBracket | Self::LeftBrace | Self::RightBrace => UniversalTokenRole::Punctuation,
215            _ => UniversalTokenRole::None,
216        }
217    }
218}
219
220impl ElementType for ScssSyntaxKind {
221    type Role = UniversalElementRole;
222
223    fn role(&self) -> Self::Role {
224        match self {
225            Self::SourceFile => UniversalElementRole::Root,
226            Self::ErrorNode => UniversalElementRole::Error,
227            _ => UniversalElementRole::None,
228        }
229    }
230}