Skip to main content

miden_assembly_syntax_cst/
syntax.rs

1use rowan::Language;
2
3/// The full set of rowan node and token kinds used by the MASM CST.
4#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
5#[repr(u16)]
6pub enum SyntaxKind {
7    Tombstone = 0,
8    Error,
9    SourceFile,
10    Doc,
11    Namespace,
12    ExternPackage,
13    Submodule,
14    Import,
15    ImportList,
16    ImportSpecifier,
17    Constant,
18    TypeDecl,
19    AdviceMap,
20    BeginBlock,
21    Procedure,
22    Attribute,
23    Visibility,
24    Signature,
25    Block,
26    IfOp,
27    WhileOp,
28    DoWhileOp,
29    RepeatOp,
30    Instruction,
31    Path,
32    Expr,
33    TypeBody,
34    Whitespace,
35    Newline,
36    Comment,
37    DocComment,
38    Ident,
39    SpecialIdent,
40    Number,
41    QuotedIdent,
42    QuotedString,
43    At,
44    Bang,
45    Colon,
46    ColonColon,
47    Comma,
48    Dot,
49    DotDot,
50    Equal,
51    LAngle,
52    LBrace,
53    LBracket,
54    LParen,
55    Minus,
56    Plus,
57    RAngle,
58    RArrow,
59    RBrace,
60    RBracket,
61    RParen,
62    Semicolon,
63    Slash,
64    SlashSlash,
65    Star,
66}
67
68impl SyntaxKind {
69    /// Returns `true` if this kind represents trivia that the formatter may preserve but most
70    /// typed accessors ignore.
71    pub fn is_trivia(self) -> bool {
72        matches!(self, Self::Whitespace | Self::Newline | Self::Comment | Self::DocComment)
73    }
74}
75
76impl From<SyntaxKind> for rowan::SyntaxKind {
77    fn from(kind: SyntaxKind) -> Self {
78        Self(kind as u16)
79    }
80}
81
82const ALL_KINDS: [SyntaxKind; SyntaxKind::Star as usize + 1] = [
83    SyntaxKind::Tombstone,
84    SyntaxKind::Error,
85    SyntaxKind::SourceFile,
86    SyntaxKind::Doc,
87    SyntaxKind::Namespace,
88    SyntaxKind::ExternPackage,
89    SyntaxKind::Submodule,
90    SyntaxKind::Import,
91    SyntaxKind::ImportList,
92    SyntaxKind::ImportSpecifier,
93    SyntaxKind::Constant,
94    SyntaxKind::TypeDecl,
95    SyntaxKind::AdviceMap,
96    SyntaxKind::BeginBlock,
97    SyntaxKind::Procedure,
98    SyntaxKind::Attribute,
99    SyntaxKind::Visibility,
100    SyntaxKind::Signature,
101    SyntaxKind::Block,
102    SyntaxKind::IfOp,
103    SyntaxKind::WhileOp,
104    SyntaxKind::DoWhileOp,
105    SyntaxKind::RepeatOp,
106    SyntaxKind::Instruction,
107    SyntaxKind::Path,
108    SyntaxKind::Expr,
109    SyntaxKind::TypeBody,
110    SyntaxKind::Whitespace,
111    SyntaxKind::Newline,
112    SyntaxKind::Comment,
113    SyntaxKind::DocComment,
114    SyntaxKind::Ident,
115    SyntaxKind::SpecialIdent,
116    SyntaxKind::Number,
117    SyntaxKind::QuotedIdent,
118    SyntaxKind::QuotedString,
119    SyntaxKind::At,
120    SyntaxKind::Bang,
121    SyntaxKind::Colon,
122    SyntaxKind::ColonColon,
123    SyntaxKind::Comma,
124    SyntaxKind::Dot,
125    SyntaxKind::DotDot,
126    SyntaxKind::Equal,
127    SyntaxKind::LAngle,
128    SyntaxKind::LBrace,
129    SyntaxKind::LBracket,
130    SyntaxKind::LParen,
131    SyntaxKind::Minus,
132    SyntaxKind::Plus,
133    SyntaxKind::RAngle,
134    SyntaxKind::RArrow,
135    SyntaxKind::RBrace,
136    SyntaxKind::RBracket,
137    SyntaxKind::RParen,
138    SyntaxKind::Semicolon,
139    SyntaxKind::Slash,
140    SyntaxKind::SlashSlash,
141    SyntaxKind::Star,
142];
143
144/// The rowan language marker for MASM CST nodes.
145#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
146pub enum MasmLanguage {}
147
148impl Language for MasmLanguage {
149    type Kind = SyntaxKind;
150
151    fn kind_from_raw(raw: rowan::SyntaxKind) -> Self::Kind {
152        ALL_KINDS
153            .get(raw.0 as usize)
154            .copied()
155            .unwrap_or_else(|| panic!("invalid syntax kind: {}", raw.0))
156    }
157
158    fn kind_to_raw(kind: Self::Kind) -> rowan::SyntaxKind {
159        kind.into()
160    }
161}
162
163/// A rowan syntax node in the MASM CST.
164pub type SyntaxNode = rowan::SyntaxNode<MasmLanguage>;
165/// A rowan syntax token in the MASM CST.
166pub type SyntaxToken = rowan::SyntaxToken<MasmLanguage>;
167/// A rowan syntax element in the MASM CST.
168pub type SyntaxElement = rowan::SyntaxElement<MasmLanguage>;