Skip to main content

oak_c/parser/
element_type.rs

1use crate::lexer::CTokenType;
2use oak_core::{ElementType, UniversalElementRole};
3
4/// Represents all possible element kinds in the C programming language.
5#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
6#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
7pub enum CElementType {
8    /// A wrapper for tokens.
9    Token(CTokenType),
10    /// Root node representing the entire source file.
11    Root,
12    /// A function definition.
13    FunctionDefinition,
14    /// A list of parameters in a function declaration or definition.
15    ParameterList,
16    /// A compound statement (a block of code enclosed in braces).
17    CompoundStatement,
18    /// An expression statement.
19    ExpressionStatement,
20    /// A declaration statement.
21    DeclarationStatement,
22    /// A declarator.
23    Declarator,
24    /// An `if` statement.
25    IfStatement,
26    /// A `while` statement.
27    WhileStatement,
28    /// A `for` statement.
29    ForStatement,
30    /// A `return` statement.
31    ReturnStatement,
32    /// A struct definition.
33    StructDefinition,
34    /// A union definition.
35    UnionDefinition,
36    /// An enum definition.
37    EnumDefinition,
38    /// A struct/union member declaration.
39    StructMember,
40    /// An enum constant.
41    EnumConstant,
42    /// A function call.
43    FunctionCall,
44    /// An error element used for recovery.
45    Error,
46}
47
48impl From<CTokenType> for CElementType {
49    fn from(token: CTokenType) -> Self {
50        Self::Token(token)
51    }
52}
53
54impl ElementType for CElementType {
55    type Role = UniversalElementRole;
56
57    fn is_root(&self) -> bool {
58        matches!(self, Self::Root)
59    }
60
61    fn is_error(&self) -> bool {
62        matches!(self, Self::Error)
63    }
64
65    fn role(&self) -> Self::Role {
66        match self {
67            Self::Root => UniversalElementRole::Root,
68            Self::FunctionDefinition | Self::StructDefinition | Self::UnionDefinition | Self::EnumDefinition => UniversalElementRole::Definition,
69            Self::CompoundStatement | Self::ExpressionStatement | Self::DeclarationStatement | Self::IfStatement | Self::WhileStatement | Self::ForStatement | Self::ReturnStatement => UniversalElementRole::Statement,
70            Self::Error => UniversalElementRole::Error,
71            _ => UniversalElementRole::None,
72        }
73    }
74}