Skip to main content

oak_msil/parser/
element_type.rs

1use oak_core::{ElementType, UniversalElementRole};
2
3/// Element types for the MSIL (CIL) language.
4#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
5#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
6pub enum MsilElementType {
7    /// The root node of the AST.
8    Root,
9    /// An assembly directive.
10    Assembly,
11    /// An external assembly directive.
12    AssemblyExtern,
13    /// A module directive.
14    Module,
15    /// A class definition.
16    Class,
17    /// A method definition.
18    Method,
19    /// An instruction.
20    Instruction,
21    /// A label.
22    Label,
23    /// A generic directive.
24    Directive,
25    /// A type reference or definition.
26    Type,
27    /// An identifier.
28    Identifier,
29    /// A number literal.
30    Number,
31    /// A string literal.
32    String,
33    /// A comment.
34    Comment,
35    /// An error node in the AST.
36    ErrorNode,
37
38    /// `.assembly` keyword.
39    AssemblyKeyword,
40    /// `extern` keyword.
41    ExternKeyword,
42    /// `.module` keyword.
43    ModuleKeyword,
44    /// `.class` keyword.
45    ClassKeyword,
46    /// `.method` keyword.
47    MethodKeyword,
48    /// `public` keyword.
49    PublicKeyword,
50    /// `private` keyword.
51    PrivateKeyword,
52    /// `static` keyword.
53    StaticKeyword,
54    /// Other keyword.
55    Keyword,
56
57    /// `{`.
58    LeftBrace,
59    /// `}`.
60    RightBrace,
61    /// `(`.
62    LeftParen,
63    /// `)`.
64    RightParen,
65    /// `[`.
66    LeftBracket,
67    /// `]`.
68    RightBracket,
69    /// `.`.
70    Dot,
71    /// `:`.
72    Colon,
73    /// `;`.
74    Semicolon,
75    /// `,`.
76    Comma,
77    /// `=`.
78    Equal,
79    /// `/`.
80    Slash,
81
82    /// Identifier token.
83    IdentifierToken,
84    /// Number token.
85    NumberToken,
86    /// String token.
87    StringToken,
88
89    /// Whitespace.
90    Whitespace,
91    /// Comment token.
92    CommentToken,
93    /// End of stream.
94    Eof,
95    /// Error token.
96    Error,
97}
98
99impl ElementType for MsilElementType {
100    type Role = UniversalElementRole;
101
102    fn role(&self) -> Self::Role {
103        match self {
104            Self::Root => UniversalElementRole::Root,
105            Self::Assembly | Self::AssemblyExtern | Self::Module | Self::Class | Self::Method | Self::Directive => UniversalElementRole::Definition,
106            Self::Instruction => UniversalElementRole::Statement,
107            Self::Type | Self::Identifier => UniversalElementRole::Typing,
108            Self::Number | Self::String => UniversalElementRole::Value,
109            Self::Comment => UniversalElementRole::Documentation,
110            Self::Error | Self::ErrorNode => UniversalElementRole::Error,
111            _ => UniversalElementRole::None,
112        }
113    }
114}
115
116impl From<crate::lexer::token_type::MsilTokenType> for MsilElementType {
117    fn from(token: crate::lexer::token_type::MsilTokenType) -> Self {
118        match token {
119            crate::lexer::token_type::MsilTokenType::Root => MsilElementType::Root,
120            crate::lexer::token_type::MsilTokenType::Assembly => MsilElementType::Assembly,
121            crate::lexer::token_type::MsilTokenType::AssemblyExtern => MsilElementType::AssemblyExtern,
122            crate::lexer::token_type::MsilTokenType::Module => MsilElementType::Module,
123            crate::lexer::token_type::MsilTokenType::Class => MsilElementType::Class,
124            crate::lexer::token_type::MsilTokenType::Method => MsilElementType::Method,
125            crate::lexer::token_type::MsilTokenType::Instruction => MsilElementType::Instruction,
126            crate::lexer::token_type::MsilTokenType::Label => MsilElementType::Label,
127            crate::lexer::token_type::MsilTokenType::Directive => MsilElementType::Directive,
128            crate::lexer::token_type::MsilTokenType::Type => MsilElementType::Type,
129            crate::lexer::token_type::MsilTokenType::Identifier => MsilElementType::Identifier,
130            crate::lexer::token_type::MsilTokenType::Number => MsilElementType::Number,
131            crate::lexer::token_type::MsilTokenType::String => MsilElementType::String,
132            crate::lexer::token_type::MsilTokenType::Comment => MsilElementType::Comment,
133            crate::lexer::token_type::MsilTokenType::ErrorNode => MsilElementType::ErrorNode,
134            crate::lexer::token_type::MsilTokenType::AssemblyKeyword => MsilElementType::AssemblyKeyword,
135            crate::lexer::token_type::MsilTokenType::ExternKeyword => MsilElementType::ExternKeyword,
136            crate::lexer::token_type::MsilTokenType::ModuleKeyword => MsilElementType::ModuleKeyword,
137            crate::lexer::token_type::MsilTokenType::ClassKeyword => MsilElementType::ClassKeyword,
138            crate::lexer::token_type::MsilTokenType::MethodKeyword => MsilElementType::MethodKeyword,
139            crate::lexer::token_type::MsilTokenType::PublicKeyword => MsilElementType::PublicKeyword,
140            crate::lexer::token_type::MsilTokenType::PrivateKeyword => MsilElementType::PrivateKeyword,
141            crate::lexer::token_type::MsilTokenType::StaticKeyword => MsilElementType::StaticKeyword,
142            crate::lexer::token_type::MsilTokenType::Keyword => MsilElementType::Keyword,
143            crate::lexer::token_type::MsilTokenType::LeftBrace => MsilElementType::LeftBrace,
144            crate::lexer::token_type::MsilTokenType::RightBrace => MsilElementType::RightBrace,
145            crate::lexer::token_type::MsilTokenType::LeftParen => MsilElementType::LeftParen,
146            crate::lexer::token_type::MsilTokenType::RightParen => MsilElementType::RightParen,
147            crate::lexer::token_type::MsilTokenType::LeftBracket => MsilElementType::LeftBracket,
148            crate::lexer::token_type::MsilTokenType::RightBracket => MsilElementType::RightBracket,
149            crate::lexer::token_type::MsilTokenType::Dot => MsilElementType::Dot,
150            crate::lexer::token_type::MsilTokenType::Colon => MsilElementType::Colon,
151            crate::lexer::token_type::MsilTokenType::Semicolon => MsilElementType::Semicolon,
152            crate::lexer::token_type::MsilTokenType::Comma => MsilElementType::Comma,
153            crate::lexer::token_type::MsilTokenType::Equal => MsilElementType::Equal,
154            crate::lexer::token_type::MsilTokenType::Slash => MsilElementType::Slash,
155            crate::lexer::token_type::MsilTokenType::IdentifierToken => MsilElementType::IdentifierToken,
156            crate::lexer::token_type::MsilTokenType::NumberToken => MsilElementType::NumberToken,
157            crate::lexer::token_type::MsilTokenType::StringToken => MsilElementType::StringToken,
158            crate::lexer::token_type::MsilTokenType::Whitespace => MsilElementType::Whitespace,
159            crate::lexer::token_type::MsilTokenType::CommentToken => MsilElementType::CommentToken,
160            crate::lexer::token_type::MsilTokenType::Eof => MsilElementType::Eof,
161            crate::lexer::token_type::MsilTokenType::Error => MsilElementType::Error,
162        }
163    }
164}