Skip to main content

oak_cpp/parser/
element_type.rs

1use crate::lexer::CppTokenType;
2use oak_core::{ElementType, UniversalElementRole};
3#[cfg(feature = "serde")]
4use serde::{Deserialize, Serialize};
5
6#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
7#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
8#[repr(u16)]
9/// Syntax element types for the C++ language.
10pub enum CppElementType {
11    /// A wrapper for tokens
12    Token(CppTokenType),
13    /// Root node of the source file
14    SourceFile,
15    /// Error token
16    Error,
17}
18
19impl From<CppTokenType> for CppElementType {
20    fn from(token: CppTokenType) -> Self {
21        Self::Token(token)
22    }
23}
24
25impl ElementType for CppElementType {
26    type Role = UniversalElementRole;
27
28    fn is_root(&self) -> bool {
29        matches!(self, Self::SourceFile)
30    }
31
32    fn is_error(&self) -> bool {
33        matches!(self, Self::Error)
34    }
35
36    fn role(&self) -> Self::Role {
37        match self {
38            Self::SourceFile => UniversalElementRole::Root,
39            Self::Error => UniversalElementRole::Error,
40            _ => UniversalElementRole::Container,
41        }
42    }
43}