use rowan::Language;
#[allow(non_camel_case_types)]
#[derive(
Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, serde::Serialize, serde::Deserialize,
)]
#[repr(u16)]
pub enum SyntaxKind {
ROOT,
RECORD,
FIELD,
VALUE_LINE,
COMMENT_LINE,
BLANK_LINE,
MALFORMED_LINE,
FIELD_NAME,
COLON,
VALUE_TEXT,
COMMENT,
TEXT,
WHITESPACE,
NEWLINE,
ERROR,
}
impl SyntaxKind {
pub const ALL: [SyntaxKind; Self::COUNT] = [
SyntaxKind::ROOT,
SyntaxKind::RECORD,
SyntaxKind::FIELD,
SyntaxKind::VALUE_LINE,
SyntaxKind::COMMENT_LINE,
SyntaxKind::BLANK_LINE,
SyntaxKind::MALFORMED_LINE,
SyntaxKind::FIELD_NAME,
SyntaxKind::COLON,
SyntaxKind::VALUE_TEXT,
SyntaxKind::COMMENT,
SyntaxKind::TEXT,
SyntaxKind::WHITESPACE,
SyntaxKind::NEWLINE,
SyntaxKind::ERROR,
];
pub const COUNT: usize = 15;
pub fn is_node(self) -> bool {
matches!(
self,
SyntaxKind::ROOT
| SyntaxKind::RECORD
| SyntaxKind::FIELD
| SyntaxKind::VALUE_LINE
| SyntaxKind::COMMENT_LINE
| SyntaxKind::BLANK_LINE
| SyntaxKind::MALFORMED_LINE
)
}
pub fn is_line(self) -> bool {
matches!(
self,
SyntaxKind::VALUE_LINE
| SyntaxKind::COMMENT_LINE
| SyntaxKind::BLANK_LINE
| SyntaxKind::MALFORMED_LINE
)
}
}
impl From<SyntaxKind> for rowan::SyntaxKind {
fn from(kind: SyntaxKind) -> Self {
Self(kind as u16)
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub enum DcfLanguage {}
impl Language for DcfLanguage {
type Kind = SyntaxKind;
fn kind_from_raw(raw: rowan::SyntaxKind) -> Self::Kind {
match raw.0 {
0 => SyntaxKind::ROOT,
1 => SyntaxKind::RECORD,
2 => SyntaxKind::FIELD,
3 => SyntaxKind::VALUE_LINE,
4 => SyntaxKind::COMMENT_LINE,
5 => SyntaxKind::BLANK_LINE,
6 => SyntaxKind::MALFORMED_LINE,
7 => SyntaxKind::FIELD_NAME,
8 => SyntaxKind::COLON,
9 => SyntaxKind::VALUE_TEXT,
10 => SyntaxKind::COMMENT,
11 => SyntaxKind::TEXT,
12 => SyntaxKind::WHITESPACE,
13 => SyntaxKind::NEWLINE,
_ => SyntaxKind::ERROR,
}
}
fn kind_to_raw(kind: Self::Kind) -> rowan::SyntaxKind {
kind.into()
}
}
pub type SyntaxNode = rowan::SyntaxNode<DcfLanguage>;
pub type SyntaxToken = rowan::SyntaxToken<DcfLanguage>;
pub type SyntaxElement = rowan::SyntaxElement<DcfLanguage>;
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn syntax_kind_round_trips() {
for kind in SyntaxKind::ALL {
assert_eq!(
DcfLanguage::kind_from_raw(kind.into()),
kind,
"{kind:?} does not round-trip through kind_from_raw"
);
}
}
#[test]
fn all_is_in_discriminant_order() {
for (i, kind) in SyntaxKind::ALL.iter().enumerate() {
assert_eq!(rowan::SyntaxKind::from(*kind).0 as usize, i, "{kind:?}");
}
}
}