1use rowan::{ast::{support, AstChildren, AstNode}, Language};
3
4macro_rules! decl_ast_node {
5 ($node:ident, $kind:ident) => {
6 #[derive(Debug, Clone, PartialEq, Eq, Hash)]
7 pub struct $node(SyntaxNode);
8 impl AstNode for $node {
9 type Language = Lang;
10
11 fn syntax(&self) -> &rowan::SyntaxNode<Self::Language> {
12 &self.0
13 }
14
15 fn can_cast(kind: <Self::Language as Language>::Kind) -> bool {
16 kind == SyntaxKind::$kind
17 }
18
19 fn cast(node: rowan::SyntaxNode<Self::Language>) -> Option<Self> {
20 if Self::can_cast(node.kind()) {
21 Some(Self(node))
22 } else {
23 None
24 }
25 }
26 }
27 impl core::fmt::Display for $node {
28 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
29 core::fmt::Display::fmt(self.syntax(), f)
30 }
31 }
32 };
33}
34
35#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
36pub enum Lang {}
37impl Language for Lang {
38 type Kind = SyntaxKind;
39
40 fn kind_to_raw(kind: Self::Kind) -> ::rowan::SyntaxKind {
41 kind.into()
42 }
43
44 fn kind_from_raw(raw: ::rowan::SyntaxKind) -> Self::Kind {
45 raw.into()
46 }
47}
48
49pub type SyntaxNode = ::rowan::SyntaxNode<Lang>;
50pub type SyntaxToken = ::rowan::SyntaxToken<Lang>;
51
52::peg::parser!(pub grammar parser<'b>(state: &'b ::rowan_peg_utils::ParseState<'input>) for str {
53 use SyntaxKind::*;
54
55 rule comment() = ()(()(g:({state.guard_none()})((g:({state.quiet().guard_token(COMMENT)}) s:$(((()(g:({state.guard_none()})(";" (g:({state.guard_none()})((quiet!{[^::char_classes::any!(@"\n")]}/expected!("<^\\n>"))){g.accept_none()})*){g.accept_none()})))) {g.accept_token(s)})){g.accept_none()}) / expected!("comment"))
56 rule whitespace() = ()(()(g:({state.guard_none()})((g:({state.quiet().guard_token(WHITESPACE)}) s:$(((()(g:({state.guard_none()})((g:({state.guard_none()})((quiet!{[::char_classes::any!(@" \t\r\n")]}/expected!("< \\t\\r\\n>"))){g.accept_none()})*){g.accept_none()})))) {g.accept_token(s)})){g.accept_none()}))
57 pub rule trivia() = _
58 rule _() = (g:({state.guard(TRIVIA)}) ((()(g:({state.guard_none()})(whitespace() (g:({state.guard_none()})((()(g:({state.guard_none()})(comment() whitespace()){g.accept_none()}))){g.accept_none()})*){g.accept_none()}))) {g.accept()})
59 rule ident() = ()(()(g:({state.guard_none()})((g:({state.quiet().guard_token(IDENT)}) s:$(((()(g:({state.guard_none()})(!(g:({state.quiet().guard_none()}) (quiet!{(quiet!{[::char_classes::any!(@"0-9")]}/expected!("<0-9>"))}) {g.accept_none()}) (g:({state.guard_none()})((()(g:({state.guard_none()})((quiet!{[::char_classes::any!(@"0-9a-zA-Z_-")]}/expected!("<0-9a-zA-Z_->"))){g.accept_none()}) / ()(g:({state.guard_none()})((quiet!{[^::char_classes::any!(@"\u{00}-\u{a0}")]}/expected!("<^\\u{00}-\\u{a0}>"))){g.accept_none()}))){g.accept_none()})+){g.accept_none()})))) {g.accept_token(s)})){g.accept_none()}) / expected!("ident"))
60 rule number() = ()(()(g:({state.guard_none()})((g:({state.quiet().guard_token(NUMBER)}) s:$(((()(g:({state.guard_none()})((g:({state.guard_none()})((quiet!{[::char_classes::any!(@"0-9")]}/expected!("<0-9>"))){g.accept_none()})+){g.accept_none()})))) {g.accept_token(s)})){g.accept_none()}) / expected!("number"))
61 rule string() = ()(()(g:({state.guard_none()})((g:({state.quiet().guard_token(STRING)}) s:$(((()(g:({state.guard_none()})("\"" (g:({state.guard_none()})((quiet!{[^::char_classes::any!(@"\"\r\n")]}/expected!("<^\\\"\\r\\n>"))){g.accept_none()})* "\""){g.accept_none()})))) {g.accept_token(s)})){g.accept_none()}) / expected!("string"))
62 rule matches() = ()(()(g:({state.guard_none()})((g:({state.quiet().guard_token(MATCHES)}) s:$(((()(g:({state.guard_none()})("<" (g:({state.guard_none()})((quiet!{[^::char_classes::any!(@"\x3e\r\n")]}/expected!("<^\\x3e\\r\\n>"))){g.accept_none()})* ">"){g.accept_none()})))) {g.accept_token(s)})){g.accept_none()}) / expected!("matches"))
63 rule label() = (g:({state.guard(LABEL)}) ((()(g:({state.guard_none()})(ident()){g.accept_none()}) / ()(g:({state.guard_none()})(string()){g.accept_none()}))) {g.accept()})
64 rule repeat_rest() = (g:({state.guard(REPEAT_REST)}) ((()(g:({state.guard_none()})((g:({state.quiet().guard_token(STAR)}) s:$(("*")) {g.accept_token(s)}) (g:({state.guard_none()})((()(g:({state.guard_none()})(number()){g.accept_none()}))){g.accept_none()})?){g.accept_none()}))) {g.accept()})
65 rule repeat() = (g:({state.guard(REPEAT)}) ((()(g:({state.guard_none()})((g:({state.quiet().guard_token(PLUS)}) s:$(("+")) {g.accept_token(s)})){g.accept_none()}) / ()(g:({state.guard_none()})(number() (g:({state.guard_none()})((()(g:({state.guard_none()})(repeat_rest()){g.accept_none()}))){g.accept_none()})?){g.accept_none()}) / ()(g:({state.guard_none()})(repeat_rest()){g.accept_none()}))) {g.accept()})
66 rule pat_expect() = (g:({state.guard(PAT_EXPECT)}) ((()(g:({state.guard_none()})((g:({state.quiet().guard_token(AT)}) s:$(("@")) {g.accept_token(s)}) label()){g.accept_none()}))) {g.accept()})
67 rule pat_atom() = (g:({state.guard(PAT_ATOM)}) ((()(g:({state.guard_none()})(ident() !(g:({state.quiet().guard_none()}) (quiet!{(()(g:({state.guard_none()})(_() (g:({state.quiet().guard_token(EQ)}) s:$(("=")) {g.accept_token(s)})){g.accept_none()}))}) {g.accept_none()})){g.accept_none()}) / ()(g:({state.guard_none()})(string()){g.accept_none()}) / ()(g:({state.guard_none()})(matches()){g.accept_none()}) / ()(g:({state.guard_none()})((g:({state.quiet().guard_token(L_BRACK)}) s:$(("[")) {g.accept_token(s)}) _() pat_choice() _() (g:({state.quiet().guard_token(R_BRACK)}) s:$(("]")) {g.accept_token(s)})){g.accept_none()}) / ()(g:({state.guard_none()})((g:({state.quiet().guard_token(L_PAREN)}) s:$(("(")) {g.accept_token(s)}) _() pat_choice() _() (g:({state.quiet().guard_token(R_PAREN)}) s:$((")")) {g.accept_token(s)})){g.accept_none()}))) {g.accept()})
68 rule pat_op() = (g:({state.guard(PAT_OP)}) ((()(g:({state.guard_none()})((g:({state.quiet().guard_token(AMP)}) s:$(("&")) {g.accept_token(s)}) pat_atom()){g.accept_none()}) / ()(g:({state.guard_none()})((g:({state.quiet().guard_token(BANG)}) s:$(("!")) {g.accept_token(s)}) pat_atom()){g.accept_none()}) / ()(g:({state.guard_none()})((g:({state.quiet().guard_token(TILDE)}) s:$(("~")) {g.accept_token(s)}) pat_atom()){g.accept_none()}) / ()(g:({state.guard_none()})((g:({state.quiet().guard_token(DOLLAR)}) s:$(("$")) {g.accept_token(s)}) pat_atom()){g.accept_none()}) / ()(g:({state.guard_none()})(repeat() _() pat_atom()){g.accept_none()}) / ()(g:({state.guard_none()})(pat_atom()){g.accept_none()}))) {g.accept()})
69 rule pat_list() = (g:({state.guard(PAT_LIST)}) ((()(g:({state.guard_none()})(pat_op() (g:({state.guard_none()})((()(g:({state.guard_none()})(_() pat_op()){g.accept_none()}))){g.accept_none()})*){g.accept_none()}))) {g.accept()})
70 rule pat_choice() = (g:({state.guard(PAT_CHOICE)}) ((()(g:({state.guard_none()})(pat_list() (g:({state.guard_none()})((()(g:({state.guard_none()})(_() (g:({state.quiet().guard_token(SLASH)}) s:$(("/")) {g.accept_token(s)}) _() pat_list()){g.accept_none()}))){g.accept_none()})* (g:({state.guard_none()})((()(g:({state.guard_none()})(_() pat_expect()){g.accept_none()}))){g.accept_none()})?){g.accept_none()}))) {g.accept()})
71 rule named() = (g:({state.guard(NAMED)}) ((()(g:({state.guard_none()})(ident() _() (g:({state.quiet().guard_token(EQ)}) s:$(("=")) {g.accept_token(s)}) _()){g.accept_none()}))) {g.accept()})
72 rule decl() = (g:({state.guard(DECL)}) ((()(g:({state.guard_none()})(named() pat_choice()){g.accept_none()}))) {g.accept()})
73 rule export() = (g:({state.guard(EXPORT)}) ((()(g:({state.guard_none()})((g:({state.guard_none()})((()(g:({state.guard_none()})(named()){g.accept_none()}))){g.accept_none()})? ident()){g.accept_none()}))) {g.accept()})
74 rule export_list() = (g:({state.guard(EXPORT_LIST)}) ((()(g:({state.guard_none()})((g:({state.quiet().guard_token(EXPORTS_KW)}) s:$(("exports")) {g.accept_token(s)}) _() (g:({state.quiet().guard_token(L_BRACK)}) s:$(("[")) {g.accept_token(s)}) _() (g:({state.guard_none()})((()(g:({state.guard_none()})(export() _()){g.accept_none()}))){g.accept_none()})* (g:({state.quiet().guard_token(R_BRACK)}) s:$(("]")) {g.accept_token(s)})){g.accept_none()}))) {g.accept()})
75 pub rule decl_list() = (g:({state.guard(DECL_LIST)}) ((()(g:({state.guard_none()})(_() (g:({state.guard_none()})((()(g:({state.guard_none()})(export_list() _()){g.accept_none()}))){g.accept_none()})? (g:({state.guard_none()})((()(g:({state.guard_none()})(decl() _()){g.accept_none()}))){g.accept_none()})+){g.accept_none()}))) {g.accept()})
76});
77#[repr(u16)]
78#[allow(non_camel_case_types)]
79#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
80pub enum SyntaxKind {
81 COMMENT = 0,
82 WHITESPACE,
83 TRIVIA,
84 IDENT,
85 NUMBER,
86 STRING,
87 MATCHES,
88 LABEL,
89 REPEAT_REST,
90 STAR,
91 REPEAT,
92 PLUS,
93 PAT_EXPECT,
94 AT,
95 PAT_ATOM,
96 L_PAREN,
97 R_PAREN,
98 PAT_OP,
99 AMP,
100 BANG,
101 TILDE,
102 DOLLAR,
103 PAT_LIST,
104 PAT_CHOICE,
105 SLASH,
106 NAMED,
107 EQ,
108 DECL,
109 EXPORT,
110 EXPORT_LIST,
111 EXPORTS_KW,
112 L_BRACK,
113 R_BRACK,
114 DECL_LIST,
115}
116impl From<::rowan::SyntaxKind> for SyntaxKind { fn from(kind: ::rowan::SyntaxKind) -> Self { ::core::assert!(kind.0 <= Self::DECL_LIST as u16); unsafe { ::core::mem::transmute::<u16, SyntaxKind>(kind.0) } } }
117impl From<SyntaxKind> for ::rowan::SyntaxKind { fn from(kind: SyntaxKind) -> Self { ::rowan::SyntaxKind(kind as u16) } }
118decl_ast_node!(Trivia, TRIVIA);
119impl Trivia {
120 pub fn comment_tokens(&self) -> impl Iterator<Item = SyntaxToken> {
121 ::rowan_peg_utils::tokens(self.syntax(), SyntaxKind::COMMENT)
122 }
123 pub fn whitespace_tokens(&self) -> impl Iterator<Item = SyntaxToken> {
124 ::rowan_peg_utils::tokens(self.syntax(), SyntaxKind::WHITESPACE)
125 }
126}
127decl_ast_node!(Label, LABEL);
128impl Label {
129 pub fn ident(&self) -> Option<SyntaxToken> {
130 support::token(self.syntax(), SyntaxKind::IDENT)
131 }
132 pub fn string(&self) -> Option<SyntaxToken> {
133 support::token(self.syntax(), SyntaxKind::STRING)
134 }
135}
136decl_ast_node!(RepeatRest, REPEAT_REST);
137impl RepeatRest {
138 pub fn number(&self) -> Option<SyntaxToken> {
139 support::token(self.syntax(), SyntaxKind::NUMBER)
140 }
141 #[doc(alias = "*")]
143 pub fn star(&self) -> SyntaxToken {
144 support::token(self.syntax(), SyntaxKind::STAR).unwrap()
145 }
146}
147decl_ast_node!(Repeat, REPEAT);
148impl Repeat {
149 pub fn number(&self) -> Option<SyntaxToken> {
150 support::token(self.syntax(), SyntaxKind::NUMBER)
151 }
152 #[doc(alias = "+")]
154 pub fn plus(&self) -> Option<SyntaxToken> {
155 support::token(self.syntax(), SyntaxKind::PLUS)
156 }
157 pub fn repeat_rest(&self) -> Option<RepeatRest> {
158 support::child(self.syntax())
159 }
160}
161decl_ast_node!(PatExpect, PAT_EXPECT);
162impl PatExpect {
163 #[doc(alias = "@")]
165 pub fn at(&self) -> SyntaxToken {
166 support::token(self.syntax(), SyntaxKind::AT).unwrap()
167 }
168 pub fn label(&self) -> Label {
169 support::child(self.syntax()).unwrap()
170 }
171}
172decl_ast_node!(PatAtom, PAT_ATOM);
173impl PatAtom {
174 pub fn ident(&self) -> Option<SyntaxToken> {
175 support::token(self.syntax(), SyntaxKind::IDENT)
176 }
177 #[doc(alias = "[")]
179 pub fn l_brack(&self) -> Option<SyntaxToken> {
180 support::token(self.syntax(), SyntaxKind::L_BRACK)
181 }
182 #[doc(alias = "(")]
184 pub fn l_paren(&self) -> Option<SyntaxToken> {
185 support::token(self.syntax(), SyntaxKind::L_PAREN)
186 }
187 pub fn matches(&self) -> Option<SyntaxToken> {
188 support::token(self.syntax(), SyntaxKind::MATCHES)
189 }
190 pub fn pat_choice(&self) -> Option<PatChoice> {
191 support::child(self.syntax())
192 }
193 #[doc(alias = "]")]
195 pub fn r_brack(&self) -> Option<SyntaxToken> {
196 support::token(self.syntax(), SyntaxKind::R_BRACK)
197 }
198 #[doc(alias = ")")]
200 pub fn r_paren(&self) -> Option<SyntaxToken> {
201 support::token(self.syntax(), SyntaxKind::R_PAREN)
202 }
203 pub fn string(&self) -> Option<SyntaxToken> {
204 support::token(self.syntax(), SyntaxKind::STRING)
205 }
206 pub fn trivias(&self) -> AstChildren<Trivia> {
207 support::children(self.syntax())
208 }
209}
210decl_ast_node!(PatOp, PAT_OP);
211impl PatOp {
212 #[doc(alias = "&")]
214 pub fn amp(&self) -> Option<SyntaxToken> {
215 support::token(self.syntax(), SyntaxKind::AMP)
216 }
217 #[doc(alias = "!")]
219 pub fn bang(&self) -> Option<SyntaxToken> {
220 support::token(self.syntax(), SyntaxKind::BANG)
221 }
222 #[doc(alias = "$")]
224 pub fn dollar(&self) -> Option<SyntaxToken> {
225 support::token(self.syntax(), SyntaxKind::DOLLAR)
226 }
227 pub fn pat_atom(&self) -> PatAtom {
228 support::child(self.syntax()).unwrap()
229 }
230 pub fn repeat(&self) -> Option<Repeat> {
231 support::child(self.syntax())
232 }
233 #[doc(alias = "~")]
235 pub fn tilde(&self) -> Option<SyntaxToken> {
236 support::token(self.syntax(), SyntaxKind::TILDE)
237 }
238 pub fn trivia(&self) -> Option<Trivia> {
239 support::child(self.syntax())
240 }
241}
242decl_ast_node!(PatList, PAT_LIST);
243impl PatList {
244 pub fn pat_ops(&self) -> AstChildren<PatOp> {
245 support::children(self.syntax())
246 }
247 pub fn trivias(&self) -> AstChildren<Trivia> {
248 support::children(self.syntax())
249 }
250}
251decl_ast_node!(PatChoice, PAT_CHOICE);
252impl PatChoice {
253 pub fn pat_expect(&self) -> Option<PatExpect> {
254 support::child(self.syntax())
255 }
256 pub fn pat_lists(&self) -> AstChildren<PatList> {
257 support::children(self.syntax())
258 }
259 #[doc(alias = "/")]
261 pub fn slash_tokens(&self) -> impl Iterator<Item = SyntaxToken> {
262 ::rowan_peg_utils::tokens(self.syntax(), SyntaxKind::SLASH)
263 }
264 pub fn trivias(&self) -> AstChildren<Trivia> {
265 support::children(self.syntax())
266 }
267}
268decl_ast_node!(Named, NAMED);
269impl Named {
270 #[doc(alias = "=")]
272 pub fn eq(&self) -> SyntaxToken {
273 support::token(self.syntax(), SyntaxKind::EQ).unwrap()
274 }
275 pub fn ident(&self) -> SyntaxToken {
276 support::token(self.syntax(), SyntaxKind::IDENT).unwrap()
277 }
278 pub fn trivias(&self) -> AstChildren<Trivia> {
279 support::children(self.syntax())
280 }
281}
282decl_ast_node!(Decl, DECL);
283impl Decl {
284 pub fn named(&self) -> Named {
285 support::child(self.syntax()).unwrap()
286 }
287 pub fn pat_choice(&self) -> PatChoice {
288 support::child(self.syntax()).unwrap()
289 }
290}
291decl_ast_node!(Export, EXPORT);
292impl Export {
293 pub fn ident(&self) -> SyntaxToken {
294 support::token(self.syntax(), SyntaxKind::IDENT).unwrap()
295 }
296 pub fn named(&self) -> Option<Named> {
297 support::child(self.syntax())
298 }
299}
300decl_ast_node!(ExportList, EXPORT_LIST);
301impl ExportList {
302 pub fn exports(&self) -> AstChildren<Export> {
303 support::children(self.syntax())
304 }
305 pub fn exports_kw(&self) -> SyntaxToken {
306 support::token(self.syntax(), SyntaxKind::EXPORTS_KW).unwrap()
307 }
308 #[doc(alias = "[")]
310 pub fn l_brack(&self) -> SyntaxToken {
311 support::token(self.syntax(), SyntaxKind::L_BRACK).unwrap()
312 }
313 #[doc(alias = "]")]
315 pub fn r_brack(&self) -> SyntaxToken {
316 support::token(self.syntax(), SyntaxKind::R_BRACK).unwrap()
317 }
318 pub fn trivias(&self) -> AstChildren<Trivia> {
319 support::children(self.syntax())
320 }
321}
322decl_ast_node!(DeclList, DECL_LIST);
323impl DeclList {
324 pub fn decls(&self) -> AstChildren<Decl> {
325 support::children(self.syntax())
326 }
327 pub fn export_list(&self) -> Option<ExportList> {
328 support::child(self.syntax())
329 }
330 pub fn trivias(&self) -> AstChildren<Trivia> {
331 support::children(self.syntax())
332 }
333}
334