Skip to main content

oak_xml/kind/
mod.rs

1use oak_core::{ElementType, TokenType, UniversalElementRole, UniversalTokenRole};
2use serde::{Deserialize, Serialize};
3
4#[derive(Copy, Clone, Debug, PartialEq, Eq, Serialize, Deserialize, Hash)]
5pub enum XmlSyntaxKind {
6    // 基本 kind
7    Root,
8    Whitespace,
9    Newline,
10    Comment,
11    Text,
12    Error,
13    Eof,
14
15    // XML 特定
16    XmlDeclaration,
17    DoctypeDeclaration,
18    ProcessingInstruction,
19    CData,
20
21    // 标签
22    StartTag,
23    EndTag,
24    SelfClosingTag,
25    TagName,
26
27    AttributeName,
28    AttributeValue,
29
30    // 字面量
31    StringLiteral,
32
33    // 标点符号
34    LeftAngle,       // <
35    RightAngle,      // >
36    LeftAngleSlash,  // </
37    SlashRightAngle, // />
38    Equals,          // =
39    Quote,           // "
40    SingleQuote,     // '
41    Exclamation,     // !
42    Question,        // ?
43    Ampersand,       // &
44    Semicolon,       // ;
45
46    // 实体引用
47    EntityReference,
48    CharacterReference,
49
50    // 标识符
51    Identifier,
52
53    // 非终结符
54    SourceFile,
55    Element,
56    Attribute,
57    Prolog,
58}
59
60impl TokenType for XmlSyntaxKind {
61    const END_OF_STREAM: Self = Self::Eof;
62    type Role = UniversalTokenRole;
63
64    fn role(&self) -> Self::Role {
65        match self {
66            Self::Whitespace | Self::Newline => UniversalTokenRole::Whitespace,
67            Self::Comment => UniversalTokenRole::Comment,
68            Self::Eof => UniversalTokenRole::Eof,
69            _ => UniversalTokenRole::None,
70        }
71    }
72}
73
74impl ElementType for XmlSyntaxKind {
75    type Role = UniversalElementRole;
76
77    fn role(&self) -> Self::Role {
78        match self {
79            Self::SourceFile => UniversalElementRole::Root,
80            Self::Element => UniversalElementRole::Container,
81            Self::Attribute => UniversalElementRole::Detail,
82            Self::Prolog => UniversalElementRole::Detail,
83            Self::StartTag | Self::EndTag | Self::SelfClosingTag => UniversalElementRole::Detail,
84            Self::Comment => UniversalElementRole::None,
85            Self::Error => UniversalElementRole::Error,
86            _ => UniversalElementRole::None,
87        }
88    }
89
90    fn is_root(&self) -> bool {
91        matches!(self, Self::SourceFile)
92    }
93
94    fn is_error(&self) -> bool {
95        matches!(self, Self::Error)
96    }
97}