1use oak_core::{ElementType, UniversalElementRole};
2
3#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
5#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
6pub enum MsilElementType {
7 Root,
9 Assembly,
11 AssemblyExtern,
13 Module,
15 Class,
17 Method,
19 Instruction,
21 Label,
23 Directive,
25 Type,
27 Identifier,
29 Number,
31 String,
33 Comment,
35 ErrorNode,
37
38 AssemblyKeyword,
40 ExternKeyword,
42 ModuleKeyword,
44 ClassKeyword,
46 MethodKeyword,
48 PublicKeyword,
50 PrivateKeyword,
52 StaticKeyword,
54 Keyword,
56
57 LeftBrace,
59 RightBrace,
61 LeftParen,
63 RightParen,
65 LeftBracket,
67 RightBracket,
69 Dot,
71 Colon,
73 Semicolon,
75 Comma,
77 Equal,
79 Slash,
81
82 IdentifierToken,
84 NumberToken,
86 StringToken,
88
89 Whitespace,
91 CommentToken,
93 Eof,
95 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}