Skip to main content

oak_vala/parser/
element_type.rs

1use crate::lexer::token_type::ValaTokenType;
2use oak_core::{ElementType, UniversalElementRole};
3#[cfg(feature = "serde")]
4use serde::{Deserialize, Serialize};
5
6#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
7#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
8#[repr(u8)]
9pub enum ValaElementType {
10    SourceFile,
11    Root,
12    Namespace,
13    Class,
14    Interface,
15    Struct,
16    Enum,
17    Method,
18    Field,
19    Property,
20    Parameter,
21    Block,
22    Statement,
23    Expression,
24    Type,
25    Error,
26
27    // Token-derived elements
28    Token(ValaTokenType),
29}
30
31impl From<ValaTokenType> for ValaElementType {
32    fn from(token: ValaTokenType) -> Self {
33        Self::Token(token)
34    }
35}
36
37impl ElementType for ValaElementType {
38    type Role = UniversalElementRole;
39
40    fn is_root(&self) -> bool {
41        matches!(self, Self::SourceFile | Self::Root)
42    }
43
44    fn is_error(&self) -> bool {
45        matches!(self, Self::Error)
46    }
47
48    fn role(&self) -> Self::Role {
49        match self {
50            Self::SourceFile | Self::Root => UniversalElementRole::Root,
51            Self::Namespace | Self::Class | Self::Interface | Self::Struct | Self::Enum | Self::Method | Self::Field | Self::Property => UniversalElementRole::Definition,
52            Self::Block | Self::Parameter => UniversalElementRole::Container,
53            Self::Statement => UniversalElementRole::Statement,
54            Self::Expression | Self::Type => UniversalElementRole::Expression,
55            Self::Error => UniversalElementRole::Error,
56            Self::Token(_) => UniversalElementRole::None,
57        }
58    }
59}
60
61impl oak_core::language::TokenType for ValaElementType {
62    type Role = oak_core::UniversalTokenRole;
63    const END_OF_STREAM: Self = Self::Token(ValaTokenType::Eof);
64
65    fn is_ignored(&self) -> bool {
66        match self {
67            Self::Token(t) => {
68                use oak_core::TokenType;
69                t.is_ignored()
70            }
71            _ => false,
72        }
73    }
74
75    fn role(&self) -> Self::Role {
76        match self {
77            Self::Token(t) => {
78                use oak_core::TokenType;
79                t.role()
80            }
81            _ => oak_core::UniversalTokenRole::None,
82        }
83    }
84}