Skip to main content

oak_msil/parser/
element_type.rs

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