Skip to main content

cairo_lang_syntax/node/
ast.rs

1// Autogenerated file. To regenerate, please run `cargo run --bin generate-syntax`.
2#![allow(clippy::match_single_binding)]
3#![allow(clippy::too_many_arguments)]
4#![allow(dead_code)]
5#![allow(unused_variables)]
6use std::ops::Deref;
7use std::sync::Arc;
8
9use cairo_lang_filesystem::span::TextWidth;
10use cairo_lang_utils::{Intern, LookupIntern, extract_matches};
11use smol_str::SmolStr;
12
13use super::element_list::ElementList;
14use super::green::GreenNodeDetails;
15use super::kind::SyntaxKind;
16use super::{
17    GreenId, GreenNode, SyntaxGroup, SyntaxNode, SyntaxStablePtr, SyntaxStablePtrId, Terminal,
18    Token, TypedStablePtr, TypedSyntaxNode,
19};
20#[path = "ast_ext.rs"]
21mod ast_ext;
22#[derive(Clone, Debug, Eq, Hash, PartialEq)]
23pub struct Trivia(ElementList<Trivium, 1>);
24impl Deref for Trivia {
25    type Target = ElementList<Trivium, 1>;
26    fn deref(&self) -> &Self::Target {
27        &self.0
28    }
29}
30impl Trivia {
31    pub fn new_green(db: &dyn SyntaxGroup, children: &[TriviumGreen]) -> TriviaGreen {
32        let width = children.iter().map(|id| id.0.lookup_intern(db).width()).sum();
33        TriviaGreen(
34            Arc::new(GreenNode {
35                kind: SyntaxKind::Trivia,
36                details: GreenNodeDetails::Node {
37                    children: children.iter().map(|x| x.0).collect(),
38                    width,
39                },
40            })
41            .intern(db),
42        )
43    }
44}
45#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
46pub struct TriviaPtr(pub SyntaxStablePtrId);
47impl TypedStablePtr for TriviaPtr {
48    type SyntaxNode = Trivia;
49    fn untyped(&self) -> SyntaxStablePtrId {
50        self.0
51    }
52    fn lookup(&self, db: &dyn SyntaxGroup) -> Trivia {
53        Trivia::from_syntax_node(db, self.0.lookup(db))
54    }
55}
56impl From<TriviaPtr> for SyntaxStablePtrId {
57    fn from(ptr: TriviaPtr) -> Self {
58        ptr.untyped()
59    }
60}
61#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
62pub struct TriviaGreen(pub GreenId);
63impl TypedSyntaxNode for Trivia {
64    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::Trivia);
65    type StablePtr = TriviaPtr;
66    type Green = TriviaGreen;
67    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
68        TriviaGreen(
69            Arc::new(GreenNode {
70                kind: SyntaxKind::Trivia,
71                details: GreenNodeDetails::Node {
72                    children: [].into(),
73                    width: TextWidth::default(),
74                },
75            })
76            .intern(db),
77        )
78    }
79    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
80        Self(ElementList::new(node))
81    }
82    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
83        if node.kind(db) == SyntaxKind::Trivia { Some(Self(ElementList::new(node))) } else { None }
84    }
85    fn as_syntax_node(&self) -> SyntaxNode {
86        self.node
87    }
88    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
89        TriviaPtr(self.node.stable_ptr(db))
90    }
91}
92#[derive(Clone, Debug, Eq, Hash, PartialEq)]
93pub enum Trivium {
94    SingleLineComment(TokenSingleLineComment),
95    SingleLineDocComment(TokenSingleLineDocComment),
96    SingleLineInnerComment(TokenSingleLineInnerComment),
97    Whitespace(TokenWhitespace),
98    Newline(TokenNewline),
99    Skipped(TokenSkipped),
100    SkippedNode(TriviumSkippedNode),
101}
102#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
103pub struct TriviumPtr(pub SyntaxStablePtrId);
104impl TypedStablePtr for TriviumPtr {
105    type SyntaxNode = Trivium;
106    fn untyped(&self) -> SyntaxStablePtrId {
107        self.0
108    }
109    fn lookup(&self, db: &dyn SyntaxGroup) -> Trivium {
110        Trivium::from_syntax_node(db, self.0.lookup(db))
111    }
112}
113impl From<TriviumPtr> for SyntaxStablePtrId {
114    fn from(ptr: TriviumPtr) -> Self {
115        ptr.untyped()
116    }
117}
118impl From<TokenSingleLineCommentPtr> for TriviumPtr {
119    fn from(value: TokenSingleLineCommentPtr) -> Self {
120        Self(value.0)
121    }
122}
123impl From<TokenSingleLineDocCommentPtr> for TriviumPtr {
124    fn from(value: TokenSingleLineDocCommentPtr) -> Self {
125        Self(value.0)
126    }
127}
128impl From<TokenSingleLineInnerCommentPtr> for TriviumPtr {
129    fn from(value: TokenSingleLineInnerCommentPtr) -> Self {
130        Self(value.0)
131    }
132}
133impl From<TokenWhitespacePtr> for TriviumPtr {
134    fn from(value: TokenWhitespacePtr) -> Self {
135        Self(value.0)
136    }
137}
138impl From<TokenNewlinePtr> for TriviumPtr {
139    fn from(value: TokenNewlinePtr) -> Self {
140        Self(value.0)
141    }
142}
143impl From<TokenSkippedPtr> for TriviumPtr {
144    fn from(value: TokenSkippedPtr) -> Self {
145        Self(value.0)
146    }
147}
148impl From<TriviumSkippedNodePtr> for TriviumPtr {
149    fn from(value: TriviumSkippedNodePtr) -> Self {
150        Self(value.0)
151    }
152}
153impl From<TokenSingleLineCommentGreen> for TriviumGreen {
154    fn from(value: TokenSingleLineCommentGreen) -> Self {
155        Self(value.0)
156    }
157}
158impl From<TokenSingleLineDocCommentGreen> for TriviumGreen {
159    fn from(value: TokenSingleLineDocCommentGreen) -> Self {
160        Self(value.0)
161    }
162}
163impl From<TokenSingleLineInnerCommentGreen> for TriviumGreen {
164    fn from(value: TokenSingleLineInnerCommentGreen) -> Self {
165        Self(value.0)
166    }
167}
168impl From<TokenWhitespaceGreen> for TriviumGreen {
169    fn from(value: TokenWhitespaceGreen) -> Self {
170        Self(value.0)
171    }
172}
173impl From<TokenNewlineGreen> for TriviumGreen {
174    fn from(value: TokenNewlineGreen) -> Self {
175        Self(value.0)
176    }
177}
178impl From<TokenSkippedGreen> for TriviumGreen {
179    fn from(value: TokenSkippedGreen) -> Self {
180        Self(value.0)
181    }
182}
183impl From<TriviumSkippedNodeGreen> for TriviumGreen {
184    fn from(value: TriviumSkippedNodeGreen) -> Self {
185        Self(value.0)
186    }
187}
188#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
189pub struct TriviumGreen(pub GreenId);
190impl TypedSyntaxNode for Trivium {
191    const OPTIONAL_KIND: Option<SyntaxKind> = None;
192    type StablePtr = TriviumPtr;
193    type Green = TriviumGreen;
194    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
195        panic!("No missing variant.");
196    }
197    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
198        let kind = node.kind(db);
199        match kind {
200            SyntaxKind::TokenSingleLineComment => {
201                Trivium::SingleLineComment(TokenSingleLineComment::from_syntax_node(db, node))
202            }
203            SyntaxKind::TokenSingleLineDocComment => {
204                Trivium::SingleLineDocComment(TokenSingleLineDocComment::from_syntax_node(db, node))
205            }
206            SyntaxKind::TokenSingleLineInnerComment => Trivium::SingleLineInnerComment(
207                TokenSingleLineInnerComment::from_syntax_node(db, node),
208            ),
209            SyntaxKind::TokenWhitespace => {
210                Trivium::Whitespace(TokenWhitespace::from_syntax_node(db, node))
211            }
212            SyntaxKind::TokenNewline => Trivium::Newline(TokenNewline::from_syntax_node(db, node)),
213            SyntaxKind::TokenSkipped => Trivium::Skipped(TokenSkipped::from_syntax_node(db, node)),
214            SyntaxKind::TriviumSkippedNode => {
215                Trivium::SkippedNode(TriviumSkippedNode::from_syntax_node(db, node))
216            }
217            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "Trivium"),
218        }
219    }
220    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
221        let kind = node.kind(db);
222        match kind {
223            SyntaxKind::TokenSingleLineComment => {
224                Some(Trivium::SingleLineComment(TokenSingleLineComment::from_syntax_node(db, node)))
225            }
226            SyntaxKind::TokenSingleLineDocComment => Some(Trivium::SingleLineDocComment(
227                TokenSingleLineDocComment::from_syntax_node(db, node),
228            )),
229            SyntaxKind::TokenSingleLineInnerComment => Some(Trivium::SingleLineInnerComment(
230                TokenSingleLineInnerComment::from_syntax_node(db, node),
231            )),
232            SyntaxKind::TokenWhitespace => {
233                Some(Trivium::Whitespace(TokenWhitespace::from_syntax_node(db, node)))
234            }
235            SyntaxKind::TokenNewline => {
236                Some(Trivium::Newline(TokenNewline::from_syntax_node(db, node)))
237            }
238            SyntaxKind::TokenSkipped => {
239                Some(Trivium::Skipped(TokenSkipped::from_syntax_node(db, node)))
240            }
241            SyntaxKind::TriviumSkippedNode => {
242                Some(Trivium::SkippedNode(TriviumSkippedNode::from_syntax_node(db, node)))
243            }
244            _ => None,
245        }
246    }
247    fn as_syntax_node(&self) -> SyntaxNode {
248        match self {
249            Trivium::SingleLineComment(x) => x.as_syntax_node(),
250            Trivium::SingleLineDocComment(x) => x.as_syntax_node(),
251            Trivium::SingleLineInnerComment(x) => x.as_syntax_node(),
252            Trivium::Whitespace(x) => x.as_syntax_node(),
253            Trivium::Newline(x) => x.as_syntax_node(),
254            Trivium::Skipped(x) => x.as_syntax_node(),
255            Trivium::SkippedNode(x) => x.as_syntax_node(),
256        }
257    }
258    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
259        TriviumPtr(self.as_syntax_node().lookup_intern(db).stable_ptr)
260    }
261}
262impl Trivium {
263    /// Checks if a kind of a variant of [Trivium].
264    pub fn is_variant(kind: SyntaxKind) -> bool {
265        matches!(
266            kind,
267            SyntaxKind::TokenSingleLineComment
268                | SyntaxKind::TokenSingleLineDocComment
269                | SyntaxKind::TokenSingleLineInnerComment
270                | SyntaxKind::TokenWhitespace
271                | SyntaxKind::TokenNewline
272                | SyntaxKind::TokenSkipped
273                | SyntaxKind::TriviumSkippedNode
274        )
275    }
276}
277#[derive(Clone, Debug, Eq, Hash, PartialEq)]
278pub enum Expr {
279    Path(ExprPath),
280    Literal(TerminalLiteralNumber),
281    ShortString(TerminalShortString),
282    String(TerminalString),
283    False(TerminalFalse),
284    True(TerminalTrue),
285    Parenthesized(ExprParenthesized),
286    Unary(ExprUnary),
287    Binary(ExprBinary),
288    Tuple(ExprListParenthesized),
289    FunctionCall(ExprFunctionCall),
290    StructCtorCall(ExprStructCtorCall),
291    Block(ExprBlock),
292    Match(ExprMatch),
293    If(ExprIf),
294    Loop(ExprLoop),
295    While(ExprWhile),
296    For(ExprFor),
297    Closure(ExprClosure),
298    ErrorPropagate(ExprErrorPropagate),
299    FieldInitShorthand(ExprFieldInitShorthand),
300    Indexed(ExprIndexed),
301    InlineMacro(ExprInlineMacro),
302    FixedSizeArray(ExprFixedSizeArray),
303    Placeholder(ExprPlaceholder),
304    Missing(ExprMissing),
305}
306#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
307pub struct ExprPtr(pub SyntaxStablePtrId);
308impl TypedStablePtr for ExprPtr {
309    type SyntaxNode = Expr;
310    fn untyped(&self) -> SyntaxStablePtrId {
311        self.0
312    }
313    fn lookup(&self, db: &dyn SyntaxGroup) -> Expr {
314        Expr::from_syntax_node(db, self.0.lookup(db))
315    }
316}
317impl From<ExprPtr> for SyntaxStablePtrId {
318    fn from(ptr: ExprPtr) -> Self {
319        ptr.untyped()
320    }
321}
322impl From<ExprPathPtr> for ExprPtr {
323    fn from(value: ExprPathPtr) -> Self {
324        Self(value.0)
325    }
326}
327impl From<TerminalLiteralNumberPtr> for ExprPtr {
328    fn from(value: TerminalLiteralNumberPtr) -> Self {
329        Self(value.0)
330    }
331}
332impl From<TerminalShortStringPtr> for ExprPtr {
333    fn from(value: TerminalShortStringPtr) -> Self {
334        Self(value.0)
335    }
336}
337impl From<TerminalStringPtr> for ExprPtr {
338    fn from(value: TerminalStringPtr) -> Self {
339        Self(value.0)
340    }
341}
342impl From<TerminalFalsePtr> for ExprPtr {
343    fn from(value: TerminalFalsePtr) -> Self {
344        Self(value.0)
345    }
346}
347impl From<TerminalTruePtr> for ExprPtr {
348    fn from(value: TerminalTruePtr) -> Self {
349        Self(value.0)
350    }
351}
352impl From<ExprParenthesizedPtr> for ExprPtr {
353    fn from(value: ExprParenthesizedPtr) -> Self {
354        Self(value.0)
355    }
356}
357impl From<ExprUnaryPtr> for ExprPtr {
358    fn from(value: ExprUnaryPtr) -> Self {
359        Self(value.0)
360    }
361}
362impl From<ExprBinaryPtr> for ExprPtr {
363    fn from(value: ExprBinaryPtr) -> Self {
364        Self(value.0)
365    }
366}
367impl From<ExprListParenthesizedPtr> for ExprPtr {
368    fn from(value: ExprListParenthesizedPtr) -> Self {
369        Self(value.0)
370    }
371}
372impl From<ExprFunctionCallPtr> for ExprPtr {
373    fn from(value: ExprFunctionCallPtr) -> Self {
374        Self(value.0)
375    }
376}
377impl From<ExprStructCtorCallPtr> for ExprPtr {
378    fn from(value: ExprStructCtorCallPtr) -> Self {
379        Self(value.0)
380    }
381}
382impl From<ExprBlockPtr> for ExprPtr {
383    fn from(value: ExprBlockPtr) -> Self {
384        Self(value.0)
385    }
386}
387impl From<ExprMatchPtr> for ExprPtr {
388    fn from(value: ExprMatchPtr) -> Self {
389        Self(value.0)
390    }
391}
392impl From<ExprIfPtr> for ExprPtr {
393    fn from(value: ExprIfPtr) -> Self {
394        Self(value.0)
395    }
396}
397impl From<ExprLoopPtr> for ExprPtr {
398    fn from(value: ExprLoopPtr) -> Self {
399        Self(value.0)
400    }
401}
402impl From<ExprWhilePtr> for ExprPtr {
403    fn from(value: ExprWhilePtr) -> Self {
404        Self(value.0)
405    }
406}
407impl From<ExprForPtr> for ExprPtr {
408    fn from(value: ExprForPtr) -> Self {
409        Self(value.0)
410    }
411}
412impl From<ExprClosurePtr> for ExprPtr {
413    fn from(value: ExprClosurePtr) -> Self {
414        Self(value.0)
415    }
416}
417impl From<ExprErrorPropagatePtr> for ExprPtr {
418    fn from(value: ExprErrorPropagatePtr) -> Self {
419        Self(value.0)
420    }
421}
422impl From<ExprFieldInitShorthandPtr> for ExprPtr {
423    fn from(value: ExprFieldInitShorthandPtr) -> Self {
424        Self(value.0)
425    }
426}
427impl From<ExprIndexedPtr> for ExprPtr {
428    fn from(value: ExprIndexedPtr) -> Self {
429        Self(value.0)
430    }
431}
432impl From<ExprInlineMacroPtr> for ExprPtr {
433    fn from(value: ExprInlineMacroPtr) -> Self {
434        Self(value.0)
435    }
436}
437impl From<ExprFixedSizeArrayPtr> for ExprPtr {
438    fn from(value: ExprFixedSizeArrayPtr) -> Self {
439        Self(value.0)
440    }
441}
442impl From<ExprPlaceholderPtr> for ExprPtr {
443    fn from(value: ExprPlaceholderPtr) -> Self {
444        Self(value.0)
445    }
446}
447impl From<ExprMissingPtr> for ExprPtr {
448    fn from(value: ExprMissingPtr) -> Self {
449        Self(value.0)
450    }
451}
452impl From<ExprPathGreen> for ExprGreen {
453    fn from(value: ExprPathGreen) -> Self {
454        Self(value.0)
455    }
456}
457impl From<TerminalLiteralNumberGreen> for ExprGreen {
458    fn from(value: TerminalLiteralNumberGreen) -> Self {
459        Self(value.0)
460    }
461}
462impl From<TerminalShortStringGreen> for ExprGreen {
463    fn from(value: TerminalShortStringGreen) -> Self {
464        Self(value.0)
465    }
466}
467impl From<TerminalStringGreen> for ExprGreen {
468    fn from(value: TerminalStringGreen) -> Self {
469        Self(value.0)
470    }
471}
472impl From<TerminalFalseGreen> for ExprGreen {
473    fn from(value: TerminalFalseGreen) -> Self {
474        Self(value.0)
475    }
476}
477impl From<TerminalTrueGreen> for ExprGreen {
478    fn from(value: TerminalTrueGreen) -> Self {
479        Self(value.0)
480    }
481}
482impl From<ExprParenthesizedGreen> for ExprGreen {
483    fn from(value: ExprParenthesizedGreen) -> Self {
484        Self(value.0)
485    }
486}
487impl From<ExprUnaryGreen> for ExprGreen {
488    fn from(value: ExprUnaryGreen) -> Self {
489        Self(value.0)
490    }
491}
492impl From<ExprBinaryGreen> for ExprGreen {
493    fn from(value: ExprBinaryGreen) -> Self {
494        Self(value.0)
495    }
496}
497impl From<ExprListParenthesizedGreen> for ExprGreen {
498    fn from(value: ExprListParenthesizedGreen) -> Self {
499        Self(value.0)
500    }
501}
502impl From<ExprFunctionCallGreen> for ExprGreen {
503    fn from(value: ExprFunctionCallGreen) -> Self {
504        Self(value.0)
505    }
506}
507impl From<ExprStructCtorCallGreen> for ExprGreen {
508    fn from(value: ExprStructCtorCallGreen) -> Self {
509        Self(value.0)
510    }
511}
512impl From<ExprBlockGreen> for ExprGreen {
513    fn from(value: ExprBlockGreen) -> Self {
514        Self(value.0)
515    }
516}
517impl From<ExprMatchGreen> for ExprGreen {
518    fn from(value: ExprMatchGreen) -> Self {
519        Self(value.0)
520    }
521}
522impl From<ExprIfGreen> for ExprGreen {
523    fn from(value: ExprIfGreen) -> Self {
524        Self(value.0)
525    }
526}
527impl From<ExprLoopGreen> for ExprGreen {
528    fn from(value: ExprLoopGreen) -> Self {
529        Self(value.0)
530    }
531}
532impl From<ExprWhileGreen> for ExprGreen {
533    fn from(value: ExprWhileGreen) -> Self {
534        Self(value.0)
535    }
536}
537impl From<ExprForGreen> for ExprGreen {
538    fn from(value: ExprForGreen) -> Self {
539        Self(value.0)
540    }
541}
542impl From<ExprClosureGreen> for ExprGreen {
543    fn from(value: ExprClosureGreen) -> Self {
544        Self(value.0)
545    }
546}
547impl From<ExprErrorPropagateGreen> for ExprGreen {
548    fn from(value: ExprErrorPropagateGreen) -> Self {
549        Self(value.0)
550    }
551}
552impl From<ExprFieldInitShorthandGreen> for ExprGreen {
553    fn from(value: ExprFieldInitShorthandGreen) -> Self {
554        Self(value.0)
555    }
556}
557impl From<ExprIndexedGreen> for ExprGreen {
558    fn from(value: ExprIndexedGreen) -> Self {
559        Self(value.0)
560    }
561}
562impl From<ExprInlineMacroGreen> for ExprGreen {
563    fn from(value: ExprInlineMacroGreen) -> Self {
564        Self(value.0)
565    }
566}
567impl From<ExprFixedSizeArrayGreen> for ExprGreen {
568    fn from(value: ExprFixedSizeArrayGreen) -> Self {
569        Self(value.0)
570    }
571}
572impl From<ExprPlaceholderGreen> for ExprGreen {
573    fn from(value: ExprPlaceholderGreen) -> Self {
574        Self(value.0)
575    }
576}
577impl From<ExprMissingGreen> for ExprGreen {
578    fn from(value: ExprMissingGreen) -> Self {
579        Self(value.0)
580    }
581}
582#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
583pub struct ExprGreen(pub GreenId);
584impl TypedSyntaxNode for Expr {
585    const OPTIONAL_KIND: Option<SyntaxKind> = None;
586    type StablePtr = ExprPtr;
587    type Green = ExprGreen;
588    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
589        ExprGreen(ExprMissing::missing(db).0)
590    }
591    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
592        let kind = node.kind(db);
593        match kind {
594            SyntaxKind::ExprPath => Expr::Path(ExprPath::from_syntax_node(db, node)),
595            SyntaxKind::TerminalLiteralNumber => {
596                Expr::Literal(TerminalLiteralNumber::from_syntax_node(db, node))
597            }
598            SyntaxKind::TerminalShortString => {
599                Expr::ShortString(TerminalShortString::from_syntax_node(db, node))
600            }
601            SyntaxKind::TerminalString => Expr::String(TerminalString::from_syntax_node(db, node)),
602            SyntaxKind::TerminalFalse => Expr::False(TerminalFalse::from_syntax_node(db, node)),
603            SyntaxKind::TerminalTrue => Expr::True(TerminalTrue::from_syntax_node(db, node)),
604            SyntaxKind::ExprParenthesized => {
605                Expr::Parenthesized(ExprParenthesized::from_syntax_node(db, node))
606            }
607            SyntaxKind::ExprUnary => Expr::Unary(ExprUnary::from_syntax_node(db, node)),
608            SyntaxKind::ExprBinary => Expr::Binary(ExprBinary::from_syntax_node(db, node)),
609            SyntaxKind::ExprListParenthesized => {
610                Expr::Tuple(ExprListParenthesized::from_syntax_node(db, node))
611            }
612            SyntaxKind::ExprFunctionCall => {
613                Expr::FunctionCall(ExprFunctionCall::from_syntax_node(db, node))
614            }
615            SyntaxKind::ExprStructCtorCall => {
616                Expr::StructCtorCall(ExprStructCtorCall::from_syntax_node(db, node))
617            }
618            SyntaxKind::ExprBlock => Expr::Block(ExprBlock::from_syntax_node(db, node)),
619            SyntaxKind::ExprMatch => Expr::Match(ExprMatch::from_syntax_node(db, node)),
620            SyntaxKind::ExprIf => Expr::If(ExprIf::from_syntax_node(db, node)),
621            SyntaxKind::ExprLoop => Expr::Loop(ExprLoop::from_syntax_node(db, node)),
622            SyntaxKind::ExprWhile => Expr::While(ExprWhile::from_syntax_node(db, node)),
623            SyntaxKind::ExprFor => Expr::For(ExprFor::from_syntax_node(db, node)),
624            SyntaxKind::ExprClosure => Expr::Closure(ExprClosure::from_syntax_node(db, node)),
625            SyntaxKind::ExprErrorPropagate => {
626                Expr::ErrorPropagate(ExprErrorPropagate::from_syntax_node(db, node))
627            }
628            SyntaxKind::ExprFieldInitShorthand => {
629                Expr::FieldInitShorthand(ExprFieldInitShorthand::from_syntax_node(db, node))
630            }
631            SyntaxKind::ExprIndexed => Expr::Indexed(ExprIndexed::from_syntax_node(db, node)),
632            SyntaxKind::ExprInlineMacro => {
633                Expr::InlineMacro(ExprInlineMacro::from_syntax_node(db, node))
634            }
635            SyntaxKind::ExprFixedSizeArray => {
636                Expr::FixedSizeArray(ExprFixedSizeArray::from_syntax_node(db, node))
637            }
638            SyntaxKind::ExprPlaceholder => {
639                Expr::Placeholder(ExprPlaceholder::from_syntax_node(db, node))
640            }
641            SyntaxKind::ExprMissing => Expr::Missing(ExprMissing::from_syntax_node(db, node)),
642            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "Expr"),
643        }
644    }
645    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
646        let kind = node.kind(db);
647        match kind {
648            SyntaxKind::ExprPath => Some(Expr::Path(ExprPath::from_syntax_node(db, node))),
649            SyntaxKind::TerminalLiteralNumber => {
650                Some(Expr::Literal(TerminalLiteralNumber::from_syntax_node(db, node)))
651            }
652            SyntaxKind::TerminalShortString => {
653                Some(Expr::ShortString(TerminalShortString::from_syntax_node(db, node)))
654            }
655            SyntaxKind::TerminalString => {
656                Some(Expr::String(TerminalString::from_syntax_node(db, node)))
657            }
658            SyntaxKind::TerminalFalse => {
659                Some(Expr::False(TerminalFalse::from_syntax_node(db, node)))
660            }
661            SyntaxKind::TerminalTrue => Some(Expr::True(TerminalTrue::from_syntax_node(db, node))),
662            SyntaxKind::ExprParenthesized => {
663                Some(Expr::Parenthesized(ExprParenthesized::from_syntax_node(db, node)))
664            }
665            SyntaxKind::ExprUnary => Some(Expr::Unary(ExprUnary::from_syntax_node(db, node))),
666            SyntaxKind::ExprBinary => Some(Expr::Binary(ExprBinary::from_syntax_node(db, node))),
667            SyntaxKind::ExprListParenthesized => {
668                Some(Expr::Tuple(ExprListParenthesized::from_syntax_node(db, node)))
669            }
670            SyntaxKind::ExprFunctionCall => {
671                Some(Expr::FunctionCall(ExprFunctionCall::from_syntax_node(db, node)))
672            }
673            SyntaxKind::ExprStructCtorCall => {
674                Some(Expr::StructCtorCall(ExprStructCtorCall::from_syntax_node(db, node)))
675            }
676            SyntaxKind::ExprBlock => Some(Expr::Block(ExprBlock::from_syntax_node(db, node))),
677            SyntaxKind::ExprMatch => Some(Expr::Match(ExprMatch::from_syntax_node(db, node))),
678            SyntaxKind::ExprIf => Some(Expr::If(ExprIf::from_syntax_node(db, node))),
679            SyntaxKind::ExprLoop => Some(Expr::Loop(ExprLoop::from_syntax_node(db, node))),
680            SyntaxKind::ExprWhile => Some(Expr::While(ExprWhile::from_syntax_node(db, node))),
681            SyntaxKind::ExprFor => Some(Expr::For(ExprFor::from_syntax_node(db, node))),
682            SyntaxKind::ExprClosure => Some(Expr::Closure(ExprClosure::from_syntax_node(db, node))),
683            SyntaxKind::ExprErrorPropagate => {
684                Some(Expr::ErrorPropagate(ExprErrorPropagate::from_syntax_node(db, node)))
685            }
686            SyntaxKind::ExprFieldInitShorthand => {
687                Some(Expr::FieldInitShorthand(ExprFieldInitShorthand::from_syntax_node(db, node)))
688            }
689            SyntaxKind::ExprIndexed => Some(Expr::Indexed(ExprIndexed::from_syntax_node(db, node))),
690            SyntaxKind::ExprInlineMacro => {
691                Some(Expr::InlineMacro(ExprInlineMacro::from_syntax_node(db, node)))
692            }
693            SyntaxKind::ExprFixedSizeArray => {
694                Some(Expr::FixedSizeArray(ExprFixedSizeArray::from_syntax_node(db, node)))
695            }
696            SyntaxKind::ExprPlaceholder => {
697                Some(Expr::Placeholder(ExprPlaceholder::from_syntax_node(db, node)))
698            }
699            SyntaxKind::ExprMissing => Some(Expr::Missing(ExprMissing::from_syntax_node(db, node))),
700            _ => None,
701        }
702    }
703    fn as_syntax_node(&self) -> SyntaxNode {
704        match self {
705            Expr::Path(x) => x.as_syntax_node(),
706            Expr::Literal(x) => x.as_syntax_node(),
707            Expr::ShortString(x) => x.as_syntax_node(),
708            Expr::String(x) => x.as_syntax_node(),
709            Expr::False(x) => x.as_syntax_node(),
710            Expr::True(x) => x.as_syntax_node(),
711            Expr::Parenthesized(x) => x.as_syntax_node(),
712            Expr::Unary(x) => x.as_syntax_node(),
713            Expr::Binary(x) => x.as_syntax_node(),
714            Expr::Tuple(x) => x.as_syntax_node(),
715            Expr::FunctionCall(x) => x.as_syntax_node(),
716            Expr::StructCtorCall(x) => x.as_syntax_node(),
717            Expr::Block(x) => x.as_syntax_node(),
718            Expr::Match(x) => x.as_syntax_node(),
719            Expr::If(x) => x.as_syntax_node(),
720            Expr::Loop(x) => x.as_syntax_node(),
721            Expr::While(x) => x.as_syntax_node(),
722            Expr::For(x) => x.as_syntax_node(),
723            Expr::Closure(x) => x.as_syntax_node(),
724            Expr::ErrorPropagate(x) => x.as_syntax_node(),
725            Expr::FieldInitShorthand(x) => x.as_syntax_node(),
726            Expr::Indexed(x) => x.as_syntax_node(),
727            Expr::InlineMacro(x) => x.as_syntax_node(),
728            Expr::FixedSizeArray(x) => x.as_syntax_node(),
729            Expr::Placeholder(x) => x.as_syntax_node(),
730            Expr::Missing(x) => x.as_syntax_node(),
731        }
732    }
733    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
734        ExprPtr(self.as_syntax_node().lookup_intern(db).stable_ptr)
735    }
736}
737impl Expr {
738    /// Checks if a kind of a variant of [Expr].
739    pub fn is_variant(kind: SyntaxKind) -> bool {
740        matches!(
741            kind,
742            SyntaxKind::ExprPath
743                | SyntaxKind::TerminalLiteralNumber
744                | SyntaxKind::TerminalShortString
745                | SyntaxKind::TerminalString
746                | SyntaxKind::TerminalFalse
747                | SyntaxKind::TerminalTrue
748                | SyntaxKind::ExprParenthesized
749                | SyntaxKind::ExprUnary
750                | SyntaxKind::ExprBinary
751                | SyntaxKind::ExprListParenthesized
752                | SyntaxKind::ExprFunctionCall
753                | SyntaxKind::ExprStructCtorCall
754                | SyntaxKind::ExprBlock
755                | SyntaxKind::ExprMatch
756                | SyntaxKind::ExprIf
757                | SyntaxKind::ExprLoop
758                | SyntaxKind::ExprWhile
759                | SyntaxKind::ExprFor
760                | SyntaxKind::ExprClosure
761                | SyntaxKind::ExprErrorPropagate
762                | SyntaxKind::ExprFieldInitShorthand
763                | SyntaxKind::ExprIndexed
764                | SyntaxKind::ExprInlineMacro
765                | SyntaxKind::ExprFixedSizeArray
766                | SyntaxKind::ExprPlaceholder
767                | SyntaxKind::ExprMissing
768        )
769    }
770}
771#[derive(Clone, Debug, Eq, Hash, PartialEq)]
772pub struct ExprList(ElementList<Expr, 2>);
773impl Deref for ExprList {
774    type Target = ElementList<Expr, 2>;
775    fn deref(&self) -> &Self::Target {
776        &self.0
777    }
778}
779impl ExprList {
780    pub fn new_green(
781        db: &dyn SyntaxGroup,
782        children: &[ExprListElementOrSeparatorGreen],
783    ) -> ExprListGreen {
784        let width = children.iter().map(|id| id.id().lookup_intern(db).width()).sum();
785        ExprListGreen(
786            Arc::new(GreenNode {
787                kind: SyntaxKind::ExprList,
788                details: GreenNodeDetails::Node {
789                    children: children.iter().map(|x| x.id()).collect(),
790                    width,
791                },
792            })
793            .intern(db),
794        )
795    }
796}
797#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
798pub struct ExprListPtr(pub SyntaxStablePtrId);
799impl TypedStablePtr for ExprListPtr {
800    type SyntaxNode = ExprList;
801    fn untyped(&self) -> SyntaxStablePtrId {
802        self.0
803    }
804    fn lookup(&self, db: &dyn SyntaxGroup) -> ExprList {
805        ExprList::from_syntax_node(db, self.0.lookup(db))
806    }
807}
808impl From<ExprListPtr> for SyntaxStablePtrId {
809    fn from(ptr: ExprListPtr) -> Self {
810        ptr.untyped()
811    }
812}
813#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
814pub enum ExprListElementOrSeparatorGreen {
815    Separator(TerminalCommaGreen),
816    Element(ExprGreen),
817}
818impl From<TerminalCommaGreen> for ExprListElementOrSeparatorGreen {
819    fn from(value: TerminalCommaGreen) -> Self {
820        ExprListElementOrSeparatorGreen::Separator(value)
821    }
822}
823impl From<ExprGreen> for ExprListElementOrSeparatorGreen {
824    fn from(value: ExprGreen) -> Self {
825        ExprListElementOrSeparatorGreen::Element(value)
826    }
827}
828impl ExprListElementOrSeparatorGreen {
829    fn id(&self) -> GreenId {
830        match self {
831            ExprListElementOrSeparatorGreen::Separator(green) => green.0,
832            ExprListElementOrSeparatorGreen::Element(green) => green.0,
833        }
834    }
835}
836#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
837pub struct ExprListGreen(pub GreenId);
838impl TypedSyntaxNode for ExprList {
839    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprList);
840    type StablePtr = ExprListPtr;
841    type Green = ExprListGreen;
842    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
843        ExprListGreen(
844            Arc::new(GreenNode {
845                kind: SyntaxKind::ExprList,
846                details: GreenNodeDetails::Node {
847                    children: [].into(),
848                    width: TextWidth::default(),
849                },
850            })
851            .intern(db),
852        )
853    }
854    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
855        Self(ElementList::new(node))
856    }
857    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
858        if node.kind(db) == SyntaxKind::ExprList {
859            Some(Self(ElementList::new(node)))
860        } else {
861            None
862        }
863    }
864    fn as_syntax_node(&self) -> SyntaxNode {
865        self.node
866    }
867    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
868        ExprListPtr(self.node.stable_ptr(db))
869    }
870}
871#[derive(Clone, Debug, Eq, Hash, PartialEq)]
872pub struct Arg {
873    node: SyntaxNode,
874}
875impl Arg {
876    pub const INDEX_MODIFIERS: usize = 0;
877    pub const INDEX_ARG_CLAUSE: usize = 1;
878    pub fn new_green(
879        db: &dyn SyntaxGroup,
880        modifiers: ModifierListGreen,
881        arg_clause: ArgClauseGreen,
882    ) -> ArgGreen {
883        let children = [modifiers.0, arg_clause.0];
884        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
885        ArgGreen(
886            Arc::new(GreenNode {
887                kind: SyntaxKind::Arg,
888                details: GreenNodeDetails::Node { children: children.into(), width },
889            })
890            .intern(db),
891        )
892    }
893}
894impl Arg {
895    pub fn modifiers(&self, db: &dyn SyntaxGroup) -> ModifierList {
896        ModifierList::from_syntax_node(db, self.node.get_children(db)[0])
897    }
898    pub fn arg_clause(&self, db: &dyn SyntaxGroup) -> ArgClause {
899        ArgClause::from_syntax_node(db, self.node.get_children(db)[1])
900    }
901}
902#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
903pub struct ArgPtr(pub SyntaxStablePtrId);
904impl ArgPtr {}
905impl TypedStablePtr for ArgPtr {
906    type SyntaxNode = Arg;
907    fn untyped(&self) -> SyntaxStablePtrId {
908        self.0
909    }
910    fn lookup(&self, db: &dyn SyntaxGroup) -> Arg {
911        Arg::from_syntax_node(db, self.0.lookup(db))
912    }
913}
914impl From<ArgPtr> for SyntaxStablePtrId {
915    fn from(ptr: ArgPtr) -> Self {
916        ptr.untyped()
917    }
918}
919#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
920pub struct ArgGreen(pub GreenId);
921impl TypedSyntaxNode for Arg {
922    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::Arg);
923    type StablePtr = ArgPtr;
924    type Green = ArgGreen;
925    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
926        ArgGreen(
927            Arc::new(GreenNode {
928                kind: SyntaxKind::Arg,
929                details: GreenNodeDetails::Node {
930                    children: [ModifierList::missing(db).0, ArgClause::missing(db).0].into(),
931                    width: TextWidth::default(),
932                },
933            })
934            .intern(db),
935        )
936    }
937    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
938        let kind = node.kind(db);
939        assert_eq!(
940            kind,
941            SyntaxKind::Arg,
942            "Unexpected SyntaxKind {:?}. Expected {:?}.",
943            kind,
944            SyntaxKind::Arg
945        );
946        Self { node }
947    }
948    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
949        let kind = node.kind(db);
950        if kind == SyntaxKind::Arg { Some(Self::from_syntax_node(db, node)) } else { None }
951    }
952    fn as_syntax_node(&self) -> SyntaxNode {
953        self.node
954    }
955    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
956        ArgPtr(self.node.stable_ptr(db))
957    }
958}
959#[derive(Clone, Debug, Eq, Hash, PartialEq)]
960pub enum ArgClause {
961    Unnamed(ArgClauseUnnamed),
962    Named(ArgClauseNamed),
963    FieldInitShorthand(ArgClauseFieldInitShorthand),
964}
965#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
966pub struct ArgClausePtr(pub SyntaxStablePtrId);
967impl TypedStablePtr for ArgClausePtr {
968    type SyntaxNode = ArgClause;
969    fn untyped(&self) -> SyntaxStablePtrId {
970        self.0
971    }
972    fn lookup(&self, db: &dyn SyntaxGroup) -> ArgClause {
973        ArgClause::from_syntax_node(db, self.0.lookup(db))
974    }
975}
976impl From<ArgClausePtr> for SyntaxStablePtrId {
977    fn from(ptr: ArgClausePtr) -> Self {
978        ptr.untyped()
979    }
980}
981impl From<ArgClauseUnnamedPtr> for ArgClausePtr {
982    fn from(value: ArgClauseUnnamedPtr) -> Self {
983        Self(value.0)
984    }
985}
986impl From<ArgClauseNamedPtr> for ArgClausePtr {
987    fn from(value: ArgClauseNamedPtr) -> Self {
988        Self(value.0)
989    }
990}
991impl From<ArgClauseFieldInitShorthandPtr> for ArgClausePtr {
992    fn from(value: ArgClauseFieldInitShorthandPtr) -> Self {
993        Self(value.0)
994    }
995}
996impl From<ArgClauseUnnamedGreen> for ArgClauseGreen {
997    fn from(value: ArgClauseUnnamedGreen) -> Self {
998        Self(value.0)
999    }
1000}
1001impl From<ArgClauseNamedGreen> for ArgClauseGreen {
1002    fn from(value: ArgClauseNamedGreen) -> Self {
1003        Self(value.0)
1004    }
1005}
1006impl From<ArgClauseFieldInitShorthandGreen> for ArgClauseGreen {
1007    fn from(value: ArgClauseFieldInitShorthandGreen) -> Self {
1008        Self(value.0)
1009    }
1010}
1011#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
1012pub struct ArgClauseGreen(pub GreenId);
1013impl TypedSyntaxNode for ArgClause {
1014    const OPTIONAL_KIND: Option<SyntaxKind> = None;
1015    type StablePtr = ArgClausePtr;
1016    type Green = ArgClauseGreen;
1017    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
1018        panic!("No missing variant.");
1019    }
1020    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
1021        let kind = node.kind(db);
1022        match kind {
1023            SyntaxKind::ArgClauseUnnamed => {
1024                ArgClause::Unnamed(ArgClauseUnnamed::from_syntax_node(db, node))
1025            }
1026            SyntaxKind::ArgClauseNamed => {
1027                ArgClause::Named(ArgClauseNamed::from_syntax_node(db, node))
1028            }
1029            SyntaxKind::ArgClauseFieldInitShorthand => ArgClause::FieldInitShorthand(
1030                ArgClauseFieldInitShorthand::from_syntax_node(db, node),
1031            ),
1032            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "ArgClause"),
1033        }
1034    }
1035    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
1036        let kind = node.kind(db);
1037        match kind {
1038            SyntaxKind::ArgClauseUnnamed => {
1039                Some(ArgClause::Unnamed(ArgClauseUnnamed::from_syntax_node(db, node)))
1040            }
1041            SyntaxKind::ArgClauseNamed => {
1042                Some(ArgClause::Named(ArgClauseNamed::from_syntax_node(db, node)))
1043            }
1044            SyntaxKind::ArgClauseFieldInitShorthand => Some(ArgClause::FieldInitShorthand(
1045                ArgClauseFieldInitShorthand::from_syntax_node(db, node),
1046            )),
1047            _ => None,
1048        }
1049    }
1050    fn as_syntax_node(&self) -> SyntaxNode {
1051        match self {
1052            ArgClause::Unnamed(x) => x.as_syntax_node(),
1053            ArgClause::Named(x) => x.as_syntax_node(),
1054            ArgClause::FieldInitShorthand(x) => x.as_syntax_node(),
1055        }
1056    }
1057    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
1058        ArgClausePtr(self.as_syntax_node().lookup_intern(db).stable_ptr)
1059    }
1060}
1061impl ArgClause {
1062    /// Checks if a kind of a variant of [ArgClause].
1063    pub fn is_variant(kind: SyntaxKind) -> bool {
1064        matches!(
1065            kind,
1066            SyntaxKind::ArgClauseUnnamed
1067                | SyntaxKind::ArgClauseNamed
1068                | SyntaxKind::ArgClauseFieldInitShorthand
1069        )
1070    }
1071}
1072#[derive(Clone, Debug, Eq, Hash, PartialEq)]
1073pub struct ArgClauseNamed {
1074    node: SyntaxNode,
1075}
1076impl ArgClauseNamed {
1077    pub const INDEX_NAME: usize = 0;
1078    pub const INDEX_COLON: usize = 1;
1079    pub const INDEX_VALUE: usize = 2;
1080    pub fn new_green(
1081        db: &dyn SyntaxGroup,
1082        name: TerminalIdentifierGreen,
1083        colon: TerminalColonGreen,
1084        value: ExprGreen,
1085    ) -> ArgClauseNamedGreen {
1086        let children = [name.0, colon.0, value.0];
1087        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
1088        ArgClauseNamedGreen(
1089            Arc::new(GreenNode {
1090                kind: SyntaxKind::ArgClauseNamed,
1091                details: GreenNodeDetails::Node { children: children.into(), width },
1092            })
1093            .intern(db),
1094        )
1095    }
1096}
1097impl ArgClauseNamed {
1098    pub fn name(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier {
1099        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[0])
1100    }
1101    pub fn colon(&self, db: &dyn SyntaxGroup) -> TerminalColon {
1102        TerminalColon::from_syntax_node(db, self.node.get_children(db)[1])
1103    }
1104    pub fn value(&self, db: &dyn SyntaxGroup) -> Expr {
1105        Expr::from_syntax_node(db, self.node.get_children(db)[2])
1106    }
1107}
1108#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
1109pub struct ArgClauseNamedPtr(pub SyntaxStablePtrId);
1110impl ArgClauseNamedPtr {}
1111impl TypedStablePtr for ArgClauseNamedPtr {
1112    type SyntaxNode = ArgClauseNamed;
1113    fn untyped(&self) -> SyntaxStablePtrId {
1114        self.0
1115    }
1116    fn lookup(&self, db: &dyn SyntaxGroup) -> ArgClauseNamed {
1117        ArgClauseNamed::from_syntax_node(db, self.0.lookup(db))
1118    }
1119}
1120impl From<ArgClauseNamedPtr> for SyntaxStablePtrId {
1121    fn from(ptr: ArgClauseNamedPtr) -> Self {
1122        ptr.untyped()
1123    }
1124}
1125#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
1126pub struct ArgClauseNamedGreen(pub GreenId);
1127impl TypedSyntaxNode for ArgClauseNamed {
1128    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ArgClauseNamed);
1129    type StablePtr = ArgClauseNamedPtr;
1130    type Green = ArgClauseNamedGreen;
1131    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
1132        ArgClauseNamedGreen(
1133            Arc::new(GreenNode {
1134                kind: SyntaxKind::ArgClauseNamed,
1135                details: GreenNodeDetails::Node {
1136                    children: [
1137                        TerminalIdentifier::missing(db).0,
1138                        TerminalColon::missing(db).0,
1139                        Expr::missing(db).0,
1140                    ]
1141                    .into(),
1142                    width: TextWidth::default(),
1143                },
1144            })
1145            .intern(db),
1146        )
1147    }
1148    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
1149        let kind = node.kind(db);
1150        assert_eq!(
1151            kind,
1152            SyntaxKind::ArgClauseNamed,
1153            "Unexpected SyntaxKind {:?}. Expected {:?}.",
1154            kind,
1155            SyntaxKind::ArgClauseNamed
1156        );
1157        Self { node }
1158    }
1159    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
1160        let kind = node.kind(db);
1161        if kind == SyntaxKind::ArgClauseNamed {
1162            Some(Self::from_syntax_node(db, node))
1163        } else {
1164            None
1165        }
1166    }
1167    fn as_syntax_node(&self) -> SyntaxNode {
1168        self.node
1169    }
1170    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
1171        ArgClauseNamedPtr(self.node.stable_ptr(db))
1172    }
1173}
1174#[derive(Clone, Debug, Eq, Hash, PartialEq)]
1175pub struct ArgClauseUnnamed {
1176    node: SyntaxNode,
1177}
1178impl ArgClauseUnnamed {
1179    pub const INDEX_VALUE: usize = 0;
1180    pub fn new_green(db: &dyn SyntaxGroup, value: ExprGreen) -> ArgClauseUnnamedGreen {
1181        let children = [value.0];
1182        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
1183        ArgClauseUnnamedGreen(
1184            Arc::new(GreenNode {
1185                kind: SyntaxKind::ArgClauseUnnamed,
1186                details: GreenNodeDetails::Node { children: children.into(), width },
1187            })
1188            .intern(db),
1189        )
1190    }
1191}
1192impl ArgClauseUnnamed {
1193    pub fn value(&self, db: &dyn SyntaxGroup) -> Expr {
1194        Expr::from_syntax_node(db, self.node.get_children(db)[0])
1195    }
1196}
1197#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
1198pub struct ArgClauseUnnamedPtr(pub SyntaxStablePtrId);
1199impl ArgClauseUnnamedPtr {}
1200impl TypedStablePtr for ArgClauseUnnamedPtr {
1201    type SyntaxNode = ArgClauseUnnamed;
1202    fn untyped(&self) -> SyntaxStablePtrId {
1203        self.0
1204    }
1205    fn lookup(&self, db: &dyn SyntaxGroup) -> ArgClauseUnnamed {
1206        ArgClauseUnnamed::from_syntax_node(db, self.0.lookup(db))
1207    }
1208}
1209impl From<ArgClauseUnnamedPtr> for SyntaxStablePtrId {
1210    fn from(ptr: ArgClauseUnnamedPtr) -> Self {
1211        ptr.untyped()
1212    }
1213}
1214#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
1215pub struct ArgClauseUnnamedGreen(pub GreenId);
1216impl TypedSyntaxNode for ArgClauseUnnamed {
1217    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ArgClauseUnnamed);
1218    type StablePtr = ArgClauseUnnamedPtr;
1219    type Green = ArgClauseUnnamedGreen;
1220    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
1221        ArgClauseUnnamedGreen(
1222            Arc::new(GreenNode {
1223                kind: SyntaxKind::ArgClauseUnnamed,
1224                details: GreenNodeDetails::Node {
1225                    children: [Expr::missing(db).0].into(),
1226                    width: TextWidth::default(),
1227                },
1228            })
1229            .intern(db),
1230        )
1231    }
1232    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
1233        let kind = node.kind(db);
1234        assert_eq!(
1235            kind,
1236            SyntaxKind::ArgClauseUnnamed,
1237            "Unexpected SyntaxKind {:?}. Expected {:?}.",
1238            kind,
1239            SyntaxKind::ArgClauseUnnamed
1240        );
1241        Self { node }
1242    }
1243    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
1244        let kind = node.kind(db);
1245        if kind == SyntaxKind::ArgClauseUnnamed {
1246            Some(Self::from_syntax_node(db, node))
1247        } else {
1248            None
1249        }
1250    }
1251    fn as_syntax_node(&self) -> SyntaxNode {
1252        self.node
1253    }
1254    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
1255        ArgClauseUnnamedPtr(self.node.stable_ptr(db))
1256    }
1257}
1258#[derive(Clone, Debug, Eq, Hash, PartialEq)]
1259pub struct ArgClauseFieldInitShorthand {
1260    node: SyntaxNode,
1261}
1262impl ArgClauseFieldInitShorthand {
1263    pub const INDEX_COLON: usize = 0;
1264    pub const INDEX_NAME: usize = 1;
1265    pub fn new_green(
1266        db: &dyn SyntaxGroup,
1267        colon: TerminalColonGreen,
1268        name: ExprFieldInitShorthandGreen,
1269    ) -> ArgClauseFieldInitShorthandGreen {
1270        let children = [colon.0, name.0];
1271        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
1272        ArgClauseFieldInitShorthandGreen(
1273            Arc::new(GreenNode {
1274                kind: SyntaxKind::ArgClauseFieldInitShorthand,
1275                details: GreenNodeDetails::Node { children: children.into(), width },
1276            })
1277            .intern(db),
1278        )
1279    }
1280}
1281impl ArgClauseFieldInitShorthand {
1282    pub fn colon(&self, db: &dyn SyntaxGroup) -> TerminalColon {
1283        TerminalColon::from_syntax_node(db, self.node.get_children(db)[0])
1284    }
1285    pub fn name(&self, db: &dyn SyntaxGroup) -> ExprFieldInitShorthand {
1286        ExprFieldInitShorthand::from_syntax_node(db, self.node.get_children(db)[1])
1287    }
1288}
1289#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
1290pub struct ArgClauseFieldInitShorthandPtr(pub SyntaxStablePtrId);
1291impl ArgClauseFieldInitShorthandPtr {}
1292impl TypedStablePtr for ArgClauseFieldInitShorthandPtr {
1293    type SyntaxNode = ArgClauseFieldInitShorthand;
1294    fn untyped(&self) -> SyntaxStablePtrId {
1295        self.0
1296    }
1297    fn lookup(&self, db: &dyn SyntaxGroup) -> ArgClauseFieldInitShorthand {
1298        ArgClauseFieldInitShorthand::from_syntax_node(db, self.0.lookup(db))
1299    }
1300}
1301impl From<ArgClauseFieldInitShorthandPtr> for SyntaxStablePtrId {
1302    fn from(ptr: ArgClauseFieldInitShorthandPtr) -> Self {
1303        ptr.untyped()
1304    }
1305}
1306#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
1307pub struct ArgClauseFieldInitShorthandGreen(pub GreenId);
1308impl TypedSyntaxNode for ArgClauseFieldInitShorthand {
1309    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ArgClauseFieldInitShorthand);
1310    type StablePtr = ArgClauseFieldInitShorthandPtr;
1311    type Green = ArgClauseFieldInitShorthandGreen;
1312    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
1313        ArgClauseFieldInitShorthandGreen(
1314            Arc::new(GreenNode {
1315                kind: SyntaxKind::ArgClauseFieldInitShorthand,
1316                details: GreenNodeDetails::Node {
1317                    children: [TerminalColon::missing(db).0, ExprFieldInitShorthand::missing(db).0]
1318                        .into(),
1319                    width: TextWidth::default(),
1320                },
1321            })
1322            .intern(db),
1323        )
1324    }
1325    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
1326        let kind = node.kind(db);
1327        assert_eq!(
1328            kind,
1329            SyntaxKind::ArgClauseFieldInitShorthand,
1330            "Unexpected SyntaxKind {:?}. Expected {:?}.",
1331            kind,
1332            SyntaxKind::ArgClauseFieldInitShorthand
1333        );
1334        Self { node }
1335    }
1336    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
1337        let kind = node.kind(db);
1338        if kind == SyntaxKind::ArgClauseFieldInitShorthand {
1339            Some(Self::from_syntax_node(db, node))
1340        } else {
1341            None
1342        }
1343    }
1344    fn as_syntax_node(&self) -> SyntaxNode {
1345        self.node
1346    }
1347    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
1348        ArgClauseFieldInitShorthandPtr(self.node.stable_ptr(db))
1349    }
1350}
1351#[derive(Clone, Debug, Eq, Hash, PartialEq)]
1352pub struct ExprFieldInitShorthand {
1353    node: SyntaxNode,
1354}
1355impl ExprFieldInitShorthand {
1356    pub const INDEX_NAME: usize = 0;
1357    pub fn new_green(
1358        db: &dyn SyntaxGroup,
1359        name: TerminalIdentifierGreen,
1360    ) -> ExprFieldInitShorthandGreen {
1361        let children = [name.0];
1362        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
1363        ExprFieldInitShorthandGreen(
1364            Arc::new(GreenNode {
1365                kind: SyntaxKind::ExprFieldInitShorthand,
1366                details: GreenNodeDetails::Node { children: children.into(), width },
1367            })
1368            .intern(db),
1369        )
1370    }
1371}
1372impl ExprFieldInitShorthand {
1373    pub fn name(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier {
1374        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[0])
1375    }
1376}
1377#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
1378pub struct ExprFieldInitShorthandPtr(pub SyntaxStablePtrId);
1379impl ExprFieldInitShorthandPtr {}
1380impl TypedStablePtr for ExprFieldInitShorthandPtr {
1381    type SyntaxNode = ExprFieldInitShorthand;
1382    fn untyped(&self) -> SyntaxStablePtrId {
1383        self.0
1384    }
1385    fn lookup(&self, db: &dyn SyntaxGroup) -> ExprFieldInitShorthand {
1386        ExprFieldInitShorthand::from_syntax_node(db, self.0.lookup(db))
1387    }
1388}
1389impl From<ExprFieldInitShorthandPtr> for SyntaxStablePtrId {
1390    fn from(ptr: ExprFieldInitShorthandPtr) -> Self {
1391        ptr.untyped()
1392    }
1393}
1394#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
1395pub struct ExprFieldInitShorthandGreen(pub GreenId);
1396impl TypedSyntaxNode for ExprFieldInitShorthand {
1397    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprFieldInitShorthand);
1398    type StablePtr = ExprFieldInitShorthandPtr;
1399    type Green = ExprFieldInitShorthandGreen;
1400    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
1401        ExprFieldInitShorthandGreen(
1402            Arc::new(GreenNode {
1403                kind: SyntaxKind::ExprFieldInitShorthand,
1404                details: GreenNodeDetails::Node {
1405                    children: [TerminalIdentifier::missing(db).0].into(),
1406                    width: TextWidth::default(),
1407                },
1408            })
1409            .intern(db),
1410        )
1411    }
1412    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
1413        let kind = node.kind(db);
1414        assert_eq!(
1415            kind,
1416            SyntaxKind::ExprFieldInitShorthand,
1417            "Unexpected SyntaxKind {:?}. Expected {:?}.",
1418            kind,
1419            SyntaxKind::ExprFieldInitShorthand
1420        );
1421        Self { node }
1422    }
1423    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
1424        let kind = node.kind(db);
1425        if kind == SyntaxKind::ExprFieldInitShorthand {
1426            Some(Self::from_syntax_node(db, node))
1427        } else {
1428            None
1429        }
1430    }
1431    fn as_syntax_node(&self) -> SyntaxNode {
1432        self.node
1433    }
1434    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
1435        ExprFieldInitShorthandPtr(self.node.stable_ptr(db))
1436    }
1437}
1438#[derive(Clone, Debug, Eq, Hash, PartialEq)]
1439pub struct ArgList(ElementList<Arg, 2>);
1440impl Deref for ArgList {
1441    type Target = ElementList<Arg, 2>;
1442    fn deref(&self) -> &Self::Target {
1443        &self.0
1444    }
1445}
1446impl ArgList {
1447    pub fn new_green(
1448        db: &dyn SyntaxGroup,
1449        children: &[ArgListElementOrSeparatorGreen],
1450    ) -> ArgListGreen {
1451        let width = children.iter().map(|id| id.id().lookup_intern(db).width()).sum();
1452        ArgListGreen(
1453            Arc::new(GreenNode {
1454                kind: SyntaxKind::ArgList,
1455                details: GreenNodeDetails::Node {
1456                    children: children.iter().map(|x| x.id()).collect(),
1457                    width,
1458                },
1459            })
1460            .intern(db),
1461        )
1462    }
1463}
1464#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
1465pub struct ArgListPtr(pub SyntaxStablePtrId);
1466impl TypedStablePtr for ArgListPtr {
1467    type SyntaxNode = ArgList;
1468    fn untyped(&self) -> SyntaxStablePtrId {
1469        self.0
1470    }
1471    fn lookup(&self, db: &dyn SyntaxGroup) -> ArgList {
1472        ArgList::from_syntax_node(db, self.0.lookup(db))
1473    }
1474}
1475impl From<ArgListPtr> for SyntaxStablePtrId {
1476    fn from(ptr: ArgListPtr) -> Self {
1477        ptr.untyped()
1478    }
1479}
1480#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
1481pub enum ArgListElementOrSeparatorGreen {
1482    Separator(TerminalCommaGreen),
1483    Element(ArgGreen),
1484}
1485impl From<TerminalCommaGreen> for ArgListElementOrSeparatorGreen {
1486    fn from(value: TerminalCommaGreen) -> Self {
1487        ArgListElementOrSeparatorGreen::Separator(value)
1488    }
1489}
1490impl From<ArgGreen> for ArgListElementOrSeparatorGreen {
1491    fn from(value: ArgGreen) -> Self {
1492        ArgListElementOrSeparatorGreen::Element(value)
1493    }
1494}
1495impl ArgListElementOrSeparatorGreen {
1496    fn id(&self) -> GreenId {
1497        match self {
1498            ArgListElementOrSeparatorGreen::Separator(green) => green.0,
1499            ArgListElementOrSeparatorGreen::Element(green) => green.0,
1500        }
1501    }
1502}
1503#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
1504pub struct ArgListGreen(pub GreenId);
1505impl TypedSyntaxNode for ArgList {
1506    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ArgList);
1507    type StablePtr = ArgListPtr;
1508    type Green = ArgListGreen;
1509    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
1510        ArgListGreen(
1511            Arc::new(GreenNode {
1512                kind: SyntaxKind::ArgList,
1513                details: GreenNodeDetails::Node {
1514                    children: [].into(),
1515                    width: TextWidth::default(),
1516                },
1517            })
1518            .intern(db),
1519        )
1520    }
1521    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
1522        Self(ElementList::new(node))
1523    }
1524    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
1525        if node.kind(db) == SyntaxKind::ArgList { Some(Self(ElementList::new(node))) } else { None }
1526    }
1527    fn as_syntax_node(&self) -> SyntaxNode {
1528        self.node
1529    }
1530    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
1531        ArgListPtr(self.node.stable_ptr(db))
1532    }
1533}
1534#[derive(Clone, Debug, Eq, Hash, PartialEq)]
1535pub struct ExprMissing {
1536    node: SyntaxNode,
1537}
1538impl ExprMissing {
1539    pub fn new_green(db: &dyn SyntaxGroup) -> ExprMissingGreen {
1540        let children = [];
1541        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
1542        ExprMissingGreen(
1543            Arc::new(GreenNode {
1544                kind: SyntaxKind::ExprMissing,
1545                details: GreenNodeDetails::Node { children: children.into(), width },
1546            })
1547            .intern(db),
1548        )
1549    }
1550}
1551impl ExprMissing {}
1552#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
1553pub struct ExprMissingPtr(pub SyntaxStablePtrId);
1554impl ExprMissingPtr {}
1555impl TypedStablePtr for ExprMissingPtr {
1556    type SyntaxNode = ExprMissing;
1557    fn untyped(&self) -> SyntaxStablePtrId {
1558        self.0
1559    }
1560    fn lookup(&self, db: &dyn SyntaxGroup) -> ExprMissing {
1561        ExprMissing::from_syntax_node(db, self.0.lookup(db))
1562    }
1563}
1564impl From<ExprMissingPtr> for SyntaxStablePtrId {
1565    fn from(ptr: ExprMissingPtr) -> Self {
1566        ptr.untyped()
1567    }
1568}
1569#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
1570pub struct ExprMissingGreen(pub GreenId);
1571impl TypedSyntaxNode for ExprMissing {
1572    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprMissing);
1573    type StablePtr = ExprMissingPtr;
1574    type Green = ExprMissingGreen;
1575    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
1576        ExprMissingGreen(
1577            Arc::new(GreenNode {
1578                kind: SyntaxKind::ExprMissing,
1579                details: GreenNodeDetails::Node {
1580                    children: [].into(),
1581                    width: TextWidth::default(),
1582                },
1583            })
1584            .intern(db),
1585        )
1586    }
1587    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
1588        let kind = node.kind(db);
1589        assert_eq!(
1590            kind,
1591            SyntaxKind::ExprMissing,
1592            "Unexpected SyntaxKind {:?}. Expected {:?}.",
1593            kind,
1594            SyntaxKind::ExprMissing
1595        );
1596        Self { node }
1597    }
1598    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
1599        let kind = node.kind(db);
1600        if kind == SyntaxKind::ExprMissing { Some(Self::from_syntax_node(db, node)) } else { None }
1601    }
1602    fn as_syntax_node(&self) -> SyntaxNode {
1603        self.node
1604    }
1605    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
1606        ExprMissingPtr(self.node.stable_ptr(db))
1607    }
1608}
1609#[derive(Clone, Debug, Eq, Hash, PartialEq)]
1610pub enum PathSegment {
1611    Simple(PathSegmentSimple),
1612    WithGenericArgs(PathSegmentWithGenericArgs),
1613    Missing(PathSegmentMissing),
1614}
1615#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
1616pub struct PathSegmentPtr(pub SyntaxStablePtrId);
1617impl TypedStablePtr for PathSegmentPtr {
1618    type SyntaxNode = PathSegment;
1619    fn untyped(&self) -> SyntaxStablePtrId {
1620        self.0
1621    }
1622    fn lookup(&self, db: &dyn SyntaxGroup) -> PathSegment {
1623        PathSegment::from_syntax_node(db, self.0.lookup(db))
1624    }
1625}
1626impl From<PathSegmentPtr> for SyntaxStablePtrId {
1627    fn from(ptr: PathSegmentPtr) -> Self {
1628        ptr.untyped()
1629    }
1630}
1631impl From<PathSegmentSimplePtr> for PathSegmentPtr {
1632    fn from(value: PathSegmentSimplePtr) -> Self {
1633        Self(value.0)
1634    }
1635}
1636impl From<PathSegmentWithGenericArgsPtr> for PathSegmentPtr {
1637    fn from(value: PathSegmentWithGenericArgsPtr) -> Self {
1638        Self(value.0)
1639    }
1640}
1641impl From<PathSegmentMissingPtr> for PathSegmentPtr {
1642    fn from(value: PathSegmentMissingPtr) -> Self {
1643        Self(value.0)
1644    }
1645}
1646impl From<PathSegmentSimpleGreen> for PathSegmentGreen {
1647    fn from(value: PathSegmentSimpleGreen) -> Self {
1648        Self(value.0)
1649    }
1650}
1651impl From<PathSegmentWithGenericArgsGreen> for PathSegmentGreen {
1652    fn from(value: PathSegmentWithGenericArgsGreen) -> Self {
1653        Self(value.0)
1654    }
1655}
1656impl From<PathSegmentMissingGreen> for PathSegmentGreen {
1657    fn from(value: PathSegmentMissingGreen) -> Self {
1658        Self(value.0)
1659    }
1660}
1661#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
1662pub struct PathSegmentGreen(pub GreenId);
1663impl TypedSyntaxNode for PathSegment {
1664    const OPTIONAL_KIND: Option<SyntaxKind> = None;
1665    type StablePtr = PathSegmentPtr;
1666    type Green = PathSegmentGreen;
1667    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
1668        PathSegmentGreen(PathSegmentMissing::missing(db).0)
1669    }
1670    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
1671        let kind = node.kind(db);
1672        match kind {
1673            SyntaxKind::PathSegmentSimple => {
1674                PathSegment::Simple(PathSegmentSimple::from_syntax_node(db, node))
1675            }
1676            SyntaxKind::PathSegmentWithGenericArgs => {
1677                PathSegment::WithGenericArgs(PathSegmentWithGenericArgs::from_syntax_node(db, node))
1678            }
1679            SyntaxKind::PathSegmentMissing => {
1680                PathSegment::Missing(PathSegmentMissing::from_syntax_node(db, node))
1681            }
1682            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "PathSegment"),
1683        }
1684    }
1685    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
1686        let kind = node.kind(db);
1687        match kind {
1688            SyntaxKind::PathSegmentSimple => {
1689                Some(PathSegment::Simple(PathSegmentSimple::from_syntax_node(db, node)))
1690            }
1691            SyntaxKind::PathSegmentWithGenericArgs => Some(PathSegment::WithGenericArgs(
1692                PathSegmentWithGenericArgs::from_syntax_node(db, node),
1693            )),
1694            SyntaxKind::PathSegmentMissing => {
1695                Some(PathSegment::Missing(PathSegmentMissing::from_syntax_node(db, node)))
1696            }
1697            _ => None,
1698        }
1699    }
1700    fn as_syntax_node(&self) -> SyntaxNode {
1701        match self {
1702            PathSegment::Simple(x) => x.as_syntax_node(),
1703            PathSegment::WithGenericArgs(x) => x.as_syntax_node(),
1704            PathSegment::Missing(x) => x.as_syntax_node(),
1705        }
1706    }
1707    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
1708        PathSegmentPtr(self.as_syntax_node().lookup_intern(db).stable_ptr)
1709    }
1710}
1711impl PathSegment {
1712    /// Checks if a kind of a variant of [PathSegment].
1713    pub fn is_variant(kind: SyntaxKind) -> bool {
1714        matches!(
1715            kind,
1716            SyntaxKind::PathSegmentSimple
1717                | SyntaxKind::PathSegmentWithGenericArgs
1718                | SyntaxKind::PathSegmentMissing
1719        )
1720    }
1721}
1722#[derive(Clone, Debug, Eq, Hash, PartialEq)]
1723pub struct PathSegmentSimple {
1724    node: SyntaxNode,
1725}
1726impl PathSegmentSimple {
1727    pub const INDEX_IDENT: usize = 0;
1728    pub fn new_green(
1729        db: &dyn SyntaxGroup,
1730        ident: TerminalIdentifierGreen,
1731    ) -> PathSegmentSimpleGreen {
1732        let children = [ident.0];
1733        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
1734        PathSegmentSimpleGreen(
1735            Arc::new(GreenNode {
1736                kind: SyntaxKind::PathSegmentSimple,
1737                details: GreenNodeDetails::Node { children: children.into(), width },
1738            })
1739            .intern(db),
1740        )
1741    }
1742}
1743impl PathSegmentSimple {
1744    pub fn ident(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier {
1745        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[0])
1746    }
1747}
1748#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
1749pub struct PathSegmentSimplePtr(pub SyntaxStablePtrId);
1750impl PathSegmentSimplePtr {}
1751impl TypedStablePtr for PathSegmentSimplePtr {
1752    type SyntaxNode = PathSegmentSimple;
1753    fn untyped(&self) -> SyntaxStablePtrId {
1754        self.0
1755    }
1756    fn lookup(&self, db: &dyn SyntaxGroup) -> PathSegmentSimple {
1757        PathSegmentSimple::from_syntax_node(db, self.0.lookup(db))
1758    }
1759}
1760impl From<PathSegmentSimplePtr> for SyntaxStablePtrId {
1761    fn from(ptr: PathSegmentSimplePtr) -> Self {
1762        ptr.untyped()
1763    }
1764}
1765#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
1766pub struct PathSegmentSimpleGreen(pub GreenId);
1767impl TypedSyntaxNode for PathSegmentSimple {
1768    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PathSegmentSimple);
1769    type StablePtr = PathSegmentSimplePtr;
1770    type Green = PathSegmentSimpleGreen;
1771    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
1772        PathSegmentSimpleGreen(
1773            Arc::new(GreenNode {
1774                kind: SyntaxKind::PathSegmentSimple,
1775                details: GreenNodeDetails::Node {
1776                    children: [TerminalIdentifier::missing(db).0].into(),
1777                    width: TextWidth::default(),
1778                },
1779            })
1780            .intern(db),
1781        )
1782    }
1783    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
1784        let kind = node.kind(db);
1785        assert_eq!(
1786            kind,
1787            SyntaxKind::PathSegmentSimple,
1788            "Unexpected SyntaxKind {:?}. Expected {:?}.",
1789            kind,
1790            SyntaxKind::PathSegmentSimple
1791        );
1792        Self { node }
1793    }
1794    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
1795        let kind = node.kind(db);
1796        if kind == SyntaxKind::PathSegmentSimple {
1797            Some(Self::from_syntax_node(db, node))
1798        } else {
1799            None
1800        }
1801    }
1802    fn as_syntax_node(&self) -> SyntaxNode {
1803        self.node
1804    }
1805    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
1806        PathSegmentSimplePtr(self.node.stable_ptr(db))
1807    }
1808}
1809#[derive(Clone, Debug, Eq, Hash, PartialEq)]
1810pub enum OptionTerminalColonColon {
1811    Empty(OptionTerminalColonColonEmpty),
1812    TerminalColonColon(TerminalColonColon),
1813}
1814#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
1815pub struct OptionTerminalColonColonPtr(pub SyntaxStablePtrId);
1816impl TypedStablePtr for OptionTerminalColonColonPtr {
1817    type SyntaxNode = OptionTerminalColonColon;
1818    fn untyped(&self) -> SyntaxStablePtrId {
1819        self.0
1820    }
1821    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionTerminalColonColon {
1822        OptionTerminalColonColon::from_syntax_node(db, self.0.lookup(db))
1823    }
1824}
1825impl From<OptionTerminalColonColonPtr> for SyntaxStablePtrId {
1826    fn from(ptr: OptionTerminalColonColonPtr) -> Self {
1827        ptr.untyped()
1828    }
1829}
1830impl From<OptionTerminalColonColonEmptyPtr> for OptionTerminalColonColonPtr {
1831    fn from(value: OptionTerminalColonColonEmptyPtr) -> Self {
1832        Self(value.0)
1833    }
1834}
1835impl From<TerminalColonColonPtr> for OptionTerminalColonColonPtr {
1836    fn from(value: TerminalColonColonPtr) -> Self {
1837        Self(value.0)
1838    }
1839}
1840impl From<OptionTerminalColonColonEmptyGreen> for OptionTerminalColonColonGreen {
1841    fn from(value: OptionTerminalColonColonEmptyGreen) -> Self {
1842        Self(value.0)
1843    }
1844}
1845impl From<TerminalColonColonGreen> for OptionTerminalColonColonGreen {
1846    fn from(value: TerminalColonColonGreen) -> Self {
1847        Self(value.0)
1848    }
1849}
1850#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
1851pub struct OptionTerminalColonColonGreen(pub GreenId);
1852impl TypedSyntaxNode for OptionTerminalColonColon {
1853    const OPTIONAL_KIND: Option<SyntaxKind> = None;
1854    type StablePtr = OptionTerminalColonColonPtr;
1855    type Green = OptionTerminalColonColonGreen;
1856    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
1857        panic!("No missing variant.");
1858    }
1859    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
1860        let kind = node.kind(db);
1861        match kind {
1862            SyntaxKind::OptionTerminalColonColonEmpty => OptionTerminalColonColon::Empty(
1863                OptionTerminalColonColonEmpty::from_syntax_node(db, node),
1864            ),
1865            SyntaxKind::TerminalColonColon => OptionTerminalColonColon::TerminalColonColon(
1866                TerminalColonColon::from_syntax_node(db, node),
1867            ),
1868            _ => panic!(
1869                "Unexpected syntax kind {:?} when constructing {}.",
1870                kind, "OptionTerminalColonColon"
1871            ),
1872        }
1873    }
1874    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
1875        let kind = node.kind(db);
1876        match kind {
1877            SyntaxKind::OptionTerminalColonColonEmpty => Some(OptionTerminalColonColon::Empty(
1878                OptionTerminalColonColonEmpty::from_syntax_node(db, node),
1879            )),
1880            SyntaxKind::TerminalColonColon => Some(OptionTerminalColonColon::TerminalColonColon(
1881                TerminalColonColon::from_syntax_node(db, node),
1882            )),
1883            _ => None,
1884        }
1885    }
1886    fn as_syntax_node(&self) -> SyntaxNode {
1887        match self {
1888            OptionTerminalColonColon::Empty(x) => x.as_syntax_node(),
1889            OptionTerminalColonColon::TerminalColonColon(x) => x.as_syntax_node(),
1890        }
1891    }
1892    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
1893        OptionTerminalColonColonPtr(self.as_syntax_node().lookup_intern(db).stable_ptr)
1894    }
1895}
1896impl OptionTerminalColonColon {
1897    /// Checks if a kind of a variant of [OptionTerminalColonColon].
1898    pub fn is_variant(kind: SyntaxKind) -> bool {
1899        matches!(kind, SyntaxKind::OptionTerminalColonColonEmpty | SyntaxKind::TerminalColonColon)
1900    }
1901}
1902#[derive(Clone, Debug, Eq, Hash, PartialEq)]
1903pub struct OptionTerminalColonColonEmpty {
1904    node: SyntaxNode,
1905}
1906impl OptionTerminalColonColonEmpty {
1907    pub fn new_green(db: &dyn SyntaxGroup) -> OptionTerminalColonColonEmptyGreen {
1908        let children = [];
1909        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
1910        OptionTerminalColonColonEmptyGreen(
1911            Arc::new(GreenNode {
1912                kind: SyntaxKind::OptionTerminalColonColonEmpty,
1913                details: GreenNodeDetails::Node { children: children.into(), width },
1914            })
1915            .intern(db),
1916        )
1917    }
1918}
1919impl OptionTerminalColonColonEmpty {}
1920#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
1921pub struct OptionTerminalColonColonEmptyPtr(pub SyntaxStablePtrId);
1922impl OptionTerminalColonColonEmptyPtr {}
1923impl TypedStablePtr for OptionTerminalColonColonEmptyPtr {
1924    type SyntaxNode = OptionTerminalColonColonEmpty;
1925    fn untyped(&self) -> SyntaxStablePtrId {
1926        self.0
1927    }
1928    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionTerminalColonColonEmpty {
1929        OptionTerminalColonColonEmpty::from_syntax_node(db, self.0.lookup(db))
1930    }
1931}
1932impl From<OptionTerminalColonColonEmptyPtr> for SyntaxStablePtrId {
1933    fn from(ptr: OptionTerminalColonColonEmptyPtr) -> Self {
1934        ptr.untyped()
1935    }
1936}
1937#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
1938pub struct OptionTerminalColonColonEmptyGreen(pub GreenId);
1939impl TypedSyntaxNode for OptionTerminalColonColonEmpty {
1940    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionTerminalColonColonEmpty);
1941    type StablePtr = OptionTerminalColonColonEmptyPtr;
1942    type Green = OptionTerminalColonColonEmptyGreen;
1943    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
1944        OptionTerminalColonColonEmptyGreen(
1945            Arc::new(GreenNode {
1946                kind: SyntaxKind::OptionTerminalColonColonEmpty,
1947                details: GreenNodeDetails::Node {
1948                    children: [].into(),
1949                    width: TextWidth::default(),
1950                },
1951            })
1952            .intern(db),
1953        )
1954    }
1955    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
1956        let kind = node.kind(db);
1957        assert_eq!(
1958            kind,
1959            SyntaxKind::OptionTerminalColonColonEmpty,
1960            "Unexpected SyntaxKind {:?}. Expected {:?}.",
1961            kind,
1962            SyntaxKind::OptionTerminalColonColonEmpty
1963        );
1964        Self { node }
1965    }
1966    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
1967        let kind = node.kind(db);
1968        if kind == SyntaxKind::OptionTerminalColonColonEmpty {
1969            Some(Self::from_syntax_node(db, node))
1970        } else {
1971            None
1972        }
1973    }
1974    fn as_syntax_node(&self) -> SyntaxNode {
1975        self.node
1976    }
1977    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
1978        OptionTerminalColonColonEmptyPtr(self.node.stable_ptr(db))
1979    }
1980}
1981#[derive(Clone, Debug, Eq, Hash, PartialEq)]
1982pub struct PathSegmentWithGenericArgs {
1983    node: SyntaxNode,
1984}
1985impl PathSegmentWithGenericArgs {
1986    pub const INDEX_IDENT: usize = 0;
1987    pub const INDEX_SEPARATOR: usize = 1;
1988    pub const INDEX_GENERIC_ARGS: usize = 2;
1989    pub fn new_green(
1990        db: &dyn SyntaxGroup,
1991        ident: TerminalIdentifierGreen,
1992        separator: OptionTerminalColonColonGreen,
1993        generic_args: GenericArgsGreen,
1994    ) -> PathSegmentWithGenericArgsGreen {
1995        let children = [ident.0, separator.0, generic_args.0];
1996        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
1997        PathSegmentWithGenericArgsGreen(
1998            Arc::new(GreenNode {
1999                kind: SyntaxKind::PathSegmentWithGenericArgs,
2000                details: GreenNodeDetails::Node { children: children.into(), width },
2001            })
2002            .intern(db),
2003        )
2004    }
2005}
2006impl PathSegmentWithGenericArgs {
2007    pub fn ident(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier {
2008        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[0])
2009    }
2010    pub fn separator(&self, db: &dyn SyntaxGroup) -> OptionTerminalColonColon {
2011        OptionTerminalColonColon::from_syntax_node(db, self.node.get_children(db)[1])
2012    }
2013    pub fn generic_args(&self, db: &dyn SyntaxGroup) -> GenericArgs {
2014        GenericArgs::from_syntax_node(db, self.node.get_children(db)[2])
2015    }
2016}
2017#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
2018pub struct PathSegmentWithGenericArgsPtr(pub SyntaxStablePtrId);
2019impl PathSegmentWithGenericArgsPtr {}
2020impl TypedStablePtr for PathSegmentWithGenericArgsPtr {
2021    type SyntaxNode = PathSegmentWithGenericArgs;
2022    fn untyped(&self) -> SyntaxStablePtrId {
2023        self.0
2024    }
2025    fn lookup(&self, db: &dyn SyntaxGroup) -> PathSegmentWithGenericArgs {
2026        PathSegmentWithGenericArgs::from_syntax_node(db, self.0.lookup(db))
2027    }
2028}
2029impl From<PathSegmentWithGenericArgsPtr> for SyntaxStablePtrId {
2030    fn from(ptr: PathSegmentWithGenericArgsPtr) -> Self {
2031        ptr.untyped()
2032    }
2033}
2034#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
2035pub struct PathSegmentWithGenericArgsGreen(pub GreenId);
2036impl TypedSyntaxNode for PathSegmentWithGenericArgs {
2037    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PathSegmentWithGenericArgs);
2038    type StablePtr = PathSegmentWithGenericArgsPtr;
2039    type Green = PathSegmentWithGenericArgsGreen;
2040    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
2041        PathSegmentWithGenericArgsGreen(
2042            Arc::new(GreenNode {
2043                kind: SyntaxKind::PathSegmentWithGenericArgs,
2044                details: GreenNodeDetails::Node {
2045                    children: [
2046                        TerminalIdentifier::missing(db).0,
2047                        OptionTerminalColonColon::missing(db).0,
2048                        GenericArgs::missing(db).0,
2049                    ]
2050                    .into(),
2051                    width: TextWidth::default(),
2052                },
2053            })
2054            .intern(db),
2055        )
2056    }
2057    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
2058        let kind = node.kind(db);
2059        assert_eq!(
2060            kind,
2061            SyntaxKind::PathSegmentWithGenericArgs,
2062            "Unexpected SyntaxKind {:?}. Expected {:?}.",
2063            kind,
2064            SyntaxKind::PathSegmentWithGenericArgs
2065        );
2066        Self { node }
2067    }
2068    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
2069        let kind = node.kind(db);
2070        if kind == SyntaxKind::PathSegmentWithGenericArgs {
2071            Some(Self::from_syntax_node(db, node))
2072        } else {
2073            None
2074        }
2075    }
2076    fn as_syntax_node(&self) -> SyntaxNode {
2077        self.node
2078    }
2079    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
2080        PathSegmentWithGenericArgsPtr(self.node.stable_ptr(db))
2081    }
2082}
2083#[derive(Clone, Debug, Eq, Hash, PartialEq)]
2084pub struct ExprPath {
2085    node: SyntaxNode,
2086}
2087impl ExprPath {
2088    pub const INDEX_DOLLAR: usize = 0;
2089    pub const INDEX_SEGMENTS: usize = 1;
2090    pub fn new_green(
2091        db: &dyn SyntaxGroup,
2092        dollar: OptionTerminalDollarGreen,
2093        segments: ExprPathInnerGreen,
2094    ) -> ExprPathGreen {
2095        let children = [dollar.0, segments.0];
2096        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
2097        ExprPathGreen(
2098            Arc::new(GreenNode {
2099                kind: SyntaxKind::ExprPath,
2100                details: GreenNodeDetails::Node { children: children.into(), width },
2101            })
2102            .intern(db),
2103        )
2104    }
2105}
2106impl ExprPath {
2107    pub fn dollar(&self, db: &dyn SyntaxGroup) -> OptionTerminalDollar {
2108        OptionTerminalDollar::from_syntax_node(db, self.node.get_children(db)[0])
2109    }
2110    pub fn segments(&self, db: &dyn SyntaxGroup) -> ExprPathInner {
2111        ExprPathInner::from_syntax_node(db, self.node.get_children(db)[1])
2112    }
2113}
2114#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
2115pub struct ExprPathPtr(pub SyntaxStablePtrId);
2116impl ExprPathPtr {}
2117impl TypedStablePtr for ExprPathPtr {
2118    type SyntaxNode = ExprPath;
2119    fn untyped(&self) -> SyntaxStablePtrId {
2120        self.0
2121    }
2122    fn lookup(&self, db: &dyn SyntaxGroup) -> ExprPath {
2123        ExprPath::from_syntax_node(db, self.0.lookup(db))
2124    }
2125}
2126impl From<ExprPathPtr> for SyntaxStablePtrId {
2127    fn from(ptr: ExprPathPtr) -> Self {
2128        ptr.untyped()
2129    }
2130}
2131#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
2132pub struct ExprPathGreen(pub GreenId);
2133impl TypedSyntaxNode for ExprPath {
2134    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprPath);
2135    type StablePtr = ExprPathPtr;
2136    type Green = ExprPathGreen;
2137    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
2138        ExprPathGreen(
2139            Arc::new(GreenNode {
2140                kind: SyntaxKind::ExprPath,
2141                details: GreenNodeDetails::Node {
2142                    children: [OptionTerminalDollar::missing(db).0, ExprPathInner::missing(db).0]
2143                        .into(),
2144                    width: TextWidth::default(),
2145                },
2146            })
2147            .intern(db),
2148        )
2149    }
2150    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
2151        let kind = node.kind(db);
2152        assert_eq!(
2153            kind,
2154            SyntaxKind::ExprPath,
2155            "Unexpected SyntaxKind {:?}. Expected {:?}.",
2156            kind,
2157            SyntaxKind::ExprPath
2158        );
2159        Self { node }
2160    }
2161    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
2162        let kind = node.kind(db);
2163        if kind == SyntaxKind::ExprPath { Some(Self::from_syntax_node(db, node)) } else { None }
2164    }
2165    fn as_syntax_node(&self) -> SyntaxNode {
2166        self.node
2167    }
2168    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
2169        ExprPathPtr(self.node.stable_ptr(db))
2170    }
2171}
2172#[derive(Clone, Debug, Eq, Hash, PartialEq)]
2173pub enum OptionTerminalDollar {
2174    Empty(OptionTerminalDollarEmpty),
2175    TerminalDollar(TerminalDollar),
2176}
2177#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
2178pub struct OptionTerminalDollarPtr(pub SyntaxStablePtrId);
2179impl TypedStablePtr for OptionTerminalDollarPtr {
2180    type SyntaxNode = OptionTerminalDollar;
2181    fn untyped(&self) -> SyntaxStablePtrId {
2182        self.0
2183    }
2184    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionTerminalDollar {
2185        OptionTerminalDollar::from_syntax_node(db, self.0.lookup(db))
2186    }
2187}
2188impl From<OptionTerminalDollarPtr> for SyntaxStablePtrId {
2189    fn from(ptr: OptionTerminalDollarPtr) -> Self {
2190        ptr.untyped()
2191    }
2192}
2193impl From<OptionTerminalDollarEmptyPtr> for OptionTerminalDollarPtr {
2194    fn from(value: OptionTerminalDollarEmptyPtr) -> Self {
2195        Self(value.0)
2196    }
2197}
2198impl From<TerminalDollarPtr> for OptionTerminalDollarPtr {
2199    fn from(value: TerminalDollarPtr) -> Self {
2200        Self(value.0)
2201    }
2202}
2203impl From<OptionTerminalDollarEmptyGreen> for OptionTerminalDollarGreen {
2204    fn from(value: OptionTerminalDollarEmptyGreen) -> Self {
2205        Self(value.0)
2206    }
2207}
2208impl From<TerminalDollarGreen> for OptionTerminalDollarGreen {
2209    fn from(value: TerminalDollarGreen) -> Self {
2210        Self(value.0)
2211    }
2212}
2213#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
2214pub struct OptionTerminalDollarGreen(pub GreenId);
2215impl TypedSyntaxNode for OptionTerminalDollar {
2216    const OPTIONAL_KIND: Option<SyntaxKind> = None;
2217    type StablePtr = OptionTerminalDollarPtr;
2218    type Green = OptionTerminalDollarGreen;
2219    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
2220        panic!("No missing variant.");
2221    }
2222    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
2223        let kind = node.kind(db);
2224        match kind {
2225            SyntaxKind::OptionTerminalDollarEmpty => {
2226                OptionTerminalDollar::Empty(OptionTerminalDollarEmpty::from_syntax_node(db, node))
2227            }
2228            SyntaxKind::TerminalDollar => {
2229                OptionTerminalDollar::TerminalDollar(TerminalDollar::from_syntax_node(db, node))
2230            }
2231            _ => panic!(
2232                "Unexpected syntax kind {:?} when constructing {}.",
2233                kind, "OptionTerminalDollar"
2234            ),
2235        }
2236    }
2237    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
2238        let kind = node.kind(db);
2239        match kind {
2240            SyntaxKind::OptionTerminalDollarEmpty => Some(OptionTerminalDollar::Empty(
2241                OptionTerminalDollarEmpty::from_syntax_node(db, node),
2242            )),
2243            SyntaxKind::TerminalDollar => Some(OptionTerminalDollar::TerminalDollar(
2244                TerminalDollar::from_syntax_node(db, node),
2245            )),
2246            _ => None,
2247        }
2248    }
2249    fn as_syntax_node(&self) -> SyntaxNode {
2250        match self {
2251            OptionTerminalDollar::Empty(x) => x.as_syntax_node(),
2252            OptionTerminalDollar::TerminalDollar(x) => x.as_syntax_node(),
2253        }
2254    }
2255    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
2256        OptionTerminalDollarPtr(self.as_syntax_node().lookup_intern(db).stable_ptr)
2257    }
2258}
2259impl OptionTerminalDollar {
2260    /// Checks if a kind of a variant of [OptionTerminalDollar].
2261    pub fn is_variant(kind: SyntaxKind) -> bool {
2262        matches!(kind, SyntaxKind::OptionTerminalDollarEmpty | SyntaxKind::TerminalDollar)
2263    }
2264}
2265#[derive(Clone, Debug, Eq, Hash, PartialEq)]
2266pub struct OptionTerminalDollarEmpty {
2267    node: SyntaxNode,
2268}
2269impl OptionTerminalDollarEmpty {
2270    pub fn new_green(db: &dyn SyntaxGroup) -> OptionTerminalDollarEmptyGreen {
2271        let children = [];
2272        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
2273        OptionTerminalDollarEmptyGreen(
2274            Arc::new(GreenNode {
2275                kind: SyntaxKind::OptionTerminalDollarEmpty,
2276                details: GreenNodeDetails::Node { children: children.into(), width },
2277            })
2278            .intern(db),
2279        )
2280    }
2281}
2282impl OptionTerminalDollarEmpty {}
2283#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
2284pub struct OptionTerminalDollarEmptyPtr(pub SyntaxStablePtrId);
2285impl OptionTerminalDollarEmptyPtr {}
2286impl TypedStablePtr for OptionTerminalDollarEmptyPtr {
2287    type SyntaxNode = OptionTerminalDollarEmpty;
2288    fn untyped(&self) -> SyntaxStablePtrId {
2289        self.0
2290    }
2291    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionTerminalDollarEmpty {
2292        OptionTerminalDollarEmpty::from_syntax_node(db, self.0.lookup(db))
2293    }
2294}
2295impl From<OptionTerminalDollarEmptyPtr> for SyntaxStablePtrId {
2296    fn from(ptr: OptionTerminalDollarEmptyPtr) -> Self {
2297        ptr.untyped()
2298    }
2299}
2300#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
2301pub struct OptionTerminalDollarEmptyGreen(pub GreenId);
2302impl TypedSyntaxNode for OptionTerminalDollarEmpty {
2303    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionTerminalDollarEmpty);
2304    type StablePtr = OptionTerminalDollarEmptyPtr;
2305    type Green = OptionTerminalDollarEmptyGreen;
2306    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
2307        OptionTerminalDollarEmptyGreen(
2308            Arc::new(GreenNode {
2309                kind: SyntaxKind::OptionTerminalDollarEmpty,
2310                details: GreenNodeDetails::Node {
2311                    children: [].into(),
2312                    width: TextWidth::default(),
2313                },
2314            })
2315            .intern(db),
2316        )
2317    }
2318    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
2319        let kind = node.kind(db);
2320        assert_eq!(
2321            kind,
2322            SyntaxKind::OptionTerminalDollarEmpty,
2323            "Unexpected SyntaxKind {:?}. Expected {:?}.",
2324            kind,
2325            SyntaxKind::OptionTerminalDollarEmpty
2326        );
2327        Self { node }
2328    }
2329    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
2330        let kind = node.kind(db);
2331        if kind == SyntaxKind::OptionTerminalDollarEmpty {
2332            Some(Self::from_syntax_node(db, node))
2333        } else {
2334            None
2335        }
2336    }
2337    fn as_syntax_node(&self) -> SyntaxNode {
2338        self.node
2339    }
2340    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
2341        OptionTerminalDollarEmptyPtr(self.node.stable_ptr(db))
2342    }
2343}
2344#[derive(Clone, Debug, Eq, Hash, PartialEq)]
2345pub struct PathSegmentMissing {
2346    node: SyntaxNode,
2347}
2348impl PathSegmentMissing {
2349    pub const INDEX_IDENT: usize = 0;
2350    pub fn new_green(
2351        db: &dyn SyntaxGroup,
2352        ident: TerminalIdentifierGreen,
2353    ) -> PathSegmentMissingGreen {
2354        let children = [ident.0];
2355        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
2356        PathSegmentMissingGreen(
2357            Arc::new(GreenNode {
2358                kind: SyntaxKind::PathSegmentMissing,
2359                details: GreenNodeDetails::Node { children: children.into(), width },
2360            })
2361            .intern(db),
2362        )
2363    }
2364}
2365impl PathSegmentMissing {
2366    pub fn ident(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier {
2367        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[0])
2368    }
2369}
2370#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
2371pub struct PathSegmentMissingPtr(pub SyntaxStablePtrId);
2372impl PathSegmentMissingPtr {}
2373impl TypedStablePtr for PathSegmentMissingPtr {
2374    type SyntaxNode = PathSegmentMissing;
2375    fn untyped(&self) -> SyntaxStablePtrId {
2376        self.0
2377    }
2378    fn lookup(&self, db: &dyn SyntaxGroup) -> PathSegmentMissing {
2379        PathSegmentMissing::from_syntax_node(db, self.0.lookup(db))
2380    }
2381}
2382impl From<PathSegmentMissingPtr> for SyntaxStablePtrId {
2383    fn from(ptr: PathSegmentMissingPtr) -> Self {
2384        ptr.untyped()
2385    }
2386}
2387#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
2388pub struct PathSegmentMissingGreen(pub GreenId);
2389impl TypedSyntaxNode for PathSegmentMissing {
2390    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PathSegmentMissing);
2391    type StablePtr = PathSegmentMissingPtr;
2392    type Green = PathSegmentMissingGreen;
2393    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
2394        PathSegmentMissingGreen(
2395            Arc::new(GreenNode {
2396                kind: SyntaxKind::PathSegmentMissing,
2397                details: GreenNodeDetails::Node {
2398                    children: [TerminalIdentifier::missing(db).0].into(),
2399                    width: TextWidth::default(),
2400                },
2401            })
2402            .intern(db),
2403        )
2404    }
2405    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
2406        let kind = node.kind(db);
2407        assert_eq!(
2408            kind,
2409            SyntaxKind::PathSegmentMissing,
2410            "Unexpected SyntaxKind {:?}. Expected {:?}.",
2411            kind,
2412            SyntaxKind::PathSegmentMissing
2413        );
2414        Self { node }
2415    }
2416    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
2417        let kind = node.kind(db);
2418        if kind == SyntaxKind::PathSegmentMissing {
2419            Some(Self::from_syntax_node(db, node))
2420        } else {
2421            None
2422        }
2423    }
2424    fn as_syntax_node(&self) -> SyntaxNode {
2425        self.node
2426    }
2427    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
2428        PathSegmentMissingPtr(self.node.stable_ptr(db))
2429    }
2430}
2431#[derive(Clone, Debug, Eq, Hash, PartialEq)]
2432pub struct ExprPathInner(ElementList<PathSegment, 2>);
2433impl Deref for ExprPathInner {
2434    type Target = ElementList<PathSegment, 2>;
2435    fn deref(&self) -> &Self::Target {
2436        &self.0
2437    }
2438}
2439impl ExprPathInner {
2440    pub fn new_green(
2441        db: &dyn SyntaxGroup,
2442        children: &[ExprPathInnerElementOrSeparatorGreen],
2443    ) -> ExprPathInnerGreen {
2444        let width = children.iter().map(|id| id.id().lookup_intern(db).width()).sum();
2445        ExprPathInnerGreen(
2446            Arc::new(GreenNode {
2447                kind: SyntaxKind::ExprPathInner,
2448                details: GreenNodeDetails::Node {
2449                    children: children.iter().map(|x| x.id()).collect(),
2450                    width,
2451                },
2452            })
2453            .intern(db),
2454        )
2455    }
2456}
2457#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
2458pub struct ExprPathInnerPtr(pub SyntaxStablePtrId);
2459impl TypedStablePtr for ExprPathInnerPtr {
2460    type SyntaxNode = ExprPathInner;
2461    fn untyped(&self) -> SyntaxStablePtrId {
2462        self.0
2463    }
2464    fn lookup(&self, db: &dyn SyntaxGroup) -> ExprPathInner {
2465        ExprPathInner::from_syntax_node(db, self.0.lookup(db))
2466    }
2467}
2468impl From<ExprPathInnerPtr> for SyntaxStablePtrId {
2469    fn from(ptr: ExprPathInnerPtr) -> Self {
2470        ptr.untyped()
2471    }
2472}
2473#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
2474pub enum ExprPathInnerElementOrSeparatorGreen {
2475    Separator(TerminalColonColonGreen),
2476    Element(PathSegmentGreen),
2477}
2478impl From<TerminalColonColonGreen> for ExprPathInnerElementOrSeparatorGreen {
2479    fn from(value: TerminalColonColonGreen) -> Self {
2480        ExprPathInnerElementOrSeparatorGreen::Separator(value)
2481    }
2482}
2483impl From<PathSegmentGreen> for ExprPathInnerElementOrSeparatorGreen {
2484    fn from(value: PathSegmentGreen) -> Self {
2485        ExprPathInnerElementOrSeparatorGreen::Element(value)
2486    }
2487}
2488impl ExprPathInnerElementOrSeparatorGreen {
2489    fn id(&self) -> GreenId {
2490        match self {
2491            ExprPathInnerElementOrSeparatorGreen::Separator(green) => green.0,
2492            ExprPathInnerElementOrSeparatorGreen::Element(green) => green.0,
2493        }
2494    }
2495}
2496#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
2497pub struct ExprPathInnerGreen(pub GreenId);
2498impl TypedSyntaxNode for ExprPathInner {
2499    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprPathInner);
2500    type StablePtr = ExprPathInnerPtr;
2501    type Green = ExprPathInnerGreen;
2502    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
2503        ExprPathInnerGreen(
2504            Arc::new(GreenNode {
2505                kind: SyntaxKind::ExprPathInner,
2506                details: GreenNodeDetails::Node {
2507                    children: [].into(),
2508                    width: TextWidth::default(),
2509                },
2510            })
2511            .intern(db),
2512        )
2513    }
2514    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
2515        Self(ElementList::new(node))
2516    }
2517    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
2518        if node.kind(db) == SyntaxKind::ExprPathInner {
2519            Some(Self(ElementList::new(node)))
2520        } else {
2521            None
2522        }
2523    }
2524    fn as_syntax_node(&self) -> SyntaxNode {
2525        self.node
2526    }
2527    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
2528        ExprPathInnerPtr(self.node.stable_ptr(db))
2529    }
2530}
2531#[derive(Clone, Debug, Eq, Hash, PartialEq)]
2532pub struct ExprParenthesized {
2533    node: SyntaxNode,
2534}
2535impl ExprParenthesized {
2536    pub const INDEX_LPAREN: usize = 0;
2537    pub const INDEX_EXPR: usize = 1;
2538    pub const INDEX_RPAREN: usize = 2;
2539    pub fn new_green(
2540        db: &dyn SyntaxGroup,
2541        lparen: TerminalLParenGreen,
2542        expr: ExprGreen,
2543        rparen: TerminalRParenGreen,
2544    ) -> ExprParenthesizedGreen {
2545        let children = [lparen.0, expr.0, rparen.0];
2546        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
2547        ExprParenthesizedGreen(
2548            Arc::new(GreenNode {
2549                kind: SyntaxKind::ExprParenthesized,
2550                details: GreenNodeDetails::Node { children: children.into(), width },
2551            })
2552            .intern(db),
2553        )
2554    }
2555}
2556impl ExprParenthesized {
2557    pub fn lparen(&self, db: &dyn SyntaxGroup) -> TerminalLParen {
2558        TerminalLParen::from_syntax_node(db, self.node.get_children(db)[0])
2559    }
2560    pub fn expr(&self, db: &dyn SyntaxGroup) -> Expr {
2561        Expr::from_syntax_node(db, self.node.get_children(db)[1])
2562    }
2563    pub fn rparen(&self, db: &dyn SyntaxGroup) -> TerminalRParen {
2564        TerminalRParen::from_syntax_node(db, self.node.get_children(db)[2])
2565    }
2566}
2567#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
2568pub struct ExprParenthesizedPtr(pub SyntaxStablePtrId);
2569impl ExprParenthesizedPtr {}
2570impl TypedStablePtr for ExprParenthesizedPtr {
2571    type SyntaxNode = ExprParenthesized;
2572    fn untyped(&self) -> SyntaxStablePtrId {
2573        self.0
2574    }
2575    fn lookup(&self, db: &dyn SyntaxGroup) -> ExprParenthesized {
2576        ExprParenthesized::from_syntax_node(db, self.0.lookup(db))
2577    }
2578}
2579impl From<ExprParenthesizedPtr> for SyntaxStablePtrId {
2580    fn from(ptr: ExprParenthesizedPtr) -> Self {
2581        ptr.untyped()
2582    }
2583}
2584#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
2585pub struct ExprParenthesizedGreen(pub GreenId);
2586impl TypedSyntaxNode for ExprParenthesized {
2587    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprParenthesized);
2588    type StablePtr = ExprParenthesizedPtr;
2589    type Green = ExprParenthesizedGreen;
2590    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
2591        ExprParenthesizedGreen(
2592            Arc::new(GreenNode {
2593                kind: SyntaxKind::ExprParenthesized,
2594                details: GreenNodeDetails::Node {
2595                    children: [
2596                        TerminalLParen::missing(db).0,
2597                        Expr::missing(db).0,
2598                        TerminalRParen::missing(db).0,
2599                    ]
2600                    .into(),
2601                    width: TextWidth::default(),
2602                },
2603            })
2604            .intern(db),
2605        )
2606    }
2607    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
2608        let kind = node.kind(db);
2609        assert_eq!(
2610            kind,
2611            SyntaxKind::ExprParenthesized,
2612            "Unexpected SyntaxKind {:?}. Expected {:?}.",
2613            kind,
2614            SyntaxKind::ExprParenthesized
2615        );
2616        Self { node }
2617    }
2618    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
2619        let kind = node.kind(db);
2620        if kind == SyntaxKind::ExprParenthesized {
2621            Some(Self::from_syntax_node(db, node))
2622        } else {
2623            None
2624        }
2625    }
2626    fn as_syntax_node(&self) -> SyntaxNode {
2627        self.node
2628    }
2629    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
2630        ExprParenthesizedPtr(self.node.stable_ptr(db))
2631    }
2632}
2633#[derive(Clone, Debug, Eq, Hash, PartialEq)]
2634pub struct ExprUnary {
2635    node: SyntaxNode,
2636}
2637impl ExprUnary {
2638    pub const INDEX_OP: usize = 0;
2639    pub const INDEX_EXPR: usize = 1;
2640    pub fn new_green(
2641        db: &dyn SyntaxGroup,
2642        op: UnaryOperatorGreen,
2643        expr: ExprGreen,
2644    ) -> ExprUnaryGreen {
2645        let children = [op.0, expr.0];
2646        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
2647        ExprUnaryGreen(
2648            Arc::new(GreenNode {
2649                kind: SyntaxKind::ExprUnary,
2650                details: GreenNodeDetails::Node { children: children.into(), width },
2651            })
2652            .intern(db),
2653        )
2654    }
2655}
2656impl ExprUnary {
2657    pub fn op(&self, db: &dyn SyntaxGroup) -> UnaryOperator {
2658        UnaryOperator::from_syntax_node(db, self.node.get_children(db)[0])
2659    }
2660    pub fn expr(&self, db: &dyn SyntaxGroup) -> Expr {
2661        Expr::from_syntax_node(db, self.node.get_children(db)[1])
2662    }
2663}
2664#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
2665pub struct ExprUnaryPtr(pub SyntaxStablePtrId);
2666impl ExprUnaryPtr {}
2667impl TypedStablePtr for ExprUnaryPtr {
2668    type SyntaxNode = ExprUnary;
2669    fn untyped(&self) -> SyntaxStablePtrId {
2670        self.0
2671    }
2672    fn lookup(&self, db: &dyn SyntaxGroup) -> ExprUnary {
2673        ExprUnary::from_syntax_node(db, self.0.lookup(db))
2674    }
2675}
2676impl From<ExprUnaryPtr> for SyntaxStablePtrId {
2677    fn from(ptr: ExprUnaryPtr) -> Self {
2678        ptr.untyped()
2679    }
2680}
2681#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
2682pub struct ExprUnaryGreen(pub GreenId);
2683impl TypedSyntaxNode for ExprUnary {
2684    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprUnary);
2685    type StablePtr = ExprUnaryPtr;
2686    type Green = ExprUnaryGreen;
2687    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
2688        ExprUnaryGreen(
2689            Arc::new(GreenNode {
2690                kind: SyntaxKind::ExprUnary,
2691                details: GreenNodeDetails::Node {
2692                    children: [UnaryOperator::missing(db).0, Expr::missing(db).0].into(),
2693                    width: TextWidth::default(),
2694                },
2695            })
2696            .intern(db),
2697        )
2698    }
2699    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
2700        let kind = node.kind(db);
2701        assert_eq!(
2702            kind,
2703            SyntaxKind::ExprUnary,
2704            "Unexpected SyntaxKind {:?}. Expected {:?}.",
2705            kind,
2706            SyntaxKind::ExprUnary
2707        );
2708        Self { node }
2709    }
2710    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
2711        let kind = node.kind(db);
2712        if kind == SyntaxKind::ExprUnary { Some(Self::from_syntax_node(db, node)) } else { None }
2713    }
2714    fn as_syntax_node(&self) -> SyntaxNode {
2715        self.node
2716    }
2717    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
2718        ExprUnaryPtr(self.node.stable_ptr(db))
2719    }
2720}
2721#[derive(Clone, Debug, Eq, Hash, PartialEq)]
2722pub enum UnaryOperator {
2723    Not(TerminalNot),
2724    BitNot(TerminalBitNot),
2725    Minus(TerminalMinus),
2726    At(TerminalAt),
2727    Desnap(TerminalMul),
2728}
2729#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
2730pub struct UnaryOperatorPtr(pub SyntaxStablePtrId);
2731impl TypedStablePtr for UnaryOperatorPtr {
2732    type SyntaxNode = UnaryOperator;
2733    fn untyped(&self) -> SyntaxStablePtrId {
2734        self.0
2735    }
2736    fn lookup(&self, db: &dyn SyntaxGroup) -> UnaryOperator {
2737        UnaryOperator::from_syntax_node(db, self.0.lookup(db))
2738    }
2739}
2740impl From<UnaryOperatorPtr> for SyntaxStablePtrId {
2741    fn from(ptr: UnaryOperatorPtr) -> Self {
2742        ptr.untyped()
2743    }
2744}
2745impl From<TerminalNotPtr> for UnaryOperatorPtr {
2746    fn from(value: TerminalNotPtr) -> Self {
2747        Self(value.0)
2748    }
2749}
2750impl From<TerminalBitNotPtr> for UnaryOperatorPtr {
2751    fn from(value: TerminalBitNotPtr) -> Self {
2752        Self(value.0)
2753    }
2754}
2755impl From<TerminalMinusPtr> for UnaryOperatorPtr {
2756    fn from(value: TerminalMinusPtr) -> Self {
2757        Self(value.0)
2758    }
2759}
2760impl From<TerminalAtPtr> for UnaryOperatorPtr {
2761    fn from(value: TerminalAtPtr) -> Self {
2762        Self(value.0)
2763    }
2764}
2765impl From<TerminalMulPtr> for UnaryOperatorPtr {
2766    fn from(value: TerminalMulPtr) -> Self {
2767        Self(value.0)
2768    }
2769}
2770impl From<TerminalNotGreen> for UnaryOperatorGreen {
2771    fn from(value: TerminalNotGreen) -> Self {
2772        Self(value.0)
2773    }
2774}
2775impl From<TerminalBitNotGreen> for UnaryOperatorGreen {
2776    fn from(value: TerminalBitNotGreen) -> Self {
2777        Self(value.0)
2778    }
2779}
2780impl From<TerminalMinusGreen> for UnaryOperatorGreen {
2781    fn from(value: TerminalMinusGreen) -> Self {
2782        Self(value.0)
2783    }
2784}
2785impl From<TerminalAtGreen> for UnaryOperatorGreen {
2786    fn from(value: TerminalAtGreen) -> Self {
2787        Self(value.0)
2788    }
2789}
2790impl From<TerminalMulGreen> for UnaryOperatorGreen {
2791    fn from(value: TerminalMulGreen) -> Self {
2792        Self(value.0)
2793    }
2794}
2795#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
2796pub struct UnaryOperatorGreen(pub GreenId);
2797impl TypedSyntaxNode for UnaryOperator {
2798    const OPTIONAL_KIND: Option<SyntaxKind> = None;
2799    type StablePtr = UnaryOperatorPtr;
2800    type Green = UnaryOperatorGreen;
2801    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
2802        panic!("No missing variant.");
2803    }
2804    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
2805        let kind = node.kind(db);
2806        match kind {
2807            SyntaxKind::TerminalNot => UnaryOperator::Not(TerminalNot::from_syntax_node(db, node)),
2808            SyntaxKind::TerminalBitNot => {
2809                UnaryOperator::BitNot(TerminalBitNot::from_syntax_node(db, node))
2810            }
2811            SyntaxKind::TerminalMinus => {
2812                UnaryOperator::Minus(TerminalMinus::from_syntax_node(db, node))
2813            }
2814            SyntaxKind::TerminalAt => UnaryOperator::At(TerminalAt::from_syntax_node(db, node)),
2815            SyntaxKind::TerminalMul => {
2816                UnaryOperator::Desnap(TerminalMul::from_syntax_node(db, node))
2817            }
2818            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "UnaryOperator"),
2819        }
2820    }
2821    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
2822        let kind = node.kind(db);
2823        match kind {
2824            SyntaxKind::TerminalNot => {
2825                Some(UnaryOperator::Not(TerminalNot::from_syntax_node(db, node)))
2826            }
2827            SyntaxKind::TerminalBitNot => {
2828                Some(UnaryOperator::BitNot(TerminalBitNot::from_syntax_node(db, node)))
2829            }
2830            SyntaxKind::TerminalMinus => {
2831                Some(UnaryOperator::Minus(TerminalMinus::from_syntax_node(db, node)))
2832            }
2833            SyntaxKind::TerminalAt => {
2834                Some(UnaryOperator::At(TerminalAt::from_syntax_node(db, node)))
2835            }
2836            SyntaxKind::TerminalMul => {
2837                Some(UnaryOperator::Desnap(TerminalMul::from_syntax_node(db, node)))
2838            }
2839            _ => None,
2840        }
2841    }
2842    fn as_syntax_node(&self) -> SyntaxNode {
2843        match self {
2844            UnaryOperator::Not(x) => x.as_syntax_node(),
2845            UnaryOperator::BitNot(x) => x.as_syntax_node(),
2846            UnaryOperator::Minus(x) => x.as_syntax_node(),
2847            UnaryOperator::At(x) => x.as_syntax_node(),
2848            UnaryOperator::Desnap(x) => x.as_syntax_node(),
2849        }
2850    }
2851    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
2852        UnaryOperatorPtr(self.as_syntax_node().lookup_intern(db).stable_ptr)
2853    }
2854}
2855impl UnaryOperator {
2856    /// Checks if a kind of a variant of [UnaryOperator].
2857    pub fn is_variant(kind: SyntaxKind) -> bool {
2858        matches!(
2859            kind,
2860            SyntaxKind::TerminalNot
2861                | SyntaxKind::TerminalBitNot
2862                | SyntaxKind::TerminalMinus
2863                | SyntaxKind::TerminalAt
2864                | SyntaxKind::TerminalMul
2865        )
2866    }
2867}
2868#[derive(Clone, Debug, Eq, Hash, PartialEq)]
2869pub struct ExprBinary {
2870    node: SyntaxNode,
2871}
2872impl ExprBinary {
2873    pub const INDEX_LHS: usize = 0;
2874    pub const INDEX_OP: usize = 1;
2875    pub const INDEX_RHS: usize = 2;
2876    pub fn new_green(
2877        db: &dyn SyntaxGroup,
2878        lhs: ExprGreen,
2879        op: BinaryOperatorGreen,
2880        rhs: ExprGreen,
2881    ) -> ExprBinaryGreen {
2882        let children = [lhs.0, op.0, rhs.0];
2883        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
2884        ExprBinaryGreen(
2885            Arc::new(GreenNode {
2886                kind: SyntaxKind::ExprBinary,
2887                details: GreenNodeDetails::Node { children: children.into(), width },
2888            })
2889            .intern(db),
2890        )
2891    }
2892}
2893impl ExprBinary {
2894    pub fn lhs(&self, db: &dyn SyntaxGroup) -> Expr {
2895        Expr::from_syntax_node(db, self.node.get_children(db)[0])
2896    }
2897    pub fn op(&self, db: &dyn SyntaxGroup) -> BinaryOperator {
2898        BinaryOperator::from_syntax_node(db, self.node.get_children(db)[1])
2899    }
2900    pub fn rhs(&self, db: &dyn SyntaxGroup) -> Expr {
2901        Expr::from_syntax_node(db, self.node.get_children(db)[2])
2902    }
2903}
2904#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
2905pub struct ExprBinaryPtr(pub SyntaxStablePtrId);
2906impl ExprBinaryPtr {}
2907impl TypedStablePtr for ExprBinaryPtr {
2908    type SyntaxNode = ExprBinary;
2909    fn untyped(&self) -> SyntaxStablePtrId {
2910        self.0
2911    }
2912    fn lookup(&self, db: &dyn SyntaxGroup) -> ExprBinary {
2913        ExprBinary::from_syntax_node(db, self.0.lookup(db))
2914    }
2915}
2916impl From<ExprBinaryPtr> for SyntaxStablePtrId {
2917    fn from(ptr: ExprBinaryPtr) -> Self {
2918        ptr.untyped()
2919    }
2920}
2921#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
2922pub struct ExprBinaryGreen(pub GreenId);
2923impl TypedSyntaxNode for ExprBinary {
2924    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprBinary);
2925    type StablePtr = ExprBinaryPtr;
2926    type Green = ExprBinaryGreen;
2927    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
2928        ExprBinaryGreen(
2929            Arc::new(GreenNode {
2930                kind: SyntaxKind::ExprBinary,
2931                details: GreenNodeDetails::Node {
2932                    children: [
2933                        Expr::missing(db).0,
2934                        BinaryOperator::missing(db).0,
2935                        Expr::missing(db).0,
2936                    ]
2937                    .into(),
2938                    width: TextWidth::default(),
2939                },
2940            })
2941            .intern(db),
2942        )
2943    }
2944    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
2945        let kind = node.kind(db);
2946        assert_eq!(
2947            kind,
2948            SyntaxKind::ExprBinary,
2949            "Unexpected SyntaxKind {:?}. Expected {:?}.",
2950            kind,
2951            SyntaxKind::ExprBinary
2952        );
2953        Self { node }
2954    }
2955    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
2956        let kind = node.kind(db);
2957        if kind == SyntaxKind::ExprBinary { Some(Self::from_syntax_node(db, node)) } else { None }
2958    }
2959    fn as_syntax_node(&self) -> SyntaxNode {
2960        self.node
2961    }
2962    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
2963        ExprBinaryPtr(self.node.stable_ptr(db))
2964    }
2965}
2966#[derive(Clone, Debug, Eq, Hash, PartialEq)]
2967pub enum BinaryOperator {
2968    Dot(TerminalDot),
2969    Not(TerminalNot),
2970    Mul(TerminalMul),
2971    MulEq(TerminalMulEq),
2972    Div(TerminalDiv),
2973    DivEq(TerminalDivEq),
2974    Mod(TerminalMod),
2975    ModEq(TerminalModEq),
2976    Plus(TerminalPlus),
2977    PlusEq(TerminalPlusEq),
2978    Minus(TerminalMinus),
2979    MinusEq(TerminalMinusEq),
2980    EqEq(TerminalEqEq),
2981    Neq(TerminalNeq),
2982    Eq(TerminalEq),
2983    And(TerminalAnd),
2984    AndAnd(TerminalAndAnd),
2985    Or(TerminalOr),
2986    OrOr(TerminalOrOr),
2987    Xor(TerminalXor),
2988    LE(TerminalLE),
2989    GE(TerminalGE),
2990    LT(TerminalLT),
2991    GT(TerminalGT),
2992    DotDot(TerminalDotDot),
2993    DotDotEq(TerminalDotDotEq),
2994}
2995#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
2996pub struct BinaryOperatorPtr(pub SyntaxStablePtrId);
2997impl TypedStablePtr for BinaryOperatorPtr {
2998    type SyntaxNode = BinaryOperator;
2999    fn untyped(&self) -> SyntaxStablePtrId {
3000        self.0
3001    }
3002    fn lookup(&self, db: &dyn SyntaxGroup) -> BinaryOperator {
3003        BinaryOperator::from_syntax_node(db, self.0.lookup(db))
3004    }
3005}
3006impl From<BinaryOperatorPtr> for SyntaxStablePtrId {
3007    fn from(ptr: BinaryOperatorPtr) -> Self {
3008        ptr.untyped()
3009    }
3010}
3011impl From<TerminalDotPtr> for BinaryOperatorPtr {
3012    fn from(value: TerminalDotPtr) -> Self {
3013        Self(value.0)
3014    }
3015}
3016impl From<TerminalNotPtr> for BinaryOperatorPtr {
3017    fn from(value: TerminalNotPtr) -> Self {
3018        Self(value.0)
3019    }
3020}
3021impl From<TerminalMulPtr> for BinaryOperatorPtr {
3022    fn from(value: TerminalMulPtr) -> Self {
3023        Self(value.0)
3024    }
3025}
3026impl From<TerminalMulEqPtr> for BinaryOperatorPtr {
3027    fn from(value: TerminalMulEqPtr) -> Self {
3028        Self(value.0)
3029    }
3030}
3031impl From<TerminalDivPtr> for BinaryOperatorPtr {
3032    fn from(value: TerminalDivPtr) -> Self {
3033        Self(value.0)
3034    }
3035}
3036impl From<TerminalDivEqPtr> for BinaryOperatorPtr {
3037    fn from(value: TerminalDivEqPtr) -> Self {
3038        Self(value.0)
3039    }
3040}
3041impl From<TerminalModPtr> for BinaryOperatorPtr {
3042    fn from(value: TerminalModPtr) -> Self {
3043        Self(value.0)
3044    }
3045}
3046impl From<TerminalModEqPtr> for BinaryOperatorPtr {
3047    fn from(value: TerminalModEqPtr) -> Self {
3048        Self(value.0)
3049    }
3050}
3051impl From<TerminalPlusPtr> for BinaryOperatorPtr {
3052    fn from(value: TerminalPlusPtr) -> Self {
3053        Self(value.0)
3054    }
3055}
3056impl From<TerminalPlusEqPtr> for BinaryOperatorPtr {
3057    fn from(value: TerminalPlusEqPtr) -> Self {
3058        Self(value.0)
3059    }
3060}
3061impl From<TerminalMinusPtr> for BinaryOperatorPtr {
3062    fn from(value: TerminalMinusPtr) -> Self {
3063        Self(value.0)
3064    }
3065}
3066impl From<TerminalMinusEqPtr> for BinaryOperatorPtr {
3067    fn from(value: TerminalMinusEqPtr) -> Self {
3068        Self(value.0)
3069    }
3070}
3071impl From<TerminalEqEqPtr> for BinaryOperatorPtr {
3072    fn from(value: TerminalEqEqPtr) -> Self {
3073        Self(value.0)
3074    }
3075}
3076impl From<TerminalNeqPtr> for BinaryOperatorPtr {
3077    fn from(value: TerminalNeqPtr) -> Self {
3078        Self(value.0)
3079    }
3080}
3081impl From<TerminalEqPtr> for BinaryOperatorPtr {
3082    fn from(value: TerminalEqPtr) -> Self {
3083        Self(value.0)
3084    }
3085}
3086impl From<TerminalAndPtr> for BinaryOperatorPtr {
3087    fn from(value: TerminalAndPtr) -> Self {
3088        Self(value.0)
3089    }
3090}
3091impl From<TerminalAndAndPtr> for BinaryOperatorPtr {
3092    fn from(value: TerminalAndAndPtr) -> Self {
3093        Self(value.0)
3094    }
3095}
3096impl From<TerminalOrPtr> for BinaryOperatorPtr {
3097    fn from(value: TerminalOrPtr) -> Self {
3098        Self(value.0)
3099    }
3100}
3101impl From<TerminalOrOrPtr> for BinaryOperatorPtr {
3102    fn from(value: TerminalOrOrPtr) -> Self {
3103        Self(value.0)
3104    }
3105}
3106impl From<TerminalXorPtr> for BinaryOperatorPtr {
3107    fn from(value: TerminalXorPtr) -> Self {
3108        Self(value.0)
3109    }
3110}
3111impl From<TerminalLEPtr> for BinaryOperatorPtr {
3112    fn from(value: TerminalLEPtr) -> Self {
3113        Self(value.0)
3114    }
3115}
3116impl From<TerminalGEPtr> for BinaryOperatorPtr {
3117    fn from(value: TerminalGEPtr) -> Self {
3118        Self(value.0)
3119    }
3120}
3121impl From<TerminalLTPtr> for BinaryOperatorPtr {
3122    fn from(value: TerminalLTPtr) -> Self {
3123        Self(value.0)
3124    }
3125}
3126impl From<TerminalGTPtr> for BinaryOperatorPtr {
3127    fn from(value: TerminalGTPtr) -> Self {
3128        Self(value.0)
3129    }
3130}
3131impl From<TerminalDotDotPtr> for BinaryOperatorPtr {
3132    fn from(value: TerminalDotDotPtr) -> Self {
3133        Self(value.0)
3134    }
3135}
3136impl From<TerminalDotDotEqPtr> for BinaryOperatorPtr {
3137    fn from(value: TerminalDotDotEqPtr) -> Self {
3138        Self(value.0)
3139    }
3140}
3141impl From<TerminalDotGreen> for BinaryOperatorGreen {
3142    fn from(value: TerminalDotGreen) -> Self {
3143        Self(value.0)
3144    }
3145}
3146impl From<TerminalNotGreen> for BinaryOperatorGreen {
3147    fn from(value: TerminalNotGreen) -> Self {
3148        Self(value.0)
3149    }
3150}
3151impl From<TerminalMulGreen> for BinaryOperatorGreen {
3152    fn from(value: TerminalMulGreen) -> Self {
3153        Self(value.0)
3154    }
3155}
3156impl From<TerminalMulEqGreen> for BinaryOperatorGreen {
3157    fn from(value: TerminalMulEqGreen) -> Self {
3158        Self(value.0)
3159    }
3160}
3161impl From<TerminalDivGreen> for BinaryOperatorGreen {
3162    fn from(value: TerminalDivGreen) -> Self {
3163        Self(value.0)
3164    }
3165}
3166impl From<TerminalDivEqGreen> for BinaryOperatorGreen {
3167    fn from(value: TerminalDivEqGreen) -> Self {
3168        Self(value.0)
3169    }
3170}
3171impl From<TerminalModGreen> for BinaryOperatorGreen {
3172    fn from(value: TerminalModGreen) -> Self {
3173        Self(value.0)
3174    }
3175}
3176impl From<TerminalModEqGreen> for BinaryOperatorGreen {
3177    fn from(value: TerminalModEqGreen) -> Self {
3178        Self(value.0)
3179    }
3180}
3181impl From<TerminalPlusGreen> for BinaryOperatorGreen {
3182    fn from(value: TerminalPlusGreen) -> Self {
3183        Self(value.0)
3184    }
3185}
3186impl From<TerminalPlusEqGreen> for BinaryOperatorGreen {
3187    fn from(value: TerminalPlusEqGreen) -> Self {
3188        Self(value.0)
3189    }
3190}
3191impl From<TerminalMinusGreen> for BinaryOperatorGreen {
3192    fn from(value: TerminalMinusGreen) -> Self {
3193        Self(value.0)
3194    }
3195}
3196impl From<TerminalMinusEqGreen> for BinaryOperatorGreen {
3197    fn from(value: TerminalMinusEqGreen) -> Self {
3198        Self(value.0)
3199    }
3200}
3201impl From<TerminalEqEqGreen> for BinaryOperatorGreen {
3202    fn from(value: TerminalEqEqGreen) -> Self {
3203        Self(value.0)
3204    }
3205}
3206impl From<TerminalNeqGreen> for BinaryOperatorGreen {
3207    fn from(value: TerminalNeqGreen) -> Self {
3208        Self(value.0)
3209    }
3210}
3211impl From<TerminalEqGreen> for BinaryOperatorGreen {
3212    fn from(value: TerminalEqGreen) -> Self {
3213        Self(value.0)
3214    }
3215}
3216impl From<TerminalAndGreen> for BinaryOperatorGreen {
3217    fn from(value: TerminalAndGreen) -> Self {
3218        Self(value.0)
3219    }
3220}
3221impl From<TerminalAndAndGreen> for BinaryOperatorGreen {
3222    fn from(value: TerminalAndAndGreen) -> Self {
3223        Self(value.0)
3224    }
3225}
3226impl From<TerminalOrGreen> for BinaryOperatorGreen {
3227    fn from(value: TerminalOrGreen) -> Self {
3228        Self(value.0)
3229    }
3230}
3231impl From<TerminalOrOrGreen> for BinaryOperatorGreen {
3232    fn from(value: TerminalOrOrGreen) -> Self {
3233        Self(value.0)
3234    }
3235}
3236impl From<TerminalXorGreen> for BinaryOperatorGreen {
3237    fn from(value: TerminalXorGreen) -> Self {
3238        Self(value.0)
3239    }
3240}
3241impl From<TerminalLEGreen> for BinaryOperatorGreen {
3242    fn from(value: TerminalLEGreen) -> Self {
3243        Self(value.0)
3244    }
3245}
3246impl From<TerminalGEGreen> for BinaryOperatorGreen {
3247    fn from(value: TerminalGEGreen) -> Self {
3248        Self(value.0)
3249    }
3250}
3251impl From<TerminalLTGreen> for BinaryOperatorGreen {
3252    fn from(value: TerminalLTGreen) -> Self {
3253        Self(value.0)
3254    }
3255}
3256impl From<TerminalGTGreen> for BinaryOperatorGreen {
3257    fn from(value: TerminalGTGreen) -> Self {
3258        Self(value.0)
3259    }
3260}
3261impl From<TerminalDotDotGreen> for BinaryOperatorGreen {
3262    fn from(value: TerminalDotDotGreen) -> Self {
3263        Self(value.0)
3264    }
3265}
3266impl From<TerminalDotDotEqGreen> for BinaryOperatorGreen {
3267    fn from(value: TerminalDotDotEqGreen) -> Self {
3268        Self(value.0)
3269    }
3270}
3271#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
3272pub struct BinaryOperatorGreen(pub GreenId);
3273impl TypedSyntaxNode for BinaryOperator {
3274    const OPTIONAL_KIND: Option<SyntaxKind> = None;
3275    type StablePtr = BinaryOperatorPtr;
3276    type Green = BinaryOperatorGreen;
3277    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
3278        panic!("No missing variant.");
3279    }
3280    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
3281        let kind = node.kind(db);
3282        match kind {
3283            SyntaxKind::TerminalDot => BinaryOperator::Dot(TerminalDot::from_syntax_node(db, node)),
3284            SyntaxKind::TerminalNot => BinaryOperator::Not(TerminalNot::from_syntax_node(db, node)),
3285            SyntaxKind::TerminalMul => BinaryOperator::Mul(TerminalMul::from_syntax_node(db, node)),
3286            SyntaxKind::TerminalMulEq => {
3287                BinaryOperator::MulEq(TerminalMulEq::from_syntax_node(db, node))
3288            }
3289            SyntaxKind::TerminalDiv => BinaryOperator::Div(TerminalDiv::from_syntax_node(db, node)),
3290            SyntaxKind::TerminalDivEq => {
3291                BinaryOperator::DivEq(TerminalDivEq::from_syntax_node(db, node))
3292            }
3293            SyntaxKind::TerminalMod => BinaryOperator::Mod(TerminalMod::from_syntax_node(db, node)),
3294            SyntaxKind::TerminalModEq => {
3295                BinaryOperator::ModEq(TerminalModEq::from_syntax_node(db, node))
3296            }
3297            SyntaxKind::TerminalPlus => {
3298                BinaryOperator::Plus(TerminalPlus::from_syntax_node(db, node))
3299            }
3300            SyntaxKind::TerminalPlusEq => {
3301                BinaryOperator::PlusEq(TerminalPlusEq::from_syntax_node(db, node))
3302            }
3303            SyntaxKind::TerminalMinus => {
3304                BinaryOperator::Minus(TerminalMinus::from_syntax_node(db, node))
3305            }
3306            SyntaxKind::TerminalMinusEq => {
3307                BinaryOperator::MinusEq(TerminalMinusEq::from_syntax_node(db, node))
3308            }
3309            SyntaxKind::TerminalEqEq => {
3310                BinaryOperator::EqEq(TerminalEqEq::from_syntax_node(db, node))
3311            }
3312            SyntaxKind::TerminalNeq => BinaryOperator::Neq(TerminalNeq::from_syntax_node(db, node)),
3313            SyntaxKind::TerminalEq => BinaryOperator::Eq(TerminalEq::from_syntax_node(db, node)),
3314            SyntaxKind::TerminalAnd => BinaryOperator::And(TerminalAnd::from_syntax_node(db, node)),
3315            SyntaxKind::TerminalAndAnd => {
3316                BinaryOperator::AndAnd(TerminalAndAnd::from_syntax_node(db, node))
3317            }
3318            SyntaxKind::TerminalOr => BinaryOperator::Or(TerminalOr::from_syntax_node(db, node)),
3319            SyntaxKind::TerminalOrOr => {
3320                BinaryOperator::OrOr(TerminalOrOr::from_syntax_node(db, node))
3321            }
3322            SyntaxKind::TerminalXor => BinaryOperator::Xor(TerminalXor::from_syntax_node(db, node)),
3323            SyntaxKind::TerminalLE => BinaryOperator::LE(TerminalLE::from_syntax_node(db, node)),
3324            SyntaxKind::TerminalGE => BinaryOperator::GE(TerminalGE::from_syntax_node(db, node)),
3325            SyntaxKind::TerminalLT => BinaryOperator::LT(TerminalLT::from_syntax_node(db, node)),
3326            SyntaxKind::TerminalGT => BinaryOperator::GT(TerminalGT::from_syntax_node(db, node)),
3327            SyntaxKind::TerminalDotDot => {
3328                BinaryOperator::DotDot(TerminalDotDot::from_syntax_node(db, node))
3329            }
3330            SyntaxKind::TerminalDotDotEq => {
3331                BinaryOperator::DotDotEq(TerminalDotDotEq::from_syntax_node(db, node))
3332            }
3333            _ => {
3334                panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "BinaryOperator")
3335            }
3336        }
3337    }
3338    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
3339        let kind = node.kind(db);
3340        match kind {
3341            SyntaxKind::TerminalDot => {
3342                Some(BinaryOperator::Dot(TerminalDot::from_syntax_node(db, node)))
3343            }
3344            SyntaxKind::TerminalNot => {
3345                Some(BinaryOperator::Not(TerminalNot::from_syntax_node(db, node)))
3346            }
3347            SyntaxKind::TerminalMul => {
3348                Some(BinaryOperator::Mul(TerminalMul::from_syntax_node(db, node)))
3349            }
3350            SyntaxKind::TerminalMulEq => {
3351                Some(BinaryOperator::MulEq(TerminalMulEq::from_syntax_node(db, node)))
3352            }
3353            SyntaxKind::TerminalDiv => {
3354                Some(BinaryOperator::Div(TerminalDiv::from_syntax_node(db, node)))
3355            }
3356            SyntaxKind::TerminalDivEq => {
3357                Some(BinaryOperator::DivEq(TerminalDivEq::from_syntax_node(db, node)))
3358            }
3359            SyntaxKind::TerminalMod => {
3360                Some(BinaryOperator::Mod(TerminalMod::from_syntax_node(db, node)))
3361            }
3362            SyntaxKind::TerminalModEq => {
3363                Some(BinaryOperator::ModEq(TerminalModEq::from_syntax_node(db, node)))
3364            }
3365            SyntaxKind::TerminalPlus => {
3366                Some(BinaryOperator::Plus(TerminalPlus::from_syntax_node(db, node)))
3367            }
3368            SyntaxKind::TerminalPlusEq => {
3369                Some(BinaryOperator::PlusEq(TerminalPlusEq::from_syntax_node(db, node)))
3370            }
3371            SyntaxKind::TerminalMinus => {
3372                Some(BinaryOperator::Minus(TerminalMinus::from_syntax_node(db, node)))
3373            }
3374            SyntaxKind::TerminalMinusEq => {
3375                Some(BinaryOperator::MinusEq(TerminalMinusEq::from_syntax_node(db, node)))
3376            }
3377            SyntaxKind::TerminalEqEq => {
3378                Some(BinaryOperator::EqEq(TerminalEqEq::from_syntax_node(db, node)))
3379            }
3380            SyntaxKind::TerminalNeq => {
3381                Some(BinaryOperator::Neq(TerminalNeq::from_syntax_node(db, node)))
3382            }
3383            SyntaxKind::TerminalEq => {
3384                Some(BinaryOperator::Eq(TerminalEq::from_syntax_node(db, node)))
3385            }
3386            SyntaxKind::TerminalAnd => {
3387                Some(BinaryOperator::And(TerminalAnd::from_syntax_node(db, node)))
3388            }
3389            SyntaxKind::TerminalAndAnd => {
3390                Some(BinaryOperator::AndAnd(TerminalAndAnd::from_syntax_node(db, node)))
3391            }
3392            SyntaxKind::TerminalOr => {
3393                Some(BinaryOperator::Or(TerminalOr::from_syntax_node(db, node)))
3394            }
3395            SyntaxKind::TerminalOrOr => {
3396                Some(BinaryOperator::OrOr(TerminalOrOr::from_syntax_node(db, node)))
3397            }
3398            SyntaxKind::TerminalXor => {
3399                Some(BinaryOperator::Xor(TerminalXor::from_syntax_node(db, node)))
3400            }
3401            SyntaxKind::TerminalLE => {
3402                Some(BinaryOperator::LE(TerminalLE::from_syntax_node(db, node)))
3403            }
3404            SyntaxKind::TerminalGE => {
3405                Some(BinaryOperator::GE(TerminalGE::from_syntax_node(db, node)))
3406            }
3407            SyntaxKind::TerminalLT => {
3408                Some(BinaryOperator::LT(TerminalLT::from_syntax_node(db, node)))
3409            }
3410            SyntaxKind::TerminalGT => {
3411                Some(BinaryOperator::GT(TerminalGT::from_syntax_node(db, node)))
3412            }
3413            SyntaxKind::TerminalDotDot => {
3414                Some(BinaryOperator::DotDot(TerminalDotDot::from_syntax_node(db, node)))
3415            }
3416            SyntaxKind::TerminalDotDotEq => {
3417                Some(BinaryOperator::DotDotEq(TerminalDotDotEq::from_syntax_node(db, node)))
3418            }
3419            _ => None,
3420        }
3421    }
3422    fn as_syntax_node(&self) -> SyntaxNode {
3423        match self {
3424            BinaryOperator::Dot(x) => x.as_syntax_node(),
3425            BinaryOperator::Not(x) => x.as_syntax_node(),
3426            BinaryOperator::Mul(x) => x.as_syntax_node(),
3427            BinaryOperator::MulEq(x) => x.as_syntax_node(),
3428            BinaryOperator::Div(x) => x.as_syntax_node(),
3429            BinaryOperator::DivEq(x) => x.as_syntax_node(),
3430            BinaryOperator::Mod(x) => x.as_syntax_node(),
3431            BinaryOperator::ModEq(x) => x.as_syntax_node(),
3432            BinaryOperator::Plus(x) => x.as_syntax_node(),
3433            BinaryOperator::PlusEq(x) => x.as_syntax_node(),
3434            BinaryOperator::Minus(x) => x.as_syntax_node(),
3435            BinaryOperator::MinusEq(x) => x.as_syntax_node(),
3436            BinaryOperator::EqEq(x) => x.as_syntax_node(),
3437            BinaryOperator::Neq(x) => x.as_syntax_node(),
3438            BinaryOperator::Eq(x) => x.as_syntax_node(),
3439            BinaryOperator::And(x) => x.as_syntax_node(),
3440            BinaryOperator::AndAnd(x) => x.as_syntax_node(),
3441            BinaryOperator::Or(x) => x.as_syntax_node(),
3442            BinaryOperator::OrOr(x) => x.as_syntax_node(),
3443            BinaryOperator::Xor(x) => x.as_syntax_node(),
3444            BinaryOperator::LE(x) => x.as_syntax_node(),
3445            BinaryOperator::GE(x) => x.as_syntax_node(),
3446            BinaryOperator::LT(x) => x.as_syntax_node(),
3447            BinaryOperator::GT(x) => x.as_syntax_node(),
3448            BinaryOperator::DotDot(x) => x.as_syntax_node(),
3449            BinaryOperator::DotDotEq(x) => x.as_syntax_node(),
3450        }
3451    }
3452    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
3453        BinaryOperatorPtr(self.as_syntax_node().lookup_intern(db).stable_ptr)
3454    }
3455}
3456impl BinaryOperator {
3457    /// Checks if a kind of a variant of [BinaryOperator].
3458    pub fn is_variant(kind: SyntaxKind) -> bool {
3459        matches!(
3460            kind,
3461            SyntaxKind::TerminalDot
3462                | SyntaxKind::TerminalNot
3463                | SyntaxKind::TerminalMul
3464                | SyntaxKind::TerminalMulEq
3465                | SyntaxKind::TerminalDiv
3466                | SyntaxKind::TerminalDivEq
3467                | SyntaxKind::TerminalMod
3468                | SyntaxKind::TerminalModEq
3469                | SyntaxKind::TerminalPlus
3470                | SyntaxKind::TerminalPlusEq
3471                | SyntaxKind::TerminalMinus
3472                | SyntaxKind::TerminalMinusEq
3473                | SyntaxKind::TerminalEqEq
3474                | SyntaxKind::TerminalNeq
3475                | SyntaxKind::TerminalEq
3476                | SyntaxKind::TerminalAnd
3477                | SyntaxKind::TerminalAndAnd
3478                | SyntaxKind::TerminalOr
3479                | SyntaxKind::TerminalOrOr
3480                | SyntaxKind::TerminalXor
3481                | SyntaxKind::TerminalLE
3482                | SyntaxKind::TerminalGE
3483                | SyntaxKind::TerminalLT
3484                | SyntaxKind::TerminalGT
3485                | SyntaxKind::TerminalDotDot
3486                | SyntaxKind::TerminalDotDotEq
3487        )
3488    }
3489}
3490#[derive(Clone, Debug, Eq, Hash, PartialEq)]
3491pub struct ExprListParenthesized {
3492    node: SyntaxNode,
3493}
3494impl ExprListParenthesized {
3495    pub const INDEX_LPAREN: usize = 0;
3496    pub const INDEX_EXPRESSIONS: usize = 1;
3497    pub const INDEX_RPAREN: usize = 2;
3498    pub fn new_green(
3499        db: &dyn SyntaxGroup,
3500        lparen: TerminalLParenGreen,
3501        expressions: ExprListGreen,
3502        rparen: TerminalRParenGreen,
3503    ) -> ExprListParenthesizedGreen {
3504        let children = [lparen.0, expressions.0, rparen.0];
3505        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
3506        ExprListParenthesizedGreen(
3507            Arc::new(GreenNode {
3508                kind: SyntaxKind::ExprListParenthesized,
3509                details: GreenNodeDetails::Node { children: children.into(), width },
3510            })
3511            .intern(db),
3512        )
3513    }
3514}
3515impl ExprListParenthesized {
3516    pub fn lparen(&self, db: &dyn SyntaxGroup) -> TerminalLParen {
3517        TerminalLParen::from_syntax_node(db, self.node.get_children(db)[0])
3518    }
3519    pub fn expressions(&self, db: &dyn SyntaxGroup) -> ExprList {
3520        ExprList::from_syntax_node(db, self.node.get_children(db)[1])
3521    }
3522    pub fn rparen(&self, db: &dyn SyntaxGroup) -> TerminalRParen {
3523        TerminalRParen::from_syntax_node(db, self.node.get_children(db)[2])
3524    }
3525}
3526#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
3527pub struct ExprListParenthesizedPtr(pub SyntaxStablePtrId);
3528impl ExprListParenthesizedPtr {}
3529impl TypedStablePtr for ExprListParenthesizedPtr {
3530    type SyntaxNode = ExprListParenthesized;
3531    fn untyped(&self) -> SyntaxStablePtrId {
3532        self.0
3533    }
3534    fn lookup(&self, db: &dyn SyntaxGroup) -> ExprListParenthesized {
3535        ExprListParenthesized::from_syntax_node(db, self.0.lookup(db))
3536    }
3537}
3538impl From<ExprListParenthesizedPtr> for SyntaxStablePtrId {
3539    fn from(ptr: ExprListParenthesizedPtr) -> Self {
3540        ptr.untyped()
3541    }
3542}
3543#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
3544pub struct ExprListParenthesizedGreen(pub GreenId);
3545impl TypedSyntaxNode for ExprListParenthesized {
3546    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprListParenthesized);
3547    type StablePtr = ExprListParenthesizedPtr;
3548    type Green = ExprListParenthesizedGreen;
3549    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
3550        ExprListParenthesizedGreen(
3551            Arc::new(GreenNode {
3552                kind: SyntaxKind::ExprListParenthesized,
3553                details: GreenNodeDetails::Node {
3554                    children: [
3555                        TerminalLParen::missing(db).0,
3556                        ExprList::missing(db).0,
3557                        TerminalRParen::missing(db).0,
3558                    ]
3559                    .into(),
3560                    width: TextWidth::default(),
3561                },
3562            })
3563            .intern(db),
3564        )
3565    }
3566    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
3567        let kind = node.kind(db);
3568        assert_eq!(
3569            kind,
3570            SyntaxKind::ExprListParenthesized,
3571            "Unexpected SyntaxKind {:?}. Expected {:?}.",
3572            kind,
3573            SyntaxKind::ExprListParenthesized
3574        );
3575        Self { node }
3576    }
3577    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
3578        let kind = node.kind(db);
3579        if kind == SyntaxKind::ExprListParenthesized {
3580            Some(Self::from_syntax_node(db, node))
3581        } else {
3582            None
3583        }
3584    }
3585    fn as_syntax_node(&self) -> SyntaxNode {
3586        self.node
3587    }
3588    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
3589        ExprListParenthesizedPtr(self.node.stable_ptr(db))
3590    }
3591}
3592#[derive(Clone, Debug, Eq, Hash, PartialEq)]
3593pub struct ExprFunctionCall {
3594    node: SyntaxNode,
3595}
3596impl ExprFunctionCall {
3597    pub const INDEX_PATH: usize = 0;
3598    pub const INDEX_ARGUMENTS: usize = 1;
3599    pub fn new_green(
3600        db: &dyn SyntaxGroup,
3601        path: ExprPathGreen,
3602        arguments: ArgListParenthesizedGreen,
3603    ) -> ExprFunctionCallGreen {
3604        let children = [path.0, arguments.0];
3605        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
3606        ExprFunctionCallGreen(
3607            Arc::new(GreenNode {
3608                kind: SyntaxKind::ExprFunctionCall,
3609                details: GreenNodeDetails::Node { children: children.into(), width },
3610            })
3611            .intern(db),
3612        )
3613    }
3614}
3615impl ExprFunctionCall {
3616    pub fn path(&self, db: &dyn SyntaxGroup) -> ExprPath {
3617        ExprPath::from_syntax_node(db, self.node.get_children(db)[0])
3618    }
3619    pub fn arguments(&self, db: &dyn SyntaxGroup) -> ArgListParenthesized {
3620        ArgListParenthesized::from_syntax_node(db, self.node.get_children(db)[1])
3621    }
3622}
3623#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
3624pub struct ExprFunctionCallPtr(pub SyntaxStablePtrId);
3625impl ExprFunctionCallPtr {}
3626impl TypedStablePtr for ExprFunctionCallPtr {
3627    type SyntaxNode = ExprFunctionCall;
3628    fn untyped(&self) -> SyntaxStablePtrId {
3629        self.0
3630    }
3631    fn lookup(&self, db: &dyn SyntaxGroup) -> ExprFunctionCall {
3632        ExprFunctionCall::from_syntax_node(db, self.0.lookup(db))
3633    }
3634}
3635impl From<ExprFunctionCallPtr> for SyntaxStablePtrId {
3636    fn from(ptr: ExprFunctionCallPtr) -> Self {
3637        ptr.untyped()
3638    }
3639}
3640#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
3641pub struct ExprFunctionCallGreen(pub GreenId);
3642impl TypedSyntaxNode for ExprFunctionCall {
3643    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprFunctionCall);
3644    type StablePtr = ExprFunctionCallPtr;
3645    type Green = ExprFunctionCallGreen;
3646    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
3647        ExprFunctionCallGreen(
3648            Arc::new(GreenNode {
3649                kind: SyntaxKind::ExprFunctionCall,
3650                details: GreenNodeDetails::Node {
3651                    children: [ExprPath::missing(db).0, ArgListParenthesized::missing(db).0].into(),
3652                    width: TextWidth::default(),
3653                },
3654            })
3655            .intern(db),
3656        )
3657    }
3658    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
3659        let kind = node.kind(db);
3660        assert_eq!(
3661            kind,
3662            SyntaxKind::ExprFunctionCall,
3663            "Unexpected SyntaxKind {:?}. Expected {:?}.",
3664            kind,
3665            SyntaxKind::ExprFunctionCall
3666        );
3667        Self { node }
3668    }
3669    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
3670        let kind = node.kind(db);
3671        if kind == SyntaxKind::ExprFunctionCall {
3672            Some(Self::from_syntax_node(db, node))
3673        } else {
3674            None
3675        }
3676    }
3677    fn as_syntax_node(&self) -> SyntaxNode {
3678        self.node
3679    }
3680    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
3681        ExprFunctionCallPtr(self.node.stable_ptr(db))
3682    }
3683}
3684#[derive(Clone, Debug, Eq, Hash, PartialEq)]
3685pub struct ArgListParenthesized {
3686    node: SyntaxNode,
3687}
3688impl ArgListParenthesized {
3689    pub const INDEX_LPAREN: usize = 0;
3690    pub const INDEX_ARGUMENTS: usize = 1;
3691    pub const INDEX_RPAREN: usize = 2;
3692    pub fn new_green(
3693        db: &dyn SyntaxGroup,
3694        lparen: TerminalLParenGreen,
3695        arguments: ArgListGreen,
3696        rparen: TerminalRParenGreen,
3697    ) -> ArgListParenthesizedGreen {
3698        let children = [lparen.0, arguments.0, rparen.0];
3699        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
3700        ArgListParenthesizedGreen(
3701            Arc::new(GreenNode {
3702                kind: SyntaxKind::ArgListParenthesized,
3703                details: GreenNodeDetails::Node { children: children.into(), width },
3704            })
3705            .intern(db),
3706        )
3707    }
3708}
3709impl ArgListParenthesized {
3710    pub fn lparen(&self, db: &dyn SyntaxGroup) -> TerminalLParen {
3711        TerminalLParen::from_syntax_node(db, self.node.get_children(db)[0])
3712    }
3713    pub fn arguments(&self, db: &dyn SyntaxGroup) -> ArgList {
3714        ArgList::from_syntax_node(db, self.node.get_children(db)[1])
3715    }
3716    pub fn rparen(&self, db: &dyn SyntaxGroup) -> TerminalRParen {
3717        TerminalRParen::from_syntax_node(db, self.node.get_children(db)[2])
3718    }
3719}
3720#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
3721pub struct ArgListParenthesizedPtr(pub SyntaxStablePtrId);
3722impl ArgListParenthesizedPtr {}
3723impl TypedStablePtr for ArgListParenthesizedPtr {
3724    type SyntaxNode = ArgListParenthesized;
3725    fn untyped(&self) -> SyntaxStablePtrId {
3726        self.0
3727    }
3728    fn lookup(&self, db: &dyn SyntaxGroup) -> ArgListParenthesized {
3729        ArgListParenthesized::from_syntax_node(db, self.0.lookup(db))
3730    }
3731}
3732impl From<ArgListParenthesizedPtr> for SyntaxStablePtrId {
3733    fn from(ptr: ArgListParenthesizedPtr) -> Self {
3734        ptr.untyped()
3735    }
3736}
3737#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
3738pub struct ArgListParenthesizedGreen(pub GreenId);
3739impl TypedSyntaxNode for ArgListParenthesized {
3740    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ArgListParenthesized);
3741    type StablePtr = ArgListParenthesizedPtr;
3742    type Green = ArgListParenthesizedGreen;
3743    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
3744        ArgListParenthesizedGreen(
3745            Arc::new(GreenNode {
3746                kind: SyntaxKind::ArgListParenthesized,
3747                details: GreenNodeDetails::Node {
3748                    children: [
3749                        TerminalLParen::missing(db).0,
3750                        ArgList::missing(db).0,
3751                        TerminalRParen::missing(db).0,
3752                    ]
3753                    .into(),
3754                    width: TextWidth::default(),
3755                },
3756            })
3757            .intern(db),
3758        )
3759    }
3760    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
3761        let kind = node.kind(db);
3762        assert_eq!(
3763            kind,
3764            SyntaxKind::ArgListParenthesized,
3765            "Unexpected SyntaxKind {:?}. Expected {:?}.",
3766            kind,
3767            SyntaxKind::ArgListParenthesized
3768        );
3769        Self { node }
3770    }
3771    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
3772        let kind = node.kind(db);
3773        if kind == SyntaxKind::ArgListParenthesized {
3774            Some(Self::from_syntax_node(db, node))
3775        } else {
3776            None
3777        }
3778    }
3779    fn as_syntax_node(&self) -> SyntaxNode {
3780        self.node
3781    }
3782    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
3783        ArgListParenthesizedPtr(self.node.stable_ptr(db))
3784    }
3785}
3786#[derive(Clone, Debug, Eq, Hash, PartialEq)]
3787pub enum OptionArgListParenthesized {
3788    Empty(OptionArgListParenthesizedEmpty),
3789    ArgListParenthesized(ArgListParenthesized),
3790}
3791#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
3792pub struct OptionArgListParenthesizedPtr(pub SyntaxStablePtrId);
3793impl TypedStablePtr for OptionArgListParenthesizedPtr {
3794    type SyntaxNode = OptionArgListParenthesized;
3795    fn untyped(&self) -> SyntaxStablePtrId {
3796        self.0
3797    }
3798    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionArgListParenthesized {
3799        OptionArgListParenthesized::from_syntax_node(db, self.0.lookup(db))
3800    }
3801}
3802impl From<OptionArgListParenthesizedPtr> for SyntaxStablePtrId {
3803    fn from(ptr: OptionArgListParenthesizedPtr) -> Self {
3804        ptr.untyped()
3805    }
3806}
3807impl From<OptionArgListParenthesizedEmptyPtr> for OptionArgListParenthesizedPtr {
3808    fn from(value: OptionArgListParenthesizedEmptyPtr) -> Self {
3809        Self(value.0)
3810    }
3811}
3812impl From<ArgListParenthesizedPtr> for OptionArgListParenthesizedPtr {
3813    fn from(value: ArgListParenthesizedPtr) -> Self {
3814        Self(value.0)
3815    }
3816}
3817impl From<OptionArgListParenthesizedEmptyGreen> for OptionArgListParenthesizedGreen {
3818    fn from(value: OptionArgListParenthesizedEmptyGreen) -> Self {
3819        Self(value.0)
3820    }
3821}
3822impl From<ArgListParenthesizedGreen> for OptionArgListParenthesizedGreen {
3823    fn from(value: ArgListParenthesizedGreen) -> Self {
3824        Self(value.0)
3825    }
3826}
3827#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
3828pub struct OptionArgListParenthesizedGreen(pub GreenId);
3829impl TypedSyntaxNode for OptionArgListParenthesized {
3830    const OPTIONAL_KIND: Option<SyntaxKind> = None;
3831    type StablePtr = OptionArgListParenthesizedPtr;
3832    type Green = OptionArgListParenthesizedGreen;
3833    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
3834        panic!("No missing variant.");
3835    }
3836    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
3837        let kind = node.kind(db);
3838        match kind {
3839            SyntaxKind::OptionArgListParenthesizedEmpty => OptionArgListParenthesized::Empty(
3840                OptionArgListParenthesizedEmpty::from_syntax_node(db, node),
3841            ),
3842            SyntaxKind::ArgListParenthesized => OptionArgListParenthesized::ArgListParenthesized(
3843                ArgListParenthesized::from_syntax_node(db, node),
3844            ),
3845            _ => panic!(
3846                "Unexpected syntax kind {:?} when constructing {}.",
3847                kind, "OptionArgListParenthesized"
3848            ),
3849        }
3850    }
3851    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
3852        let kind = node.kind(db);
3853        match kind {
3854            SyntaxKind::OptionArgListParenthesizedEmpty => Some(OptionArgListParenthesized::Empty(
3855                OptionArgListParenthesizedEmpty::from_syntax_node(db, node),
3856            )),
3857            SyntaxKind::ArgListParenthesized => {
3858                Some(OptionArgListParenthesized::ArgListParenthesized(
3859                    ArgListParenthesized::from_syntax_node(db, node),
3860                ))
3861            }
3862            _ => None,
3863        }
3864    }
3865    fn as_syntax_node(&self) -> SyntaxNode {
3866        match self {
3867            OptionArgListParenthesized::Empty(x) => x.as_syntax_node(),
3868            OptionArgListParenthesized::ArgListParenthesized(x) => x.as_syntax_node(),
3869        }
3870    }
3871    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
3872        OptionArgListParenthesizedPtr(self.as_syntax_node().lookup_intern(db).stable_ptr)
3873    }
3874}
3875impl OptionArgListParenthesized {
3876    /// Checks if a kind of a variant of [OptionArgListParenthesized].
3877    pub fn is_variant(kind: SyntaxKind) -> bool {
3878        matches!(
3879            kind,
3880            SyntaxKind::OptionArgListParenthesizedEmpty | SyntaxKind::ArgListParenthesized
3881        )
3882    }
3883}
3884#[derive(Clone, Debug, Eq, Hash, PartialEq)]
3885pub struct OptionArgListParenthesizedEmpty {
3886    node: SyntaxNode,
3887}
3888impl OptionArgListParenthesizedEmpty {
3889    pub fn new_green(db: &dyn SyntaxGroup) -> OptionArgListParenthesizedEmptyGreen {
3890        let children = [];
3891        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
3892        OptionArgListParenthesizedEmptyGreen(
3893            Arc::new(GreenNode {
3894                kind: SyntaxKind::OptionArgListParenthesizedEmpty,
3895                details: GreenNodeDetails::Node { children: children.into(), width },
3896            })
3897            .intern(db),
3898        )
3899    }
3900}
3901impl OptionArgListParenthesizedEmpty {}
3902#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
3903pub struct OptionArgListParenthesizedEmptyPtr(pub SyntaxStablePtrId);
3904impl OptionArgListParenthesizedEmptyPtr {}
3905impl TypedStablePtr for OptionArgListParenthesizedEmptyPtr {
3906    type SyntaxNode = OptionArgListParenthesizedEmpty;
3907    fn untyped(&self) -> SyntaxStablePtrId {
3908        self.0
3909    }
3910    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionArgListParenthesizedEmpty {
3911        OptionArgListParenthesizedEmpty::from_syntax_node(db, self.0.lookup(db))
3912    }
3913}
3914impl From<OptionArgListParenthesizedEmptyPtr> for SyntaxStablePtrId {
3915    fn from(ptr: OptionArgListParenthesizedEmptyPtr) -> Self {
3916        ptr.untyped()
3917    }
3918}
3919#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
3920pub struct OptionArgListParenthesizedEmptyGreen(pub GreenId);
3921impl TypedSyntaxNode for OptionArgListParenthesizedEmpty {
3922    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionArgListParenthesizedEmpty);
3923    type StablePtr = OptionArgListParenthesizedEmptyPtr;
3924    type Green = OptionArgListParenthesizedEmptyGreen;
3925    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
3926        OptionArgListParenthesizedEmptyGreen(
3927            Arc::new(GreenNode {
3928                kind: SyntaxKind::OptionArgListParenthesizedEmpty,
3929                details: GreenNodeDetails::Node {
3930                    children: [].into(),
3931                    width: TextWidth::default(),
3932                },
3933            })
3934            .intern(db),
3935        )
3936    }
3937    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
3938        let kind = node.kind(db);
3939        assert_eq!(
3940            kind,
3941            SyntaxKind::OptionArgListParenthesizedEmpty,
3942            "Unexpected SyntaxKind {:?}. Expected {:?}.",
3943            kind,
3944            SyntaxKind::OptionArgListParenthesizedEmpty
3945        );
3946        Self { node }
3947    }
3948    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
3949        let kind = node.kind(db);
3950        if kind == SyntaxKind::OptionArgListParenthesizedEmpty {
3951            Some(Self::from_syntax_node(db, node))
3952        } else {
3953            None
3954        }
3955    }
3956    fn as_syntax_node(&self) -> SyntaxNode {
3957        self.node
3958    }
3959    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
3960        OptionArgListParenthesizedEmptyPtr(self.node.stable_ptr(db))
3961    }
3962}
3963#[derive(Clone, Debug, Eq, Hash, PartialEq)]
3964pub struct ExprStructCtorCall {
3965    node: SyntaxNode,
3966}
3967impl ExprStructCtorCall {
3968    pub const INDEX_PATH: usize = 0;
3969    pub const INDEX_ARGUMENTS: usize = 1;
3970    pub fn new_green(
3971        db: &dyn SyntaxGroup,
3972        path: ExprPathGreen,
3973        arguments: StructArgListBracedGreen,
3974    ) -> ExprStructCtorCallGreen {
3975        let children = [path.0, arguments.0];
3976        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
3977        ExprStructCtorCallGreen(
3978            Arc::new(GreenNode {
3979                kind: SyntaxKind::ExprStructCtorCall,
3980                details: GreenNodeDetails::Node { children: children.into(), width },
3981            })
3982            .intern(db),
3983        )
3984    }
3985}
3986impl ExprStructCtorCall {
3987    pub fn path(&self, db: &dyn SyntaxGroup) -> ExprPath {
3988        ExprPath::from_syntax_node(db, self.node.get_children(db)[0])
3989    }
3990    pub fn arguments(&self, db: &dyn SyntaxGroup) -> StructArgListBraced {
3991        StructArgListBraced::from_syntax_node(db, self.node.get_children(db)[1])
3992    }
3993}
3994#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
3995pub struct ExprStructCtorCallPtr(pub SyntaxStablePtrId);
3996impl ExprStructCtorCallPtr {}
3997impl TypedStablePtr for ExprStructCtorCallPtr {
3998    type SyntaxNode = ExprStructCtorCall;
3999    fn untyped(&self) -> SyntaxStablePtrId {
4000        self.0
4001    }
4002    fn lookup(&self, db: &dyn SyntaxGroup) -> ExprStructCtorCall {
4003        ExprStructCtorCall::from_syntax_node(db, self.0.lookup(db))
4004    }
4005}
4006impl From<ExprStructCtorCallPtr> for SyntaxStablePtrId {
4007    fn from(ptr: ExprStructCtorCallPtr) -> Self {
4008        ptr.untyped()
4009    }
4010}
4011#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
4012pub struct ExprStructCtorCallGreen(pub GreenId);
4013impl TypedSyntaxNode for ExprStructCtorCall {
4014    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprStructCtorCall);
4015    type StablePtr = ExprStructCtorCallPtr;
4016    type Green = ExprStructCtorCallGreen;
4017    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
4018        ExprStructCtorCallGreen(
4019            Arc::new(GreenNode {
4020                kind: SyntaxKind::ExprStructCtorCall,
4021                details: GreenNodeDetails::Node {
4022                    children: [ExprPath::missing(db).0, StructArgListBraced::missing(db).0].into(),
4023                    width: TextWidth::default(),
4024                },
4025            })
4026            .intern(db),
4027        )
4028    }
4029    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
4030        let kind = node.kind(db);
4031        assert_eq!(
4032            kind,
4033            SyntaxKind::ExprStructCtorCall,
4034            "Unexpected SyntaxKind {:?}. Expected {:?}.",
4035            kind,
4036            SyntaxKind::ExprStructCtorCall
4037        );
4038        Self { node }
4039    }
4040    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
4041        let kind = node.kind(db);
4042        if kind == SyntaxKind::ExprStructCtorCall {
4043            Some(Self::from_syntax_node(db, node))
4044        } else {
4045            None
4046        }
4047    }
4048    fn as_syntax_node(&self) -> SyntaxNode {
4049        self.node
4050    }
4051    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
4052        ExprStructCtorCallPtr(self.node.stable_ptr(db))
4053    }
4054}
4055#[derive(Clone, Debug, Eq, Hash, PartialEq)]
4056pub struct StructArgListBraced {
4057    node: SyntaxNode,
4058}
4059impl StructArgListBraced {
4060    pub const INDEX_LBRACE: usize = 0;
4061    pub const INDEX_ARGUMENTS: usize = 1;
4062    pub const INDEX_RBRACE: usize = 2;
4063    pub fn new_green(
4064        db: &dyn SyntaxGroup,
4065        lbrace: TerminalLBraceGreen,
4066        arguments: StructArgListGreen,
4067        rbrace: TerminalRBraceGreen,
4068    ) -> StructArgListBracedGreen {
4069        let children = [lbrace.0, arguments.0, rbrace.0];
4070        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
4071        StructArgListBracedGreen(
4072            Arc::new(GreenNode {
4073                kind: SyntaxKind::StructArgListBraced,
4074                details: GreenNodeDetails::Node { children: children.into(), width },
4075            })
4076            .intern(db),
4077        )
4078    }
4079}
4080impl StructArgListBraced {
4081    pub fn lbrace(&self, db: &dyn SyntaxGroup) -> TerminalLBrace {
4082        TerminalLBrace::from_syntax_node(db, self.node.get_children(db)[0])
4083    }
4084    pub fn arguments(&self, db: &dyn SyntaxGroup) -> StructArgList {
4085        StructArgList::from_syntax_node(db, self.node.get_children(db)[1])
4086    }
4087    pub fn rbrace(&self, db: &dyn SyntaxGroup) -> TerminalRBrace {
4088        TerminalRBrace::from_syntax_node(db, self.node.get_children(db)[2])
4089    }
4090}
4091#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
4092pub struct StructArgListBracedPtr(pub SyntaxStablePtrId);
4093impl StructArgListBracedPtr {}
4094impl TypedStablePtr for StructArgListBracedPtr {
4095    type SyntaxNode = StructArgListBraced;
4096    fn untyped(&self) -> SyntaxStablePtrId {
4097        self.0
4098    }
4099    fn lookup(&self, db: &dyn SyntaxGroup) -> StructArgListBraced {
4100        StructArgListBraced::from_syntax_node(db, self.0.lookup(db))
4101    }
4102}
4103impl From<StructArgListBracedPtr> for SyntaxStablePtrId {
4104    fn from(ptr: StructArgListBracedPtr) -> Self {
4105        ptr.untyped()
4106    }
4107}
4108#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
4109pub struct StructArgListBracedGreen(pub GreenId);
4110impl TypedSyntaxNode for StructArgListBraced {
4111    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StructArgListBraced);
4112    type StablePtr = StructArgListBracedPtr;
4113    type Green = StructArgListBracedGreen;
4114    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
4115        StructArgListBracedGreen(
4116            Arc::new(GreenNode {
4117                kind: SyntaxKind::StructArgListBraced,
4118                details: GreenNodeDetails::Node {
4119                    children: [
4120                        TerminalLBrace::missing(db).0,
4121                        StructArgList::missing(db).0,
4122                        TerminalRBrace::missing(db).0,
4123                    ]
4124                    .into(),
4125                    width: TextWidth::default(),
4126                },
4127            })
4128            .intern(db),
4129        )
4130    }
4131    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
4132        let kind = node.kind(db);
4133        assert_eq!(
4134            kind,
4135            SyntaxKind::StructArgListBraced,
4136            "Unexpected SyntaxKind {:?}. Expected {:?}.",
4137            kind,
4138            SyntaxKind::StructArgListBraced
4139        );
4140        Self { node }
4141    }
4142    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
4143        let kind = node.kind(db);
4144        if kind == SyntaxKind::StructArgListBraced {
4145            Some(Self::from_syntax_node(db, node))
4146        } else {
4147            None
4148        }
4149    }
4150    fn as_syntax_node(&self) -> SyntaxNode {
4151        self.node
4152    }
4153    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
4154        StructArgListBracedPtr(self.node.stable_ptr(db))
4155    }
4156}
4157#[derive(Clone, Debug, Eq, Hash, PartialEq)]
4158pub struct ExprBlock {
4159    node: SyntaxNode,
4160}
4161impl ExprBlock {
4162    pub const INDEX_LBRACE: usize = 0;
4163    pub const INDEX_STATEMENTS: usize = 1;
4164    pub const INDEX_RBRACE: usize = 2;
4165    pub fn new_green(
4166        db: &dyn SyntaxGroup,
4167        lbrace: TerminalLBraceGreen,
4168        statements: StatementListGreen,
4169        rbrace: TerminalRBraceGreen,
4170    ) -> ExprBlockGreen {
4171        let children = [lbrace.0, statements.0, rbrace.0];
4172        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
4173        ExprBlockGreen(
4174            Arc::new(GreenNode {
4175                kind: SyntaxKind::ExprBlock,
4176                details: GreenNodeDetails::Node { children: children.into(), width },
4177            })
4178            .intern(db),
4179        )
4180    }
4181}
4182impl ExprBlock {
4183    pub fn lbrace(&self, db: &dyn SyntaxGroup) -> TerminalLBrace {
4184        TerminalLBrace::from_syntax_node(db, self.node.get_children(db)[0])
4185    }
4186    pub fn statements(&self, db: &dyn SyntaxGroup) -> StatementList {
4187        StatementList::from_syntax_node(db, self.node.get_children(db)[1])
4188    }
4189    pub fn rbrace(&self, db: &dyn SyntaxGroup) -> TerminalRBrace {
4190        TerminalRBrace::from_syntax_node(db, self.node.get_children(db)[2])
4191    }
4192}
4193#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
4194pub struct ExprBlockPtr(pub SyntaxStablePtrId);
4195impl ExprBlockPtr {}
4196impl TypedStablePtr for ExprBlockPtr {
4197    type SyntaxNode = ExprBlock;
4198    fn untyped(&self) -> SyntaxStablePtrId {
4199        self.0
4200    }
4201    fn lookup(&self, db: &dyn SyntaxGroup) -> ExprBlock {
4202        ExprBlock::from_syntax_node(db, self.0.lookup(db))
4203    }
4204}
4205impl From<ExprBlockPtr> for SyntaxStablePtrId {
4206    fn from(ptr: ExprBlockPtr) -> Self {
4207        ptr.untyped()
4208    }
4209}
4210#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
4211pub struct ExprBlockGreen(pub GreenId);
4212impl TypedSyntaxNode for ExprBlock {
4213    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprBlock);
4214    type StablePtr = ExprBlockPtr;
4215    type Green = ExprBlockGreen;
4216    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
4217        ExprBlockGreen(
4218            Arc::new(GreenNode {
4219                kind: SyntaxKind::ExprBlock,
4220                details: GreenNodeDetails::Node {
4221                    children: [
4222                        TerminalLBrace::missing(db).0,
4223                        StatementList::missing(db).0,
4224                        TerminalRBrace::missing(db).0,
4225                    ]
4226                    .into(),
4227                    width: TextWidth::default(),
4228                },
4229            })
4230            .intern(db),
4231        )
4232    }
4233    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
4234        let kind = node.kind(db);
4235        assert_eq!(
4236            kind,
4237            SyntaxKind::ExprBlock,
4238            "Unexpected SyntaxKind {:?}. Expected {:?}.",
4239            kind,
4240            SyntaxKind::ExprBlock
4241        );
4242        Self { node }
4243    }
4244    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
4245        let kind = node.kind(db);
4246        if kind == SyntaxKind::ExprBlock { Some(Self::from_syntax_node(db, node)) } else { None }
4247    }
4248    fn as_syntax_node(&self) -> SyntaxNode {
4249        self.node
4250    }
4251    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
4252        ExprBlockPtr(self.node.stable_ptr(db))
4253    }
4254}
4255#[derive(Clone, Debug, Eq, Hash, PartialEq)]
4256pub struct ExprMatch {
4257    node: SyntaxNode,
4258}
4259impl ExprMatch {
4260    pub const INDEX_MATCH_KW: usize = 0;
4261    pub const INDEX_EXPR: usize = 1;
4262    pub const INDEX_LBRACE: usize = 2;
4263    pub const INDEX_ARMS: usize = 3;
4264    pub const INDEX_RBRACE: usize = 4;
4265    pub fn new_green(
4266        db: &dyn SyntaxGroup,
4267        match_kw: TerminalMatchGreen,
4268        expr: ExprGreen,
4269        lbrace: TerminalLBraceGreen,
4270        arms: MatchArmsGreen,
4271        rbrace: TerminalRBraceGreen,
4272    ) -> ExprMatchGreen {
4273        let children = [match_kw.0, expr.0, lbrace.0, arms.0, rbrace.0];
4274        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
4275        ExprMatchGreen(
4276            Arc::new(GreenNode {
4277                kind: SyntaxKind::ExprMatch,
4278                details: GreenNodeDetails::Node { children: children.into(), width },
4279            })
4280            .intern(db),
4281        )
4282    }
4283}
4284impl ExprMatch {
4285    pub fn match_kw(&self, db: &dyn SyntaxGroup) -> TerminalMatch {
4286        TerminalMatch::from_syntax_node(db, self.node.get_children(db)[0])
4287    }
4288    pub fn expr(&self, db: &dyn SyntaxGroup) -> Expr {
4289        Expr::from_syntax_node(db, self.node.get_children(db)[1])
4290    }
4291    pub fn lbrace(&self, db: &dyn SyntaxGroup) -> TerminalLBrace {
4292        TerminalLBrace::from_syntax_node(db, self.node.get_children(db)[2])
4293    }
4294    pub fn arms(&self, db: &dyn SyntaxGroup) -> MatchArms {
4295        MatchArms::from_syntax_node(db, self.node.get_children(db)[3])
4296    }
4297    pub fn rbrace(&self, db: &dyn SyntaxGroup) -> TerminalRBrace {
4298        TerminalRBrace::from_syntax_node(db, self.node.get_children(db)[4])
4299    }
4300}
4301#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
4302pub struct ExprMatchPtr(pub SyntaxStablePtrId);
4303impl ExprMatchPtr {}
4304impl TypedStablePtr for ExprMatchPtr {
4305    type SyntaxNode = ExprMatch;
4306    fn untyped(&self) -> SyntaxStablePtrId {
4307        self.0
4308    }
4309    fn lookup(&self, db: &dyn SyntaxGroup) -> ExprMatch {
4310        ExprMatch::from_syntax_node(db, self.0.lookup(db))
4311    }
4312}
4313impl From<ExprMatchPtr> for SyntaxStablePtrId {
4314    fn from(ptr: ExprMatchPtr) -> Self {
4315        ptr.untyped()
4316    }
4317}
4318#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
4319pub struct ExprMatchGreen(pub GreenId);
4320impl TypedSyntaxNode for ExprMatch {
4321    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprMatch);
4322    type StablePtr = ExprMatchPtr;
4323    type Green = ExprMatchGreen;
4324    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
4325        ExprMatchGreen(
4326            Arc::new(GreenNode {
4327                kind: SyntaxKind::ExprMatch,
4328                details: GreenNodeDetails::Node {
4329                    children: [
4330                        TerminalMatch::missing(db).0,
4331                        Expr::missing(db).0,
4332                        TerminalLBrace::missing(db).0,
4333                        MatchArms::missing(db).0,
4334                        TerminalRBrace::missing(db).0,
4335                    ]
4336                    .into(),
4337                    width: TextWidth::default(),
4338                },
4339            })
4340            .intern(db),
4341        )
4342    }
4343    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
4344        let kind = node.kind(db);
4345        assert_eq!(
4346            kind,
4347            SyntaxKind::ExprMatch,
4348            "Unexpected SyntaxKind {:?}. Expected {:?}.",
4349            kind,
4350            SyntaxKind::ExprMatch
4351        );
4352        Self { node }
4353    }
4354    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
4355        let kind = node.kind(db);
4356        if kind == SyntaxKind::ExprMatch { Some(Self::from_syntax_node(db, node)) } else { None }
4357    }
4358    fn as_syntax_node(&self) -> SyntaxNode {
4359        self.node
4360    }
4361    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
4362        ExprMatchPtr(self.node.stable_ptr(db))
4363    }
4364}
4365#[derive(Clone, Debug, Eq, Hash, PartialEq)]
4366pub struct MatchArms(ElementList<MatchArm, 2>);
4367impl Deref for MatchArms {
4368    type Target = ElementList<MatchArm, 2>;
4369    fn deref(&self) -> &Self::Target {
4370        &self.0
4371    }
4372}
4373impl MatchArms {
4374    pub fn new_green(
4375        db: &dyn SyntaxGroup,
4376        children: &[MatchArmsElementOrSeparatorGreen],
4377    ) -> MatchArmsGreen {
4378        let width = children.iter().map(|id| id.id().lookup_intern(db).width()).sum();
4379        MatchArmsGreen(
4380            Arc::new(GreenNode {
4381                kind: SyntaxKind::MatchArms,
4382                details: GreenNodeDetails::Node {
4383                    children: children.iter().map(|x| x.id()).collect(),
4384                    width,
4385                },
4386            })
4387            .intern(db),
4388        )
4389    }
4390}
4391#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
4392pub struct MatchArmsPtr(pub SyntaxStablePtrId);
4393impl TypedStablePtr for MatchArmsPtr {
4394    type SyntaxNode = MatchArms;
4395    fn untyped(&self) -> SyntaxStablePtrId {
4396        self.0
4397    }
4398    fn lookup(&self, db: &dyn SyntaxGroup) -> MatchArms {
4399        MatchArms::from_syntax_node(db, self.0.lookup(db))
4400    }
4401}
4402impl From<MatchArmsPtr> for SyntaxStablePtrId {
4403    fn from(ptr: MatchArmsPtr) -> Self {
4404        ptr.untyped()
4405    }
4406}
4407#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
4408pub enum MatchArmsElementOrSeparatorGreen {
4409    Separator(TerminalCommaGreen),
4410    Element(MatchArmGreen),
4411}
4412impl From<TerminalCommaGreen> for MatchArmsElementOrSeparatorGreen {
4413    fn from(value: TerminalCommaGreen) -> Self {
4414        MatchArmsElementOrSeparatorGreen::Separator(value)
4415    }
4416}
4417impl From<MatchArmGreen> for MatchArmsElementOrSeparatorGreen {
4418    fn from(value: MatchArmGreen) -> Self {
4419        MatchArmsElementOrSeparatorGreen::Element(value)
4420    }
4421}
4422impl MatchArmsElementOrSeparatorGreen {
4423    fn id(&self) -> GreenId {
4424        match self {
4425            MatchArmsElementOrSeparatorGreen::Separator(green) => green.0,
4426            MatchArmsElementOrSeparatorGreen::Element(green) => green.0,
4427        }
4428    }
4429}
4430#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
4431pub struct MatchArmsGreen(pub GreenId);
4432impl TypedSyntaxNode for MatchArms {
4433    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::MatchArms);
4434    type StablePtr = MatchArmsPtr;
4435    type Green = MatchArmsGreen;
4436    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
4437        MatchArmsGreen(
4438            Arc::new(GreenNode {
4439                kind: SyntaxKind::MatchArms,
4440                details: GreenNodeDetails::Node {
4441                    children: [].into(),
4442                    width: TextWidth::default(),
4443                },
4444            })
4445            .intern(db),
4446        )
4447    }
4448    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
4449        Self(ElementList::new(node))
4450    }
4451    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
4452        if node.kind(db) == SyntaxKind::MatchArms {
4453            Some(Self(ElementList::new(node)))
4454        } else {
4455            None
4456        }
4457    }
4458    fn as_syntax_node(&self) -> SyntaxNode {
4459        self.node
4460    }
4461    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
4462        MatchArmsPtr(self.node.stable_ptr(db))
4463    }
4464}
4465#[derive(Clone, Debug, Eq, Hash, PartialEq)]
4466pub struct MatchArm {
4467    node: SyntaxNode,
4468}
4469impl MatchArm {
4470    pub const INDEX_PATTERNS: usize = 0;
4471    pub const INDEX_ARROW: usize = 1;
4472    pub const INDEX_EXPRESSION: usize = 2;
4473    pub fn new_green(
4474        db: &dyn SyntaxGroup,
4475        patterns: PatternListOrGreen,
4476        arrow: TerminalMatchArrowGreen,
4477        expression: ExprGreen,
4478    ) -> MatchArmGreen {
4479        let children = [patterns.0, arrow.0, expression.0];
4480        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
4481        MatchArmGreen(
4482            Arc::new(GreenNode {
4483                kind: SyntaxKind::MatchArm,
4484                details: GreenNodeDetails::Node { children: children.into(), width },
4485            })
4486            .intern(db),
4487        )
4488    }
4489}
4490impl MatchArm {
4491    pub fn patterns(&self, db: &dyn SyntaxGroup) -> PatternListOr {
4492        PatternListOr::from_syntax_node(db, self.node.get_children(db)[0])
4493    }
4494    pub fn arrow(&self, db: &dyn SyntaxGroup) -> TerminalMatchArrow {
4495        TerminalMatchArrow::from_syntax_node(db, self.node.get_children(db)[1])
4496    }
4497    pub fn expression(&self, db: &dyn SyntaxGroup) -> Expr {
4498        Expr::from_syntax_node(db, self.node.get_children(db)[2])
4499    }
4500}
4501#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
4502pub struct MatchArmPtr(pub SyntaxStablePtrId);
4503impl MatchArmPtr {}
4504impl TypedStablePtr for MatchArmPtr {
4505    type SyntaxNode = MatchArm;
4506    fn untyped(&self) -> SyntaxStablePtrId {
4507        self.0
4508    }
4509    fn lookup(&self, db: &dyn SyntaxGroup) -> MatchArm {
4510        MatchArm::from_syntax_node(db, self.0.lookup(db))
4511    }
4512}
4513impl From<MatchArmPtr> for SyntaxStablePtrId {
4514    fn from(ptr: MatchArmPtr) -> Self {
4515        ptr.untyped()
4516    }
4517}
4518#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
4519pub struct MatchArmGreen(pub GreenId);
4520impl TypedSyntaxNode for MatchArm {
4521    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::MatchArm);
4522    type StablePtr = MatchArmPtr;
4523    type Green = MatchArmGreen;
4524    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
4525        MatchArmGreen(
4526            Arc::new(GreenNode {
4527                kind: SyntaxKind::MatchArm,
4528                details: GreenNodeDetails::Node {
4529                    children: [
4530                        PatternListOr::missing(db).0,
4531                        TerminalMatchArrow::missing(db).0,
4532                        Expr::missing(db).0,
4533                    ]
4534                    .into(),
4535                    width: TextWidth::default(),
4536                },
4537            })
4538            .intern(db),
4539        )
4540    }
4541    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
4542        let kind = node.kind(db);
4543        assert_eq!(
4544            kind,
4545            SyntaxKind::MatchArm,
4546            "Unexpected SyntaxKind {:?}. Expected {:?}.",
4547            kind,
4548            SyntaxKind::MatchArm
4549        );
4550        Self { node }
4551    }
4552    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
4553        let kind = node.kind(db);
4554        if kind == SyntaxKind::MatchArm { Some(Self::from_syntax_node(db, node)) } else { None }
4555    }
4556    fn as_syntax_node(&self) -> SyntaxNode {
4557        self.node
4558    }
4559    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
4560        MatchArmPtr(self.node.stable_ptr(db))
4561    }
4562}
4563#[derive(Clone, Debug, Eq, Hash, PartialEq)]
4564pub struct ExprIf {
4565    node: SyntaxNode,
4566}
4567impl ExprIf {
4568    pub const INDEX_IF_KW: usize = 0;
4569    pub const INDEX_CONDITIONS: usize = 1;
4570    pub const INDEX_IF_BLOCK: usize = 2;
4571    pub const INDEX_ELSE_CLAUSE: usize = 3;
4572    pub fn new_green(
4573        db: &dyn SyntaxGroup,
4574        if_kw: TerminalIfGreen,
4575        conditions: ConditionListAndGreen,
4576        if_block: ExprBlockGreen,
4577        else_clause: OptionElseClauseGreen,
4578    ) -> ExprIfGreen {
4579        let children = [if_kw.0, conditions.0, if_block.0, else_clause.0];
4580        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
4581        ExprIfGreen(
4582            Arc::new(GreenNode {
4583                kind: SyntaxKind::ExprIf,
4584                details: GreenNodeDetails::Node { children: children.into(), width },
4585            })
4586            .intern(db),
4587        )
4588    }
4589}
4590impl ExprIf {
4591    pub fn if_kw(&self, db: &dyn SyntaxGroup) -> TerminalIf {
4592        TerminalIf::from_syntax_node(db, self.node.get_children(db)[0])
4593    }
4594    pub fn conditions(&self, db: &dyn SyntaxGroup) -> ConditionListAnd {
4595        ConditionListAnd::from_syntax_node(db, self.node.get_children(db)[1])
4596    }
4597    pub fn if_block(&self, db: &dyn SyntaxGroup) -> ExprBlock {
4598        ExprBlock::from_syntax_node(db, self.node.get_children(db)[2])
4599    }
4600    pub fn else_clause(&self, db: &dyn SyntaxGroup) -> OptionElseClause {
4601        OptionElseClause::from_syntax_node(db, self.node.get_children(db)[3])
4602    }
4603}
4604#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
4605pub struct ExprIfPtr(pub SyntaxStablePtrId);
4606impl ExprIfPtr {}
4607impl TypedStablePtr for ExprIfPtr {
4608    type SyntaxNode = ExprIf;
4609    fn untyped(&self) -> SyntaxStablePtrId {
4610        self.0
4611    }
4612    fn lookup(&self, db: &dyn SyntaxGroup) -> ExprIf {
4613        ExprIf::from_syntax_node(db, self.0.lookup(db))
4614    }
4615}
4616impl From<ExprIfPtr> for SyntaxStablePtrId {
4617    fn from(ptr: ExprIfPtr) -> Self {
4618        ptr.untyped()
4619    }
4620}
4621#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
4622pub struct ExprIfGreen(pub GreenId);
4623impl TypedSyntaxNode for ExprIf {
4624    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprIf);
4625    type StablePtr = ExprIfPtr;
4626    type Green = ExprIfGreen;
4627    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
4628        ExprIfGreen(
4629            Arc::new(GreenNode {
4630                kind: SyntaxKind::ExprIf,
4631                details: GreenNodeDetails::Node {
4632                    children: [
4633                        TerminalIf::missing(db).0,
4634                        ConditionListAnd::missing(db).0,
4635                        ExprBlock::missing(db).0,
4636                        OptionElseClause::missing(db).0,
4637                    ]
4638                    .into(),
4639                    width: TextWidth::default(),
4640                },
4641            })
4642            .intern(db),
4643        )
4644    }
4645    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
4646        let kind = node.kind(db);
4647        assert_eq!(
4648            kind,
4649            SyntaxKind::ExprIf,
4650            "Unexpected SyntaxKind {:?}. Expected {:?}.",
4651            kind,
4652            SyntaxKind::ExprIf
4653        );
4654        Self { node }
4655    }
4656    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
4657        let kind = node.kind(db);
4658        if kind == SyntaxKind::ExprIf { Some(Self::from_syntax_node(db, node)) } else { None }
4659    }
4660    fn as_syntax_node(&self) -> SyntaxNode {
4661        self.node
4662    }
4663    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
4664        ExprIfPtr(self.node.stable_ptr(db))
4665    }
4666}
4667#[derive(Clone, Debug, Eq, Hash, PartialEq)]
4668pub struct ConditionListAnd(ElementList<Condition, 2>);
4669impl Deref for ConditionListAnd {
4670    type Target = ElementList<Condition, 2>;
4671    fn deref(&self) -> &Self::Target {
4672        &self.0
4673    }
4674}
4675impl ConditionListAnd {
4676    pub fn new_green(
4677        db: &dyn SyntaxGroup,
4678        children: &[ConditionListAndElementOrSeparatorGreen],
4679    ) -> ConditionListAndGreen {
4680        let width = children.iter().map(|id| id.id().lookup_intern(db).width()).sum();
4681        ConditionListAndGreen(
4682            Arc::new(GreenNode {
4683                kind: SyntaxKind::ConditionListAnd,
4684                details: GreenNodeDetails::Node {
4685                    children: children.iter().map(|x| x.id()).collect(),
4686                    width,
4687                },
4688            })
4689            .intern(db),
4690        )
4691    }
4692}
4693#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
4694pub struct ConditionListAndPtr(pub SyntaxStablePtrId);
4695impl TypedStablePtr for ConditionListAndPtr {
4696    type SyntaxNode = ConditionListAnd;
4697    fn untyped(&self) -> SyntaxStablePtrId {
4698        self.0
4699    }
4700    fn lookup(&self, db: &dyn SyntaxGroup) -> ConditionListAnd {
4701        ConditionListAnd::from_syntax_node(db, self.0.lookup(db))
4702    }
4703}
4704impl From<ConditionListAndPtr> for SyntaxStablePtrId {
4705    fn from(ptr: ConditionListAndPtr) -> Self {
4706        ptr.untyped()
4707    }
4708}
4709#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
4710pub enum ConditionListAndElementOrSeparatorGreen {
4711    Separator(TerminalAndAndGreen),
4712    Element(ConditionGreen),
4713}
4714impl From<TerminalAndAndGreen> for ConditionListAndElementOrSeparatorGreen {
4715    fn from(value: TerminalAndAndGreen) -> Self {
4716        ConditionListAndElementOrSeparatorGreen::Separator(value)
4717    }
4718}
4719impl From<ConditionGreen> for ConditionListAndElementOrSeparatorGreen {
4720    fn from(value: ConditionGreen) -> Self {
4721        ConditionListAndElementOrSeparatorGreen::Element(value)
4722    }
4723}
4724impl ConditionListAndElementOrSeparatorGreen {
4725    fn id(&self) -> GreenId {
4726        match self {
4727            ConditionListAndElementOrSeparatorGreen::Separator(green) => green.0,
4728            ConditionListAndElementOrSeparatorGreen::Element(green) => green.0,
4729        }
4730    }
4731}
4732#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
4733pub struct ConditionListAndGreen(pub GreenId);
4734impl TypedSyntaxNode for ConditionListAnd {
4735    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ConditionListAnd);
4736    type StablePtr = ConditionListAndPtr;
4737    type Green = ConditionListAndGreen;
4738    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
4739        ConditionListAndGreen(
4740            Arc::new(GreenNode {
4741                kind: SyntaxKind::ConditionListAnd,
4742                details: GreenNodeDetails::Node {
4743                    children: [].into(),
4744                    width: TextWidth::default(),
4745                },
4746            })
4747            .intern(db),
4748        )
4749    }
4750    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
4751        Self(ElementList::new(node))
4752    }
4753    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
4754        if node.kind(db) == SyntaxKind::ConditionListAnd {
4755            Some(Self(ElementList::new(node)))
4756        } else {
4757            None
4758        }
4759    }
4760    fn as_syntax_node(&self) -> SyntaxNode {
4761        self.node
4762    }
4763    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
4764        ConditionListAndPtr(self.node.stable_ptr(db))
4765    }
4766}
4767#[derive(Clone, Debug, Eq, Hash, PartialEq)]
4768pub enum Condition {
4769    Let(ConditionLet),
4770    Expr(ConditionExpr),
4771}
4772#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
4773pub struct ConditionPtr(pub SyntaxStablePtrId);
4774impl TypedStablePtr for ConditionPtr {
4775    type SyntaxNode = Condition;
4776    fn untyped(&self) -> SyntaxStablePtrId {
4777        self.0
4778    }
4779    fn lookup(&self, db: &dyn SyntaxGroup) -> Condition {
4780        Condition::from_syntax_node(db, self.0.lookup(db))
4781    }
4782}
4783impl From<ConditionPtr> for SyntaxStablePtrId {
4784    fn from(ptr: ConditionPtr) -> Self {
4785        ptr.untyped()
4786    }
4787}
4788impl From<ConditionLetPtr> for ConditionPtr {
4789    fn from(value: ConditionLetPtr) -> Self {
4790        Self(value.0)
4791    }
4792}
4793impl From<ConditionExprPtr> for ConditionPtr {
4794    fn from(value: ConditionExprPtr) -> Self {
4795        Self(value.0)
4796    }
4797}
4798impl From<ConditionLetGreen> for ConditionGreen {
4799    fn from(value: ConditionLetGreen) -> Self {
4800        Self(value.0)
4801    }
4802}
4803impl From<ConditionExprGreen> for ConditionGreen {
4804    fn from(value: ConditionExprGreen) -> Self {
4805        Self(value.0)
4806    }
4807}
4808#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
4809pub struct ConditionGreen(pub GreenId);
4810impl TypedSyntaxNode for Condition {
4811    const OPTIONAL_KIND: Option<SyntaxKind> = None;
4812    type StablePtr = ConditionPtr;
4813    type Green = ConditionGreen;
4814    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
4815        panic!("No missing variant.");
4816    }
4817    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
4818        let kind = node.kind(db);
4819        match kind {
4820            SyntaxKind::ConditionLet => Condition::Let(ConditionLet::from_syntax_node(db, node)),
4821            SyntaxKind::ConditionExpr => Condition::Expr(ConditionExpr::from_syntax_node(db, node)),
4822            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "Condition"),
4823        }
4824    }
4825    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
4826        let kind = node.kind(db);
4827        match kind {
4828            SyntaxKind::ConditionLet => {
4829                Some(Condition::Let(ConditionLet::from_syntax_node(db, node)))
4830            }
4831            SyntaxKind::ConditionExpr => {
4832                Some(Condition::Expr(ConditionExpr::from_syntax_node(db, node)))
4833            }
4834            _ => None,
4835        }
4836    }
4837    fn as_syntax_node(&self) -> SyntaxNode {
4838        match self {
4839            Condition::Let(x) => x.as_syntax_node(),
4840            Condition::Expr(x) => x.as_syntax_node(),
4841        }
4842    }
4843    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
4844        ConditionPtr(self.as_syntax_node().lookup_intern(db).stable_ptr)
4845    }
4846}
4847impl Condition {
4848    /// Checks if a kind of a variant of [Condition].
4849    pub fn is_variant(kind: SyntaxKind) -> bool {
4850        matches!(kind, SyntaxKind::ConditionLet | SyntaxKind::ConditionExpr)
4851    }
4852}
4853#[derive(Clone, Debug, Eq, Hash, PartialEq)]
4854pub struct ConditionLet {
4855    node: SyntaxNode,
4856}
4857impl ConditionLet {
4858    pub const INDEX_LET_KW: usize = 0;
4859    pub const INDEX_PATTERNS: usize = 1;
4860    pub const INDEX_EQ: usize = 2;
4861    pub const INDEX_EXPR: usize = 3;
4862    pub fn new_green(
4863        db: &dyn SyntaxGroup,
4864        let_kw: TerminalLetGreen,
4865        patterns: PatternListOrGreen,
4866        eq: TerminalEqGreen,
4867        expr: ExprGreen,
4868    ) -> ConditionLetGreen {
4869        let children = [let_kw.0, patterns.0, eq.0, expr.0];
4870        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
4871        ConditionLetGreen(
4872            Arc::new(GreenNode {
4873                kind: SyntaxKind::ConditionLet,
4874                details: GreenNodeDetails::Node { children: children.into(), width },
4875            })
4876            .intern(db),
4877        )
4878    }
4879}
4880impl ConditionLet {
4881    pub fn let_kw(&self, db: &dyn SyntaxGroup) -> TerminalLet {
4882        TerminalLet::from_syntax_node(db, self.node.get_children(db)[0])
4883    }
4884    pub fn patterns(&self, db: &dyn SyntaxGroup) -> PatternListOr {
4885        PatternListOr::from_syntax_node(db, self.node.get_children(db)[1])
4886    }
4887    pub fn eq(&self, db: &dyn SyntaxGroup) -> TerminalEq {
4888        TerminalEq::from_syntax_node(db, self.node.get_children(db)[2])
4889    }
4890    pub fn expr(&self, db: &dyn SyntaxGroup) -> Expr {
4891        Expr::from_syntax_node(db, self.node.get_children(db)[3])
4892    }
4893}
4894#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
4895pub struct ConditionLetPtr(pub SyntaxStablePtrId);
4896impl ConditionLetPtr {}
4897impl TypedStablePtr for ConditionLetPtr {
4898    type SyntaxNode = ConditionLet;
4899    fn untyped(&self) -> SyntaxStablePtrId {
4900        self.0
4901    }
4902    fn lookup(&self, db: &dyn SyntaxGroup) -> ConditionLet {
4903        ConditionLet::from_syntax_node(db, self.0.lookup(db))
4904    }
4905}
4906impl From<ConditionLetPtr> for SyntaxStablePtrId {
4907    fn from(ptr: ConditionLetPtr) -> Self {
4908        ptr.untyped()
4909    }
4910}
4911#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
4912pub struct ConditionLetGreen(pub GreenId);
4913impl TypedSyntaxNode for ConditionLet {
4914    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ConditionLet);
4915    type StablePtr = ConditionLetPtr;
4916    type Green = ConditionLetGreen;
4917    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
4918        ConditionLetGreen(
4919            Arc::new(GreenNode {
4920                kind: SyntaxKind::ConditionLet,
4921                details: GreenNodeDetails::Node {
4922                    children: [
4923                        TerminalLet::missing(db).0,
4924                        PatternListOr::missing(db).0,
4925                        TerminalEq::missing(db).0,
4926                        Expr::missing(db).0,
4927                    ]
4928                    .into(),
4929                    width: TextWidth::default(),
4930                },
4931            })
4932            .intern(db),
4933        )
4934    }
4935    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
4936        let kind = node.kind(db);
4937        assert_eq!(
4938            kind,
4939            SyntaxKind::ConditionLet,
4940            "Unexpected SyntaxKind {:?}. Expected {:?}.",
4941            kind,
4942            SyntaxKind::ConditionLet
4943        );
4944        Self { node }
4945    }
4946    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
4947        let kind = node.kind(db);
4948        if kind == SyntaxKind::ConditionLet { Some(Self::from_syntax_node(db, node)) } else { None }
4949    }
4950    fn as_syntax_node(&self) -> SyntaxNode {
4951        self.node
4952    }
4953    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
4954        ConditionLetPtr(self.node.stable_ptr(db))
4955    }
4956}
4957#[derive(Clone, Debug, Eq, Hash, PartialEq)]
4958pub struct ConditionExpr {
4959    node: SyntaxNode,
4960}
4961impl ConditionExpr {
4962    pub const INDEX_EXPR: usize = 0;
4963    pub fn new_green(db: &dyn SyntaxGroup, expr: ExprGreen) -> ConditionExprGreen {
4964        let children = [expr.0];
4965        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
4966        ConditionExprGreen(
4967            Arc::new(GreenNode {
4968                kind: SyntaxKind::ConditionExpr,
4969                details: GreenNodeDetails::Node { children: children.into(), width },
4970            })
4971            .intern(db),
4972        )
4973    }
4974}
4975impl ConditionExpr {
4976    pub fn expr(&self, db: &dyn SyntaxGroup) -> Expr {
4977        Expr::from_syntax_node(db, self.node.get_children(db)[0])
4978    }
4979}
4980#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
4981pub struct ConditionExprPtr(pub SyntaxStablePtrId);
4982impl ConditionExprPtr {}
4983impl TypedStablePtr for ConditionExprPtr {
4984    type SyntaxNode = ConditionExpr;
4985    fn untyped(&self) -> SyntaxStablePtrId {
4986        self.0
4987    }
4988    fn lookup(&self, db: &dyn SyntaxGroup) -> ConditionExpr {
4989        ConditionExpr::from_syntax_node(db, self.0.lookup(db))
4990    }
4991}
4992impl From<ConditionExprPtr> for SyntaxStablePtrId {
4993    fn from(ptr: ConditionExprPtr) -> Self {
4994        ptr.untyped()
4995    }
4996}
4997#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
4998pub struct ConditionExprGreen(pub GreenId);
4999impl TypedSyntaxNode for ConditionExpr {
5000    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ConditionExpr);
5001    type StablePtr = ConditionExprPtr;
5002    type Green = ConditionExprGreen;
5003    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
5004        ConditionExprGreen(
5005            Arc::new(GreenNode {
5006                kind: SyntaxKind::ConditionExpr,
5007                details: GreenNodeDetails::Node {
5008                    children: [Expr::missing(db).0].into(),
5009                    width: TextWidth::default(),
5010                },
5011            })
5012            .intern(db),
5013        )
5014    }
5015    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
5016        let kind = node.kind(db);
5017        assert_eq!(
5018            kind,
5019            SyntaxKind::ConditionExpr,
5020            "Unexpected SyntaxKind {:?}. Expected {:?}.",
5021            kind,
5022            SyntaxKind::ConditionExpr
5023        );
5024        Self { node }
5025    }
5026    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
5027        let kind = node.kind(db);
5028        if kind == SyntaxKind::ConditionExpr {
5029            Some(Self::from_syntax_node(db, node))
5030        } else {
5031            None
5032        }
5033    }
5034    fn as_syntax_node(&self) -> SyntaxNode {
5035        self.node
5036    }
5037    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
5038        ConditionExprPtr(self.node.stable_ptr(db))
5039    }
5040}
5041#[derive(Clone, Debug, Eq, Hash, PartialEq)]
5042pub enum BlockOrIf {
5043    Block(ExprBlock),
5044    If(ExprIf),
5045}
5046#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
5047pub struct BlockOrIfPtr(pub SyntaxStablePtrId);
5048impl TypedStablePtr for BlockOrIfPtr {
5049    type SyntaxNode = BlockOrIf;
5050    fn untyped(&self) -> SyntaxStablePtrId {
5051        self.0
5052    }
5053    fn lookup(&self, db: &dyn SyntaxGroup) -> BlockOrIf {
5054        BlockOrIf::from_syntax_node(db, self.0.lookup(db))
5055    }
5056}
5057impl From<BlockOrIfPtr> for SyntaxStablePtrId {
5058    fn from(ptr: BlockOrIfPtr) -> Self {
5059        ptr.untyped()
5060    }
5061}
5062impl From<ExprBlockPtr> for BlockOrIfPtr {
5063    fn from(value: ExprBlockPtr) -> Self {
5064        Self(value.0)
5065    }
5066}
5067impl From<ExprIfPtr> for BlockOrIfPtr {
5068    fn from(value: ExprIfPtr) -> Self {
5069        Self(value.0)
5070    }
5071}
5072impl From<ExprBlockGreen> for BlockOrIfGreen {
5073    fn from(value: ExprBlockGreen) -> Self {
5074        Self(value.0)
5075    }
5076}
5077impl From<ExprIfGreen> for BlockOrIfGreen {
5078    fn from(value: ExprIfGreen) -> Self {
5079        Self(value.0)
5080    }
5081}
5082#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
5083pub struct BlockOrIfGreen(pub GreenId);
5084impl TypedSyntaxNode for BlockOrIf {
5085    const OPTIONAL_KIND: Option<SyntaxKind> = None;
5086    type StablePtr = BlockOrIfPtr;
5087    type Green = BlockOrIfGreen;
5088    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
5089        panic!("No missing variant.");
5090    }
5091    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
5092        let kind = node.kind(db);
5093        match kind {
5094            SyntaxKind::ExprBlock => BlockOrIf::Block(ExprBlock::from_syntax_node(db, node)),
5095            SyntaxKind::ExprIf => BlockOrIf::If(ExprIf::from_syntax_node(db, node)),
5096            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "BlockOrIf"),
5097        }
5098    }
5099    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
5100        let kind = node.kind(db);
5101        match kind {
5102            SyntaxKind::ExprBlock => Some(BlockOrIf::Block(ExprBlock::from_syntax_node(db, node))),
5103            SyntaxKind::ExprIf => Some(BlockOrIf::If(ExprIf::from_syntax_node(db, node))),
5104            _ => None,
5105        }
5106    }
5107    fn as_syntax_node(&self) -> SyntaxNode {
5108        match self {
5109            BlockOrIf::Block(x) => x.as_syntax_node(),
5110            BlockOrIf::If(x) => x.as_syntax_node(),
5111        }
5112    }
5113    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
5114        BlockOrIfPtr(self.as_syntax_node().lookup_intern(db).stable_ptr)
5115    }
5116}
5117impl BlockOrIf {
5118    /// Checks if a kind of a variant of [BlockOrIf].
5119    pub fn is_variant(kind: SyntaxKind) -> bool {
5120        matches!(kind, SyntaxKind::ExprBlock | SyntaxKind::ExprIf)
5121    }
5122}
5123#[derive(Clone, Debug, Eq, Hash, PartialEq)]
5124pub struct ExprLoop {
5125    node: SyntaxNode,
5126}
5127impl ExprLoop {
5128    pub const INDEX_LOOP_KW: usize = 0;
5129    pub const INDEX_BODY: usize = 1;
5130    pub fn new_green(
5131        db: &dyn SyntaxGroup,
5132        loop_kw: TerminalLoopGreen,
5133        body: ExprBlockGreen,
5134    ) -> ExprLoopGreen {
5135        let children = [loop_kw.0, body.0];
5136        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
5137        ExprLoopGreen(
5138            Arc::new(GreenNode {
5139                kind: SyntaxKind::ExprLoop,
5140                details: GreenNodeDetails::Node { children: children.into(), width },
5141            })
5142            .intern(db),
5143        )
5144    }
5145}
5146impl ExprLoop {
5147    pub fn loop_kw(&self, db: &dyn SyntaxGroup) -> TerminalLoop {
5148        TerminalLoop::from_syntax_node(db, self.node.get_children(db)[0])
5149    }
5150    pub fn body(&self, db: &dyn SyntaxGroup) -> ExprBlock {
5151        ExprBlock::from_syntax_node(db, self.node.get_children(db)[1])
5152    }
5153}
5154#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
5155pub struct ExprLoopPtr(pub SyntaxStablePtrId);
5156impl ExprLoopPtr {}
5157impl TypedStablePtr for ExprLoopPtr {
5158    type SyntaxNode = ExprLoop;
5159    fn untyped(&self) -> SyntaxStablePtrId {
5160        self.0
5161    }
5162    fn lookup(&self, db: &dyn SyntaxGroup) -> ExprLoop {
5163        ExprLoop::from_syntax_node(db, self.0.lookup(db))
5164    }
5165}
5166impl From<ExprLoopPtr> for SyntaxStablePtrId {
5167    fn from(ptr: ExprLoopPtr) -> Self {
5168        ptr.untyped()
5169    }
5170}
5171#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
5172pub struct ExprLoopGreen(pub GreenId);
5173impl TypedSyntaxNode for ExprLoop {
5174    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprLoop);
5175    type StablePtr = ExprLoopPtr;
5176    type Green = ExprLoopGreen;
5177    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
5178        ExprLoopGreen(
5179            Arc::new(GreenNode {
5180                kind: SyntaxKind::ExprLoop,
5181                details: GreenNodeDetails::Node {
5182                    children: [TerminalLoop::missing(db).0, ExprBlock::missing(db).0].into(),
5183                    width: TextWidth::default(),
5184                },
5185            })
5186            .intern(db),
5187        )
5188    }
5189    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
5190        let kind = node.kind(db);
5191        assert_eq!(
5192            kind,
5193            SyntaxKind::ExprLoop,
5194            "Unexpected SyntaxKind {:?}. Expected {:?}.",
5195            kind,
5196            SyntaxKind::ExprLoop
5197        );
5198        Self { node }
5199    }
5200    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
5201        let kind = node.kind(db);
5202        if kind == SyntaxKind::ExprLoop { Some(Self::from_syntax_node(db, node)) } else { None }
5203    }
5204    fn as_syntax_node(&self) -> SyntaxNode {
5205        self.node
5206    }
5207    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
5208        ExprLoopPtr(self.node.stable_ptr(db))
5209    }
5210}
5211#[derive(Clone, Debug, Eq, Hash, PartialEq)]
5212pub struct ExprWhile {
5213    node: SyntaxNode,
5214}
5215impl ExprWhile {
5216    pub const INDEX_WHILE_KW: usize = 0;
5217    pub const INDEX_CONDITIONS: usize = 1;
5218    pub const INDEX_BODY: usize = 2;
5219    pub fn new_green(
5220        db: &dyn SyntaxGroup,
5221        while_kw: TerminalWhileGreen,
5222        conditions: ConditionListAndGreen,
5223        body: ExprBlockGreen,
5224    ) -> ExprWhileGreen {
5225        let children = [while_kw.0, conditions.0, body.0];
5226        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
5227        ExprWhileGreen(
5228            Arc::new(GreenNode {
5229                kind: SyntaxKind::ExprWhile,
5230                details: GreenNodeDetails::Node { children: children.into(), width },
5231            })
5232            .intern(db),
5233        )
5234    }
5235}
5236impl ExprWhile {
5237    pub fn while_kw(&self, db: &dyn SyntaxGroup) -> TerminalWhile {
5238        TerminalWhile::from_syntax_node(db, self.node.get_children(db)[0])
5239    }
5240    pub fn conditions(&self, db: &dyn SyntaxGroup) -> ConditionListAnd {
5241        ConditionListAnd::from_syntax_node(db, self.node.get_children(db)[1])
5242    }
5243    pub fn body(&self, db: &dyn SyntaxGroup) -> ExprBlock {
5244        ExprBlock::from_syntax_node(db, self.node.get_children(db)[2])
5245    }
5246}
5247#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
5248pub struct ExprWhilePtr(pub SyntaxStablePtrId);
5249impl ExprWhilePtr {}
5250impl TypedStablePtr for ExprWhilePtr {
5251    type SyntaxNode = ExprWhile;
5252    fn untyped(&self) -> SyntaxStablePtrId {
5253        self.0
5254    }
5255    fn lookup(&self, db: &dyn SyntaxGroup) -> ExprWhile {
5256        ExprWhile::from_syntax_node(db, self.0.lookup(db))
5257    }
5258}
5259impl From<ExprWhilePtr> for SyntaxStablePtrId {
5260    fn from(ptr: ExprWhilePtr) -> Self {
5261        ptr.untyped()
5262    }
5263}
5264#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
5265pub struct ExprWhileGreen(pub GreenId);
5266impl TypedSyntaxNode for ExprWhile {
5267    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprWhile);
5268    type StablePtr = ExprWhilePtr;
5269    type Green = ExprWhileGreen;
5270    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
5271        ExprWhileGreen(
5272            Arc::new(GreenNode {
5273                kind: SyntaxKind::ExprWhile,
5274                details: GreenNodeDetails::Node {
5275                    children: [
5276                        TerminalWhile::missing(db).0,
5277                        ConditionListAnd::missing(db).0,
5278                        ExprBlock::missing(db).0,
5279                    ]
5280                    .into(),
5281                    width: TextWidth::default(),
5282                },
5283            })
5284            .intern(db),
5285        )
5286    }
5287    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
5288        let kind = node.kind(db);
5289        assert_eq!(
5290            kind,
5291            SyntaxKind::ExprWhile,
5292            "Unexpected SyntaxKind {:?}. Expected {:?}.",
5293            kind,
5294            SyntaxKind::ExprWhile
5295        );
5296        Self { node }
5297    }
5298    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
5299        let kind = node.kind(db);
5300        if kind == SyntaxKind::ExprWhile { Some(Self::from_syntax_node(db, node)) } else { None }
5301    }
5302    fn as_syntax_node(&self) -> SyntaxNode {
5303        self.node
5304    }
5305    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
5306        ExprWhilePtr(self.node.stable_ptr(db))
5307    }
5308}
5309#[derive(Clone, Debug, Eq, Hash, PartialEq)]
5310pub struct ExprFor {
5311    node: SyntaxNode,
5312}
5313impl ExprFor {
5314    pub const INDEX_FOR_KW: usize = 0;
5315    pub const INDEX_PATTERN: usize = 1;
5316    pub const INDEX_IDENTIFIER: usize = 2;
5317    pub const INDEX_EXPR: usize = 3;
5318    pub const INDEX_BODY: usize = 4;
5319    pub fn new_green(
5320        db: &dyn SyntaxGroup,
5321        for_kw: TerminalForGreen,
5322        pattern: PatternGreen,
5323        identifier: TerminalIdentifierGreen,
5324        expr: ExprGreen,
5325        body: ExprBlockGreen,
5326    ) -> ExprForGreen {
5327        let children = [for_kw.0, pattern.0, identifier.0, expr.0, body.0];
5328        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
5329        ExprForGreen(
5330            Arc::new(GreenNode {
5331                kind: SyntaxKind::ExprFor,
5332                details: GreenNodeDetails::Node { children: children.into(), width },
5333            })
5334            .intern(db),
5335        )
5336    }
5337}
5338impl ExprFor {
5339    pub fn for_kw(&self, db: &dyn SyntaxGroup) -> TerminalFor {
5340        TerminalFor::from_syntax_node(db, self.node.get_children(db)[0])
5341    }
5342    pub fn pattern(&self, db: &dyn SyntaxGroup) -> Pattern {
5343        Pattern::from_syntax_node(db, self.node.get_children(db)[1])
5344    }
5345    pub fn identifier(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier {
5346        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[2])
5347    }
5348    pub fn expr(&self, db: &dyn SyntaxGroup) -> Expr {
5349        Expr::from_syntax_node(db, self.node.get_children(db)[3])
5350    }
5351    pub fn body(&self, db: &dyn SyntaxGroup) -> ExprBlock {
5352        ExprBlock::from_syntax_node(db, self.node.get_children(db)[4])
5353    }
5354}
5355#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
5356pub struct ExprForPtr(pub SyntaxStablePtrId);
5357impl ExprForPtr {
5358    pub fn pattern_green(self, db: &dyn SyntaxGroup) -> PatternGreen {
5359        let ptr = self.0.lookup_intern(db);
5360        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
5361            PatternGreen(key_fields[0])
5362        } else {
5363            panic!("Unexpected key field query on root.");
5364        }
5365    }
5366    pub fn identifier_green(self, db: &dyn SyntaxGroup) -> TerminalIdentifierGreen {
5367        let ptr = self.0.lookup_intern(db);
5368        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
5369            TerminalIdentifierGreen(key_fields[1])
5370        } else {
5371            panic!("Unexpected key field query on root.");
5372        }
5373    }
5374}
5375impl TypedStablePtr for ExprForPtr {
5376    type SyntaxNode = ExprFor;
5377    fn untyped(&self) -> SyntaxStablePtrId {
5378        self.0
5379    }
5380    fn lookup(&self, db: &dyn SyntaxGroup) -> ExprFor {
5381        ExprFor::from_syntax_node(db, self.0.lookup(db))
5382    }
5383}
5384impl From<ExprForPtr> for SyntaxStablePtrId {
5385    fn from(ptr: ExprForPtr) -> Self {
5386        ptr.untyped()
5387    }
5388}
5389#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
5390pub struct ExprForGreen(pub GreenId);
5391impl TypedSyntaxNode for ExprFor {
5392    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprFor);
5393    type StablePtr = ExprForPtr;
5394    type Green = ExprForGreen;
5395    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
5396        ExprForGreen(
5397            Arc::new(GreenNode {
5398                kind: SyntaxKind::ExprFor,
5399                details: GreenNodeDetails::Node {
5400                    children: [
5401                        TerminalFor::missing(db).0,
5402                        Pattern::missing(db).0,
5403                        TerminalIdentifier::missing(db).0,
5404                        Expr::missing(db).0,
5405                        ExprBlock::missing(db).0,
5406                    ]
5407                    .into(),
5408                    width: TextWidth::default(),
5409                },
5410            })
5411            .intern(db),
5412        )
5413    }
5414    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
5415        let kind = node.kind(db);
5416        assert_eq!(
5417            kind,
5418            SyntaxKind::ExprFor,
5419            "Unexpected SyntaxKind {:?}. Expected {:?}.",
5420            kind,
5421            SyntaxKind::ExprFor
5422        );
5423        Self { node }
5424    }
5425    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
5426        let kind = node.kind(db);
5427        if kind == SyntaxKind::ExprFor { Some(Self::from_syntax_node(db, node)) } else { None }
5428    }
5429    fn as_syntax_node(&self) -> SyntaxNode {
5430        self.node
5431    }
5432    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
5433        ExprForPtr(self.node.stable_ptr(db))
5434    }
5435}
5436#[derive(Clone, Debug, Eq, Hash, PartialEq)]
5437pub struct ElseClause {
5438    node: SyntaxNode,
5439}
5440impl ElseClause {
5441    pub const INDEX_ELSE_KW: usize = 0;
5442    pub const INDEX_ELSE_BLOCK_OR_IF: usize = 1;
5443    pub fn new_green(
5444        db: &dyn SyntaxGroup,
5445        else_kw: TerminalElseGreen,
5446        else_block_or_if: BlockOrIfGreen,
5447    ) -> ElseClauseGreen {
5448        let children = [else_kw.0, else_block_or_if.0];
5449        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
5450        ElseClauseGreen(
5451            Arc::new(GreenNode {
5452                kind: SyntaxKind::ElseClause,
5453                details: GreenNodeDetails::Node { children: children.into(), width },
5454            })
5455            .intern(db),
5456        )
5457    }
5458}
5459impl ElseClause {
5460    pub fn else_kw(&self, db: &dyn SyntaxGroup) -> TerminalElse {
5461        TerminalElse::from_syntax_node(db, self.node.get_children(db)[0])
5462    }
5463    pub fn else_block_or_if(&self, db: &dyn SyntaxGroup) -> BlockOrIf {
5464        BlockOrIf::from_syntax_node(db, self.node.get_children(db)[1])
5465    }
5466}
5467#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
5468pub struct ElseClausePtr(pub SyntaxStablePtrId);
5469impl ElseClausePtr {}
5470impl TypedStablePtr for ElseClausePtr {
5471    type SyntaxNode = ElseClause;
5472    fn untyped(&self) -> SyntaxStablePtrId {
5473        self.0
5474    }
5475    fn lookup(&self, db: &dyn SyntaxGroup) -> ElseClause {
5476        ElseClause::from_syntax_node(db, self.0.lookup(db))
5477    }
5478}
5479impl From<ElseClausePtr> for SyntaxStablePtrId {
5480    fn from(ptr: ElseClausePtr) -> Self {
5481        ptr.untyped()
5482    }
5483}
5484#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
5485pub struct ElseClauseGreen(pub GreenId);
5486impl TypedSyntaxNode for ElseClause {
5487    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ElseClause);
5488    type StablePtr = ElseClausePtr;
5489    type Green = ElseClauseGreen;
5490    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
5491        ElseClauseGreen(
5492            Arc::new(GreenNode {
5493                kind: SyntaxKind::ElseClause,
5494                details: GreenNodeDetails::Node {
5495                    children: [TerminalElse::missing(db).0, BlockOrIf::missing(db).0].into(),
5496                    width: TextWidth::default(),
5497                },
5498            })
5499            .intern(db),
5500        )
5501    }
5502    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
5503        let kind = node.kind(db);
5504        assert_eq!(
5505            kind,
5506            SyntaxKind::ElseClause,
5507            "Unexpected SyntaxKind {:?}. Expected {:?}.",
5508            kind,
5509            SyntaxKind::ElseClause
5510        );
5511        Self { node }
5512    }
5513    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
5514        let kind = node.kind(db);
5515        if kind == SyntaxKind::ElseClause { Some(Self::from_syntax_node(db, node)) } else { None }
5516    }
5517    fn as_syntax_node(&self) -> SyntaxNode {
5518        self.node
5519    }
5520    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
5521        ElseClausePtr(self.node.stable_ptr(db))
5522    }
5523}
5524#[derive(Clone, Debug, Eq, Hash, PartialEq)]
5525pub enum OptionElseClause {
5526    Empty(OptionElseClauseEmpty),
5527    ElseClause(ElseClause),
5528}
5529#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
5530pub struct OptionElseClausePtr(pub SyntaxStablePtrId);
5531impl TypedStablePtr for OptionElseClausePtr {
5532    type SyntaxNode = OptionElseClause;
5533    fn untyped(&self) -> SyntaxStablePtrId {
5534        self.0
5535    }
5536    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionElseClause {
5537        OptionElseClause::from_syntax_node(db, self.0.lookup(db))
5538    }
5539}
5540impl From<OptionElseClausePtr> for SyntaxStablePtrId {
5541    fn from(ptr: OptionElseClausePtr) -> Self {
5542        ptr.untyped()
5543    }
5544}
5545impl From<OptionElseClauseEmptyPtr> for OptionElseClausePtr {
5546    fn from(value: OptionElseClauseEmptyPtr) -> Self {
5547        Self(value.0)
5548    }
5549}
5550impl From<ElseClausePtr> for OptionElseClausePtr {
5551    fn from(value: ElseClausePtr) -> Self {
5552        Self(value.0)
5553    }
5554}
5555impl From<OptionElseClauseEmptyGreen> for OptionElseClauseGreen {
5556    fn from(value: OptionElseClauseEmptyGreen) -> Self {
5557        Self(value.0)
5558    }
5559}
5560impl From<ElseClauseGreen> for OptionElseClauseGreen {
5561    fn from(value: ElseClauseGreen) -> Self {
5562        Self(value.0)
5563    }
5564}
5565#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
5566pub struct OptionElseClauseGreen(pub GreenId);
5567impl TypedSyntaxNode for OptionElseClause {
5568    const OPTIONAL_KIND: Option<SyntaxKind> = None;
5569    type StablePtr = OptionElseClausePtr;
5570    type Green = OptionElseClauseGreen;
5571    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
5572        panic!("No missing variant.");
5573    }
5574    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
5575        let kind = node.kind(db);
5576        match kind {
5577            SyntaxKind::OptionElseClauseEmpty => {
5578                OptionElseClause::Empty(OptionElseClauseEmpty::from_syntax_node(db, node))
5579            }
5580            SyntaxKind::ElseClause => {
5581                OptionElseClause::ElseClause(ElseClause::from_syntax_node(db, node))
5582            }
5583            _ => panic!(
5584                "Unexpected syntax kind {:?} when constructing {}.",
5585                kind, "OptionElseClause"
5586            ),
5587        }
5588    }
5589    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
5590        let kind = node.kind(db);
5591        match kind {
5592            SyntaxKind::OptionElseClauseEmpty => {
5593                Some(OptionElseClause::Empty(OptionElseClauseEmpty::from_syntax_node(db, node)))
5594            }
5595            SyntaxKind::ElseClause => {
5596                Some(OptionElseClause::ElseClause(ElseClause::from_syntax_node(db, node)))
5597            }
5598            _ => None,
5599        }
5600    }
5601    fn as_syntax_node(&self) -> SyntaxNode {
5602        match self {
5603            OptionElseClause::Empty(x) => x.as_syntax_node(),
5604            OptionElseClause::ElseClause(x) => x.as_syntax_node(),
5605        }
5606    }
5607    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
5608        OptionElseClausePtr(self.as_syntax_node().lookup_intern(db).stable_ptr)
5609    }
5610}
5611impl OptionElseClause {
5612    /// Checks if a kind of a variant of [OptionElseClause].
5613    pub fn is_variant(kind: SyntaxKind) -> bool {
5614        matches!(kind, SyntaxKind::OptionElseClauseEmpty | SyntaxKind::ElseClause)
5615    }
5616}
5617#[derive(Clone, Debug, Eq, Hash, PartialEq)]
5618pub struct OptionElseClauseEmpty {
5619    node: SyntaxNode,
5620}
5621impl OptionElseClauseEmpty {
5622    pub fn new_green(db: &dyn SyntaxGroup) -> OptionElseClauseEmptyGreen {
5623        let children = [];
5624        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
5625        OptionElseClauseEmptyGreen(
5626            Arc::new(GreenNode {
5627                kind: SyntaxKind::OptionElseClauseEmpty,
5628                details: GreenNodeDetails::Node { children: children.into(), width },
5629            })
5630            .intern(db),
5631        )
5632    }
5633}
5634impl OptionElseClauseEmpty {}
5635#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
5636pub struct OptionElseClauseEmptyPtr(pub SyntaxStablePtrId);
5637impl OptionElseClauseEmptyPtr {}
5638impl TypedStablePtr for OptionElseClauseEmptyPtr {
5639    type SyntaxNode = OptionElseClauseEmpty;
5640    fn untyped(&self) -> SyntaxStablePtrId {
5641        self.0
5642    }
5643    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionElseClauseEmpty {
5644        OptionElseClauseEmpty::from_syntax_node(db, self.0.lookup(db))
5645    }
5646}
5647impl From<OptionElseClauseEmptyPtr> for SyntaxStablePtrId {
5648    fn from(ptr: OptionElseClauseEmptyPtr) -> Self {
5649        ptr.untyped()
5650    }
5651}
5652#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
5653pub struct OptionElseClauseEmptyGreen(pub GreenId);
5654impl TypedSyntaxNode for OptionElseClauseEmpty {
5655    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionElseClauseEmpty);
5656    type StablePtr = OptionElseClauseEmptyPtr;
5657    type Green = OptionElseClauseEmptyGreen;
5658    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
5659        OptionElseClauseEmptyGreen(
5660            Arc::new(GreenNode {
5661                kind: SyntaxKind::OptionElseClauseEmpty,
5662                details: GreenNodeDetails::Node {
5663                    children: [].into(),
5664                    width: TextWidth::default(),
5665                },
5666            })
5667            .intern(db),
5668        )
5669    }
5670    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
5671        let kind = node.kind(db);
5672        assert_eq!(
5673            kind,
5674            SyntaxKind::OptionElseClauseEmpty,
5675            "Unexpected SyntaxKind {:?}. Expected {:?}.",
5676            kind,
5677            SyntaxKind::OptionElseClauseEmpty
5678        );
5679        Self { node }
5680    }
5681    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
5682        let kind = node.kind(db);
5683        if kind == SyntaxKind::OptionElseClauseEmpty {
5684            Some(Self::from_syntax_node(db, node))
5685        } else {
5686            None
5687        }
5688    }
5689    fn as_syntax_node(&self) -> SyntaxNode {
5690        self.node
5691    }
5692    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
5693        OptionElseClauseEmptyPtr(self.node.stable_ptr(db))
5694    }
5695}
5696#[derive(Clone, Debug, Eq, Hash, PartialEq)]
5697pub struct ExprErrorPropagate {
5698    node: SyntaxNode,
5699}
5700impl ExprErrorPropagate {
5701    pub const INDEX_EXPR: usize = 0;
5702    pub const INDEX_OP: usize = 1;
5703    pub fn new_green(
5704        db: &dyn SyntaxGroup,
5705        expr: ExprGreen,
5706        op: TerminalQuestionMarkGreen,
5707    ) -> ExprErrorPropagateGreen {
5708        let children = [expr.0, op.0];
5709        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
5710        ExprErrorPropagateGreen(
5711            Arc::new(GreenNode {
5712                kind: SyntaxKind::ExprErrorPropagate,
5713                details: GreenNodeDetails::Node { children: children.into(), width },
5714            })
5715            .intern(db),
5716        )
5717    }
5718}
5719impl ExprErrorPropagate {
5720    pub fn expr(&self, db: &dyn SyntaxGroup) -> Expr {
5721        Expr::from_syntax_node(db, self.node.get_children(db)[0])
5722    }
5723    pub fn op(&self, db: &dyn SyntaxGroup) -> TerminalQuestionMark {
5724        TerminalQuestionMark::from_syntax_node(db, self.node.get_children(db)[1])
5725    }
5726}
5727#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
5728pub struct ExprErrorPropagatePtr(pub SyntaxStablePtrId);
5729impl ExprErrorPropagatePtr {}
5730impl TypedStablePtr for ExprErrorPropagatePtr {
5731    type SyntaxNode = ExprErrorPropagate;
5732    fn untyped(&self) -> SyntaxStablePtrId {
5733        self.0
5734    }
5735    fn lookup(&self, db: &dyn SyntaxGroup) -> ExprErrorPropagate {
5736        ExprErrorPropagate::from_syntax_node(db, self.0.lookup(db))
5737    }
5738}
5739impl From<ExprErrorPropagatePtr> for SyntaxStablePtrId {
5740    fn from(ptr: ExprErrorPropagatePtr) -> Self {
5741        ptr.untyped()
5742    }
5743}
5744#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
5745pub struct ExprErrorPropagateGreen(pub GreenId);
5746impl TypedSyntaxNode for ExprErrorPropagate {
5747    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprErrorPropagate);
5748    type StablePtr = ExprErrorPropagatePtr;
5749    type Green = ExprErrorPropagateGreen;
5750    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
5751        ExprErrorPropagateGreen(
5752            Arc::new(GreenNode {
5753                kind: SyntaxKind::ExprErrorPropagate,
5754                details: GreenNodeDetails::Node {
5755                    children: [Expr::missing(db).0, TerminalQuestionMark::missing(db).0].into(),
5756                    width: TextWidth::default(),
5757                },
5758            })
5759            .intern(db),
5760        )
5761    }
5762    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
5763        let kind = node.kind(db);
5764        assert_eq!(
5765            kind,
5766            SyntaxKind::ExprErrorPropagate,
5767            "Unexpected SyntaxKind {:?}. Expected {:?}.",
5768            kind,
5769            SyntaxKind::ExprErrorPropagate
5770        );
5771        Self { node }
5772    }
5773    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
5774        let kind = node.kind(db);
5775        if kind == SyntaxKind::ExprErrorPropagate {
5776            Some(Self::from_syntax_node(db, node))
5777        } else {
5778            None
5779        }
5780    }
5781    fn as_syntax_node(&self) -> SyntaxNode {
5782        self.node
5783    }
5784    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
5785        ExprErrorPropagatePtr(self.node.stable_ptr(db))
5786    }
5787}
5788#[derive(Clone, Debug, Eq, Hash, PartialEq)]
5789pub struct ExprIndexed {
5790    node: SyntaxNode,
5791}
5792impl ExprIndexed {
5793    pub const INDEX_EXPR: usize = 0;
5794    pub const INDEX_LBRACK: usize = 1;
5795    pub const INDEX_INDEX_EXPR: usize = 2;
5796    pub const INDEX_RBRACK: usize = 3;
5797    pub fn new_green(
5798        db: &dyn SyntaxGroup,
5799        expr: ExprGreen,
5800        lbrack: TerminalLBrackGreen,
5801        index_expr: ExprGreen,
5802        rbrack: TerminalRBrackGreen,
5803    ) -> ExprIndexedGreen {
5804        let children = [expr.0, lbrack.0, index_expr.0, rbrack.0];
5805        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
5806        ExprIndexedGreen(
5807            Arc::new(GreenNode {
5808                kind: SyntaxKind::ExprIndexed,
5809                details: GreenNodeDetails::Node { children: children.into(), width },
5810            })
5811            .intern(db),
5812        )
5813    }
5814}
5815impl ExprIndexed {
5816    pub fn expr(&self, db: &dyn SyntaxGroup) -> Expr {
5817        Expr::from_syntax_node(db, self.node.get_children(db)[0])
5818    }
5819    pub fn lbrack(&self, db: &dyn SyntaxGroup) -> TerminalLBrack {
5820        TerminalLBrack::from_syntax_node(db, self.node.get_children(db)[1])
5821    }
5822    pub fn index_expr(&self, db: &dyn SyntaxGroup) -> Expr {
5823        Expr::from_syntax_node(db, self.node.get_children(db)[2])
5824    }
5825    pub fn rbrack(&self, db: &dyn SyntaxGroup) -> TerminalRBrack {
5826        TerminalRBrack::from_syntax_node(db, self.node.get_children(db)[3])
5827    }
5828}
5829#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
5830pub struct ExprIndexedPtr(pub SyntaxStablePtrId);
5831impl ExprIndexedPtr {}
5832impl TypedStablePtr for ExprIndexedPtr {
5833    type SyntaxNode = ExprIndexed;
5834    fn untyped(&self) -> SyntaxStablePtrId {
5835        self.0
5836    }
5837    fn lookup(&self, db: &dyn SyntaxGroup) -> ExprIndexed {
5838        ExprIndexed::from_syntax_node(db, self.0.lookup(db))
5839    }
5840}
5841impl From<ExprIndexedPtr> for SyntaxStablePtrId {
5842    fn from(ptr: ExprIndexedPtr) -> Self {
5843        ptr.untyped()
5844    }
5845}
5846#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
5847pub struct ExprIndexedGreen(pub GreenId);
5848impl TypedSyntaxNode for ExprIndexed {
5849    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprIndexed);
5850    type StablePtr = ExprIndexedPtr;
5851    type Green = ExprIndexedGreen;
5852    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
5853        ExprIndexedGreen(
5854            Arc::new(GreenNode {
5855                kind: SyntaxKind::ExprIndexed,
5856                details: GreenNodeDetails::Node {
5857                    children: [
5858                        Expr::missing(db).0,
5859                        TerminalLBrack::missing(db).0,
5860                        Expr::missing(db).0,
5861                        TerminalRBrack::missing(db).0,
5862                    ]
5863                    .into(),
5864                    width: TextWidth::default(),
5865                },
5866            })
5867            .intern(db),
5868        )
5869    }
5870    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
5871        let kind = node.kind(db);
5872        assert_eq!(
5873            kind,
5874            SyntaxKind::ExprIndexed,
5875            "Unexpected SyntaxKind {:?}. Expected {:?}.",
5876            kind,
5877            SyntaxKind::ExprIndexed
5878        );
5879        Self { node }
5880    }
5881    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
5882        let kind = node.kind(db);
5883        if kind == SyntaxKind::ExprIndexed { Some(Self::from_syntax_node(db, node)) } else { None }
5884    }
5885    fn as_syntax_node(&self) -> SyntaxNode {
5886        self.node
5887    }
5888    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
5889        ExprIndexedPtr(self.node.stable_ptr(db))
5890    }
5891}
5892#[derive(Clone, Debug, Eq, Hash, PartialEq)]
5893pub struct ExprFixedSizeArray {
5894    node: SyntaxNode,
5895}
5896impl ExprFixedSizeArray {
5897    pub const INDEX_LBRACK: usize = 0;
5898    pub const INDEX_EXPRS: usize = 1;
5899    pub const INDEX_SIZE: usize = 2;
5900    pub const INDEX_RBRACK: usize = 3;
5901    pub fn new_green(
5902        db: &dyn SyntaxGroup,
5903        lbrack: TerminalLBrackGreen,
5904        exprs: ExprListGreen,
5905        size: OptionFixedSizeArraySizeGreen,
5906        rbrack: TerminalRBrackGreen,
5907    ) -> ExprFixedSizeArrayGreen {
5908        let children = [lbrack.0, exprs.0, size.0, rbrack.0];
5909        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
5910        ExprFixedSizeArrayGreen(
5911            Arc::new(GreenNode {
5912                kind: SyntaxKind::ExprFixedSizeArray,
5913                details: GreenNodeDetails::Node { children: children.into(), width },
5914            })
5915            .intern(db),
5916        )
5917    }
5918}
5919impl ExprFixedSizeArray {
5920    pub fn lbrack(&self, db: &dyn SyntaxGroup) -> TerminalLBrack {
5921        TerminalLBrack::from_syntax_node(db, self.node.get_children(db)[0])
5922    }
5923    pub fn exprs(&self, db: &dyn SyntaxGroup) -> ExprList {
5924        ExprList::from_syntax_node(db, self.node.get_children(db)[1])
5925    }
5926    pub fn size(&self, db: &dyn SyntaxGroup) -> OptionFixedSizeArraySize {
5927        OptionFixedSizeArraySize::from_syntax_node(db, self.node.get_children(db)[2])
5928    }
5929    pub fn rbrack(&self, db: &dyn SyntaxGroup) -> TerminalRBrack {
5930        TerminalRBrack::from_syntax_node(db, self.node.get_children(db)[3])
5931    }
5932}
5933#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
5934pub struct ExprFixedSizeArrayPtr(pub SyntaxStablePtrId);
5935impl ExprFixedSizeArrayPtr {}
5936impl TypedStablePtr for ExprFixedSizeArrayPtr {
5937    type SyntaxNode = ExprFixedSizeArray;
5938    fn untyped(&self) -> SyntaxStablePtrId {
5939        self.0
5940    }
5941    fn lookup(&self, db: &dyn SyntaxGroup) -> ExprFixedSizeArray {
5942        ExprFixedSizeArray::from_syntax_node(db, self.0.lookup(db))
5943    }
5944}
5945impl From<ExprFixedSizeArrayPtr> for SyntaxStablePtrId {
5946    fn from(ptr: ExprFixedSizeArrayPtr) -> Self {
5947        ptr.untyped()
5948    }
5949}
5950#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
5951pub struct ExprFixedSizeArrayGreen(pub GreenId);
5952impl TypedSyntaxNode for ExprFixedSizeArray {
5953    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprFixedSizeArray);
5954    type StablePtr = ExprFixedSizeArrayPtr;
5955    type Green = ExprFixedSizeArrayGreen;
5956    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
5957        ExprFixedSizeArrayGreen(
5958            Arc::new(GreenNode {
5959                kind: SyntaxKind::ExprFixedSizeArray,
5960                details: GreenNodeDetails::Node {
5961                    children: [
5962                        TerminalLBrack::missing(db).0,
5963                        ExprList::missing(db).0,
5964                        OptionFixedSizeArraySize::missing(db).0,
5965                        TerminalRBrack::missing(db).0,
5966                    ]
5967                    .into(),
5968                    width: TextWidth::default(),
5969                },
5970            })
5971            .intern(db),
5972        )
5973    }
5974    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
5975        let kind = node.kind(db);
5976        assert_eq!(
5977            kind,
5978            SyntaxKind::ExprFixedSizeArray,
5979            "Unexpected SyntaxKind {:?}. Expected {:?}.",
5980            kind,
5981            SyntaxKind::ExprFixedSizeArray
5982        );
5983        Self { node }
5984    }
5985    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
5986        let kind = node.kind(db);
5987        if kind == SyntaxKind::ExprFixedSizeArray {
5988            Some(Self::from_syntax_node(db, node))
5989        } else {
5990            None
5991        }
5992    }
5993    fn as_syntax_node(&self) -> SyntaxNode {
5994        self.node
5995    }
5996    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
5997        ExprFixedSizeArrayPtr(self.node.stable_ptr(db))
5998    }
5999}
6000#[derive(Clone, Debug, Eq, Hash, PartialEq)]
6001pub struct FixedSizeArraySize {
6002    node: SyntaxNode,
6003}
6004impl FixedSizeArraySize {
6005    pub const INDEX_SEMICOLON: usize = 0;
6006    pub const INDEX_SIZE: usize = 1;
6007    pub fn new_green(
6008        db: &dyn SyntaxGroup,
6009        semicolon: TerminalSemicolonGreen,
6010        size: ExprGreen,
6011    ) -> FixedSizeArraySizeGreen {
6012        let children = [semicolon.0, size.0];
6013        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
6014        FixedSizeArraySizeGreen(
6015            Arc::new(GreenNode {
6016                kind: SyntaxKind::FixedSizeArraySize,
6017                details: GreenNodeDetails::Node { children: children.into(), width },
6018            })
6019            .intern(db),
6020        )
6021    }
6022}
6023impl FixedSizeArraySize {
6024    pub fn semicolon(&self, db: &dyn SyntaxGroup) -> TerminalSemicolon {
6025        TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[0])
6026    }
6027    pub fn size(&self, db: &dyn SyntaxGroup) -> Expr {
6028        Expr::from_syntax_node(db, self.node.get_children(db)[1])
6029    }
6030}
6031#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
6032pub struct FixedSizeArraySizePtr(pub SyntaxStablePtrId);
6033impl FixedSizeArraySizePtr {}
6034impl TypedStablePtr for FixedSizeArraySizePtr {
6035    type SyntaxNode = FixedSizeArraySize;
6036    fn untyped(&self) -> SyntaxStablePtrId {
6037        self.0
6038    }
6039    fn lookup(&self, db: &dyn SyntaxGroup) -> FixedSizeArraySize {
6040        FixedSizeArraySize::from_syntax_node(db, self.0.lookup(db))
6041    }
6042}
6043impl From<FixedSizeArraySizePtr> for SyntaxStablePtrId {
6044    fn from(ptr: FixedSizeArraySizePtr) -> Self {
6045        ptr.untyped()
6046    }
6047}
6048#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
6049pub struct FixedSizeArraySizeGreen(pub GreenId);
6050impl TypedSyntaxNode for FixedSizeArraySize {
6051    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::FixedSizeArraySize);
6052    type StablePtr = FixedSizeArraySizePtr;
6053    type Green = FixedSizeArraySizeGreen;
6054    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
6055        FixedSizeArraySizeGreen(
6056            Arc::new(GreenNode {
6057                kind: SyntaxKind::FixedSizeArraySize,
6058                details: GreenNodeDetails::Node {
6059                    children: [TerminalSemicolon::missing(db).0, Expr::missing(db).0].into(),
6060                    width: TextWidth::default(),
6061                },
6062            })
6063            .intern(db),
6064        )
6065    }
6066    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
6067        let kind = node.kind(db);
6068        assert_eq!(
6069            kind,
6070            SyntaxKind::FixedSizeArraySize,
6071            "Unexpected SyntaxKind {:?}. Expected {:?}.",
6072            kind,
6073            SyntaxKind::FixedSizeArraySize
6074        );
6075        Self { node }
6076    }
6077    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
6078        let kind = node.kind(db);
6079        if kind == SyntaxKind::FixedSizeArraySize {
6080            Some(Self::from_syntax_node(db, node))
6081        } else {
6082            None
6083        }
6084    }
6085    fn as_syntax_node(&self) -> SyntaxNode {
6086        self.node
6087    }
6088    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
6089        FixedSizeArraySizePtr(self.node.stable_ptr(db))
6090    }
6091}
6092#[derive(Clone, Debug, Eq, Hash, PartialEq)]
6093pub enum OptionFixedSizeArraySize {
6094    Empty(OptionFixedSizeArraySizeEmpty),
6095    FixedSizeArraySize(FixedSizeArraySize),
6096}
6097#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
6098pub struct OptionFixedSizeArraySizePtr(pub SyntaxStablePtrId);
6099impl TypedStablePtr for OptionFixedSizeArraySizePtr {
6100    type SyntaxNode = OptionFixedSizeArraySize;
6101    fn untyped(&self) -> SyntaxStablePtrId {
6102        self.0
6103    }
6104    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionFixedSizeArraySize {
6105        OptionFixedSizeArraySize::from_syntax_node(db, self.0.lookup(db))
6106    }
6107}
6108impl From<OptionFixedSizeArraySizePtr> for SyntaxStablePtrId {
6109    fn from(ptr: OptionFixedSizeArraySizePtr) -> Self {
6110        ptr.untyped()
6111    }
6112}
6113impl From<OptionFixedSizeArraySizeEmptyPtr> for OptionFixedSizeArraySizePtr {
6114    fn from(value: OptionFixedSizeArraySizeEmptyPtr) -> Self {
6115        Self(value.0)
6116    }
6117}
6118impl From<FixedSizeArraySizePtr> for OptionFixedSizeArraySizePtr {
6119    fn from(value: FixedSizeArraySizePtr) -> Self {
6120        Self(value.0)
6121    }
6122}
6123impl From<OptionFixedSizeArraySizeEmptyGreen> for OptionFixedSizeArraySizeGreen {
6124    fn from(value: OptionFixedSizeArraySizeEmptyGreen) -> Self {
6125        Self(value.0)
6126    }
6127}
6128impl From<FixedSizeArraySizeGreen> for OptionFixedSizeArraySizeGreen {
6129    fn from(value: FixedSizeArraySizeGreen) -> Self {
6130        Self(value.0)
6131    }
6132}
6133#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
6134pub struct OptionFixedSizeArraySizeGreen(pub GreenId);
6135impl TypedSyntaxNode for OptionFixedSizeArraySize {
6136    const OPTIONAL_KIND: Option<SyntaxKind> = None;
6137    type StablePtr = OptionFixedSizeArraySizePtr;
6138    type Green = OptionFixedSizeArraySizeGreen;
6139    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
6140        panic!("No missing variant.");
6141    }
6142    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
6143        let kind = node.kind(db);
6144        match kind {
6145            SyntaxKind::OptionFixedSizeArraySizeEmpty => OptionFixedSizeArraySize::Empty(
6146                OptionFixedSizeArraySizeEmpty::from_syntax_node(db, node),
6147            ),
6148            SyntaxKind::FixedSizeArraySize => OptionFixedSizeArraySize::FixedSizeArraySize(
6149                FixedSizeArraySize::from_syntax_node(db, node),
6150            ),
6151            _ => panic!(
6152                "Unexpected syntax kind {:?} when constructing {}.",
6153                kind, "OptionFixedSizeArraySize"
6154            ),
6155        }
6156    }
6157    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
6158        let kind = node.kind(db);
6159        match kind {
6160            SyntaxKind::OptionFixedSizeArraySizeEmpty => Some(OptionFixedSizeArraySize::Empty(
6161                OptionFixedSizeArraySizeEmpty::from_syntax_node(db, node),
6162            )),
6163            SyntaxKind::FixedSizeArraySize => Some(OptionFixedSizeArraySize::FixedSizeArraySize(
6164                FixedSizeArraySize::from_syntax_node(db, node),
6165            )),
6166            _ => None,
6167        }
6168    }
6169    fn as_syntax_node(&self) -> SyntaxNode {
6170        match self {
6171            OptionFixedSizeArraySize::Empty(x) => x.as_syntax_node(),
6172            OptionFixedSizeArraySize::FixedSizeArraySize(x) => x.as_syntax_node(),
6173        }
6174    }
6175    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
6176        OptionFixedSizeArraySizePtr(self.as_syntax_node().lookup_intern(db).stable_ptr)
6177    }
6178}
6179impl OptionFixedSizeArraySize {
6180    /// Checks if a kind of a variant of [OptionFixedSizeArraySize].
6181    pub fn is_variant(kind: SyntaxKind) -> bool {
6182        matches!(kind, SyntaxKind::OptionFixedSizeArraySizeEmpty | SyntaxKind::FixedSizeArraySize)
6183    }
6184}
6185#[derive(Clone, Debug, Eq, Hash, PartialEq)]
6186pub struct OptionFixedSizeArraySizeEmpty {
6187    node: SyntaxNode,
6188}
6189impl OptionFixedSizeArraySizeEmpty {
6190    pub fn new_green(db: &dyn SyntaxGroup) -> OptionFixedSizeArraySizeEmptyGreen {
6191        let children = [];
6192        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
6193        OptionFixedSizeArraySizeEmptyGreen(
6194            Arc::new(GreenNode {
6195                kind: SyntaxKind::OptionFixedSizeArraySizeEmpty,
6196                details: GreenNodeDetails::Node { children: children.into(), width },
6197            })
6198            .intern(db),
6199        )
6200    }
6201}
6202impl OptionFixedSizeArraySizeEmpty {}
6203#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
6204pub struct OptionFixedSizeArraySizeEmptyPtr(pub SyntaxStablePtrId);
6205impl OptionFixedSizeArraySizeEmptyPtr {}
6206impl TypedStablePtr for OptionFixedSizeArraySizeEmptyPtr {
6207    type SyntaxNode = OptionFixedSizeArraySizeEmpty;
6208    fn untyped(&self) -> SyntaxStablePtrId {
6209        self.0
6210    }
6211    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionFixedSizeArraySizeEmpty {
6212        OptionFixedSizeArraySizeEmpty::from_syntax_node(db, self.0.lookup(db))
6213    }
6214}
6215impl From<OptionFixedSizeArraySizeEmptyPtr> for SyntaxStablePtrId {
6216    fn from(ptr: OptionFixedSizeArraySizeEmptyPtr) -> Self {
6217        ptr.untyped()
6218    }
6219}
6220#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
6221pub struct OptionFixedSizeArraySizeEmptyGreen(pub GreenId);
6222impl TypedSyntaxNode for OptionFixedSizeArraySizeEmpty {
6223    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionFixedSizeArraySizeEmpty);
6224    type StablePtr = OptionFixedSizeArraySizeEmptyPtr;
6225    type Green = OptionFixedSizeArraySizeEmptyGreen;
6226    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
6227        OptionFixedSizeArraySizeEmptyGreen(
6228            Arc::new(GreenNode {
6229                kind: SyntaxKind::OptionFixedSizeArraySizeEmpty,
6230                details: GreenNodeDetails::Node {
6231                    children: [].into(),
6232                    width: TextWidth::default(),
6233                },
6234            })
6235            .intern(db),
6236        )
6237    }
6238    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
6239        let kind = node.kind(db);
6240        assert_eq!(
6241            kind,
6242            SyntaxKind::OptionFixedSizeArraySizeEmpty,
6243            "Unexpected SyntaxKind {:?}. Expected {:?}.",
6244            kind,
6245            SyntaxKind::OptionFixedSizeArraySizeEmpty
6246        );
6247        Self { node }
6248    }
6249    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
6250        let kind = node.kind(db);
6251        if kind == SyntaxKind::OptionFixedSizeArraySizeEmpty {
6252            Some(Self::from_syntax_node(db, node))
6253        } else {
6254            None
6255        }
6256    }
6257    fn as_syntax_node(&self) -> SyntaxNode {
6258        self.node
6259    }
6260    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
6261        OptionFixedSizeArraySizeEmptyPtr(self.node.stable_ptr(db))
6262    }
6263}
6264#[derive(Clone, Debug, Eq, Hash, PartialEq)]
6265pub struct ExprClosure {
6266    node: SyntaxNode,
6267}
6268impl ExprClosure {
6269    pub const INDEX_WRAPPER: usize = 0;
6270    pub const INDEX_RET_TY: usize = 1;
6271    pub const INDEX_OPTIONAL_NO_PANIC: usize = 2;
6272    pub const INDEX_EXPR: usize = 3;
6273    pub fn new_green(
6274        db: &dyn SyntaxGroup,
6275        wrapper: ClosureParamWrapperGreen,
6276        ret_ty: OptionReturnTypeClauseGreen,
6277        optional_no_panic: OptionTerminalNoPanicGreen,
6278        expr: ExprGreen,
6279    ) -> ExprClosureGreen {
6280        let children = [wrapper.0, ret_ty.0, optional_no_panic.0, expr.0];
6281        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
6282        ExprClosureGreen(
6283            Arc::new(GreenNode {
6284                kind: SyntaxKind::ExprClosure,
6285                details: GreenNodeDetails::Node { children: children.into(), width },
6286            })
6287            .intern(db),
6288        )
6289    }
6290}
6291impl ExprClosure {
6292    pub fn wrapper(&self, db: &dyn SyntaxGroup) -> ClosureParamWrapper {
6293        ClosureParamWrapper::from_syntax_node(db, self.node.get_children(db)[0])
6294    }
6295    pub fn ret_ty(&self, db: &dyn SyntaxGroup) -> OptionReturnTypeClause {
6296        OptionReturnTypeClause::from_syntax_node(db, self.node.get_children(db)[1])
6297    }
6298    pub fn optional_no_panic(&self, db: &dyn SyntaxGroup) -> OptionTerminalNoPanic {
6299        OptionTerminalNoPanic::from_syntax_node(db, self.node.get_children(db)[2])
6300    }
6301    pub fn expr(&self, db: &dyn SyntaxGroup) -> Expr {
6302        Expr::from_syntax_node(db, self.node.get_children(db)[3])
6303    }
6304}
6305#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
6306pub struct ExprClosurePtr(pub SyntaxStablePtrId);
6307impl ExprClosurePtr {}
6308impl TypedStablePtr for ExprClosurePtr {
6309    type SyntaxNode = ExprClosure;
6310    fn untyped(&self) -> SyntaxStablePtrId {
6311        self.0
6312    }
6313    fn lookup(&self, db: &dyn SyntaxGroup) -> ExprClosure {
6314        ExprClosure::from_syntax_node(db, self.0.lookup(db))
6315    }
6316}
6317impl From<ExprClosurePtr> for SyntaxStablePtrId {
6318    fn from(ptr: ExprClosurePtr) -> Self {
6319        ptr.untyped()
6320    }
6321}
6322#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
6323pub struct ExprClosureGreen(pub GreenId);
6324impl TypedSyntaxNode for ExprClosure {
6325    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprClosure);
6326    type StablePtr = ExprClosurePtr;
6327    type Green = ExprClosureGreen;
6328    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
6329        ExprClosureGreen(
6330            Arc::new(GreenNode {
6331                kind: SyntaxKind::ExprClosure,
6332                details: GreenNodeDetails::Node {
6333                    children: [
6334                        ClosureParamWrapper::missing(db).0,
6335                        OptionReturnTypeClause::missing(db).0,
6336                        OptionTerminalNoPanic::missing(db).0,
6337                        Expr::missing(db).0,
6338                    ]
6339                    .into(),
6340                    width: TextWidth::default(),
6341                },
6342            })
6343            .intern(db),
6344        )
6345    }
6346    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
6347        let kind = node.kind(db);
6348        assert_eq!(
6349            kind,
6350            SyntaxKind::ExprClosure,
6351            "Unexpected SyntaxKind {:?}. Expected {:?}.",
6352            kind,
6353            SyntaxKind::ExprClosure
6354        );
6355        Self { node }
6356    }
6357    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
6358        let kind = node.kind(db);
6359        if kind == SyntaxKind::ExprClosure { Some(Self::from_syntax_node(db, node)) } else { None }
6360    }
6361    fn as_syntax_node(&self) -> SyntaxNode {
6362        self.node
6363    }
6364    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
6365        ExprClosurePtr(self.node.stable_ptr(db))
6366    }
6367}
6368#[derive(Clone, Debug, Eq, Hash, PartialEq)]
6369pub enum ClosureParamWrapper {
6370    Nullary(TerminalOrOr),
6371    NAry(ClosureParamWrapperNAry),
6372}
6373#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
6374pub struct ClosureParamWrapperPtr(pub SyntaxStablePtrId);
6375impl TypedStablePtr for ClosureParamWrapperPtr {
6376    type SyntaxNode = ClosureParamWrapper;
6377    fn untyped(&self) -> SyntaxStablePtrId {
6378        self.0
6379    }
6380    fn lookup(&self, db: &dyn SyntaxGroup) -> ClosureParamWrapper {
6381        ClosureParamWrapper::from_syntax_node(db, self.0.lookup(db))
6382    }
6383}
6384impl From<ClosureParamWrapperPtr> for SyntaxStablePtrId {
6385    fn from(ptr: ClosureParamWrapperPtr) -> Self {
6386        ptr.untyped()
6387    }
6388}
6389impl From<TerminalOrOrPtr> for ClosureParamWrapperPtr {
6390    fn from(value: TerminalOrOrPtr) -> Self {
6391        Self(value.0)
6392    }
6393}
6394impl From<ClosureParamWrapperNAryPtr> for ClosureParamWrapperPtr {
6395    fn from(value: ClosureParamWrapperNAryPtr) -> Self {
6396        Self(value.0)
6397    }
6398}
6399impl From<TerminalOrOrGreen> for ClosureParamWrapperGreen {
6400    fn from(value: TerminalOrOrGreen) -> Self {
6401        Self(value.0)
6402    }
6403}
6404impl From<ClosureParamWrapperNAryGreen> for ClosureParamWrapperGreen {
6405    fn from(value: ClosureParamWrapperNAryGreen) -> Self {
6406        Self(value.0)
6407    }
6408}
6409#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
6410pub struct ClosureParamWrapperGreen(pub GreenId);
6411impl TypedSyntaxNode for ClosureParamWrapper {
6412    const OPTIONAL_KIND: Option<SyntaxKind> = None;
6413    type StablePtr = ClosureParamWrapperPtr;
6414    type Green = ClosureParamWrapperGreen;
6415    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
6416        panic!("No missing variant.");
6417    }
6418    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
6419        let kind = node.kind(db);
6420        match kind {
6421            SyntaxKind::TerminalOrOr => {
6422                ClosureParamWrapper::Nullary(TerminalOrOr::from_syntax_node(db, node))
6423            }
6424            SyntaxKind::ClosureParamWrapperNAry => {
6425                ClosureParamWrapper::NAry(ClosureParamWrapperNAry::from_syntax_node(db, node))
6426            }
6427            _ => panic!(
6428                "Unexpected syntax kind {:?} when constructing {}.",
6429                kind, "ClosureParamWrapper"
6430            ),
6431        }
6432    }
6433    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
6434        let kind = node.kind(db);
6435        match kind {
6436            SyntaxKind::TerminalOrOr => {
6437                Some(ClosureParamWrapper::Nullary(TerminalOrOr::from_syntax_node(db, node)))
6438            }
6439            SyntaxKind::ClosureParamWrapperNAry => {
6440                Some(ClosureParamWrapper::NAry(ClosureParamWrapperNAry::from_syntax_node(db, node)))
6441            }
6442            _ => None,
6443        }
6444    }
6445    fn as_syntax_node(&self) -> SyntaxNode {
6446        match self {
6447            ClosureParamWrapper::Nullary(x) => x.as_syntax_node(),
6448            ClosureParamWrapper::NAry(x) => x.as_syntax_node(),
6449        }
6450    }
6451    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
6452        ClosureParamWrapperPtr(self.as_syntax_node().lookup_intern(db).stable_ptr)
6453    }
6454}
6455impl ClosureParamWrapper {
6456    /// Checks if a kind of a variant of [ClosureParamWrapper].
6457    pub fn is_variant(kind: SyntaxKind) -> bool {
6458        matches!(kind, SyntaxKind::TerminalOrOr | SyntaxKind::ClosureParamWrapperNAry)
6459    }
6460}
6461#[derive(Clone, Debug, Eq, Hash, PartialEq)]
6462pub struct ClosureParamWrapperNAry {
6463    node: SyntaxNode,
6464}
6465impl ClosureParamWrapperNAry {
6466    pub const INDEX_LEFTOR: usize = 0;
6467    pub const INDEX_PARAMS: usize = 1;
6468    pub const INDEX_RIGHTOR: usize = 2;
6469    pub fn new_green(
6470        db: &dyn SyntaxGroup,
6471        leftor: TerminalOrGreen,
6472        params: ParamListGreen,
6473        rightor: TerminalOrGreen,
6474    ) -> ClosureParamWrapperNAryGreen {
6475        let children = [leftor.0, params.0, rightor.0];
6476        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
6477        ClosureParamWrapperNAryGreen(
6478            Arc::new(GreenNode {
6479                kind: SyntaxKind::ClosureParamWrapperNAry,
6480                details: GreenNodeDetails::Node { children: children.into(), width },
6481            })
6482            .intern(db),
6483        )
6484    }
6485}
6486impl ClosureParamWrapperNAry {
6487    pub fn leftor(&self, db: &dyn SyntaxGroup) -> TerminalOr {
6488        TerminalOr::from_syntax_node(db, self.node.get_children(db)[0])
6489    }
6490    pub fn params(&self, db: &dyn SyntaxGroup) -> ParamList {
6491        ParamList::from_syntax_node(db, self.node.get_children(db)[1])
6492    }
6493    pub fn rightor(&self, db: &dyn SyntaxGroup) -> TerminalOr {
6494        TerminalOr::from_syntax_node(db, self.node.get_children(db)[2])
6495    }
6496}
6497#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
6498pub struct ClosureParamWrapperNAryPtr(pub SyntaxStablePtrId);
6499impl ClosureParamWrapperNAryPtr {}
6500impl TypedStablePtr for ClosureParamWrapperNAryPtr {
6501    type SyntaxNode = ClosureParamWrapperNAry;
6502    fn untyped(&self) -> SyntaxStablePtrId {
6503        self.0
6504    }
6505    fn lookup(&self, db: &dyn SyntaxGroup) -> ClosureParamWrapperNAry {
6506        ClosureParamWrapperNAry::from_syntax_node(db, self.0.lookup(db))
6507    }
6508}
6509impl From<ClosureParamWrapperNAryPtr> for SyntaxStablePtrId {
6510    fn from(ptr: ClosureParamWrapperNAryPtr) -> Self {
6511        ptr.untyped()
6512    }
6513}
6514#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
6515pub struct ClosureParamWrapperNAryGreen(pub GreenId);
6516impl TypedSyntaxNode for ClosureParamWrapperNAry {
6517    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ClosureParamWrapperNAry);
6518    type StablePtr = ClosureParamWrapperNAryPtr;
6519    type Green = ClosureParamWrapperNAryGreen;
6520    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
6521        ClosureParamWrapperNAryGreen(
6522            Arc::new(GreenNode {
6523                kind: SyntaxKind::ClosureParamWrapperNAry,
6524                details: GreenNodeDetails::Node {
6525                    children: [
6526                        TerminalOr::missing(db).0,
6527                        ParamList::missing(db).0,
6528                        TerminalOr::missing(db).0,
6529                    ]
6530                    .into(),
6531                    width: TextWidth::default(),
6532                },
6533            })
6534            .intern(db),
6535        )
6536    }
6537    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
6538        let kind = node.kind(db);
6539        assert_eq!(
6540            kind,
6541            SyntaxKind::ClosureParamWrapperNAry,
6542            "Unexpected SyntaxKind {:?}. Expected {:?}.",
6543            kind,
6544            SyntaxKind::ClosureParamWrapperNAry
6545        );
6546        Self { node }
6547    }
6548    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
6549        let kind = node.kind(db);
6550        if kind == SyntaxKind::ClosureParamWrapperNAry {
6551            Some(Self::from_syntax_node(db, node))
6552        } else {
6553            None
6554        }
6555    }
6556    fn as_syntax_node(&self) -> SyntaxNode {
6557        self.node
6558    }
6559    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
6560        ClosureParamWrapperNAryPtr(self.node.stable_ptr(db))
6561    }
6562}
6563#[derive(Clone, Debug, Eq, Hash, PartialEq)]
6564pub struct ExprPlaceholder {
6565    node: SyntaxNode,
6566}
6567impl ExprPlaceholder {
6568    pub const INDEX_DOLLAR: usize = 0;
6569    pub const INDEX_PATH: usize = 1;
6570    pub fn new_green(
6571        db: &dyn SyntaxGroup,
6572        dollar: TerminalDollarGreen,
6573        path: ExprPathGreen,
6574    ) -> ExprPlaceholderGreen {
6575        let children = [dollar.0, path.0];
6576        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
6577        ExprPlaceholderGreen(
6578            Arc::new(GreenNode {
6579                kind: SyntaxKind::ExprPlaceholder,
6580                details: GreenNodeDetails::Node { children: children.into(), width },
6581            })
6582            .intern(db),
6583        )
6584    }
6585}
6586impl ExprPlaceholder {
6587    pub fn dollar(&self, db: &dyn SyntaxGroup) -> TerminalDollar {
6588        TerminalDollar::from_syntax_node(db, self.node.get_children(db)[0])
6589    }
6590    pub fn path(&self, db: &dyn SyntaxGroup) -> ExprPath {
6591        ExprPath::from_syntax_node(db, self.node.get_children(db)[1])
6592    }
6593}
6594#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
6595pub struct ExprPlaceholderPtr(pub SyntaxStablePtrId);
6596impl ExprPlaceholderPtr {}
6597impl TypedStablePtr for ExprPlaceholderPtr {
6598    type SyntaxNode = ExprPlaceholder;
6599    fn untyped(&self) -> SyntaxStablePtrId {
6600        self.0
6601    }
6602    fn lookup(&self, db: &dyn SyntaxGroup) -> ExprPlaceholder {
6603        ExprPlaceholder::from_syntax_node(db, self.0.lookup(db))
6604    }
6605}
6606impl From<ExprPlaceholderPtr> for SyntaxStablePtrId {
6607    fn from(ptr: ExprPlaceholderPtr) -> Self {
6608        ptr.untyped()
6609    }
6610}
6611#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
6612pub struct ExprPlaceholderGreen(pub GreenId);
6613impl TypedSyntaxNode for ExprPlaceholder {
6614    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprPlaceholder);
6615    type StablePtr = ExprPlaceholderPtr;
6616    type Green = ExprPlaceholderGreen;
6617    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
6618        ExprPlaceholderGreen(
6619            Arc::new(GreenNode {
6620                kind: SyntaxKind::ExprPlaceholder,
6621                details: GreenNodeDetails::Node {
6622                    children: [TerminalDollar::missing(db).0, ExprPath::missing(db).0].into(),
6623                    width: TextWidth::default(),
6624                },
6625            })
6626            .intern(db),
6627        )
6628    }
6629    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
6630        let kind = node.kind(db);
6631        assert_eq!(
6632            kind,
6633            SyntaxKind::ExprPlaceholder,
6634            "Unexpected SyntaxKind {:?}. Expected {:?}.",
6635            kind,
6636            SyntaxKind::ExprPlaceholder
6637        );
6638        Self { node }
6639    }
6640    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
6641        let kind = node.kind(db);
6642        if kind == SyntaxKind::ExprPlaceholder {
6643            Some(Self::from_syntax_node(db, node))
6644        } else {
6645            None
6646        }
6647    }
6648    fn as_syntax_node(&self) -> SyntaxNode {
6649        self.node
6650    }
6651    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
6652        ExprPlaceholderPtr(self.node.stable_ptr(db))
6653    }
6654}
6655#[derive(Clone, Debug, Eq, Hash, PartialEq)]
6656pub struct StructArgExpr {
6657    node: SyntaxNode,
6658}
6659impl StructArgExpr {
6660    pub const INDEX_COLON: usize = 0;
6661    pub const INDEX_EXPR: usize = 1;
6662    pub fn new_green(
6663        db: &dyn SyntaxGroup,
6664        colon: TerminalColonGreen,
6665        expr: ExprGreen,
6666    ) -> StructArgExprGreen {
6667        let children = [colon.0, expr.0];
6668        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
6669        StructArgExprGreen(
6670            Arc::new(GreenNode {
6671                kind: SyntaxKind::StructArgExpr,
6672                details: GreenNodeDetails::Node { children: children.into(), width },
6673            })
6674            .intern(db),
6675        )
6676    }
6677}
6678impl StructArgExpr {
6679    pub fn colon(&self, db: &dyn SyntaxGroup) -> TerminalColon {
6680        TerminalColon::from_syntax_node(db, self.node.get_children(db)[0])
6681    }
6682    pub fn expr(&self, db: &dyn SyntaxGroup) -> Expr {
6683        Expr::from_syntax_node(db, self.node.get_children(db)[1])
6684    }
6685}
6686#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
6687pub struct StructArgExprPtr(pub SyntaxStablePtrId);
6688impl StructArgExprPtr {}
6689impl TypedStablePtr for StructArgExprPtr {
6690    type SyntaxNode = StructArgExpr;
6691    fn untyped(&self) -> SyntaxStablePtrId {
6692        self.0
6693    }
6694    fn lookup(&self, db: &dyn SyntaxGroup) -> StructArgExpr {
6695        StructArgExpr::from_syntax_node(db, self.0.lookup(db))
6696    }
6697}
6698impl From<StructArgExprPtr> for SyntaxStablePtrId {
6699    fn from(ptr: StructArgExprPtr) -> Self {
6700        ptr.untyped()
6701    }
6702}
6703#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
6704pub struct StructArgExprGreen(pub GreenId);
6705impl TypedSyntaxNode for StructArgExpr {
6706    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StructArgExpr);
6707    type StablePtr = StructArgExprPtr;
6708    type Green = StructArgExprGreen;
6709    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
6710        StructArgExprGreen(
6711            Arc::new(GreenNode {
6712                kind: SyntaxKind::StructArgExpr,
6713                details: GreenNodeDetails::Node {
6714                    children: [TerminalColon::missing(db).0, Expr::missing(db).0].into(),
6715                    width: TextWidth::default(),
6716                },
6717            })
6718            .intern(db),
6719        )
6720    }
6721    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
6722        let kind = node.kind(db);
6723        assert_eq!(
6724            kind,
6725            SyntaxKind::StructArgExpr,
6726            "Unexpected SyntaxKind {:?}. Expected {:?}.",
6727            kind,
6728            SyntaxKind::StructArgExpr
6729        );
6730        Self { node }
6731    }
6732    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
6733        let kind = node.kind(db);
6734        if kind == SyntaxKind::StructArgExpr {
6735            Some(Self::from_syntax_node(db, node))
6736        } else {
6737            None
6738        }
6739    }
6740    fn as_syntax_node(&self) -> SyntaxNode {
6741        self.node
6742    }
6743    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
6744        StructArgExprPtr(self.node.stable_ptr(db))
6745    }
6746}
6747#[derive(Clone, Debug, Eq, Hash, PartialEq)]
6748pub enum OptionStructArgExpr {
6749    Empty(OptionStructArgExprEmpty),
6750    StructArgExpr(StructArgExpr),
6751}
6752#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
6753pub struct OptionStructArgExprPtr(pub SyntaxStablePtrId);
6754impl TypedStablePtr for OptionStructArgExprPtr {
6755    type SyntaxNode = OptionStructArgExpr;
6756    fn untyped(&self) -> SyntaxStablePtrId {
6757        self.0
6758    }
6759    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionStructArgExpr {
6760        OptionStructArgExpr::from_syntax_node(db, self.0.lookup(db))
6761    }
6762}
6763impl From<OptionStructArgExprPtr> for SyntaxStablePtrId {
6764    fn from(ptr: OptionStructArgExprPtr) -> Self {
6765        ptr.untyped()
6766    }
6767}
6768impl From<OptionStructArgExprEmptyPtr> for OptionStructArgExprPtr {
6769    fn from(value: OptionStructArgExprEmptyPtr) -> Self {
6770        Self(value.0)
6771    }
6772}
6773impl From<StructArgExprPtr> for OptionStructArgExprPtr {
6774    fn from(value: StructArgExprPtr) -> Self {
6775        Self(value.0)
6776    }
6777}
6778impl From<OptionStructArgExprEmptyGreen> for OptionStructArgExprGreen {
6779    fn from(value: OptionStructArgExprEmptyGreen) -> Self {
6780        Self(value.0)
6781    }
6782}
6783impl From<StructArgExprGreen> for OptionStructArgExprGreen {
6784    fn from(value: StructArgExprGreen) -> Self {
6785        Self(value.0)
6786    }
6787}
6788#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
6789pub struct OptionStructArgExprGreen(pub GreenId);
6790impl TypedSyntaxNode for OptionStructArgExpr {
6791    const OPTIONAL_KIND: Option<SyntaxKind> = None;
6792    type StablePtr = OptionStructArgExprPtr;
6793    type Green = OptionStructArgExprGreen;
6794    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
6795        panic!("No missing variant.");
6796    }
6797    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
6798        let kind = node.kind(db);
6799        match kind {
6800            SyntaxKind::OptionStructArgExprEmpty => {
6801                OptionStructArgExpr::Empty(OptionStructArgExprEmpty::from_syntax_node(db, node))
6802            }
6803            SyntaxKind::StructArgExpr => {
6804                OptionStructArgExpr::StructArgExpr(StructArgExpr::from_syntax_node(db, node))
6805            }
6806            _ => panic!(
6807                "Unexpected syntax kind {:?} when constructing {}.",
6808                kind, "OptionStructArgExpr"
6809            ),
6810        }
6811    }
6812    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
6813        let kind = node.kind(db);
6814        match kind {
6815            SyntaxKind::OptionStructArgExprEmpty => Some(OptionStructArgExpr::Empty(
6816                OptionStructArgExprEmpty::from_syntax_node(db, node),
6817            )),
6818            SyntaxKind::StructArgExpr => {
6819                Some(OptionStructArgExpr::StructArgExpr(StructArgExpr::from_syntax_node(db, node)))
6820            }
6821            _ => None,
6822        }
6823    }
6824    fn as_syntax_node(&self) -> SyntaxNode {
6825        match self {
6826            OptionStructArgExpr::Empty(x) => x.as_syntax_node(),
6827            OptionStructArgExpr::StructArgExpr(x) => x.as_syntax_node(),
6828        }
6829    }
6830    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
6831        OptionStructArgExprPtr(self.as_syntax_node().lookup_intern(db).stable_ptr)
6832    }
6833}
6834impl OptionStructArgExpr {
6835    /// Checks if a kind of a variant of [OptionStructArgExpr].
6836    pub fn is_variant(kind: SyntaxKind) -> bool {
6837        matches!(kind, SyntaxKind::OptionStructArgExprEmpty | SyntaxKind::StructArgExpr)
6838    }
6839}
6840#[derive(Clone, Debug, Eq, Hash, PartialEq)]
6841pub struct OptionStructArgExprEmpty {
6842    node: SyntaxNode,
6843}
6844impl OptionStructArgExprEmpty {
6845    pub fn new_green(db: &dyn SyntaxGroup) -> OptionStructArgExprEmptyGreen {
6846        let children = [];
6847        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
6848        OptionStructArgExprEmptyGreen(
6849            Arc::new(GreenNode {
6850                kind: SyntaxKind::OptionStructArgExprEmpty,
6851                details: GreenNodeDetails::Node { children: children.into(), width },
6852            })
6853            .intern(db),
6854        )
6855    }
6856}
6857impl OptionStructArgExprEmpty {}
6858#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
6859pub struct OptionStructArgExprEmptyPtr(pub SyntaxStablePtrId);
6860impl OptionStructArgExprEmptyPtr {}
6861impl TypedStablePtr for OptionStructArgExprEmptyPtr {
6862    type SyntaxNode = OptionStructArgExprEmpty;
6863    fn untyped(&self) -> SyntaxStablePtrId {
6864        self.0
6865    }
6866    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionStructArgExprEmpty {
6867        OptionStructArgExprEmpty::from_syntax_node(db, self.0.lookup(db))
6868    }
6869}
6870impl From<OptionStructArgExprEmptyPtr> for SyntaxStablePtrId {
6871    fn from(ptr: OptionStructArgExprEmptyPtr) -> Self {
6872        ptr.untyped()
6873    }
6874}
6875#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
6876pub struct OptionStructArgExprEmptyGreen(pub GreenId);
6877impl TypedSyntaxNode for OptionStructArgExprEmpty {
6878    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionStructArgExprEmpty);
6879    type StablePtr = OptionStructArgExprEmptyPtr;
6880    type Green = OptionStructArgExprEmptyGreen;
6881    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
6882        OptionStructArgExprEmptyGreen(
6883            Arc::new(GreenNode {
6884                kind: SyntaxKind::OptionStructArgExprEmpty,
6885                details: GreenNodeDetails::Node {
6886                    children: [].into(),
6887                    width: TextWidth::default(),
6888                },
6889            })
6890            .intern(db),
6891        )
6892    }
6893    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
6894        let kind = node.kind(db);
6895        assert_eq!(
6896            kind,
6897            SyntaxKind::OptionStructArgExprEmpty,
6898            "Unexpected SyntaxKind {:?}. Expected {:?}.",
6899            kind,
6900            SyntaxKind::OptionStructArgExprEmpty
6901        );
6902        Self { node }
6903    }
6904    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
6905        let kind = node.kind(db);
6906        if kind == SyntaxKind::OptionStructArgExprEmpty {
6907            Some(Self::from_syntax_node(db, node))
6908        } else {
6909            None
6910        }
6911    }
6912    fn as_syntax_node(&self) -> SyntaxNode {
6913        self.node
6914    }
6915    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
6916        OptionStructArgExprEmptyPtr(self.node.stable_ptr(db))
6917    }
6918}
6919#[derive(Clone, Debug, Eq, Hash, PartialEq)]
6920pub struct StructArgSingle {
6921    node: SyntaxNode,
6922}
6923impl StructArgSingle {
6924    pub const INDEX_IDENTIFIER: usize = 0;
6925    pub const INDEX_ARG_EXPR: usize = 1;
6926    pub fn new_green(
6927        db: &dyn SyntaxGroup,
6928        identifier: TerminalIdentifierGreen,
6929        arg_expr: OptionStructArgExprGreen,
6930    ) -> StructArgSingleGreen {
6931        let children = [identifier.0, arg_expr.0];
6932        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
6933        StructArgSingleGreen(
6934            Arc::new(GreenNode {
6935                kind: SyntaxKind::StructArgSingle,
6936                details: GreenNodeDetails::Node { children: children.into(), width },
6937            })
6938            .intern(db),
6939        )
6940    }
6941}
6942impl StructArgSingle {
6943    pub fn identifier(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier {
6944        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[0])
6945    }
6946    pub fn arg_expr(&self, db: &dyn SyntaxGroup) -> OptionStructArgExpr {
6947        OptionStructArgExpr::from_syntax_node(db, self.node.get_children(db)[1])
6948    }
6949}
6950#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
6951pub struct StructArgSinglePtr(pub SyntaxStablePtrId);
6952impl StructArgSinglePtr {
6953    pub fn identifier_green(self, db: &dyn SyntaxGroup) -> TerminalIdentifierGreen {
6954        let ptr = self.0.lookup_intern(db);
6955        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
6956            TerminalIdentifierGreen(key_fields[0])
6957        } else {
6958            panic!("Unexpected key field query on root.");
6959        }
6960    }
6961}
6962impl TypedStablePtr for StructArgSinglePtr {
6963    type SyntaxNode = StructArgSingle;
6964    fn untyped(&self) -> SyntaxStablePtrId {
6965        self.0
6966    }
6967    fn lookup(&self, db: &dyn SyntaxGroup) -> StructArgSingle {
6968        StructArgSingle::from_syntax_node(db, self.0.lookup(db))
6969    }
6970}
6971impl From<StructArgSinglePtr> for SyntaxStablePtrId {
6972    fn from(ptr: StructArgSinglePtr) -> Self {
6973        ptr.untyped()
6974    }
6975}
6976#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
6977pub struct StructArgSingleGreen(pub GreenId);
6978impl TypedSyntaxNode for StructArgSingle {
6979    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StructArgSingle);
6980    type StablePtr = StructArgSinglePtr;
6981    type Green = StructArgSingleGreen;
6982    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
6983        StructArgSingleGreen(
6984            Arc::new(GreenNode {
6985                kind: SyntaxKind::StructArgSingle,
6986                details: GreenNodeDetails::Node {
6987                    children: [
6988                        TerminalIdentifier::missing(db).0,
6989                        OptionStructArgExpr::missing(db).0,
6990                    ]
6991                    .into(),
6992                    width: TextWidth::default(),
6993                },
6994            })
6995            .intern(db),
6996        )
6997    }
6998    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
6999        let kind = node.kind(db);
7000        assert_eq!(
7001            kind,
7002            SyntaxKind::StructArgSingle,
7003            "Unexpected SyntaxKind {:?}. Expected {:?}.",
7004            kind,
7005            SyntaxKind::StructArgSingle
7006        );
7007        Self { node }
7008    }
7009    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
7010        let kind = node.kind(db);
7011        if kind == SyntaxKind::StructArgSingle {
7012            Some(Self::from_syntax_node(db, node))
7013        } else {
7014            None
7015        }
7016    }
7017    fn as_syntax_node(&self) -> SyntaxNode {
7018        self.node
7019    }
7020    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
7021        StructArgSinglePtr(self.node.stable_ptr(db))
7022    }
7023}
7024#[derive(Clone, Debug, Eq, Hash, PartialEq)]
7025pub struct StructArgTail {
7026    node: SyntaxNode,
7027}
7028impl StructArgTail {
7029    pub const INDEX_DOTDOT: usize = 0;
7030    pub const INDEX_EXPRESSION: usize = 1;
7031    pub fn new_green(
7032        db: &dyn SyntaxGroup,
7033        dotdot: TerminalDotDotGreen,
7034        expression: ExprGreen,
7035    ) -> StructArgTailGreen {
7036        let children = [dotdot.0, expression.0];
7037        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
7038        StructArgTailGreen(
7039            Arc::new(GreenNode {
7040                kind: SyntaxKind::StructArgTail,
7041                details: GreenNodeDetails::Node { children: children.into(), width },
7042            })
7043            .intern(db),
7044        )
7045    }
7046}
7047impl StructArgTail {
7048    pub fn dotdot(&self, db: &dyn SyntaxGroup) -> TerminalDotDot {
7049        TerminalDotDot::from_syntax_node(db, self.node.get_children(db)[0])
7050    }
7051    pub fn expression(&self, db: &dyn SyntaxGroup) -> Expr {
7052        Expr::from_syntax_node(db, self.node.get_children(db)[1])
7053    }
7054}
7055#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
7056pub struct StructArgTailPtr(pub SyntaxStablePtrId);
7057impl StructArgTailPtr {}
7058impl TypedStablePtr for StructArgTailPtr {
7059    type SyntaxNode = StructArgTail;
7060    fn untyped(&self) -> SyntaxStablePtrId {
7061        self.0
7062    }
7063    fn lookup(&self, db: &dyn SyntaxGroup) -> StructArgTail {
7064        StructArgTail::from_syntax_node(db, self.0.lookup(db))
7065    }
7066}
7067impl From<StructArgTailPtr> for SyntaxStablePtrId {
7068    fn from(ptr: StructArgTailPtr) -> Self {
7069        ptr.untyped()
7070    }
7071}
7072#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
7073pub struct StructArgTailGreen(pub GreenId);
7074impl TypedSyntaxNode for StructArgTail {
7075    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StructArgTail);
7076    type StablePtr = StructArgTailPtr;
7077    type Green = StructArgTailGreen;
7078    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
7079        StructArgTailGreen(
7080            Arc::new(GreenNode {
7081                kind: SyntaxKind::StructArgTail,
7082                details: GreenNodeDetails::Node {
7083                    children: [TerminalDotDot::missing(db).0, Expr::missing(db).0].into(),
7084                    width: TextWidth::default(),
7085                },
7086            })
7087            .intern(db),
7088        )
7089    }
7090    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
7091        let kind = node.kind(db);
7092        assert_eq!(
7093            kind,
7094            SyntaxKind::StructArgTail,
7095            "Unexpected SyntaxKind {:?}. Expected {:?}.",
7096            kind,
7097            SyntaxKind::StructArgTail
7098        );
7099        Self { node }
7100    }
7101    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
7102        let kind = node.kind(db);
7103        if kind == SyntaxKind::StructArgTail {
7104            Some(Self::from_syntax_node(db, node))
7105        } else {
7106            None
7107        }
7108    }
7109    fn as_syntax_node(&self) -> SyntaxNode {
7110        self.node
7111    }
7112    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
7113        StructArgTailPtr(self.node.stable_ptr(db))
7114    }
7115}
7116#[derive(Clone, Debug, Eq, Hash, PartialEq)]
7117pub enum StructArg {
7118    StructArgSingle(StructArgSingle),
7119    StructArgTail(StructArgTail),
7120}
7121#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
7122pub struct StructArgPtr(pub SyntaxStablePtrId);
7123impl TypedStablePtr for StructArgPtr {
7124    type SyntaxNode = StructArg;
7125    fn untyped(&self) -> SyntaxStablePtrId {
7126        self.0
7127    }
7128    fn lookup(&self, db: &dyn SyntaxGroup) -> StructArg {
7129        StructArg::from_syntax_node(db, self.0.lookup(db))
7130    }
7131}
7132impl From<StructArgPtr> for SyntaxStablePtrId {
7133    fn from(ptr: StructArgPtr) -> Self {
7134        ptr.untyped()
7135    }
7136}
7137impl From<StructArgSinglePtr> for StructArgPtr {
7138    fn from(value: StructArgSinglePtr) -> Self {
7139        Self(value.0)
7140    }
7141}
7142impl From<StructArgTailPtr> for StructArgPtr {
7143    fn from(value: StructArgTailPtr) -> Self {
7144        Self(value.0)
7145    }
7146}
7147impl From<StructArgSingleGreen> for StructArgGreen {
7148    fn from(value: StructArgSingleGreen) -> Self {
7149        Self(value.0)
7150    }
7151}
7152impl From<StructArgTailGreen> for StructArgGreen {
7153    fn from(value: StructArgTailGreen) -> Self {
7154        Self(value.0)
7155    }
7156}
7157#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
7158pub struct StructArgGreen(pub GreenId);
7159impl TypedSyntaxNode for StructArg {
7160    const OPTIONAL_KIND: Option<SyntaxKind> = None;
7161    type StablePtr = StructArgPtr;
7162    type Green = StructArgGreen;
7163    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
7164        panic!("No missing variant.");
7165    }
7166    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
7167        let kind = node.kind(db);
7168        match kind {
7169            SyntaxKind::StructArgSingle => {
7170                StructArg::StructArgSingle(StructArgSingle::from_syntax_node(db, node))
7171            }
7172            SyntaxKind::StructArgTail => {
7173                StructArg::StructArgTail(StructArgTail::from_syntax_node(db, node))
7174            }
7175            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "StructArg"),
7176        }
7177    }
7178    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
7179        let kind = node.kind(db);
7180        match kind {
7181            SyntaxKind::StructArgSingle => {
7182                Some(StructArg::StructArgSingle(StructArgSingle::from_syntax_node(db, node)))
7183            }
7184            SyntaxKind::StructArgTail => {
7185                Some(StructArg::StructArgTail(StructArgTail::from_syntax_node(db, node)))
7186            }
7187            _ => None,
7188        }
7189    }
7190    fn as_syntax_node(&self) -> SyntaxNode {
7191        match self {
7192            StructArg::StructArgSingle(x) => x.as_syntax_node(),
7193            StructArg::StructArgTail(x) => x.as_syntax_node(),
7194        }
7195    }
7196    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
7197        StructArgPtr(self.as_syntax_node().lookup_intern(db).stable_ptr)
7198    }
7199}
7200impl StructArg {
7201    /// Checks if a kind of a variant of [StructArg].
7202    pub fn is_variant(kind: SyntaxKind) -> bool {
7203        matches!(kind, SyntaxKind::StructArgSingle | SyntaxKind::StructArgTail)
7204    }
7205}
7206#[derive(Clone, Debug, Eq, Hash, PartialEq)]
7207pub struct StructArgList(ElementList<StructArg, 2>);
7208impl Deref for StructArgList {
7209    type Target = ElementList<StructArg, 2>;
7210    fn deref(&self) -> &Self::Target {
7211        &self.0
7212    }
7213}
7214impl StructArgList {
7215    pub fn new_green(
7216        db: &dyn SyntaxGroup,
7217        children: &[StructArgListElementOrSeparatorGreen],
7218    ) -> StructArgListGreen {
7219        let width = children.iter().map(|id| id.id().lookup_intern(db).width()).sum();
7220        StructArgListGreen(
7221            Arc::new(GreenNode {
7222                kind: SyntaxKind::StructArgList,
7223                details: GreenNodeDetails::Node {
7224                    children: children.iter().map(|x| x.id()).collect(),
7225                    width,
7226                },
7227            })
7228            .intern(db),
7229        )
7230    }
7231}
7232#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
7233pub struct StructArgListPtr(pub SyntaxStablePtrId);
7234impl TypedStablePtr for StructArgListPtr {
7235    type SyntaxNode = StructArgList;
7236    fn untyped(&self) -> SyntaxStablePtrId {
7237        self.0
7238    }
7239    fn lookup(&self, db: &dyn SyntaxGroup) -> StructArgList {
7240        StructArgList::from_syntax_node(db, self.0.lookup(db))
7241    }
7242}
7243impl From<StructArgListPtr> for SyntaxStablePtrId {
7244    fn from(ptr: StructArgListPtr) -> Self {
7245        ptr.untyped()
7246    }
7247}
7248#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
7249pub enum StructArgListElementOrSeparatorGreen {
7250    Separator(TerminalCommaGreen),
7251    Element(StructArgGreen),
7252}
7253impl From<TerminalCommaGreen> for StructArgListElementOrSeparatorGreen {
7254    fn from(value: TerminalCommaGreen) -> Self {
7255        StructArgListElementOrSeparatorGreen::Separator(value)
7256    }
7257}
7258impl From<StructArgGreen> for StructArgListElementOrSeparatorGreen {
7259    fn from(value: StructArgGreen) -> Self {
7260        StructArgListElementOrSeparatorGreen::Element(value)
7261    }
7262}
7263impl StructArgListElementOrSeparatorGreen {
7264    fn id(&self) -> GreenId {
7265        match self {
7266            StructArgListElementOrSeparatorGreen::Separator(green) => green.0,
7267            StructArgListElementOrSeparatorGreen::Element(green) => green.0,
7268        }
7269    }
7270}
7271#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
7272pub struct StructArgListGreen(pub GreenId);
7273impl TypedSyntaxNode for StructArgList {
7274    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StructArgList);
7275    type StablePtr = StructArgListPtr;
7276    type Green = StructArgListGreen;
7277    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
7278        StructArgListGreen(
7279            Arc::new(GreenNode {
7280                kind: SyntaxKind::StructArgList,
7281                details: GreenNodeDetails::Node {
7282                    children: [].into(),
7283                    width: TextWidth::default(),
7284                },
7285            })
7286            .intern(db),
7287        )
7288    }
7289    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
7290        Self(ElementList::new(node))
7291    }
7292    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
7293        if node.kind(db) == SyntaxKind::StructArgList {
7294            Some(Self(ElementList::new(node)))
7295        } else {
7296            None
7297        }
7298    }
7299    fn as_syntax_node(&self) -> SyntaxNode {
7300        self.node
7301    }
7302    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
7303        StructArgListPtr(self.node.stable_ptr(db))
7304    }
7305}
7306#[derive(Clone, Debug, Eq, Hash, PartialEq)]
7307pub struct ArgListBraced {
7308    node: SyntaxNode,
7309}
7310impl ArgListBraced {
7311    pub const INDEX_LBRACE: usize = 0;
7312    pub const INDEX_ARGUMENTS: usize = 1;
7313    pub const INDEX_RBRACE: usize = 2;
7314    pub fn new_green(
7315        db: &dyn SyntaxGroup,
7316        lbrace: TerminalLBraceGreen,
7317        arguments: ArgListGreen,
7318        rbrace: TerminalRBraceGreen,
7319    ) -> ArgListBracedGreen {
7320        let children = [lbrace.0, arguments.0, rbrace.0];
7321        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
7322        ArgListBracedGreen(
7323            Arc::new(GreenNode {
7324                kind: SyntaxKind::ArgListBraced,
7325                details: GreenNodeDetails::Node { children: children.into(), width },
7326            })
7327            .intern(db),
7328        )
7329    }
7330}
7331impl ArgListBraced {
7332    pub fn lbrace(&self, db: &dyn SyntaxGroup) -> TerminalLBrace {
7333        TerminalLBrace::from_syntax_node(db, self.node.get_children(db)[0])
7334    }
7335    pub fn arguments(&self, db: &dyn SyntaxGroup) -> ArgList {
7336        ArgList::from_syntax_node(db, self.node.get_children(db)[1])
7337    }
7338    pub fn rbrace(&self, db: &dyn SyntaxGroup) -> TerminalRBrace {
7339        TerminalRBrace::from_syntax_node(db, self.node.get_children(db)[2])
7340    }
7341}
7342#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
7343pub struct ArgListBracedPtr(pub SyntaxStablePtrId);
7344impl ArgListBracedPtr {}
7345impl TypedStablePtr for ArgListBracedPtr {
7346    type SyntaxNode = ArgListBraced;
7347    fn untyped(&self) -> SyntaxStablePtrId {
7348        self.0
7349    }
7350    fn lookup(&self, db: &dyn SyntaxGroup) -> ArgListBraced {
7351        ArgListBraced::from_syntax_node(db, self.0.lookup(db))
7352    }
7353}
7354impl From<ArgListBracedPtr> for SyntaxStablePtrId {
7355    fn from(ptr: ArgListBracedPtr) -> Self {
7356        ptr.untyped()
7357    }
7358}
7359#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
7360pub struct ArgListBracedGreen(pub GreenId);
7361impl TypedSyntaxNode for ArgListBraced {
7362    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ArgListBraced);
7363    type StablePtr = ArgListBracedPtr;
7364    type Green = ArgListBracedGreen;
7365    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
7366        ArgListBracedGreen(
7367            Arc::new(GreenNode {
7368                kind: SyntaxKind::ArgListBraced,
7369                details: GreenNodeDetails::Node {
7370                    children: [
7371                        TerminalLBrace::missing(db).0,
7372                        ArgList::missing(db).0,
7373                        TerminalRBrace::missing(db).0,
7374                    ]
7375                    .into(),
7376                    width: TextWidth::default(),
7377                },
7378            })
7379            .intern(db),
7380        )
7381    }
7382    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
7383        let kind = node.kind(db);
7384        assert_eq!(
7385            kind,
7386            SyntaxKind::ArgListBraced,
7387            "Unexpected SyntaxKind {:?}. Expected {:?}.",
7388            kind,
7389            SyntaxKind::ArgListBraced
7390        );
7391        Self { node }
7392    }
7393    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
7394        let kind = node.kind(db);
7395        if kind == SyntaxKind::ArgListBraced {
7396            Some(Self::from_syntax_node(db, node))
7397        } else {
7398            None
7399        }
7400    }
7401    fn as_syntax_node(&self) -> SyntaxNode {
7402        self.node
7403    }
7404    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
7405        ArgListBracedPtr(self.node.stable_ptr(db))
7406    }
7407}
7408#[derive(Clone, Debug, Eq, Hash, PartialEq)]
7409pub struct ArgListBracketed {
7410    node: SyntaxNode,
7411}
7412impl ArgListBracketed {
7413    pub const INDEX_LBRACK: usize = 0;
7414    pub const INDEX_ARGUMENTS: usize = 1;
7415    pub const INDEX_RBRACK: usize = 2;
7416    pub fn new_green(
7417        db: &dyn SyntaxGroup,
7418        lbrack: TerminalLBrackGreen,
7419        arguments: ArgListGreen,
7420        rbrack: TerminalRBrackGreen,
7421    ) -> ArgListBracketedGreen {
7422        let children = [lbrack.0, arguments.0, rbrack.0];
7423        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
7424        ArgListBracketedGreen(
7425            Arc::new(GreenNode {
7426                kind: SyntaxKind::ArgListBracketed,
7427                details: GreenNodeDetails::Node { children: children.into(), width },
7428            })
7429            .intern(db),
7430        )
7431    }
7432}
7433impl ArgListBracketed {
7434    pub fn lbrack(&self, db: &dyn SyntaxGroup) -> TerminalLBrack {
7435        TerminalLBrack::from_syntax_node(db, self.node.get_children(db)[0])
7436    }
7437    pub fn arguments(&self, db: &dyn SyntaxGroup) -> ArgList {
7438        ArgList::from_syntax_node(db, self.node.get_children(db)[1])
7439    }
7440    pub fn rbrack(&self, db: &dyn SyntaxGroup) -> TerminalRBrack {
7441        TerminalRBrack::from_syntax_node(db, self.node.get_children(db)[2])
7442    }
7443}
7444#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
7445pub struct ArgListBracketedPtr(pub SyntaxStablePtrId);
7446impl ArgListBracketedPtr {}
7447impl TypedStablePtr for ArgListBracketedPtr {
7448    type SyntaxNode = ArgListBracketed;
7449    fn untyped(&self) -> SyntaxStablePtrId {
7450        self.0
7451    }
7452    fn lookup(&self, db: &dyn SyntaxGroup) -> ArgListBracketed {
7453        ArgListBracketed::from_syntax_node(db, self.0.lookup(db))
7454    }
7455}
7456impl From<ArgListBracketedPtr> for SyntaxStablePtrId {
7457    fn from(ptr: ArgListBracketedPtr) -> Self {
7458        ptr.untyped()
7459    }
7460}
7461#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
7462pub struct ArgListBracketedGreen(pub GreenId);
7463impl TypedSyntaxNode for ArgListBracketed {
7464    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ArgListBracketed);
7465    type StablePtr = ArgListBracketedPtr;
7466    type Green = ArgListBracketedGreen;
7467    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
7468        ArgListBracketedGreen(
7469            Arc::new(GreenNode {
7470                kind: SyntaxKind::ArgListBracketed,
7471                details: GreenNodeDetails::Node {
7472                    children: [
7473                        TerminalLBrack::missing(db).0,
7474                        ArgList::missing(db).0,
7475                        TerminalRBrack::missing(db).0,
7476                    ]
7477                    .into(),
7478                    width: TextWidth::default(),
7479                },
7480            })
7481            .intern(db),
7482        )
7483    }
7484    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
7485        let kind = node.kind(db);
7486        assert_eq!(
7487            kind,
7488            SyntaxKind::ArgListBracketed,
7489            "Unexpected SyntaxKind {:?}. Expected {:?}.",
7490            kind,
7491            SyntaxKind::ArgListBracketed
7492        );
7493        Self { node }
7494    }
7495    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
7496        let kind = node.kind(db);
7497        if kind == SyntaxKind::ArgListBracketed {
7498            Some(Self::from_syntax_node(db, node))
7499        } else {
7500            None
7501        }
7502    }
7503    fn as_syntax_node(&self) -> SyntaxNode {
7504        self.node
7505    }
7506    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
7507        ArgListBracketedPtr(self.node.stable_ptr(db))
7508    }
7509}
7510#[derive(Clone, Debug, Eq, Hash, PartialEq)]
7511pub enum WrappedArgList {
7512    BracketedArgList(ArgListBracketed),
7513    ParenthesizedArgList(ArgListParenthesized),
7514    BracedArgList(ArgListBraced),
7515    Missing(WrappedArgListMissing),
7516}
7517#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
7518pub struct WrappedArgListPtr(pub SyntaxStablePtrId);
7519impl TypedStablePtr for WrappedArgListPtr {
7520    type SyntaxNode = WrappedArgList;
7521    fn untyped(&self) -> SyntaxStablePtrId {
7522        self.0
7523    }
7524    fn lookup(&self, db: &dyn SyntaxGroup) -> WrappedArgList {
7525        WrappedArgList::from_syntax_node(db, self.0.lookup(db))
7526    }
7527}
7528impl From<WrappedArgListPtr> for SyntaxStablePtrId {
7529    fn from(ptr: WrappedArgListPtr) -> Self {
7530        ptr.untyped()
7531    }
7532}
7533impl From<ArgListBracketedPtr> for WrappedArgListPtr {
7534    fn from(value: ArgListBracketedPtr) -> Self {
7535        Self(value.0)
7536    }
7537}
7538impl From<ArgListParenthesizedPtr> for WrappedArgListPtr {
7539    fn from(value: ArgListParenthesizedPtr) -> Self {
7540        Self(value.0)
7541    }
7542}
7543impl From<ArgListBracedPtr> for WrappedArgListPtr {
7544    fn from(value: ArgListBracedPtr) -> Self {
7545        Self(value.0)
7546    }
7547}
7548impl From<WrappedArgListMissingPtr> for WrappedArgListPtr {
7549    fn from(value: WrappedArgListMissingPtr) -> Self {
7550        Self(value.0)
7551    }
7552}
7553impl From<ArgListBracketedGreen> for WrappedArgListGreen {
7554    fn from(value: ArgListBracketedGreen) -> Self {
7555        Self(value.0)
7556    }
7557}
7558impl From<ArgListParenthesizedGreen> for WrappedArgListGreen {
7559    fn from(value: ArgListParenthesizedGreen) -> Self {
7560        Self(value.0)
7561    }
7562}
7563impl From<ArgListBracedGreen> for WrappedArgListGreen {
7564    fn from(value: ArgListBracedGreen) -> Self {
7565        Self(value.0)
7566    }
7567}
7568impl From<WrappedArgListMissingGreen> for WrappedArgListGreen {
7569    fn from(value: WrappedArgListMissingGreen) -> Self {
7570        Self(value.0)
7571    }
7572}
7573#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
7574pub struct WrappedArgListGreen(pub GreenId);
7575impl TypedSyntaxNode for WrappedArgList {
7576    const OPTIONAL_KIND: Option<SyntaxKind> = None;
7577    type StablePtr = WrappedArgListPtr;
7578    type Green = WrappedArgListGreen;
7579    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
7580        WrappedArgListGreen(WrappedArgListMissing::missing(db).0)
7581    }
7582    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
7583        let kind = node.kind(db);
7584        match kind {
7585            SyntaxKind::ArgListBracketed => {
7586                WrappedArgList::BracketedArgList(ArgListBracketed::from_syntax_node(db, node))
7587            }
7588            SyntaxKind::ArgListParenthesized => WrappedArgList::ParenthesizedArgList(
7589                ArgListParenthesized::from_syntax_node(db, node),
7590            ),
7591            SyntaxKind::ArgListBraced => {
7592                WrappedArgList::BracedArgList(ArgListBraced::from_syntax_node(db, node))
7593            }
7594            SyntaxKind::WrappedArgListMissing => {
7595                WrappedArgList::Missing(WrappedArgListMissing::from_syntax_node(db, node))
7596            }
7597            _ => {
7598                panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "WrappedArgList")
7599            }
7600        }
7601    }
7602    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
7603        let kind = node.kind(db);
7604        match kind {
7605            SyntaxKind::ArgListBracketed => {
7606                Some(WrappedArgList::BracketedArgList(ArgListBracketed::from_syntax_node(db, node)))
7607            }
7608            SyntaxKind::ArgListParenthesized => Some(WrappedArgList::ParenthesizedArgList(
7609                ArgListParenthesized::from_syntax_node(db, node),
7610            )),
7611            SyntaxKind::ArgListBraced => {
7612                Some(WrappedArgList::BracedArgList(ArgListBraced::from_syntax_node(db, node)))
7613            }
7614            SyntaxKind::WrappedArgListMissing => {
7615                Some(WrappedArgList::Missing(WrappedArgListMissing::from_syntax_node(db, node)))
7616            }
7617            _ => None,
7618        }
7619    }
7620    fn as_syntax_node(&self) -> SyntaxNode {
7621        match self {
7622            WrappedArgList::BracketedArgList(x) => x.as_syntax_node(),
7623            WrappedArgList::ParenthesizedArgList(x) => x.as_syntax_node(),
7624            WrappedArgList::BracedArgList(x) => x.as_syntax_node(),
7625            WrappedArgList::Missing(x) => x.as_syntax_node(),
7626        }
7627    }
7628    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
7629        WrappedArgListPtr(self.as_syntax_node().lookup_intern(db).stable_ptr)
7630    }
7631}
7632impl WrappedArgList {
7633    /// Checks if a kind of a variant of [WrappedArgList].
7634    pub fn is_variant(kind: SyntaxKind) -> bool {
7635        matches!(
7636            kind,
7637            SyntaxKind::ArgListBracketed
7638                | SyntaxKind::ArgListParenthesized
7639                | SyntaxKind::ArgListBraced
7640                | SyntaxKind::WrappedArgListMissing
7641        )
7642    }
7643}
7644#[derive(Clone, Debug, Eq, Hash, PartialEq)]
7645pub struct WrappedArgListMissing {
7646    node: SyntaxNode,
7647}
7648impl WrappedArgListMissing {
7649    pub fn new_green(db: &dyn SyntaxGroup) -> WrappedArgListMissingGreen {
7650        let children = [];
7651        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
7652        WrappedArgListMissingGreen(
7653            Arc::new(GreenNode {
7654                kind: SyntaxKind::WrappedArgListMissing,
7655                details: GreenNodeDetails::Node { children: children.into(), width },
7656            })
7657            .intern(db),
7658        )
7659    }
7660}
7661impl WrappedArgListMissing {}
7662#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
7663pub struct WrappedArgListMissingPtr(pub SyntaxStablePtrId);
7664impl WrappedArgListMissingPtr {}
7665impl TypedStablePtr for WrappedArgListMissingPtr {
7666    type SyntaxNode = WrappedArgListMissing;
7667    fn untyped(&self) -> SyntaxStablePtrId {
7668        self.0
7669    }
7670    fn lookup(&self, db: &dyn SyntaxGroup) -> WrappedArgListMissing {
7671        WrappedArgListMissing::from_syntax_node(db, self.0.lookup(db))
7672    }
7673}
7674impl From<WrappedArgListMissingPtr> for SyntaxStablePtrId {
7675    fn from(ptr: WrappedArgListMissingPtr) -> Self {
7676        ptr.untyped()
7677    }
7678}
7679#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
7680pub struct WrappedArgListMissingGreen(pub GreenId);
7681impl TypedSyntaxNode for WrappedArgListMissing {
7682    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::WrappedArgListMissing);
7683    type StablePtr = WrappedArgListMissingPtr;
7684    type Green = WrappedArgListMissingGreen;
7685    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
7686        WrappedArgListMissingGreen(
7687            Arc::new(GreenNode {
7688                kind: SyntaxKind::WrappedArgListMissing,
7689                details: GreenNodeDetails::Node {
7690                    children: [].into(),
7691                    width: TextWidth::default(),
7692                },
7693            })
7694            .intern(db),
7695        )
7696    }
7697    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
7698        let kind = node.kind(db);
7699        assert_eq!(
7700            kind,
7701            SyntaxKind::WrappedArgListMissing,
7702            "Unexpected SyntaxKind {:?}. Expected {:?}.",
7703            kind,
7704            SyntaxKind::WrappedArgListMissing
7705        );
7706        Self { node }
7707    }
7708    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
7709        let kind = node.kind(db);
7710        if kind == SyntaxKind::WrappedArgListMissing {
7711            Some(Self::from_syntax_node(db, node))
7712        } else {
7713            None
7714        }
7715    }
7716    fn as_syntax_node(&self) -> SyntaxNode {
7717        self.node
7718    }
7719    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
7720        WrappedArgListMissingPtr(self.node.stable_ptr(db))
7721    }
7722}
7723#[derive(Clone, Debug, Eq, Hash, PartialEq)]
7724pub enum Pattern {
7725    Underscore(TerminalUnderscore),
7726    Literal(TerminalLiteralNumber),
7727    False(TerminalFalse),
7728    True(TerminalTrue),
7729    ShortString(TerminalShortString),
7730    String(TerminalString),
7731    Identifier(PatternIdentifier),
7732    Struct(PatternStruct),
7733    Tuple(PatternTuple),
7734    Enum(PatternEnum),
7735    FixedSizeArray(PatternFixedSizeArray),
7736    Path(ExprPath),
7737}
7738#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
7739pub struct PatternPtr(pub SyntaxStablePtrId);
7740impl TypedStablePtr for PatternPtr {
7741    type SyntaxNode = Pattern;
7742    fn untyped(&self) -> SyntaxStablePtrId {
7743        self.0
7744    }
7745    fn lookup(&self, db: &dyn SyntaxGroup) -> Pattern {
7746        Pattern::from_syntax_node(db, self.0.lookup(db))
7747    }
7748}
7749impl From<PatternPtr> for SyntaxStablePtrId {
7750    fn from(ptr: PatternPtr) -> Self {
7751        ptr.untyped()
7752    }
7753}
7754impl From<TerminalUnderscorePtr> for PatternPtr {
7755    fn from(value: TerminalUnderscorePtr) -> Self {
7756        Self(value.0)
7757    }
7758}
7759impl From<TerminalLiteralNumberPtr> for PatternPtr {
7760    fn from(value: TerminalLiteralNumberPtr) -> Self {
7761        Self(value.0)
7762    }
7763}
7764impl From<TerminalFalsePtr> for PatternPtr {
7765    fn from(value: TerminalFalsePtr) -> Self {
7766        Self(value.0)
7767    }
7768}
7769impl From<TerminalTruePtr> for PatternPtr {
7770    fn from(value: TerminalTruePtr) -> Self {
7771        Self(value.0)
7772    }
7773}
7774impl From<TerminalShortStringPtr> for PatternPtr {
7775    fn from(value: TerminalShortStringPtr) -> Self {
7776        Self(value.0)
7777    }
7778}
7779impl From<TerminalStringPtr> for PatternPtr {
7780    fn from(value: TerminalStringPtr) -> Self {
7781        Self(value.0)
7782    }
7783}
7784impl From<PatternIdentifierPtr> for PatternPtr {
7785    fn from(value: PatternIdentifierPtr) -> Self {
7786        Self(value.0)
7787    }
7788}
7789impl From<PatternStructPtr> for PatternPtr {
7790    fn from(value: PatternStructPtr) -> Self {
7791        Self(value.0)
7792    }
7793}
7794impl From<PatternTuplePtr> for PatternPtr {
7795    fn from(value: PatternTuplePtr) -> Self {
7796        Self(value.0)
7797    }
7798}
7799impl From<PatternEnumPtr> for PatternPtr {
7800    fn from(value: PatternEnumPtr) -> Self {
7801        Self(value.0)
7802    }
7803}
7804impl From<PatternFixedSizeArrayPtr> for PatternPtr {
7805    fn from(value: PatternFixedSizeArrayPtr) -> Self {
7806        Self(value.0)
7807    }
7808}
7809impl From<ExprPathPtr> for PatternPtr {
7810    fn from(value: ExprPathPtr) -> Self {
7811        Self(value.0)
7812    }
7813}
7814impl From<TerminalUnderscoreGreen> for PatternGreen {
7815    fn from(value: TerminalUnderscoreGreen) -> Self {
7816        Self(value.0)
7817    }
7818}
7819impl From<TerminalLiteralNumberGreen> for PatternGreen {
7820    fn from(value: TerminalLiteralNumberGreen) -> Self {
7821        Self(value.0)
7822    }
7823}
7824impl From<TerminalFalseGreen> for PatternGreen {
7825    fn from(value: TerminalFalseGreen) -> Self {
7826        Self(value.0)
7827    }
7828}
7829impl From<TerminalTrueGreen> for PatternGreen {
7830    fn from(value: TerminalTrueGreen) -> Self {
7831        Self(value.0)
7832    }
7833}
7834impl From<TerminalShortStringGreen> for PatternGreen {
7835    fn from(value: TerminalShortStringGreen) -> Self {
7836        Self(value.0)
7837    }
7838}
7839impl From<TerminalStringGreen> for PatternGreen {
7840    fn from(value: TerminalStringGreen) -> Self {
7841        Self(value.0)
7842    }
7843}
7844impl From<PatternIdentifierGreen> for PatternGreen {
7845    fn from(value: PatternIdentifierGreen) -> Self {
7846        Self(value.0)
7847    }
7848}
7849impl From<PatternStructGreen> for PatternGreen {
7850    fn from(value: PatternStructGreen) -> Self {
7851        Self(value.0)
7852    }
7853}
7854impl From<PatternTupleGreen> for PatternGreen {
7855    fn from(value: PatternTupleGreen) -> Self {
7856        Self(value.0)
7857    }
7858}
7859impl From<PatternEnumGreen> for PatternGreen {
7860    fn from(value: PatternEnumGreen) -> Self {
7861        Self(value.0)
7862    }
7863}
7864impl From<PatternFixedSizeArrayGreen> for PatternGreen {
7865    fn from(value: PatternFixedSizeArrayGreen) -> Self {
7866        Self(value.0)
7867    }
7868}
7869impl From<ExprPathGreen> for PatternGreen {
7870    fn from(value: ExprPathGreen) -> Self {
7871        Self(value.0)
7872    }
7873}
7874#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
7875pub struct PatternGreen(pub GreenId);
7876impl TypedSyntaxNode for Pattern {
7877    const OPTIONAL_KIND: Option<SyntaxKind> = None;
7878    type StablePtr = PatternPtr;
7879    type Green = PatternGreen;
7880    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
7881        panic!("No missing variant.");
7882    }
7883    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
7884        let kind = node.kind(db);
7885        match kind {
7886            SyntaxKind::TerminalUnderscore => {
7887                Pattern::Underscore(TerminalUnderscore::from_syntax_node(db, node))
7888            }
7889            SyntaxKind::TerminalLiteralNumber => {
7890                Pattern::Literal(TerminalLiteralNumber::from_syntax_node(db, node))
7891            }
7892            SyntaxKind::TerminalFalse => Pattern::False(TerminalFalse::from_syntax_node(db, node)),
7893            SyntaxKind::TerminalTrue => Pattern::True(TerminalTrue::from_syntax_node(db, node)),
7894            SyntaxKind::TerminalShortString => {
7895                Pattern::ShortString(TerminalShortString::from_syntax_node(db, node))
7896            }
7897            SyntaxKind::TerminalString => {
7898                Pattern::String(TerminalString::from_syntax_node(db, node))
7899            }
7900            SyntaxKind::PatternIdentifier => {
7901                Pattern::Identifier(PatternIdentifier::from_syntax_node(db, node))
7902            }
7903            SyntaxKind::PatternStruct => Pattern::Struct(PatternStruct::from_syntax_node(db, node)),
7904            SyntaxKind::PatternTuple => Pattern::Tuple(PatternTuple::from_syntax_node(db, node)),
7905            SyntaxKind::PatternEnum => Pattern::Enum(PatternEnum::from_syntax_node(db, node)),
7906            SyntaxKind::PatternFixedSizeArray => {
7907                Pattern::FixedSizeArray(PatternFixedSizeArray::from_syntax_node(db, node))
7908            }
7909            SyntaxKind::ExprPath => Pattern::Path(ExprPath::from_syntax_node(db, node)),
7910            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "Pattern"),
7911        }
7912    }
7913    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
7914        let kind = node.kind(db);
7915        match kind {
7916            SyntaxKind::TerminalUnderscore => {
7917                Some(Pattern::Underscore(TerminalUnderscore::from_syntax_node(db, node)))
7918            }
7919            SyntaxKind::TerminalLiteralNumber => {
7920                Some(Pattern::Literal(TerminalLiteralNumber::from_syntax_node(db, node)))
7921            }
7922            SyntaxKind::TerminalFalse => {
7923                Some(Pattern::False(TerminalFalse::from_syntax_node(db, node)))
7924            }
7925            SyntaxKind::TerminalTrue => {
7926                Some(Pattern::True(TerminalTrue::from_syntax_node(db, node)))
7927            }
7928            SyntaxKind::TerminalShortString => {
7929                Some(Pattern::ShortString(TerminalShortString::from_syntax_node(db, node)))
7930            }
7931            SyntaxKind::TerminalString => {
7932                Some(Pattern::String(TerminalString::from_syntax_node(db, node)))
7933            }
7934            SyntaxKind::PatternIdentifier => {
7935                Some(Pattern::Identifier(PatternIdentifier::from_syntax_node(db, node)))
7936            }
7937            SyntaxKind::PatternStruct => {
7938                Some(Pattern::Struct(PatternStruct::from_syntax_node(db, node)))
7939            }
7940            SyntaxKind::PatternTuple => {
7941                Some(Pattern::Tuple(PatternTuple::from_syntax_node(db, node)))
7942            }
7943            SyntaxKind::PatternEnum => Some(Pattern::Enum(PatternEnum::from_syntax_node(db, node))),
7944            SyntaxKind::PatternFixedSizeArray => {
7945                Some(Pattern::FixedSizeArray(PatternFixedSizeArray::from_syntax_node(db, node)))
7946            }
7947            SyntaxKind::ExprPath => Some(Pattern::Path(ExprPath::from_syntax_node(db, node))),
7948            _ => None,
7949        }
7950    }
7951    fn as_syntax_node(&self) -> SyntaxNode {
7952        match self {
7953            Pattern::Underscore(x) => x.as_syntax_node(),
7954            Pattern::Literal(x) => x.as_syntax_node(),
7955            Pattern::False(x) => x.as_syntax_node(),
7956            Pattern::True(x) => x.as_syntax_node(),
7957            Pattern::ShortString(x) => x.as_syntax_node(),
7958            Pattern::String(x) => x.as_syntax_node(),
7959            Pattern::Identifier(x) => x.as_syntax_node(),
7960            Pattern::Struct(x) => x.as_syntax_node(),
7961            Pattern::Tuple(x) => x.as_syntax_node(),
7962            Pattern::Enum(x) => x.as_syntax_node(),
7963            Pattern::FixedSizeArray(x) => x.as_syntax_node(),
7964            Pattern::Path(x) => x.as_syntax_node(),
7965        }
7966    }
7967    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
7968        PatternPtr(self.as_syntax_node().lookup_intern(db).stable_ptr)
7969    }
7970}
7971impl Pattern {
7972    /// Checks if a kind of a variant of [Pattern].
7973    pub fn is_variant(kind: SyntaxKind) -> bool {
7974        matches!(
7975            kind,
7976            SyntaxKind::TerminalUnderscore
7977                | SyntaxKind::TerminalLiteralNumber
7978                | SyntaxKind::TerminalFalse
7979                | SyntaxKind::TerminalTrue
7980                | SyntaxKind::TerminalShortString
7981                | SyntaxKind::TerminalString
7982                | SyntaxKind::PatternIdentifier
7983                | SyntaxKind::PatternStruct
7984                | SyntaxKind::PatternTuple
7985                | SyntaxKind::PatternEnum
7986                | SyntaxKind::PatternFixedSizeArray
7987                | SyntaxKind::ExprPath
7988        )
7989    }
7990}
7991#[derive(Clone, Debug, Eq, Hash, PartialEq)]
7992pub struct PatternIdentifier {
7993    node: SyntaxNode,
7994}
7995impl PatternIdentifier {
7996    pub const INDEX_MODIFIERS: usize = 0;
7997    pub const INDEX_NAME: usize = 1;
7998    pub fn new_green(
7999        db: &dyn SyntaxGroup,
8000        modifiers: ModifierListGreen,
8001        name: TerminalIdentifierGreen,
8002    ) -> PatternIdentifierGreen {
8003        let children = [modifiers.0, name.0];
8004        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
8005        PatternIdentifierGreen(
8006            Arc::new(GreenNode {
8007                kind: SyntaxKind::PatternIdentifier,
8008                details: GreenNodeDetails::Node { children: children.into(), width },
8009            })
8010            .intern(db),
8011        )
8012    }
8013}
8014impl PatternIdentifier {
8015    pub fn modifiers(&self, db: &dyn SyntaxGroup) -> ModifierList {
8016        ModifierList::from_syntax_node(db, self.node.get_children(db)[0])
8017    }
8018    pub fn name(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier {
8019        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[1])
8020    }
8021}
8022#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
8023pub struct PatternIdentifierPtr(pub SyntaxStablePtrId);
8024impl PatternIdentifierPtr {
8025    pub fn name_green(self, db: &dyn SyntaxGroup) -> TerminalIdentifierGreen {
8026        let ptr = self.0.lookup_intern(db);
8027        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
8028            TerminalIdentifierGreen(key_fields[0])
8029        } else {
8030            panic!("Unexpected key field query on root.");
8031        }
8032    }
8033}
8034impl TypedStablePtr for PatternIdentifierPtr {
8035    type SyntaxNode = PatternIdentifier;
8036    fn untyped(&self) -> SyntaxStablePtrId {
8037        self.0
8038    }
8039    fn lookup(&self, db: &dyn SyntaxGroup) -> PatternIdentifier {
8040        PatternIdentifier::from_syntax_node(db, self.0.lookup(db))
8041    }
8042}
8043impl From<PatternIdentifierPtr> for SyntaxStablePtrId {
8044    fn from(ptr: PatternIdentifierPtr) -> Self {
8045        ptr.untyped()
8046    }
8047}
8048#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
8049pub struct PatternIdentifierGreen(pub GreenId);
8050impl TypedSyntaxNode for PatternIdentifier {
8051    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PatternIdentifier);
8052    type StablePtr = PatternIdentifierPtr;
8053    type Green = PatternIdentifierGreen;
8054    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
8055        PatternIdentifierGreen(
8056            Arc::new(GreenNode {
8057                kind: SyntaxKind::PatternIdentifier,
8058                details: GreenNodeDetails::Node {
8059                    children: [ModifierList::missing(db).0, TerminalIdentifier::missing(db).0]
8060                        .into(),
8061                    width: TextWidth::default(),
8062                },
8063            })
8064            .intern(db),
8065        )
8066    }
8067    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
8068        let kind = node.kind(db);
8069        assert_eq!(
8070            kind,
8071            SyntaxKind::PatternIdentifier,
8072            "Unexpected SyntaxKind {:?}. Expected {:?}.",
8073            kind,
8074            SyntaxKind::PatternIdentifier
8075        );
8076        Self { node }
8077    }
8078    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
8079        let kind = node.kind(db);
8080        if kind == SyntaxKind::PatternIdentifier {
8081            Some(Self::from_syntax_node(db, node))
8082        } else {
8083            None
8084        }
8085    }
8086    fn as_syntax_node(&self) -> SyntaxNode {
8087        self.node
8088    }
8089    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
8090        PatternIdentifierPtr(self.node.stable_ptr(db))
8091    }
8092}
8093#[derive(Clone, Debug, Eq, Hash, PartialEq)]
8094pub struct PatternStruct {
8095    node: SyntaxNode,
8096}
8097impl PatternStruct {
8098    pub const INDEX_PATH: usize = 0;
8099    pub const INDEX_LBRACE: usize = 1;
8100    pub const INDEX_PARAMS: usize = 2;
8101    pub const INDEX_RBRACE: usize = 3;
8102    pub fn new_green(
8103        db: &dyn SyntaxGroup,
8104        path: ExprPathGreen,
8105        lbrace: TerminalLBraceGreen,
8106        params: PatternStructParamListGreen,
8107        rbrace: TerminalRBraceGreen,
8108    ) -> PatternStructGreen {
8109        let children = [path.0, lbrace.0, params.0, rbrace.0];
8110        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
8111        PatternStructGreen(
8112            Arc::new(GreenNode {
8113                kind: SyntaxKind::PatternStruct,
8114                details: GreenNodeDetails::Node { children: children.into(), width },
8115            })
8116            .intern(db),
8117        )
8118    }
8119}
8120impl PatternStruct {
8121    pub fn path(&self, db: &dyn SyntaxGroup) -> ExprPath {
8122        ExprPath::from_syntax_node(db, self.node.get_children(db)[0])
8123    }
8124    pub fn lbrace(&self, db: &dyn SyntaxGroup) -> TerminalLBrace {
8125        TerminalLBrace::from_syntax_node(db, self.node.get_children(db)[1])
8126    }
8127    pub fn params(&self, db: &dyn SyntaxGroup) -> PatternStructParamList {
8128        PatternStructParamList::from_syntax_node(db, self.node.get_children(db)[2])
8129    }
8130    pub fn rbrace(&self, db: &dyn SyntaxGroup) -> TerminalRBrace {
8131        TerminalRBrace::from_syntax_node(db, self.node.get_children(db)[3])
8132    }
8133}
8134#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
8135pub struct PatternStructPtr(pub SyntaxStablePtrId);
8136impl PatternStructPtr {}
8137impl TypedStablePtr for PatternStructPtr {
8138    type SyntaxNode = PatternStruct;
8139    fn untyped(&self) -> SyntaxStablePtrId {
8140        self.0
8141    }
8142    fn lookup(&self, db: &dyn SyntaxGroup) -> PatternStruct {
8143        PatternStruct::from_syntax_node(db, self.0.lookup(db))
8144    }
8145}
8146impl From<PatternStructPtr> for SyntaxStablePtrId {
8147    fn from(ptr: PatternStructPtr) -> Self {
8148        ptr.untyped()
8149    }
8150}
8151#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
8152pub struct PatternStructGreen(pub GreenId);
8153impl TypedSyntaxNode for PatternStruct {
8154    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PatternStruct);
8155    type StablePtr = PatternStructPtr;
8156    type Green = PatternStructGreen;
8157    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
8158        PatternStructGreen(
8159            Arc::new(GreenNode {
8160                kind: SyntaxKind::PatternStruct,
8161                details: GreenNodeDetails::Node {
8162                    children: [
8163                        ExprPath::missing(db).0,
8164                        TerminalLBrace::missing(db).0,
8165                        PatternStructParamList::missing(db).0,
8166                        TerminalRBrace::missing(db).0,
8167                    ]
8168                    .into(),
8169                    width: TextWidth::default(),
8170                },
8171            })
8172            .intern(db),
8173        )
8174    }
8175    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
8176        let kind = node.kind(db);
8177        assert_eq!(
8178            kind,
8179            SyntaxKind::PatternStruct,
8180            "Unexpected SyntaxKind {:?}. Expected {:?}.",
8181            kind,
8182            SyntaxKind::PatternStruct
8183        );
8184        Self { node }
8185    }
8186    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
8187        let kind = node.kind(db);
8188        if kind == SyntaxKind::PatternStruct {
8189            Some(Self::from_syntax_node(db, node))
8190        } else {
8191            None
8192        }
8193    }
8194    fn as_syntax_node(&self) -> SyntaxNode {
8195        self.node
8196    }
8197    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
8198        PatternStructPtr(self.node.stable_ptr(db))
8199    }
8200}
8201#[derive(Clone, Debug, Eq, Hash, PartialEq)]
8202pub struct PatternStructParamList(ElementList<PatternStructParam, 2>);
8203impl Deref for PatternStructParamList {
8204    type Target = ElementList<PatternStructParam, 2>;
8205    fn deref(&self) -> &Self::Target {
8206        &self.0
8207    }
8208}
8209impl PatternStructParamList {
8210    pub fn new_green(
8211        db: &dyn SyntaxGroup,
8212        children: &[PatternStructParamListElementOrSeparatorGreen],
8213    ) -> PatternStructParamListGreen {
8214        let width = children.iter().map(|id| id.id().lookup_intern(db).width()).sum();
8215        PatternStructParamListGreen(
8216            Arc::new(GreenNode {
8217                kind: SyntaxKind::PatternStructParamList,
8218                details: GreenNodeDetails::Node {
8219                    children: children.iter().map(|x| x.id()).collect(),
8220                    width,
8221                },
8222            })
8223            .intern(db),
8224        )
8225    }
8226}
8227#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
8228pub struct PatternStructParamListPtr(pub SyntaxStablePtrId);
8229impl TypedStablePtr for PatternStructParamListPtr {
8230    type SyntaxNode = PatternStructParamList;
8231    fn untyped(&self) -> SyntaxStablePtrId {
8232        self.0
8233    }
8234    fn lookup(&self, db: &dyn SyntaxGroup) -> PatternStructParamList {
8235        PatternStructParamList::from_syntax_node(db, self.0.lookup(db))
8236    }
8237}
8238impl From<PatternStructParamListPtr> for SyntaxStablePtrId {
8239    fn from(ptr: PatternStructParamListPtr) -> Self {
8240        ptr.untyped()
8241    }
8242}
8243#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
8244pub enum PatternStructParamListElementOrSeparatorGreen {
8245    Separator(TerminalCommaGreen),
8246    Element(PatternStructParamGreen),
8247}
8248impl From<TerminalCommaGreen> for PatternStructParamListElementOrSeparatorGreen {
8249    fn from(value: TerminalCommaGreen) -> Self {
8250        PatternStructParamListElementOrSeparatorGreen::Separator(value)
8251    }
8252}
8253impl From<PatternStructParamGreen> for PatternStructParamListElementOrSeparatorGreen {
8254    fn from(value: PatternStructParamGreen) -> Self {
8255        PatternStructParamListElementOrSeparatorGreen::Element(value)
8256    }
8257}
8258impl PatternStructParamListElementOrSeparatorGreen {
8259    fn id(&self) -> GreenId {
8260        match self {
8261            PatternStructParamListElementOrSeparatorGreen::Separator(green) => green.0,
8262            PatternStructParamListElementOrSeparatorGreen::Element(green) => green.0,
8263        }
8264    }
8265}
8266#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
8267pub struct PatternStructParamListGreen(pub GreenId);
8268impl TypedSyntaxNode for PatternStructParamList {
8269    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PatternStructParamList);
8270    type StablePtr = PatternStructParamListPtr;
8271    type Green = PatternStructParamListGreen;
8272    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
8273        PatternStructParamListGreen(
8274            Arc::new(GreenNode {
8275                kind: SyntaxKind::PatternStructParamList,
8276                details: GreenNodeDetails::Node {
8277                    children: [].into(),
8278                    width: TextWidth::default(),
8279                },
8280            })
8281            .intern(db),
8282        )
8283    }
8284    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
8285        Self(ElementList::new(node))
8286    }
8287    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
8288        if node.kind(db) == SyntaxKind::PatternStructParamList {
8289            Some(Self(ElementList::new(node)))
8290        } else {
8291            None
8292        }
8293    }
8294    fn as_syntax_node(&self) -> SyntaxNode {
8295        self.node
8296    }
8297    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
8298        PatternStructParamListPtr(self.node.stable_ptr(db))
8299    }
8300}
8301#[derive(Clone, Debug, Eq, Hash, PartialEq)]
8302pub struct PatternTuple {
8303    node: SyntaxNode,
8304}
8305impl PatternTuple {
8306    pub const INDEX_LPAREN: usize = 0;
8307    pub const INDEX_PATTERNS: usize = 1;
8308    pub const INDEX_RPAREN: usize = 2;
8309    pub fn new_green(
8310        db: &dyn SyntaxGroup,
8311        lparen: TerminalLParenGreen,
8312        patterns: PatternListGreen,
8313        rparen: TerminalRParenGreen,
8314    ) -> PatternTupleGreen {
8315        let children = [lparen.0, patterns.0, rparen.0];
8316        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
8317        PatternTupleGreen(
8318            Arc::new(GreenNode {
8319                kind: SyntaxKind::PatternTuple,
8320                details: GreenNodeDetails::Node { children: children.into(), width },
8321            })
8322            .intern(db),
8323        )
8324    }
8325}
8326impl PatternTuple {
8327    pub fn lparen(&self, db: &dyn SyntaxGroup) -> TerminalLParen {
8328        TerminalLParen::from_syntax_node(db, self.node.get_children(db)[0])
8329    }
8330    pub fn patterns(&self, db: &dyn SyntaxGroup) -> PatternList {
8331        PatternList::from_syntax_node(db, self.node.get_children(db)[1])
8332    }
8333    pub fn rparen(&self, db: &dyn SyntaxGroup) -> TerminalRParen {
8334        TerminalRParen::from_syntax_node(db, self.node.get_children(db)[2])
8335    }
8336}
8337#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
8338pub struct PatternTuplePtr(pub SyntaxStablePtrId);
8339impl PatternTuplePtr {}
8340impl TypedStablePtr for PatternTuplePtr {
8341    type SyntaxNode = PatternTuple;
8342    fn untyped(&self) -> SyntaxStablePtrId {
8343        self.0
8344    }
8345    fn lookup(&self, db: &dyn SyntaxGroup) -> PatternTuple {
8346        PatternTuple::from_syntax_node(db, self.0.lookup(db))
8347    }
8348}
8349impl From<PatternTuplePtr> for SyntaxStablePtrId {
8350    fn from(ptr: PatternTuplePtr) -> Self {
8351        ptr.untyped()
8352    }
8353}
8354#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
8355pub struct PatternTupleGreen(pub GreenId);
8356impl TypedSyntaxNode for PatternTuple {
8357    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PatternTuple);
8358    type StablePtr = PatternTuplePtr;
8359    type Green = PatternTupleGreen;
8360    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
8361        PatternTupleGreen(
8362            Arc::new(GreenNode {
8363                kind: SyntaxKind::PatternTuple,
8364                details: GreenNodeDetails::Node {
8365                    children: [
8366                        TerminalLParen::missing(db).0,
8367                        PatternList::missing(db).0,
8368                        TerminalRParen::missing(db).0,
8369                    ]
8370                    .into(),
8371                    width: TextWidth::default(),
8372                },
8373            })
8374            .intern(db),
8375        )
8376    }
8377    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
8378        let kind = node.kind(db);
8379        assert_eq!(
8380            kind,
8381            SyntaxKind::PatternTuple,
8382            "Unexpected SyntaxKind {:?}. Expected {:?}.",
8383            kind,
8384            SyntaxKind::PatternTuple
8385        );
8386        Self { node }
8387    }
8388    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
8389        let kind = node.kind(db);
8390        if kind == SyntaxKind::PatternTuple { Some(Self::from_syntax_node(db, node)) } else { None }
8391    }
8392    fn as_syntax_node(&self) -> SyntaxNode {
8393        self.node
8394    }
8395    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
8396        PatternTuplePtr(self.node.stable_ptr(db))
8397    }
8398}
8399#[derive(Clone, Debug, Eq, Hash, PartialEq)]
8400pub struct PatternFixedSizeArray {
8401    node: SyntaxNode,
8402}
8403impl PatternFixedSizeArray {
8404    pub const INDEX_LBRACK: usize = 0;
8405    pub const INDEX_PATTERNS: usize = 1;
8406    pub const INDEX_RBRACK: usize = 2;
8407    pub fn new_green(
8408        db: &dyn SyntaxGroup,
8409        lbrack: TerminalLBrackGreen,
8410        patterns: PatternListGreen,
8411        rbrack: TerminalRBrackGreen,
8412    ) -> PatternFixedSizeArrayGreen {
8413        let children = [lbrack.0, patterns.0, rbrack.0];
8414        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
8415        PatternFixedSizeArrayGreen(
8416            Arc::new(GreenNode {
8417                kind: SyntaxKind::PatternFixedSizeArray,
8418                details: GreenNodeDetails::Node { children: children.into(), width },
8419            })
8420            .intern(db),
8421        )
8422    }
8423}
8424impl PatternFixedSizeArray {
8425    pub fn lbrack(&self, db: &dyn SyntaxGroup) -> TerminalLBrack {
8426        TerminalLBrack::from_syntax_node(db, self.node.get_children(db)[0])
8427    }
8428    pub fn patterns(&self, db: &dyn SyntaxGroup) -> PatternList {
8429        PatternList::from_syntax_node(db, self.node.get_children(db)[1])
8430    }
8431    pub fn rbrack(&self, db: &dyn SyntaxGroup) -> TerminalRBrack {
8432        TerminalRBrack::from_syntax_node(db, self.node.get_children(db)[2])
8433    }
8434}
8435#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
8436pub struct PatternFixedSizeArrayPtr(pub SyntaxStablePtrId);
8437impl PatternFixedSizeArrayPtr {}
8438impl TypedStablePtr for PatternFixedSizeArrayPtr {
8439    type SyntaxNode = PatternFixedSizeArray;
8440    fn untyped(&self) -> SyntaxStablePtrId {
8441        self.0
8442    }
8443    fn lookup(&self, db: &dyn SyntaxGroup) -> PatternFixedSizeArray {
8444        PatternFixedSizeArray::from_syntax_node(db, self.0.lookup(db))
8445    }
8446}
8447impl From<PatternFixedSizeArrayPtr> for SyntaxStablePtrId {
8448    fn from(ptr: PatternFixedSizeArrayPtr) -> Self {
8449        ptr.untyped()
8450    }
8451}
8452#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
8453pub struct PatternFixedSizeArrayGreen(pub GreenId);
8454impl TypedSyntaxNode for PatternFixedSizeArray {
8455    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PatternFixedSizeArray);
8456    type StablePtr = PatternFixedSizeArrayPtr;
8457    type Green = PatternFixedSizeArrayGreen;
8458    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
8459        PatternFixedSizeArrayGreen(
8460            Arc::new(GreenNode {
8461                kind: SyntaxKind::PatternFixedSizeArray,
8462                details: GreenNodeDetails::Node {
8463                    children: [
8464                        TerminalLBrack::missing(db).0,
8465                        PatternList::missing(db).0,
8466                        TerminalRBrack::missing(db).0,
8467                    ]
8468                    .into(),
8469                    width: TextWidth::default(),
8470                },
8471            })
8472            .intern(db),
8473        )
8474    }
8475    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
8476        let kind = node.kind(db);
8477        assert_eq!(
8478            kind,
8479            SyntaxKind::PatternFixedSizeArray,
8480            "Unexpected SyntaxKind {:?}. Expected {:?}.",
8481            kind,
8482            SyntaxKind::PatternFixedSizeArray
8483        );
8484        Self { node }
8485    }
8486    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
8487        let kind = node.kind(db);
8488        if kind == SyntaxKind::PatternFixedSizeArray {
8489            Some(Self::from_syntax_node(db, node))
8490        } else {
8491            None
8492        }
8493    }
8494    fn as_syntax_node(&self) -> SyntaxNode {
8495        self.node
8496    }
8497    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
8498        PatternFixedSizeArrayPtr(self.node.stable_ptr(db))
8499    }
8500}
8501#[derive(Clone, Debug, Eq, Hash, PartialEq)]
8502pub struct PatternList(ElementList<Pattern, 2>);
8503impl Deref for PatternList {
8504    type Target = ElementList<Pattern, 2>;
8505    fn deref(&self) -> &Self::Target {
8506        &self.0
8507    }
8508}
8509impl PatternList {
8510    pub fn new_green(
8511        db: &dyn SyntaxGroup,
8512        children: &[PatternListElementOrSeparatorGreen],
8513    ) -> PatternListGreen {
8514        let width = children.iter().map(|id| id.id().lookup_intern(db).width()).sum();
8515        PatternListGreen(
8516            Arc::new(GreenNode {
8517                kind: SyntaxKind::PatternList,
8518                details: GreenNodeDetails::Node {
8519                    children: children.iter().map(|x| x.id()).collect(),
8520                    width,
8521                },
8522            })
8523            .intern(db),
8524        )
8525    }
8526}
8527#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
8528pub struct PatternListPtr(pub SyntaxStablePtrId);
8529impl TypedStablePtr for PatternListPtr {
8530    type SyntaxNode = PatternList;
8531    fn untyped(&self) -> SyntaxStablePtrId {
8532        self.0
8533    }
8534    fn lookup(&self, db: &dyn SyntaxGroup) -> PatternList {
8535        PatternList::from_syntax_node(db, self.0.lookup(db))
8536    }
8537}
8538impl From<PatternListPtr> for SyntaxStablePtrId {
8539    fn from(ptr: PatternListPtr) -> Self {
8540        ptr.untyped()
8541    }
8542}
8543#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
8544pub enum PatternListElementOrSeparatorGreen {
8545    Separator(TerminalCommaGreen),
8546    Element(PatternGreen),
8547}
8548impl From<TerminalCommaGreen> for PatternListElementOrSeparatorGreen {
8549    fn from(value: TerminalCommaGreen) -> Self {
8550        PatternListElementOrSeparatorGreen::Separator(value)
8551    }
8552}
8553impl From<PatternGreen> for PatternListElementOrSeparatorGreen {
8554    fn from(value: PatternGreen) -> Self {
8555        PatternListElementOrSeparatorGreen::Element(value)
8556    }
8557}
8558impl PatternListElementOrSeparatorGreen {
8559    fn id(&self) -> GreenId {
8560        match self {
8561            PatternListElementOrSeparatorGreen::Separator(green) => green.0,
8562            PatternListElementOrSeparatorGreen::Element(green) => green.0,
8563        }
8564    }
8565}
8566#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
8567pub struct PatternListGreen(pub GreenId);
8568impl TypedSyntaxNode for PatternList {
8569    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PatternList);
8570    type StablePtr = PatternListPtr;
8571    type Green = PatternListGreen;
8572    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
8573        PatternListGreen(
8574            Arc::new(GreenNode {
8575                kind: SyntaxKind::PatternList,
8576                details: GreenNodeDetails::Node {
8577                    children: [].into(),
8578                    width: TextWidth::default(),
8579                },
8580            })
8581            .intern(db),
8582        )
8583    }
8584    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
8585        Self(ElementList::new(node))
8586    }
8587    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
8588        if node.kind(db) == SyntaxKind::PatternList {
8589            Some(Self(ElementList::new(node)))
8590        } else {
8591            None
8592        }
8593    }
8594    fn as_syntax_node(&self) -> SyntaxNode {
8595        self.node
8596    }
8597    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
8598        PatternListPtr(self.node.stable_ptr(db))
8599    }
8600}
8601#[derive(Clone, Debug, Eq, Hash, PartialEq)]
8602pub struct PatternListOr(ElementList<Pattern, 2>);
8603impl Deref for PatternListOr {
8604    type Target = ElementList<Pattern, 2>;
8605    fn deref(&self) -> &Self::Target {
8606        &self.0
8607    }
8608}
8609impl PatternListOr {
8610    pub fn new_green(
8611        db: &dyn SyntaxGroup,
8612        children: &[PatternListOrElementOrSeparatorGreen],
8613    ) -> PatternListOrGreen {
8614        let width = children.iter().map(|id| id.id().lookup_intern(db).width()).sum();
8615        PatternListOrGreen(
8616            Arc::new(GreenNode {
8617                kind: SyntaxKind::PatternListOr,
8618                details: GreenNodeDetails::Node {
8619                    children: children.iter().map(|x| x.id()).collect(),
8620                    width,
8621                },
8622            })
8623            .intern(db),
8624        )
8625    }
8626}
8627#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
8628pub struct PatternListOrPtr(pub SyntaxStablePtrId);
8629impl TypedStablePtr for PatternListOrPtr {
8630    type SyntaxNode = PatternListOr;
8631    fn untyped(&self) -> SyntaxStablePtrId {
8632        self.0
8633    }
8634    fn lookup(&self, db: &dyn SyntaxGroup) -> PatternListOr {
8635        PatternListOr::from_syntax_node(db, self.0.lookup(db))
8636    }
8637}
8638impl From<PatternListOrPtr> for SyntaxStablePtrId {
8639    fn from(ptr: PatternListOrPtr) -> Self {
8640        ptr.untyped()
8641    }
8642}
8643#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
8644pub enum PatternListOrElementOrSeparatorGreen {
8645    Separator(TerminalOrGreen),
8646    Element(PatternGreen),
8647}
8648impl From<TerminalOrGreen> for PatternListOrElementOrSeparatorGreen {
8649    fn from(value: TerminalOrGreen) -> Self {
8650        PatternListOrElementOrSeparatorGreen::Separator(value)
8651    }
8652}
8653impl From<PatternGreen> for PatternListOrElementOrSeparatorGreen {
8654    fn from(value: PatternGreen) -> Self {
8655        PatternListOrElementOrSeparatorGreen::Element(value)
8656    }
8657}
8658impl PatternListOrElementOrSeparatorGreen {
8659    fn id(&self) -> GreenId {
8660        match self {
8661            PatternListOrElementOrSeparatorGreen::Separator(green) => green.0,
8662            PatternListOrElementOrSeparatorGreen::Element(green) => green.0,
8663        }
8664    }
8665}
8666#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
8667pub struct PatternListOrGreen(pub GreenId);
8668impl TypedSyntaxNode for PatternListOr {
8669    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PatternListOr);
8670    type StablePtr = PatternListOrPtr;
8671    type Green = PatternListOrGreen;
8672    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
8673        PatternListOrGreen(
8674            Arc::new(GreenNode {
8675                kind: SyntaxKind::PatternListOr,
8676                details: GreenNodeDetails::Node {
8677                    children: [].into(),
8678                    width: TextWidth::default(),
8679                },
8680            })
8681            .intern(db),
8682        )
8683    }
8684    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
8685        Self(ElementList::new(node))
8686    }
8687    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
8688        if node.kind(db) == SyntaxKind::PatternListOr {
8689            Some(Self(ElementList::new(node)))
8690        } else {
8691            None
8692        }
8693    }
8694    fn as_syntax_node(&self) -> SyntaxNode {
8695        self.node
8696    }
8697    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
8698        PatternListOrPtr(self.node.stable_ptr(db))
8699    }
8700}
8701#[derive(Clone, Debug, Eq, Hash, PartialEq)]
8702pub enum PatternStructParam {
8703    Single(PatternIdentifier),
8704    WithExpr(PatternStructParamWithExpr),
8705    Tail(TerminalDotDot),
8706}
8707#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
8708pub struct PatternStructParamPtr(pub SyntaxStablePtrId);
8709impl TypedStablePtr for PatternStructParamPtr {
8710    type SyntaxNode = PatternStructParam;
8711    fn untyped(&self) -> SyntaxStablePtrId {
8712        self.0
8713    }
8714    fn lookup(&self, db: &dyn SyntaxGroup) -> PatternStructParam {
8715        PatternStructParam::from_syntax_node(db, self.0.lookup(db))
8716    }
8717}
8718impl From<PatternStructParamPtr> for SyntaxStablePtrId {
8719    fn from(ptr: PatternStructParamPtr) -> Self {
8720        ptr.untyped()
8721    }
8722}
8723impl From<PatternIdentifierPtr> for PatternStructParamPtr {
8724    fn from(value: PatternIdentifierPtr) -> Self {
8725        Self(value.0)
8726    }
8727}
8728impl From<PatternStructParamWithExprPtr> for PatternStructParamPtr {
8729    fn from(value: PatternStructParamWithExprPtr) -> Self {
8730        Self(value.0)
8731    }
8732}
8733impl From<TerminalDotDotPtr> for PatternStructParamPtr {
8734    fn from(value: TerminalDotDotPtr) -> Self {
8735        Self(value.0)
8736    }
8737}
8738impl From<PatternIdentifierGreen> for PatternStructParamGreen {
8739    fn from(value: PatternIdentifierGreen) -> Self {
8740        Self(value.0)
8741    }
8742}
8743impl From<PatternStructParamWithExprGreen> for PatternStructParamGreen {
8744    fn from(value: PatternStructParamWithExprGreen) -> Self {
8745        Self(value.0)
8746    }
8747}
8748impl From<TerminalDotDotGreen> for PatternStructParamGreen {
8749    fn from(value: TerminalDotDotGreen) -> Self {
8750        Self(value.0)
8751    }
8752}
8753#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
8754pub struct PatternStructParamGreen(pub GreenId);
8755impl TypedSyntaxNode for PatternStructParam {
8756    const OPTIONAL_KIND: Option<SyntaxKind> = None;
8757    type StablePtr = PatternStructParamPtr;
8758    type Green = PatternStructParamGreen;
8759    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
8760        panic!("No missing variant.");
8761    }
8762    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
8763        let kind = node.kind(db);
8764        match kind {
8765            SyntaxKind::PatternIdentifier => {
8766                PatternStructParam::Single(PatternIdentifier::from_syntax_node(db, node))
8767            }
8768            SyntaxKind::PatternStructParamWithExpr => {
8769                PatternStructParam::WithExpr(PatternStructParamWithExpr::from_syntax_node(db, node))
8770            }
8771            SyntaxKind::TerminalDotDot => {
8772                PatternStructParam::Tail(TerminalDotDot::from_syntax_node(db, node))
8773            }
8774            _ => panic!(
8775                "Unexpected syntax kind {:?} when constructing {}.",
8776                kind, "PatternStructParam"
8777            ),
8778        }
8779    }
8780    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
8781        let kind = node.kind(db);
8782        match kind {
8783            SyntaxKind::PatternIdentifier => {
8784                Some(PatternStructParam::Single(PatternIdentifier::from_syntax_node(db, node)))
8785            }
8786            SyntaxKind::PatternStructParamWithExpr => Some(PatternStructParam::WithExpr(
8787                PatternStructParamWithExpr::from_syntax_node(db, node),
8788            )),
8789            SyntaxKind::TerminalDotDot => {
8790                Some(PatternStructParam::Tail(TerminalDotDot::from_syntax_node(db, node)))
8791            }
8792            _ => None,
8793        }
8794    }
8795    fn as_syntax_node(&self) -> SyntaxNode {
8796        match self {
8797            PatternStructParam::Single(x) => x.as_syntax_node(),
8798            PatternStructParam::WithExpr(x) => x.as_syntax_node(),
8799            PatternStructParam::Tail(x) => x.as_syntax_node(),
8800        }
8801    }
8802    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
8803        PatternStructParamPtr(self.as_syntax_node().lookup_intern(db).stable_ptr)
8804    }
8805}
8806impl PatternStructParam {
8807    /// Checks if a kind of a variant of [PatternStructParam].
8808    pub fn is_variant(kind: SyntaxKind) -> bool {
8809        matches!(
8810            kind,
8811            SyntaxKind::PatternIdentifier
8812                | SyntaxKind::PatternStructParamWithExpr
8813                | SyntaxKind::TerminalDotDot
8814        )
8815    }
8816}
8817#[derive(Clone, Debug, Eq, Hash, PartialEq)]
8818pub struct PatternStructParamWithExpr {
8819    node: SyntaxNode,
8820}
8821impl PatternStructParamWithExpr {
8822    pub const INDEX_MODIFIERS: usize = 0;
8823    pub const INDEX_NAME: usize = 1;
8824    pub const INDEX_COLON: usize = 2;
8825    pub const INDEX_PATTERN: usize = 3;
8826    pub fn new_green(
8827        db: &dyn SyntaxGroup,
8828        modifiers: ModifierListGreen,
8829        name: TerminalIdentifierGreen,
8830        colon: TerminalColonGreen,
8831        pattern: PatternGreen,
8832    ) -> PatternStructParamWithExprGreen {
8833        let children = [modifiers.0, name.0, colon.0, pattern.0];
8834        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
8835        PatternStructParamWithExprGreen(
8836            Arc::new(GreenNode {
8837                kind: SyntaxKind::PatternStructParamWithExpr,
8838                details: GreenNodeDetails::Node { children: children.into(), width },
8839            })
8840            .intern(db),
8841        )
8842    }
8843}
8844impl PatternStructParamWithExpr {
8845    pub fn modifiers(&self, db: &dyn SyntaxGroup) -> ModifierList {
8846        ModifierList::from_syntax_node(db, self.node.get_children(db)[0])
8847    }
8848    pub fn name(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier {
8849        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[1])
8850    }
8851    pub fn colon(&self, db: &dyn SyntaxGroup) -> TerminalColon {
8852        TerminalColon::from_syntax_node(db, self.node.get_children(db)[2])
8853    }
8854    pub fn pattern(&self, db: &dyn SyntaxGroup) -> Pattern {
8855        Pattern::from_syntax_node(db, self.node.get_children(db)[3])
8856    }
8857}
8858#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
8859pub struct PatternStructParamWithExprPtr(pub SyntaxStablePtrId);
8860impl PatternStructParamWithExprPtr {}
8861impl TypedStablePtr for PatternStructParamWithExprPtr {
8862    type SyntaxNode = PatternStructParamWithExpr;
8863    fn untyped(&self) -> SyntaxStablePtrId {
8864        self.0
8865    }
8866    fn lookup(&self, db: &dyn SyntaxGroup) -> PatternStructParamWithExpr {
8867        PatternStructParamWithExpr::from_syntax_node(db, self.0.lookup(db))
8868    }
8869}
8870impl From<PatternStructParamWithExprPtr> for SyntaxStablePtrId {
8871    fn from(ptr: PatternStructParamWithExprPtr) -> Self {
8872        ptr.untyped()
8873    }
8874}
8875#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
8876pub struct PatternStructParamWithExprGreen(pub GreenId);
8877impl TypedSyntaxNode for PatternStructParamWithExpr {
8878    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PatternStructParamWithExpr);
8879    type StablePtr = PatternStructParamWithExprPtr;
8880    type Green = PatternStructParamWithExprGreen;
8881    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
8882        PatternStructParamWithExprGreen(
8883            Arc::new(GreenNode {
8884                kind: SyntaxKind::PatternStructParamWithExpr,
8885                details: GreenNodeDetails::Node {
8886                    children: [
8887                        ModifierList::missing(db).0,
8888                        TerminalIdentifier::missing(db).0,
8889                        TerminalColon::missing(db).0,
8890                        Pattern::missing(db).0,
8891                    ]
8892                    .into(),
8893                    width: TextWidth::default(),
8894                },
8895            })
8896            .intern(db),
8897        )
8898    }
8899    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
8900        let kind = node.kind(db);
8901        assert_eq!(
8902            kind,
8903            SyntaxKind::PatternStructParamWithExpr,
8904            "Unexpected SyntaxKind {:?}. Expected {:?}.",
8905            kind,
8906            SyntaxKind::PatternStructParamWithExpr
8907        );
8908        Self { node }
8909    }
8910    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
8911        let kind = node.kind(db);
8912        if kind == SyntaxKind::PatternStructParamWithExpr {
8913            Some(Self::from_syntax_node(db, node))
8914        } else {
8915            None
8916        }
8917    }
8918    fn as_syntax_node(&self) -> SyntaxNode {
8919        self.node
8920    }
8921    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
8922        PatternStructParamWithExprPtr(self.node.stable_ptr(db))
8923    }
8924}
8925#[derive(Clone, Debug, Eq, Hash, PartialEq)]
8926pub struct PatternEnum {
8927    node: SyntaxNode,
8928}
8929impl PatternEnum {
8930    pub const INDEX_PATH: usize = 0;
8931    pub const INDEX_PATTERN: usize = 1;
8932    pub fn new_green(
8933        db: &dyn SyntaxGroup,
8934        path: ExprPathGreen,
8935        pattern: OptionPatternEnumInnerPatternGreen,
8936    ) -> PatternEnumGreen {
8937        let children = [path.0, pattern.0];
8938        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
8939        PatternEnumGreen(
8940            Arc::new(GreenNode {
8941                kind: SyntaxKind::PatternEnum,
8942                details: GreenNodeDetails::Node { children: children.into(), width },
8943            })
8944            .intern(db),
8945        )
8946    }
8947}
8948impl PatternEnum {
8949    pub fn path(&self, db: &dyn SyntaxGroup) -> ExprPath {
8950        ExprPath::from_syntax_node(db, self.node.get_children(db)[0])
8951    }
8952    pub fn pattern(&self, db: &dyn SyntaxGroup) -> OptionPatternEnumInnerPattern {
8953        OptionPatternEnumInnerPattern::from_syntax_node(db, self.node.get_children(db)[1])
8954    }
8955}
8956#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
8957pub struct PatternEnumPtr(pub SyntaxStablePtrId);
8958impl PatternEnumPtr {}
8959impl TypedStablePtr for PatternEnumPtr {
8960    type SyntaxNode = PatternEnum;
8961    fn untyped(&self) -> SyntaxStablePtrId {
8962        self.0
8963    }
8964    fn lookup(&self, db: &dyn SyntaxGroup) -> PatternEnum {
8965        PatternEnum::from_syntax_node(db, self.0.lookup(db))
8966    }
8967}
8968impl From<PatternEnumPtr> for SyntaxStablePtrId {
8969    fn from(ptr: PatternEnumPtr) -> Self {
8970        ptr.untyped()
8971    }
8972}
8973#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
8974pub struct PatternEnumGreen(pub GreenId);
8975impl TypedSyntaxNode for PatternEnum {
8976    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PatternEnum);
8977    type StablePtr = PatternEnumPtr;
8978    type Green = PatternEnumGreen;
8979    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
8980        PatternEnumGreen(
8981            Arc::new(GreenNode {
8982                kind: SyntaxKind::PatternEnum,
8983                details: GreenNodeDetails::Node {
8984                    children: [
8985                        ExprPath::missing(db).0,
8986                        OptionPatternEnumInnerPattern::missing(db).0,
8987                    ]
8988                    .into(),
8989                    width: TextWidth::default(),
8990                },
8991            })
8992            .intern(db),
8993        )
8994    }
8995    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
8996        let kind = node.kind(db);
8997        assert_eq!(
8998            kind,
8999            SyntaxKind::PatternEnum,
9000            "Unexpected SyntaxKind {:?}. Expected {:?}.",
9001            kind,
9002            SyntaxKind::PatternEnum
9003        );
9004        Self { node }
9005    }
9006    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
9007        let kind = node.kind(db);
9008        if kind == SyntaxKind::PatternEnum { Some(Self::from_syntax_node(db, node)) } else { None }
9009    }
9010    fn as_syntax_node(&self) -> SyntaxNode {
9011        self.node
9012    }
9013    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
9014        PatternEnumPtr(self.node.stable_ptr(db))
9015    }
9016}
9017#[derive(Clone, Debug, Eq, Hash, PartialEq)]
9018pub struct PatternEnumInnerPattern {
9019    node: SyntaxNode,
9020}
9021impl PatternEnumInnerPattern {
9022    pub const INDEX_LPAREN: usize = 0;
9023    pub const INDEX_PATTERN: usize = 1;
9024    pub const INDEX_RPAREN: usize = 2;
9025    pub fn new_green(
9026        db: &dyn SyntaxGroup,
9027        lparen: TerminalLParenGreen,
9028        pattern: PatternGreen,
9029        rparen: TerminalRParenGreen,
9030    ) -> PatternEnumInnerPatternGreen {
9031        let children = [lparen.0, pattern.0, rparen.0];
9032        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
9033        PatternEnumInnerPatternGreen(
9034            Arc::new(GreenNode {
9035                kind: SyntaxKind::PatternEnumInnerPattern,
9036                details: GreenNodeDetails::Node { children: children.into(), width },
9037            })
9038            .intern(db),
9039        )
9040    }
9041}
9042impl PatternEnumInnerPattern {
9043    pub fn lparen(&self, db: &dyn SyntaxGroup) -> TerminalLParen {
9044        TerminalLParen::from_syntax_node(db, self.node.get_children(db)[0])
9045    }
9046    pub fn pattern(&self, db: &dyn SyntaxGroup) -> Pattern {
9047        Pattern::from_syntax_node(db, self.node.get_children(db)[1])
9048    }
9049    pub fn rparen(&self, db: &dyn SyntaxGroup) -> TerminalRParen {
9050        TerminalRParen::from_syntax_node(db, self.node.get_children(db)[2])
9051    }
9052}
9053#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
9054pub struct PatternEnumInnerPatternPtr(pub SyntaxStablePtrId);
9055impl PatternEnumInnerPatternPtr {}
9056impl TypedStablePtr for PatternEnumInnerPatternPtr {
9057    type SyntaxNode = PatternEnumInnerPattern;
9058    fn untyped(&self) -> SyntaxStablePtrId {
9059        self.0
9060    }
9061    fn lookup(&self, db: &dyn SyntaxGroup) -> PatternEnumInnerPattern {
9062        PatternEnumInnerPattern::from_syntax_node(db, self.0.lookup(db))
9063    }
9064}
9065impl From<PatternEnumInnerPatternPtr> for SyntaxStablePtrId {
9066    fn from(ptr: PatternEnumInnerPatternPtr) -> Self {
9067        ptr.untyped()
9068    }
9069}
9070#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
9071pub struct PatternEnumInnerPatternGreen(pub GreenId);
9072impl TypedSyntaxNode for PatternEnumInnerPattern {
9073    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PatternEnumInnerPattern);
9074    type StablePtr = PatternEnumInnerPatternPtr;
9075    type Green = PatternEnumInnerPatternGreen;
9076    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
9077        PatternEnumInnerPatternGreen(
9078            Arc::new(GreenNode {
9079                kind: SyntaxKind::PatternEnumInnerPattern,
9080                details: GreenNodeDetails::Node {
9081                    children: [
9082                        TerminalLParen::missing(db).0,
9083                        Pattern::missing(db).0,
9084                        TerminalRParen::missing(db).0,
9085                    ]
9086                    .into(),
9087                    width: TextWidth::default(),
9088                },
9089            })
9090            .intern(db),
9091        )
9092    }
9093    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
9094        let kind = node.kind(db);
9095        assert_eq!(
9096            kind,
9097            SyntaxKind::PatternEnumInnerPattern,
9098            "Unexpected SyntaxKind {:?}. Expected {:?}.",
9099            kind,
9100            SyntaxKind::PatternEnumInnerPattern
9101        );
9102        Self { node }
9103    }
9104    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
9105        let kind = node.kind(db);
9106        if kind == SyntaxKind::PatternEnumInnerPattern {
9107            Some(Self::from_syntax_node(db, node))
9108        } else {
9109            None
9110        }
9111    }
9112    fn as_syntax_node(&self) -> SyntaxNode {
9113        self.node
9114    }
9115    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
9116        PatternEnumInnerPatternPtr(self.node.stable_ptr(db))
9117    }
9118}
9119#[derive(Clone, Debug, Eq, Hash, PartialEq)]
9120pub enum OptionPatternEnumInnerPattern {
9121    Empty(OptionPatternEnumInnerPatternEmpty),
9122    PatternEnumInnerPattern(PatternEnumInnerPattern),
9123}
9124#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
9125pub struct OptionPatternEnumInnerPatternPtr(pub SyntaxStablePtrId);
9126impl TypedStablePtr for OptionPatternEnumInnerPatternPtr {
9127    type SyntaxNode = OptionPatternEnumInnerPattern;
9128    fn untyped(&self) -> SyntaxStablePtrId {
9129        self.0
9130    }
9131    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionPatternEnumInnerPattern {
9132        OptionPatternEnumInnerPattern::from_syntax_node(db, self.0.lookup(db))
9133    }
9134}
9135impl From<OptionPatternEnumInnerPatternPtr> for SyntaxStablePtrId {
9136    fn from(ptr: OptionPatternEnumInnerPatternPtr) -> Self {
9137        ptr.untyped()
9138    }
9139}
9140impl From<OptionPatternEnumInnerPatternEmptyPtr> for OptionPatternEnumInnerPatternPtr {
9141    fn from(value: OptionPatternEnumInnerPatternEmptyPtr) -> Self {
9142        Self(value.0)
9143    }
9144}
9145impl From<PatternEnumInnerPatternPtr> for OptionPatternEnumInnerPatternPtr {
9146    fn from(value: PatternEnumInnerPatternPtr) -> Self {
9147        Self(value.0)
9148    }
9149}
9150impl From<OptionPatternEnumInnerPatternEmptyGreen> for OptionPatternEnumInnerPatternGreen {
9151    fn from(value: OptionPatternEnumInnerPatternEmptyGreen) -> Self {
9152        Self(value.0)
9153    }
9154}
9155impl From<PatternEnumInnerPatternGreen> for OptionPatternEnumInnerPatternGreen {
9156    fn from(value: PatternEnumInnerPatternGreen) -> Self {
9157        Self(value.0)
9158    }
9159}
9160#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
9161pub struct OptionPatternEnumInnerPatternGreen(pub GreenId);
9162impl TypedSyntaxNode for OptionPatternEnumInnerPattern {
9163    const OPTIONAL_KIND: Option<SyntaxKind> = None;
9164    type StablePtr = OptionPatternEnumInnerPatternPtr;
9165    type Green = OptionPatternEnumInnerPatternGreen;
9166    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
9167        panic!("No missing variant.");
9168    }
9169    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
9170        let kind = node.kind(db);
9171        match kind {
9172            SyntaxKind::OptionPatternEnumInnerPatternEmpty => OptionPatternEnumInnerPattern::Empty(
9173                OptionPatternEnumInnerPatternEmpty::from_syntax_node(db, node),
9174            ),
9175            SyntaxKind::PatternEnumInnerPattern => {
9176                OptionPatternEnumInnerPattern::PatternEnumInnerPattern(
9177                    PatternEnumInnerPattern::from_syntax_node(db, node),
9178                )
9179            }
9180            _ => panic!(
9181                "Unexpected syntax kind {:?} when constructing {}.",
9182                kind, "OptionPatternEnumInnerPattern"
9183            ),
9184        }
9185    }
9186    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
9187        let kind = node.kind(db);
9188        match kind {
9189            SyntaxKind::OptionPatternEnumInnerPatternEmpty => {
9190                Some(OptionPatternEnumInnerPattern::Empty(
9191                    OptionPatternEnumInnerPatternEmpty::from_syntax_node(db, node),
9192                ))
9193            }
9194            SyntaxKind::PatternEnumInnerPattern => {
9195                Some(OptionPatternEnumInnerPattern::PatternEnumInnerPattern(
9196                    PatternEnumInnerPattern::from_syntax_node(db, node),
9197                ))
9198            }
9199            _ => None,
9200        }
9201    }
9202    fn as_syntax_node(&self) -> SyntaxNode {
9203        match self {
9204            OptionPatternEnumInnerPattern::Empty(x) => x.as_syntax_node(),
9205            OptionPatternEnumInnerPattern::PatternEnumInnerPattern(x) => x.as_syntax_node(),
9206        }
9207    }
9208    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
9209        OptionPatternEnumInnerPatternPtr(self.as_syntax_node().lookup_intern(db).stable_ptr)
9210    }
9211}
9212impl OptionPatternEnumInnerPattern {
9213    /// Checks if a kind of a variant of [OptionPatternEnumInnerPattern].
9214    pub fn is_variant(kind: SyntaxKind) -> bool {
9215        matches!(
9216            kind,
9217            SyntaxKind::OptionPatternEnumInnerPatternEmpty | SyntaxKind::PatternEnumInnerPattern
9218        )
9219    }
9220}
9221#[derive(Clone, Debug, Eq, Hash, PartialEq)]
9222pub struct OptionPatternEnumInnerPatternEmpty {
9223    node: SyntaxNode,
9224}
9225impl OptionPatternEnumInnerPatternEmpty {
9226    pub fn new_green(db: &dyn SyntaxGroup) -> OptionPatternEnumInnerPatternEmptyGreen {
9227        let children = [];
9228        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
9229        OptionPatternEnumInnerPatternEmptyGreen(
9230            Arc::new(GreenNode {
9231                kind: SyntaxKind::OptionPatternEnumInnerPatternEmpty,
9232                details: GreenNodeDetails::Node { children: children.into(), width },
9233            })
9234            .intern(db),
9235        )
9236    }
9237}
9238impl OptionPatternEnumInnerPatternEmpty {}
9239#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
9240pub struct OptionPatternEnumInnerPatternEmptyPtr(pub SyntaxStablePtrId);
9241impl OptionPatternEnumInnerPatternEmptyPtr {}
9242impl TypedStablePtr for OptionPatternEnumInnerPatternEmptyPtr {
9243    type SyntaxNode = OptionPatternEnumInnerPatternEmpty;
9244    fn untyped(&self) -> SyntaxStablePtrId {
9245        self.0
9246    }
9247    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionPatternEnumInnerPatternEmpty {
9248        OptionPatternEnumInnerPatternEmpty::from_syntax_node(db, self.0.lookup(db))
9249    }
9250}
9251impl From<OptionPatternEnumInnerPatternEmptyPtr> for SyntaxStablePtrId {
9252    fn from(ptr: OptionPatternEnumInnerPatternEmptyPtr) -> Self {
9253        ptr.untyped()
9254    }
9255}
9256#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
9257pub struct OptionPatternEnumInnerPatternEmptyGreen(pub GreenId);
9258impl TypedSyntaxNode for OptionPatternEnumInnerPatternEmpty {
9259    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionPatternEnumInnerPatternEmpty);
9260    type StablePtr = OptionPatternEnumInnerPatternEmptyPtr;
9261    type Green = OptionPatternEnumInnerPatternEmptyGreen;
9262    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
9263        OptionPatternEnumInnerPatternEmptyGreen(
9264            Arc::new(GreenNode {
9265                kind: SyntaxKind::OptionPatternEnumInnerPatternEmpty,
9266                details: GreenNodeDetails::Node {
9267                    children: [].into(),
9268                    width: TextWidth::default(),
9269                },
9270            })
9271            .intern(db),
9272        )
9273    }
9274    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
9275        let kind = node.kind(db);
9276        assert_eq!(
9277            kind,
9278            SyntaxKind::OptionPatternEnumInnerPatternEmpty,
9279            "Unexpected SyntaxKind {:?}. Expected {:?}.",
9280            kind,
9281            SyntaxKind::OptionPatternEnumInnerPatternEmpty
9282        );
9283        Self { node }
9284    }
9285    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
9286        let kind = node.kind(db);
9287        if kind == SyntaxKind::OptionPatternEnumInnerPatternEmpty {
9288            Some(Self::from_syntax_node(db, node))
9289        } else {
9290            None
9291        }
9292    }
9293    fn as_syntax_node(&self) -> SyntaxNode {
9294        self.node
9295    }
9296    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
9297        OptionPatternEnumInnerPatternEmptyPtr(self.node.stable_ptr(db))
9298    }
9299}
9300#[derive(Clone, Debug, Eq, Hash, PartialEq)]
9301pub struct TypeClause {
9302    node: SyntaxNode,
9303}
9304impl TypeClause {
9305    pub const INDEX_COLON: usize = 0;
9306    pub const INDEX_TY: usize = 1;
9307    pub fn new_green(
9308        db: &dyn SyntaxGroup,
9309        colon: TerminalColonGreen,
9310        ty: ExprGreen,
9311    ) -> TypeClauseGreen {
9312        let children = [colon.0, ty.0];
9313        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
9314        TypeClauseGreen(
9315            Arc::new(GreenNode {
9316                kind: SyntaxKind::TypeClause,
9317                details: GreenNodeDetails::Node { children: children.into(), width },
9318            })
9319            .intern(db),
9320        )
9321    }
9322}
9323impl TypeClause {
9324    pub fn colon(&self, db: &dyn SyntaxGroup) -> TerminalColon {
9325        TerminalColon::from_syntax_node(db, self.node.get_children(db)[0])
9326    }
9327    pub fn ty(&self, db: &dyn SyntaxGroup) -> Expr {
9328        Expr::from_syntax_node(db, self.node.get_children(db)[1])
9329    }
9330}
9331#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
9332pub struct TypeClausePtr(pub SyntaxStablePtrId);
9333impl TypeClausePtr {}
9334impl TypedStablePtr for TypeClausePtr {
9335    type SyntaxNode = TypeClause;
9336    fn untyped(&self) -> SyntaxStablePtrId {
9337        self.0
9338    }
9339    fn lookup(&self, db: &dyn SyntaxGroup) -> TypeClause {
9340        TypeClause::from_syntax_node(db, self.0.lookup(db))
9341    }
9342}
9343impl From<TypeClausePtr> for SyntaxStablePtrId {
9344    fn from(ptr: TypeClausePtr) -> Self {
9345        ptr.untyped()
9346    }
9347}
9348#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
9349pub struct TypeClauseGreen(pub GreenId);
9350impl TypedSyntaxNode for TypeClause {
9351    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TypeClause);
9352    type StablePtr = TypeClausePtr;
9353    type Green = TypeClauseGreen;
9354    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
9355        TypeClauseGreen(
9356            Arc::new(GreenNode {
9357                kind: SyntaxKind::TypeClause,
9358                details: GreenNodeDetails::Node {
9359                    children: [TerminalColon::missing(db).0, Expr::missing(db).0].into(),
9360                    width: TextWidth::default(),
9361                },
9362            })
9363            .intern(db),
9364        )
9365    }
9366    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
9367        let kind = node.kind(db);
9368        assert_eq!(
9369            kind,
9370            SyntaxKind::TypeClause,
9371            "Unexpected SyntaxKind {:?}. Expected {:?}.",
9372            kind,
9373            SyntaxKind::TypeClause
9374        );
9375        Self { node }
9376    }
9377    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
9378        let kind = node.kind(db);
9379        if kind == SyntaxKind::TypeClause { Some(Self::from_syntax_node(db, node)) } else { None }
9380    }
9381    fn as_syntax_node(&self) -> SyntaxNode {
9382        self.node
9383    }
9384    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
9385        TypeClausePtr(self.node.stable_ptr(db))
9386    }
9387}
9388#[derive(Clone, Debug, Eq, Hash, PartialEq)]
9389pub enum OptionTypeClause {
9390    Empty(OptionTypeClauseEmpty),
9391    TypeClause(TypeClause),
9392}
9393#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
9394pub struct OptionTypeClausePtr(pub SyntaxStablePtrId);
9395impl TypedStablePtr for OptionTypeClausePtr {
9396    type SyntaxNode = OptionTypeClause;
9397    fn untyped(&self) -> SyntaxStablePtrId {
9398        self.0
9399    }
9400    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionTypeClause {
9401        OptionTypeClause::from_syntax_node(db, self.0.lookup(db))
9402    }
9403}
9404impl From<OptionTypeClausePtr> for SyntaxStablePtrId {
9405    fn from(ptr: OptionTypeClausePtr) -> Self {
9406        ptr.untyped()
9407    }
9408}
9409impl From<OptionTypeClauseEmptyPtr> for OptionTypeClausePtr {
9410    fn from(value: OptionTypeClauseEmptyPtr) -> Self {
9411        Self(value.0)
9412    }
9413}
9414impl From<TypeClausePtr> for OptionTypeClausePtr {
9415    fn from(value: TypeClausePtr) -> Self {
9416        Self(value.0)
9417    }
9418}
9419impl From<OptionTypeClauseEmptyGreen> for OptionTypeClauseGreen {
9420    fn from(value: OptionTypeClauseEmptyGreen) -> Self {
9421        Self(value.0)
9422    }
9423}
9424impl From<TypeClauseGreen> for OptionTypeClauseGreen {
9425    fn from(value: TypeClauseGreen) -> Self {
9426        Self(value.0)
9427    }
9428}
9429#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
9430pub struct OptionTypeClauseGreen(pub GreenId);
9431impl TypedSyntaxNode for OptionTypeClause {
9432    const OPTIONAL_KIND: Option<SyntaxKind> = None;
9433    type StablePtr = OptionTypeClausePtr;
9434    type Green = OptionTypeClauseGreen;
9435    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
9436        panic!("No missing variant.");
9437    }
9438    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
9439        let kind = node.kind(db);
9440        match kind {
9441            SyntaxKind::OptionTypeClauseEmpty => {
9442                OptionTypeClause::Empty(OptionTypeClauseEmpty::from_syntax_node(db, node))
9443            }
9444            SyntaxKind::TypeClause => {
9445                OptionTypeClause::TypeClause(TypeClause::from_syntax_node(db, node))
9446            }
9447            _ => panic!(
9448                "Unexpected syntax kind {:?} when constructing {}.",
9449                kind, "OptionTypeClause"
9450            ),
9451        }
9452    }
9453    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
9454        let kind = node.kind(db);
9455        match kind {
9456            SyntaxKind::OptionTypeClauseEmpty => {
9457                Some(OptionTypeClause::Empty(OptionTypeClauseEmpty::from_syntax_node(db, node)))
9458            }
9459            SyntaxKind::TypeClause => {
9460                Some(OptionTypeClause::TypeClause(TypeClause::from_syntax_node(db, node)))
9461            }
9462            _ => None,
9463        }
9464    }
9465    fn as_syntax_node(&self) -> SyntaxNode {
9466        match self {
9467            OptionTypeClause::Empty(x) => x.as_syntax_node(),
9468            OptionTypeClause::TypeClause(x) => x.as_syntax_node(),
9469        }
9470    }
9471    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
9472        OptionTypeClausePtr(self.as_syntax_node().lookup_intern(db).stable_ptr)
9473    }
9474}
9475impl OptionTypeClause {
9476    /// Checks if a kind of a variant of [OptionTypeClause].
9477    pub fn is_variant(kind: SyntaxKind) -> bool {
9478        matches!(kind, SyntaxKind::OptionTypeClauseEmpty | SyntaxKind::TypeClause)
9479    }
9480}
9481#[derive(Clone, Debug, Eq, Hash, PartialEq)]
9482pub struct OptionTypeClauseEmpty {
9483    node: SyntaxNode,
9484}
9485impl OptionTypeClauseEmpty {
9486    pub fn new_green(db: &dyn SyntaxGroup) -> OptionTypeClauseEmptyGreen {
9487        let children = [];
9488        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
9489        OptionTypeClauseEmptyGreen(
9490            Arc::new(GreenNode {
9491                kind: SyntaxKind::OptionTypeClauseEmpty,
9492                details: GreenNodeDetails::Node { children: children.into(), width },
9493            })
9494            .intern(db),
9495        )
9496    }
9497}
9498impl OptionTypeClauseEmpty {}
9499#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
9500pub struct OptionTypeClauseEmptyPtr(pub SyntaxStablePtrId);
9501impl OptionTypeClauseEmptyPtr {}
9502impl TypedStablePtr for OptionTypeClauseEmptyPtr {
9503    type SyntaxNode = OptionTypeClauseEmpty;
9504    fn untyped(&self) -> SyntaxStablePtrId {
9505        self.0
9506    }
9507    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionTypeClauseEmpty {
9508        OptionTypeClauseEmpty::from_syntax_node(db, self.0.lookup(db))
9509    }
9510}
9511impl From<OptionTypeClauseEmptyPtr> for SyntaxStablePtrId {
9512    fn from(ptr: OptionTypeClauseEmptyPtr) -> Self {
9513        ptr.untyped()
9514    }
9515}
9516#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
9517pub struct OptionTypeClauseEmptyGreen(pub GreenId);
9518impl TypedSyntaxNode for OptionTypeClauseEmpty {
9519    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionTypeClauseEmpty);
9520    type StablePtr = OptionTypeClauseEmptyPtr;
9521    type Green = OptionTypeClauseEmptyGreen;
9522    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
9523        OptionTypeClauseEmptyGreen(
9524            Arc::new(GreenNode {
9525                kind: SyntaxKind::OptionTypeClauseEmpty,
9526                details: GreenNodeDetails::Node {
9527                    children: [].into(),
9528                    width: TextWidth::default(),
9529                },
9530            })
9531            .intern(db),
9532        )
9533    }
9534    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
9535        let kind = node.kind(db);
9536        assert_eq!(
9537            kind,
9538            SyntaxKind::OptionTypeClauseEmpty,
9539            "Unexpected SyntaxKind {:?}. Expected {:?}.",
9540            kind,
9541            SyntaxKind::OptionTypeClauseEmpty
9542        );
9543        Self { node }
9544    }
9545    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
9546        let kind = node.kind(db);
9547        if kind == SyntaxKind::OptionTypeClauseEmpty {
9548            Some(Self::from_syntax_node(db, node))
9549        } else {
9550            None
9551        }
9552    }
9553    fn as_syntax_node(&self) -> SyntaxNode {
9554        self.node
9555    }
9556    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
9557        OptionTypeClauseEmptyPtr(self.node.stable_ptr(db))
9558    }
9559}
9560#[derive(Clone, Debug, Eq, Hash, PartialEq)]
9561pub struct ReturnTypeClause {
9562    node: SyntaxNode,
9563}
9564impl ReturnTypeClause {
9565    pub const INDEX_ARROW: usize = 0;
9566    pub const INDEX_TY: usize = 1;
9567    pub fn new_green(
9568        db: &dyn SyntaxGroup,
9569        arrow: TerminalArrowGreen,
9570        ty: ExprGreen,
9571    ) -> ReturnTypeClauseGreen {
9572        let children = [arrow.0, ty.0];
9573        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
9574        ReturnTypeClauseGreen(
9575            Arc::new(GreenNode {
9576                kind: SyntaxKind::ReturnTypeClause,
9577                details: GreenNodeDetails::Node { children: children.into(), width },
9578            })
9579            .intern(db),
9580        )
9581    }
9582}
9583impl ReturnTypeClause {
9584    pub fn arrow(&self, db: &dyn SyntaxGroup) -> TerminalArrow {
9585        TerminalArrow::from_syntax_node(db, self.node.get_children(db)[0])
9586    }
9587    pub fn ty(&self, db: &dyn SyntaxGroup) -> Expr {
9588        Expr::from_syntax_node(db, self.node.get_children(db)[1])
9589    }
9590}
9591#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
9592pub struct ReturnTypeClausePtr(pub SyntaxStablePtrId);
9593impl ReturnTypeClausePtr {}
9594impl TypedStablePtr for ReturnTypeClausePtr {
9595    type SyntaxNode = ReturnTypeClause;
9596    fn untyped(&self) -> SyntaxStablePtrId {
9597        self.0
9598    }
9599    fn lookup(&self, db: &dyn SyntaxGroup) -> ReturnTypeClause {
9600        ReturnTypeClause::from_syntax_node(db, self.0.lookup(db))
9601    }
9602}
9603impl From<ReturnTypeClausePtr> for SyntaxStablePtrId {
9604    fn from(ptr: ReturnTypeClausePtr) -> Self {
9605        ptr.untyped()
9606    }
9607}
9608#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
9609pub struct ReturnTypeClauseGreen(pub GreenId);
9610impl TypedSyntaxNode for ReturnTypeClause {
9611    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ReturnTypeClause);
9612    type StablePtr = ReturnTypeClausePtr;
9613    type Green = ReturnTypeClauseGreen;
9614    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
9615        ReturnTypeClauseGreen(
9616            Arc::new(GreenNode {
9617                kind: SyntaxKind::ReturnTypeClause,
9618                details: GreenNodeDetails::Node {
9619                    children: [TerminalArrow::missing(db).0, Expr::missing(db).0].into(),
9620                    width: TextWidth::default(),
9621                },
9622            })
9623            .intern(db),
9624        )
9625    }
9626    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
9627        let kind = node.kind(db);
9628        assert_eq!(
9629            kind,
9630            SyntaxKind::ReturnTypeClause,
9631            "Unexpected SyntaxKind {:?}. Expected {:?}.",
9632            kind,
9633            SyntaxKind::ReturnTypeClause
9634        );
9635        Self { node }
9636    }
9637    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
9638        let kind = node.kind(db);
9639        if kind == SyntaxKind::ReturnTypeClause {
9640            Some(Self::from_syntax_node(db, node))
9641        } else {
9642            None
9643        }
9644    }
9645    fn as_syntax_node(&self) -> SyntaxNode {
9646        self.node
9647    }
9648    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
9649        ReturnTypeClausePtr(self.node.stable_ptr(db))
9650    }
9651}
9652#[derive(Clone, Debug, Eq, Hash, PartialEq)]
9653pub enum OptionReturnTypeClause {
9654    Empty(OptionReturnTypeClauseEmpty),
9655    ReturnTypeClause(ReturnTypeClause),
9656}
9657#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
9658pub struct OptionReturnTypeClausePtr(pub SyntaxStablePtrId);
9659impl TypedStablePtr for OptionReturnTypeClausePtr {
9660    type SyntaxNode = OptionReturnTypeClause;
9661    fn untyped(&self) -> SyntaxStablePtrId {
9662        self.0
9663    }
9664    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionReturnTypeClause {
9665        OptionReturnTypeClause::from_syntax_node(db, self.0.lookup(db))
9666    }
9667}
9668impl From<OptionReturnTypeClausePtr> for SyntaxStablePtrId {
9669    fn from(ptr: OptionReturnTypeClausePtr) -> Self {
9670        ptr.untyped()
9671    }
9672}
9673impl From<OptionReturnTypeClauseEmptyPtr> for OptionReturnTypeClausePtr {
9674    fn from(value: OptionReturnTypeClauseEmptyPtr) -> Self {
9675        Self(value.0)
9676    }
9677}
9678impl From<ReturnTypeClausePtr> for OptionReturnTypeClausePtr {
9679    fn from(value: ReturnTypeClausePtr) -> Self {
9680        Self(value.0)
9681    }
9682}
9683impl From<OptionReturnTypeClauseEmptyGreen> for OptionReturnTypeClauseGreen {
9684    fn from(value: OptionReturnTypeClauseEmptyGreen) -> Self {
9685        Self(value.0)
9686    }
9687}
9688impl From<ReturnTypeClauseGreen> for OptionReturnTypeClauseGreen {
9689    fn from(value: ReturnTypeClauseGreen) -> Self {
9690        Self(value.0)
9691    }
9692}
9693#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
9694pub struct OptionReturnTypeClauseGreen(pub GreenId);
9695impl TypedSyntaxNode for OptionReturnTypeClause {
9696    const OPTIONAL_KIND: Option<SyntaxKind> = None;
9697    type StablePtr = OptionReturnTypeClausePtr;
9698    type Green = OptionReturnTypeClauseGreen;
9699    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
9700        panic!("No missing variant.");
9701    }
9702    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
9703        let kind = node.kind(db);
9704        match kind {
9705            SyntaxKind::OptionReturnTypeClauseEmpty => OptionReturnTypeClause::Empty(
9706                OptionReturnTypeClauseEmpty::from_syntax_node(db, node),
9707            ),
9708            SyntaxKind::ReturnTypeClause => OptionReturnTypeClause::ReturnTypeClause(
9709                ReturnTypeClause::from_syntax_node(db, node),
9710            ),
9711            _ => panic!(
9712                "Unexpected syntax kind {:?} when constructing {}.",
9713                kind, "OptionReturnTypeClause"
9714            ),
9715        }
9716    }
9717    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
9718        let kind = node.kind(db);
9719        match kind {
9720            SyntaxKind::OptionReturnTypeClauseEmpty => Some(OptionReturnTypeClause::Empty(
9721                OptionReturnTypeClauseEmpty::from_syntax_node(db, node),
9722            )),
9723            SyntaxKind::ReturnTypeClause => Some(OptionReturnTypeClause::ReturnTypeClause(
9724                ReturnTypeClause::from_syntax_node(db, node),
9725            )),
9726            _ => None,
9727        }
9728    }
9729    fn as_syntax_node(&self) -> SyntaxNode {
9730        match self {
9731            OptionReturnTypeClause::Empty(x) => x.as_syntax_node(),
9732            OptionReturnTypeClause::ReturnTypeClause(x) => x.as_syntax_node(),
9733        }
9734    }
9735    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
9736        OptionReturnTypeClausePtr(self.as_syntax_node().lookup_intern(db).stable_ptr)
9737    }
9738}
9739impl OptionReturnTypeClause {
9740    /// Checks if a kind of a variant of [OptionReturnTypeClause].
9741    pub fn is_variant(kind: SyntaxKind) -> bool {
9742        matches!(kind, SyntaxKind::OptionReturnTypeClauseEmpty | SyntaxKind::ReturnTypeClause)
9743    }
9744}
9745#[derive(Clone, Debug, Eq, Hash, PartialEq)]
9746pub struct OptionReturnTypeClauseEmpty {
9747    node: SyntaxNode,
9748}
9749impl OptionReturnTypeClauseEmpty {
9750    pub fn new_green(db: &dyn SyntaxGroup) -> OptionReturnTypeClauseEmptyGreen {
9751        let children = [];
9752        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
9753        OptionReturnTypeClauseEmptyGreen(
9754            Arc::new(GreenNode {
9755                kind: SyntaxKind::OptionReturnTypeClauseEmpty,
9756                details: GreenNodeDetails::Node { children: children.into(), width },
9757            })
9758            .intern(db),
9759        )
9760    }
9761}
9762impl OptionReturnTypeClauseEmpty {}
9763#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
9764pub struct OptionReturnTypeClauseEmptyPtr(pub SyntaxStablePtrId);
9765impl OptionReturnTypeClauseEmptyPtr {}
9766impl TypedStablePtr for OptionReturnTypeClauseEmptyPtr {
9767    type SyntaxNode = OptionReturnTypeClauseEmpty;
9768    fn untyped(&self) -> SyntaxStablePtrId {
9769        self.0
9770    }
9771    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionReturnTypeClauseEmpty {
9772        OptionReturnTypeClauseEmpty::from_syntax_node(db, self.0.lookup(db))
9773    }
9774}
9775impl From<OptionReturnTypeClauseEmptyPtr> for SyntaxStablePtrId {
9776    fn from(ptr: OptionReturnTypeClauseEmptyPtr) -> Self {
9777        ptr.untyped()
9778    }
9779}
9780#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
9781pub struct OptionReturnTypeClauseEmptyGreen(pub GreenId);
9782impl TypedSyntaxNode for OptionReturnTypeClauseEmpty {
9783    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionReturnTypeClauseEmpty);
9784    type StablePtr = OptionReturnTypeClauseEmptyPtr;
9785    type Green = OptionReturnTypeClauseEmptyGreen;
9786    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
9787        OptionReturnTypeClauseEmptyGreen(
9788            Arc::new(GreenNode {
9789                kind: SyntaxKind::OptionReturnTypeClauseEmpty,
9790                details: GreenNodeDetails::Node {
9791                    children: [].into(),
9792                    width: TextWidth::default(),
9793                },
9794            })
9795            .intern(db),
9796        )
9797    }
9798    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
9799        let kind = node.kind(db);
9800        assert_eq!(
9801            kind,
9802            SyntaxKind::OptionReturnTypeClauseEmpty,
9803            "Unexpected SyntaxKind {:?}. Expected {:?}.",
9804            kind,
9805            SyntaxKind::OptionReturnTypeClauseEmpty
9806        );
9807        Self { node }
9808    }
9809    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
9810        let kind = node.kind(db);
9811        if kind == SyntaxKind::OptionReturnTypeClauseEmpty {
9812            Some(Self::from_syntax_node(db, node))
9813        } else {
9814            None
9815        }
9816    }
9817    fn as_syntax_node(&self) -> SyntaxNode {
9818        self.node
9819    }
9820    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
9821        OptionReturnTypeClauseEmptyPtr(self.node.stable_ptr(db))
9822    }
9823}
9824#[derive(Clone, Debug, Eq, Hash, PartialEq)]
9825pub enum Statement {
9826    Let(StatementLet),
9827    Expr(StatementExpr),
9828    Continue(StatementContinue),
9829    Return(StatementReturn),
9830    Break(StatementBreak),
9831    Item(StatementItem),
9832    Missing(StatementMissing),
9833}
9834#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
9835pub struct StatementPtr(pub SyntaxStablePtrId);
9836impl TypedStablePtr for StatementPtr {
9837    type SyntaxNode = Statement;
9838    fn untyped(&self) -> SyntaxStablePtrId {
9839        self.0
9840    }
9841    fn lookup(&self, db: &dyn SyntaxGroup) -> Statement {
9842        Statement::from_syntax_node(db, self.0.lookup(db))
9843    }
9844}
9845impl From<StatementPtr> for SyntaxStablePtrId {
9846    fn from(ptr: StatementPtr) -> Self {
9847        ptr.untyped()
9848    }
9849}
9850impl From<StatementLetPtr> for StatementPtr {
9851    fn from(value: StatementLetPtr) -> Self {
9852        Self(value.0)
9853    }
9854}
9855impl From<StatementExprPtr> for StatementPtr {
9856    fn from(value: StatementExprPtr) -> Self {
9857        Self(value.0)
9858    }
9859}
9860impl From<StatementContinuePtr> for StatementPtr {
9861    fn from(value: StatementContinuePtr) -> Self {
9862        Self(value.0)
9863    }
9864}
9865impl From<StatementReturnPtr> for StatementPtr {
9866    fn from(value: StatementReturnPtr) -> Self {
9867        Self(value.0)
9868    }
9869}
9870impl From<StatementBreakPtr> for StatementPtr {
9871    fn from(value: StatementBreakPtr) -> Self {
9872        Self(value.0)
9873    }
9874}
9875impl From<StatementItemPtr> for StatementPtr {
9876    fn from(value: StatementItemPtr) -> Self {
9877        Self(value.0)
9878    }
9879}
9880impl From<StatementMissingPtr> for StatementPtr {
9881    fn from(value: StatementMissingPtr) -> Self {
9882        Self(value.0)
9883    }
9884}
9885impl From<StatementLetGreen> for StatementGreen {
9886    fn from(value: StatementLetGreen) -> Self {
9887        Self(value.0)
9888    }
9889}
9890impl From<StatementExprGreen> for StatementGreen {
9891    fn from(value: StatementExprGreen) -> Self {
9892        Self(value.0)
9893    }
9894}
9895impl From<StatementContinueGreen> for StatementGreen {
9896    fn from(value: StatementContinueGreen) -> Self {
9897        Self(value.0)
9898    }
9899}
9900impl From<StatementReturnGreen> for StatementGreen {
9901    fn from(value: StatementReturnGreen) -> Self {
9902        Self(value.0)
9903    }
9904}
9905impl From<StatementBreakGreen> for StatementGreen {
9906    fn from(value: StatementBreakGreen) -> Self {
9907        Self(value.0)
9908    }
9909}
9910impl From<StatementItemGreen> for StatementGreen {
9911    fn from(value: StatementItemGreen) -> Self {
9912        Self(value.0)
9913    }
9914}
9915impl From<StatementMissingGreen> for StatementGreen {
9916    fn from(value: StatementMissingGreen) -> Self {
9917        Self(value.0)
9918    }
9919}
9920#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
9921pub struct StatementGreen(pub GreenId);
9922impl TypedSyntaxNode for Statement {
9923    const OPTIONAL_KIND: Option<SyntaxKind> = None;
9924    type StablePtr = StatementPtr;
9925    type Green = StatementGreen;
9926    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
9927        StatementGreen(StatementMissing::missing(db).0)
9928    }
9929    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
9930        let kind = node.kind(db);
9931        match kind {
9932            SyntaxKind::StatementLet => Statement::Let(StatementLet::from_syntax_node(db, node)),
9933            SyntaxKind::StatementExpr => Statement::Expr(StatementExpr::from_syntax_node(db, node)),
9934            SyntaxKind::StatementContinue => {
9935                Statement::Continue(StatementContinue::from_syntax_node(db, node))
9936            }
9937            SyntaxKind::StatementReturn => {
9938                Statement::Return(StatementReturn::from_syntax_node(db, node))
9939            }
9940            SyntaxKind::StatementBreak => {
9941                Statement::Break(StatementBreak::from_syntax_node(db, node))
9942            }
9943            SyntaxKind::StatementItem => Statement::Item(StatementItem::from_syntax_node(db, node)),
9944            SyntaxKind::StatementMissing => {
9945                Statement::Missing(StatementMissing::from_syntax_node(db, node))
9946            }
9947            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "Statement"),
9948        }
9949    }
9950    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
9951        let kind = node.kind(db);
9952        match kind {
9953            SyntaxKind::StatementLet => {
9954                Some(Statement::Let(StatementLet::from_syntax_node(db, node)))
9955            }
9956            SyntaxKind::StatementExpr => {
9957                Some(Statement::Expr(StatementExpr::from_syntax_node(db, node)))
9958            }
9959            SyntaxKind::StatementContinue => {
9960                Some(Statement::Continue(StatementContinue::from_syntax_node(db, node)))
9961            }
9962            SyntaxKind::StatementReturn => {
9963                Some(Statement::Return(StatementReturn::from_syntax_node(db, node)))
9964            }
9965            SyntaxKind::StatementBreak => {
9966                Some(Statement::Break(StatementBreak::from_syntax_node(db, node)))
9967            }
9968            SyntaxKind::StatementItem => {
9969                Some(Statement::Item(StatementItem::from_syntax_node(db, node)))
9970            }
9971            SyntaxKind::StatementMissing => {
9972                Some(Statement::Missing(StatementMissing::from_syntax_node(db, node)))
9973            }
9974            _ => None,
9975        }
9976    }
9977    fn as_syntax_node(&self) -> SyntaxNode {
9978        match self {
9979            Statement::Let(x) => x.as_syntax_node(),
9980            Statement::Expr(x) => x.as_syntax_node(),
9981            Statement::Continue(x) => x.as_syntax_node(),
9982            Statement::Return(x) => x.as_syntax_node(),
9983            Statement::Break(x) => x.as_syntax_node(),
9984            Statement::Item(x) => x.as_syntax_node(),
9985            Statement::Missing(x) => x.as_syntax_node(),
9986        }
9987    }
9988    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
9989        StatementPtr(self.as_syntax_node().lookup_intern(db).stable_ptr)
9990    }
9991}
9992impl Statement {
9993    /// Checks if a kind of a variant of [Statement].
9994    pub fn is_variant(kind: SyntaxKind) -> bool {
9995        matches!(
9996            kind,
9997            SyntaxKind::StatementLet
9998                | SyntaxKind::StatementExpr
9999                | SyntaxKind::StatementContinue
10000                | SyntaxKind::StatementReturn
10001                | SyntaxKind::StatementBreak
10002                | SyntaxKind::StatementItem
10003                | SyntaxKind::StatementMissing
10004        )
10005    }
10006}
10007#[derive(Clone, Debug, Eq, Hash, PartialEq)]
10008pub struct StatementList(ElementList<Statement, 1>);
10009impl Deref for StatementList {
10010    type Target = ElementList<Statement, 1>;
10011    fn deref(&self) -> &Self::Target {
10012        &self.0
10013    }
10014}
10015impl StatementList {
10016    pub fn new_green(db: &dyn SyntaxGroup, children: &[StatementGreen]) -> StatementListGreen {
10017        let width = children.iter().map(|id| id.0.lookup_intern(db).width()).sum();
10018        StatementListGreen(
10019            Arc::new(GreenNode {
10020                kind: SyntaxKind::StatementList,
10021                details: GreenNodeDetails::Node {
10022                    children: children.iter().map(|x| x.0).collect(),
10023                    width,
10024                },
10025            })
10026            .intern(db),
10027        )
10028    }
10029}
10030#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
10031pub struct StatementListPtr(pub SyntaxStablePtrId);
10032impl TypedStablePtr for StatementListPtr {
10033    type SyntaxNode = StatementList;
10034    fn untyped(&self) -> SyntaxStablePtrId {
10035        self.0
10036    }
10037    fn lookup(&self, db: &dyn SyntaxGroup) -> StatementList {
10038        StatementList::from_syntax_node(db, self.0.lookup(db))
10039    }
10040}
10041impl From<StatementListPtr> for SyntaxStablePtrId {
10042    fn from(ptr: StatementListPtr) -> Self {
10043        ptr.untyped()
10044    }
10045}
10046#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
10047pub struct StatementListGreen(pub GreenId);
10048impl TypedSyntaxNode for StatementList {
10049    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StatementList);
10050    type StablePtr = StatementListPtr;
10051    type Green = StatementListGreen;
10052    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
10053        StatementListGreen(
10054            Arc::new(GreenNode {
10055                kind: SyntaxKind::StatementList,
10056                details: GreenNodeDetails::Node {
10057                    children: [].into(),
10058                    width: TextWidth::default(),
10059                },
10060            })
10061            .intern(db),
10062        )
10063    }
10064    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
10065        Self(ElementList::new(node))
10066    }
10067    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
10068        if node.kind(db) == SyntaxKind::StatementList {
10069            Some(Self(ElementList::new(node)))
10070        } else {
10071            None
10072        }
10073    }
10074    fn as_syntax_node(&self) -> SyntaxNode {
10075        self.node
10076    }
10077    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
10078        StatementListPtr(self.node.stable_ptr(db))
10079    }
10080}
10081#[derive(Clone, Debug, Eq, Hash, PartialEq)]
10082pub struct StatementMissing {
10083    node: SyntaxNode,
10084}
10085impl StatementMissing {
10086    pub fn new_green(db: &dyn SyntaxGroup) -> StatementMissingGreen {
10087        let children = [];
10088        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
10089        StatementMissingGreen(
10090            Arc::new(GreenNode {
10091                kind: SyntaxKind::StatementMissing,
10092                details: GreenNodeDetails::Node { children: children.into(), width },
10093            })
10094            .intern(db),
10095        )
10096    }
10097}
10098impl StatementMissing {}
10099#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
10100pub struct StatementMissingPtr(pub SyntaxStablePtrId);
10101impl StatementMissingPtr {}
10102impl TypedStablePtr for StatementMissingPtr {
10103    type SyntaxNode = StatementMissing;
10104    fn untyped(&self) -> SyntaxStablePtrId {
10105        self.0
10106    }
10107    fn lookup(&self, db: &dyn SyntaxGroup) -> StatementMissing {
10108        StatementMissing::from_syntax_node(db, self.0.lookup(db))
10109    }
10110}
10111impl From<StatementMissingPtr> for SyntaxStablePtrId {
10112    fn from(ptr: StatementMissingPtr) -> Self {
10113        ptr.untyped()
10114    }
10115}
10116#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
10117pub struct StatementMissingGreen(pub GreenId);
10118impl TypedSyntaxNode for StatementMissing {
10119    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StatementMissing);
10120    type StablePtr = StatementMissingPtr;
10121    type Green = StatementMissingGreen;
10122    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
10123        StatementMissingGreen(
10124            Arc::new(GreenNode {
10125                kind: SyntaxKind::StatementMissing,
10126                details: GreenNodeDetails::Node {
10127                    children: [].into(),
10128                    width: TextWidth::default(),
10129                },
10130            })
10131            .intern(db),
10132        )
10133    }
10134    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
10135        let kind = node.kind(db);
10136        assert_eq!(
10137            kind,
10138            SyntaxKind::StatementMissing,
10139            "Unexpected SyntaxKind {:?}. Expected {:?}.",
10140            kind,
10141            SyntaxKind::StatementMissing
10142        );
10143        Self { node }
10144    }
10145    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
10146        let kind = node.kind(db);
10147        if kind == SyntaxKind::StatementMissing {
10148            Some(Self::from_syntax_node(db, node))
10149        } else {
10150            None
10151        }
10152    }
10153    fn as_syntax_node(&self) -> SyntaxNode {
10154        self.node
10155    }
10156    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
10157        StatementMissingPtr(self.node.stable_ptr(db))
10158    }
10159}
10160#[derive(Clone, Debug, Eq, Hash, PartialEq)]
10161pub struct StatementLet {
10162    node: SyntaxNode,
10163}
10164impl StatementLet {
10165    pub const INDEX_ATTRIBUTES: usize = 0;
10166    pub const INDEX_LET_KW: usize = 1;
10167    pub const INDEX_PATTERN: usize = 2;
10168    pub const INDEX_TYPE_CLAUSE: usize = 3;
10169    pub const INDEX_EQ: usize = 4;
10170    pub const INDEX_RHS: usize = 5;
10171    pub const INDEX_LET_ELSE_CLAUSE: usize = 6;
10172    pub const INDEX_SEMICOLON: usize = 7;
10173    pub fn new_green(
10174        db: &dyn SyntaxGroup,
10175        attributes: AttributeListGreen,
10176        let_kw: TerminalLetGreen,
10177        pattern: PatternGreen,
10178        type_clause: OptionTypeClauseGreen,
10179        eq: TerminalEqGreen,
10180        rhs: ExprGreen,
10181        let_else_clause: OptionLetElseClauseGreen,
10182        semicolon: TerminalSemicolonGreen,
10183    ) -> StatementLetGreen {
10184        let children = [
10185            attributes.0,
10186            let_kw.0,
10187            pattern.0,
10188            type_clause.0,
10189            eq.0,
10190            rhs.0,
10191            let_else_clause.0,
10192            semicolon.0,
10193        ];
10194        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
10195        StatementLetGreen(
10196            Arc::new(GreenNode {
10197                kind: SyntaxKind::StatementLet,
10198                details: GreenNodeDetails::Node { children: children.into(), width },
10199            })
10200            .intern(db),
10201        )
10202    }
10203}
10204impl StatementLet {
10205    pub fn attributes(&self, db: &dyn SyntaxGroup) -> AttributeList {
10206        AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
10207    }
10208    pub fn let_kw(&self, db: &dyn SyntaxGroup) -> TerminalLet {
10209        TerminalLet::from_syntax_node(db, self.node.get_children(db)[1])
10210    }
10211    pub fn pattern(&self, db: &dyn SyntaxGroup) -> Pattern {
10212        Pattern::from_syntax_node(db, self.node.get_children(db)[2])
10213    }
10214    pub fn type_clause(&self, db: &dyn SyntaxGroup) -> OptionTypeClause {
10215        OptionTypeClause::from_syntax_node(db, self.node.get_children(db)[3])
10216    }
10217    pub fn eq(&self, db: &dyn SyntaxGroup) -> TerminalEq {
10218        TerminalEq::from_syntax_node(db, self.node.get_children(db)[4])
10219    }
10220    pub fn rhs(&self, db: &dyn SyntaxGroup) -> Expr {
10221        Expr::from_syntax_node(db, self.node.get_children(db)[5])
10222    }
10223    pub fn let_else_clause(&self, db: &dyn SyntaxGroup) -> OptionLetElseClause {
10224        OptionLetElseClause::from_syntax_node(db, self.node.get_children(db)[6])
10225    }
10226    pub fn semicolon(&self, db: &dyn SyntaxGroup) -> TerminalSemicolon {
10227        TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[7])
10228    }
10229}
10230#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
10231pub struct StatementLetPtr(pub SyntaxStablePtrId);
10232impl StatementLetPtr {
10233    pub fn pattern_green(self, db: &dyn SyntaxGroup) -> PatternGreen {
10234        let ptr = self.0.lookup_intern(db);
10235        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
10236            PatternGreen(key_fields[0])
10237        } else {
10238            panic!("Unexpected key field query on root.");
10239        }
10240    }
10241}
10242impl TypedStablePtr for StatementLetPtr {
10243    type SyntaxNode = StatementLet;
10244    fn untyped(&self) -> SyntaxStablePtrId {
10245        self.0
10246    }
10247    fn lookup(&self, db: &dyn SyntaxGroup) -> StatementLet {
10248        StatementLet::from_syntax_node(db, self.0.lookup(db))
10249    }
10250}
10251impl From<StatementLetPtr> for SyntaxStablePtrId {
10252    fn from(ptr: StatementLetPtr) -> Self {
10253        ptr.untyped()
10254    }
10255}
10256#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
10257pub struct StatementLetGreen(pub GreenId);
10258impl TypedSyntaxNode for StatementLet {
10259    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StatementLet);
10260    type StablePtr = StatementLetPtr;
10261    type Green = StatementLetGreen;
10262    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
10263        StatementLetGreen(
10264            Arc::new(GreenNode {
10265                kind: SyntaxKind::StatementLet,
10266                details: GreenNodeDetails::Node {
10267                    children: [
10268                        AttributeList::missing(db).0,
10269                        TerminalLet::missing(db).0,
10270                        Pattern::missing(db).0,
10271                        OptionTypeClause::missing(db).0,
10272                        TerminalEq::missing(db).0,
10273                        Expr::missing(db).0,
10274                        OptionLetElseClause::missing(db).0,
10275                        TerminalSemicolon::missing(db).0,
10276                    ]
10277                    .into(),
10278                    width: TextWidth::default(),
10279                },
10280            })
10281            .intern(db),
10282        )
10283    }
10284    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
10285        let kind = node.kind(db);
10286        assert_eq!(
10287            kind,
10288            SyntaxKind::StatementLet,
10289            "Unexpected SyntaxKind {:?}. Expected {:?}.",
10290            kind,
10291            SyntaxKind::StatementLet
10292        );
10293        Self { node }
10294    }
10295    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
10296        let kind = node.kind(db);
10297        if kind == SyntaxKind::StatementLet { Some(Self::from_syntax_node(db, node)) } else { None }
10298    }
10299    fn as_syntax_node(&self) -> SyntaxNode {
10300        self.node
10301    }
10302    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
10303        StatementLetPtr(self.node.stable_ptr(db))
10304    }
10305}
10306#[derive(Clone, Debug, Eq, Hash, PartialEq)]
10307pub struct LetElseClause {
10308    node: SyntaxNode,
10309}
10310impl LetElseClause {
10311    pub const INDEX_ELSE_KW: usize = 0;
10312    pub const INDEX_ELSE_BLOCK: usize = 1;
10313    pub fn new_green(
10314        db: &dyn SyntaxGroup,
10315        else_kw: TerminalElseGreen,
10316        else_block: ExprBlockGreen,
10317    ) -> LetElseClauseGreen {
10318        let children = [else_kw.0, else_block.0];
10319        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
10320        LetElseClauseGreen(
10321            Arc::new(GreenNode {
10322                kind: SyntaxKind::LetElseClause,
10323                details: GreenNodeDetails::Node { children: children.into(), width },
10324            })
10325            .intern(db),
10326        )
10327    }
10328}
10329impl LetElseClause {
10330    pub fn else_kw(&self, db: &dyn SyntaxGroup) -> TerminalElse {
10331        TerminalElse::from_syntax_node(db, self.node.get_children(db)[0])
10332    }
10333    pub fn else_block(&self, db: &dyn SyntaxGroup) -> ExprBlock {
10334        ExprBlock::from_syntax_node(db, self.node.get_children(db)[1])
10335    }
10336}
10337#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
10338pub struct LetElseClausePtr(pub SyntaxStablePtrId);
10339impl LetElseClausePtr {}
10340impl TypedStablePtr for LetElseClausePtr {
10341    type SyntaxNode = LetElseClause;
10342    fn untyped(&self) -> SyntaxStablePtrId {
10343        self.0
10344    }
10345    fn lookup(&self, db: &dyn SyntaxGroup) -> LetElseClause {
10346        LetElseClause::from_syntax_node(db, self.0.lookup(db))
10347    }
10348}
10349impl From<LetElseClausePtr> for SyntaxStablePtrId {
10350    fn from(ptr: LetElseClausePtr) -> Self {
10351        ptr.untyped()
10352    }
10353}
10354#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
10355pub struct LetElseClauseGreen(pub GreenId);
10356impl TypedSyntaxNode for LetElseClause {
10357    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::LetElseClause);
10358    type StablePtr = LetElseClausePtr;
10359    type Green = LetElseClauseGreen;
10360    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
10361        LetElseClauseGreen(
10362            Arc::new(GreenNode {
10363                kind: SyntaxKind::LetElseClause,
10364                details: GreenNodeDetails::Node {
10365                    children: [TerminalElse::missing(db).0, ExprBlock::missing(db).0].into(),
10366                    width: TextWidth::default(),
10367                },
10368            })
10369            .intern(db),
10370        )
10371    }
10372    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
10373        let kind = node.kind(db);
10374        assert_eq!(
10375            kind,
10376            SyntaxKind::LetElseClause,
10377            "Unexpected SyntaxKind {:?}. Expected {:?}.",
10378            kind,
10379            SyntaxKind::LetElseClause
10380        );
10381        Self { node }
10382    }
10383    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
10384        let kind = node.kind(db);
10385        if kind == SyntaxKind::LetElseClause {
10386            Some(Self::from_syntax_node(db, node))
10387        } else {
10388            None
10389        }
10390    }
10391    fn as_syntax_node(&self) -> SyntaxNode {
10392        self.node
10393    }
10394    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
10395        LetElseClausePtr(self.node.stable_ptr(db))
10396    }
10397}
10398#[derive(Clone, Debug, Eq, Hash, PartialEq)]
10399pub enum OptionLetElseClause {
10400    Empty(OptionLetElseClauseEmpty),
10401    LetElseClause(LetElseClause),
10402}
10403#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
10404pub struct OptionLetElseClausePtr(pub SyntaxStablePtrId);
10405impl TypedStablePtr for OptionLetElseClausePtr {
10406    type SyntaxNode = OptionLetElseClause;
10407    fn untyped(&self) -> SyntaxStablePtrId {
10408        self.0
10409    }
10410    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionLetElseClause {
10411        OptionLetElseClause::from_syntax_node(db, self.0.lookup(db))
10412    }
10413}
10414impl From<OptionLetElseClausePtr> for SyntaxStablePtrId {
10415    fn from(ptr: OptionLetElseClausePtr) -> Self {
10416        ptr.untyped()
10417    }
10418}
10419impl From<OptionLetElseClauseEmptyPtr> for OptionLetElseClausePtr {
10420    fn from(value: OptionLetElseClauseEmptyPtr) -> Self {
10421        Self(value.0)
10422    }
10423}
10424impl From<LetElseClausePtr> for OptionLetElseClausePtr {
10425    fn from(value: LetElseClausePtr) -> Self {
10426        Self(value.0)
10427    }
10428}
10429impl From<OptionLetElseClauseEmptyGreen> for OptionLetElseClauseGreen {
10430    fn from(value: OptionLetElseClauseEmptyGreen) -> Self {
10431        Self(value.0)
10432    }
10433}
10434impl From<LetElseClauseGreen> for OptionLetElseClauseGreen {
10435    fn from(value: LetElseClauseGreen) -> Self {
10436        Self(value.0)
10437    }
10438}
10439#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
10440pub struct OptionLetElseClauseGreen(pub GreenId);
10441impl TypedSyntaxNode for OptionLetElseClause {
10442    const OPTIONAL_KIND: Option<SyntaxKind> = None;
10443    type StablePtr = OptionLetElseClausePtr;
10444    type Green = OptionLetElseClauseGreen;
10445    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
10446        panic!("No missing variant.");
10447    }
10448    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
10449        let kind = node.kind(db);
10450        match kind {
10451            SyntaxKind::OptionLetElseClauseEmpty => {
10452                OptionLetElseClause::Empty(OptionLetElseClauseEmpty::from_syntax_node(db, node))
10453            }
10454            SyntaxKind::LetElseClause => {
10455                OptionLetElseClause::LetElseClause(LetElseClause::from_syntax_node(db, node))
10456            }
10457            _ => panic!(
10458                "Unexpected syntax kind {:?} when constructing {}.",
10459                kind, "OptionLetElseClause"
10460            ),
10461        }
10462    }
10463    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
10464        let kind = node.kind(db);
10465        match kind {
10466            SyntaxKind::OptionLetElseClauseEmpty => Some(OptionLetElseClause::Empty(
10467                OptionLetElseClauseEmpty::from_syntax_node(db, node),
10468            )),
10469            SyntaxKind::LetElseClause => {
10470                Some(OptionLetElseClause::LetElseClause(LetElseClause::from_syntax_node(db, node)))
10471            }
10472            _ => None,
10473        }
10474    }
10475    fn as_syntax_node(&self) -> SyntaxNode {
10476        match self {
10477            OptionLetElseClause::Empty(x) => x.as_syntax_node(),
10478            OptionLetElseClause::LetElseClause(x) => x.as_syntax_node(),
10479        }
10480    }
10481    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
10482        OptionLetElseClausePtr(self.as_syntax_node().lookup_intern(db).stable_ptr)
10483    }
10484}
10485impl OptionLetElseClause {
10486    /// Checks if a kind of a variant of [OptionLetElseClause].
10487    pub fn is_variant(kind: SyntaxKind) -> bool {
10488        matches!(kind, SyntaxKind::OptionLetElseClauseEmpty | SyntaxKind::LetElseClause)
10489    }
10490}
10491#[derive(Clone, Debug, Eq, Hash, PartialEq)]
10492pub struct OptionLetElseClauseEmpty {
10493    node: SyntaxNode,
10494}
10495impl OptionLetElseClauseEmpty {
10496    pub fn new_green(db: &dyn SyntaxGroup) -> OptionLetElseClauseEmptyGreen {
10497        let children = [];
10498        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
10499        OptionLetElseClauseEmptyGreen(
10500            Arc::new(GreenNode {
10501                kind: SyntaxKind::OptionLetElseClauseEmpty,
10502                details: GreenNodeDetails::Node { children: children.into(), width },
10503            })
10504            .intern(db),
10505        )
10506    }
10507}
10508impl OptionLetElseClauseEmpty {}
10509#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
10510pub struct OptionLetElseClauseEmptyPtr(pub SyntaxStablePtrId);
10511impl OptionLetElseClauseEmptyPtr {}
10512impl TypedStablePtr for OptionLetElseClauseEmptyPtr {
10513    type SyntaxNode = OptionLetElseClauseEmpty;
10514    fn untyped(&self) -> SyntaxStablePtrId {
10515        self.0
10516    }
10517    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionLetElseClauseEmpty {
10518        OptionLetElseClauseEmpty::from_syntax_node(db, self.0.lookup(db))
10519    }
10520}
10521impl From<OptionLetElseClauseEmptyPtr> for SyntaxStablePtrId {
10522    fn from(ptr: OptionLetElseClauseEmptyPtr) -> Self {
10523        ptr.untyped()
10524    }
10525}
10526#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
10527pub struct OptionLetElseClauseEmptyGreen(pub GreenId);
10528impl TypedSyntaxNode for OptionLetElseClauseEmpty {
10529    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionLetElseClauseEmpty);
10530    type StablePtr = OptionLetElseClauseEmptyPtr;
10531    type Green = OptionLetElseClauseEmptyGreen;
10532    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
10533        OptionLetElseClauseEmptyGreen(
10534            Arc::new(GreenNode {
10535                kind: SyntaxKind::OptionLetElseClauseEmpty,
10536                details: GreenNodeDetails::Node {
10537                    children: [].into(),
10538                    width: TextWidth::default(),
10539                },
10540            })
10541            .intern(db),
10542        )
10543    }
10544    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
10545        let kind = node.kind(db);
10546        assert_eq!(
10547            kind,
10548            SyntaxKind::OptionLetElseClauseEmpty,
10549            "Unexpected SyntaxKind {:?}. Expected {:?}.",
10550            kind,
10551            SyntaxKind::OptionLetElseClauseEmpty
10552        );
10553        Self { node }
10554    }
10555    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
10556        let kind = node.kind(db);
10557        if kind == SyntaxKind::OptionLetElseClauseEmpty {
10558            Some(Self::from_syntax_node(db, node))
10559        } else {
10560            None
10561        }
10562    }
10563    fn as_syntax_node(&self) -> SyntaxNode {
10564        self.node
10565    }
10566    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
10567        OptionLetElseClauseEmptyPtr(self.node.stable_ptr(db))
10568    }
10569}
10570#[derive(Clone, Debug, Eq, Hash, PartialEq)]
10571pub enum OptionTerminalSemicolon {
10572    Empty(OptionTerminalSemicolonEmpty),
10573    TerminalSemicolon(TerminalSemicolon),
10574}
10575#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
10576pub struct OptionTerminalSemicolonPtr(pub SyntaxStablePtrId);
10577impl TypedStablePtr for OptionTerminalSemicolonPtr {
10578    type SyntaxNode = OptionTerminalSemicolon;
10579    fn untyped(&self) -> SyntaxStablePtrId {
10580        self.0
10581    }
10582    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionTerminalSemicolon {
10583        OptionTerminalSemicolon::from_syntax_node(db, self.0.lookup(db))
10584    }
10585}
10586impl From<OptionTerminalSemicolonPtr> for SyntaxStablePtrId {
10587    fn from(ptr: OptionTerminalSemicolonPtr) -> Self {
10588        ptr.untyped()
10589    }
10590}
10591impl From<OptionTerminalSemicolonEmptyPtr> for OptionTerminalSemicolonPtr {
10592    fn from(value: OptionTerminalSemicolonEmptyPtr) -> Self {
10593        Self(value.0)
10594    }
10595}
10596impl From<TerminalSemicolonPtr> for OptionTerminalSemicolonPtr {
10597    fn from(value: TerminalSemicolonPtr) -> Self {
10598        Self(value.0)
10599    }
10600}
10601impl From<OptionTerminalSemicolonEmptyGreen> for OptionTerminalSemicolonGreen {
10602    fn from(value: OptionTerminalSemicolonEmptyGreen) -> Self {
10603        Self(value.0)
10604    }
10605}
10606impl From<TerminalSemicolonGreen> for OptionTerminalSemicolonGreen {
10607    fn from(value: TerminalSemicolonGreen) -> Self {
10608        Self(value.0)
10609    }
10610}
10611#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
10612pub struct OptionTerminalSemicolonGreen(pub GreenId);
10613impl TypedSyntaxNode for OptionTerminalSemicolon {
10614    const OPTIONAL_KIND: Option<SyntaxKind> = None;
10615    type StablePtr = OptionTerminalSemicolonPtr;
10616    type Green = OptionTerminalSemicolonGreen;
10617    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
10618        panic!("No missing variant.");
10619    }
10620    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
10621        let kind = node.kind(db);
10622        match kind {
10623            SyntaxKind::OptionTerminalSemicolonEmpty => OptionTerminalSemicolon::Empty(
10624                OptionTerminalSemicolonEmpty::from_syntax_node(db, node),
10625            ),
10626            SyntaxKind::TerminalSemicolon => OptionTerminalSemicolon::TerminalSemicolon(
10627                TerminalSemicolon::from_syntax_node(db, node),
10628            ),
10629            _ => panic!(
10630                "Unexpected syntax kind {:?} when constructing {}.",
10631                kind, "OptionTerminalSemicolon"
10632            ),
10633        }
10634    }
10635    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
10636        let kind = node.kind(db);
10637        match kind {
10638            SyntaxKind::OptionTerminalSemicolonEmpty => Some(OptionTerminalSemicolon::Empty(
10639                OptionTerminalSemicolonEmpty::from_syntax_node(db, node),
10640            )),
10641            SyntaxKind::TerminalSemicolon => Some(OptionTerminalSemicolon::TerminalSemicolon(
10642                TerminalSemicolon::from_syntax_node(db, node),
10643            )),
10644            _ => None,
10645        }
10646    }
10647    fn as_syntax_node(&self) -> SyntaxNode {
10648        match self {
10649            OptionTerminalSemicolon::Empty(x) => x.as_syntax_node(),
10650            OptionTerminalSemicolon::TerminalSemicolon(x) => x.as_syntax_node(),
10651        }
10652    }
10653    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
10654        OptionTerminalSemicolonPtr(self.as_syntax_node().lookup_intern(db).stable_ptr)
10655    }
10656}
10657impl OptionTerminalSemicolon {
10658    /// Checks if a kind of a variant of [OptionTerminalSemicolon].
10659    pub fn is_variant(kind: SyntaxKind) -> bool {
10660        matches!(kind, SyntaxKind::OptionTerminalSemicolonEmpty | SyntaxKind::TerminalSemicolon)
10661    }
10662}
10663#[derive(Clone, Debug, Eq, Hash, PartialEq)]
10664pub struct OptionTerminalSemicolonEmpty {
10665    node: SyntaxNode,
10666}
10667impl OptionTerminalSemicolonEmpty {
10668    pub fn new_green(db: &dyn SyntaxGroup) -> OptionTerminalSemicolonEmptyGreen {
10669        let children = [];
10670        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
10671        OptionTerminalSemicolonEmptyGreen(
10672            Arc::new(GreenNode {
10673                kind: SyntaxKind::OptionTerminalSemicolonEmpty,
10674                details: GreenNodeDetails::Node { children: children.into(), width },
10675            })
10676            .intern(db),
10677        )
10678    }
10679}
10680impl OptionTerminalSemicolonEmpty {}
10681#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
10682pub struct OptionTerminalSemicolonEmptyPtr(pub SyntaxStablePtrId);
10683impl OptionTerminalSemicolonEmptyPtr {}
10684impl TypedStablePtr for OptionTerminalSemicolonEmptyPtr {
10685    type SyntaxNode = OptionTerminalSemicolonEmpty;
10686    fn untyped(&self) -> SyntaxStablePtrId {
10687        self.0
10688    }
10689    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionTerminalSemicolonEmpty {
10690        OptionTerminalSemicolonEmpty::from_syntax_node(db, self.0.lookup(db))
10691    }
10692}
10693impl From<OptionTerminalSemicolonEmptyPtr> for SyntaxStablePtrId {
10694    fn from(ptr: OptionTerminalSemicolonEmptyPtr) -> Self {
10695        ptr.untyped()
10696    }
10697}
10698#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
10699pub struct OptionTerminalSemicolonEmptyGreen(pub GreenId);
10700impl TypedSyntaxNode for OptionTerminalSemicolonEmpty {
10701    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionTerminalSemicolonEmpty);
10702    type StablePtr = OptionTerminalSemicolonEmptyPtr;
10703    type Green = OptionTerminalSemicolonEmptyGreen;
10704    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
10705        OptionTerminalSemicolonEmptyGreen(
10706            Arc::new(GreenNode {
10707                kind: SyntaxKind::OptionTerminalSemicolonEmpty,
10708                details: GreenNodeDetails::Node {
10709                    children: [].into(),
10710                    width: TextWidth::default(),
10711                },
10712            })
10713            .intern(db),
10714        )
10715    }
10716    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
10717        let kind = node.kind(db);
10718        assert_eq!(
10719            kind,
10720            SyntaxKind::OptionTerminalSemicolonEmpty,
10721            "Unexpected SyntaxKind {:?}. Expected {:?}.",
10722            kind,
10723            SyntaxKind::OptionTerminalSemicolonEmpty
10724        );
10725        Self { node }
10726    }
10727    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
10728        let kind = node.kind(db);
10729        if kind == SyntaxKind::OptionTerminalSemicolonEmpty {
10730            Some(Self::from_syntax_node(db, node))
10731        } else {
10732            None
10733        }
10734    }
10735    fn as_syntax_node(&self) -> SyntaxNode {
10736        self.node
10737    }
10738    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
10739        OptionTerminalSemicolonEmptyPtr(self.node.stable_ptr(db))
10740    }
10741}
10742#[derive(Clone, Debug, Eq, Hash, PartialEq)]
10743pub struct StatementExpr {
10744    node: SyntaxNode,
10745}
10746impl StatementExpr {
10747    pub const INDEX_ATTRIBUTES: usize = 0;
10748    pub const INDEX_EXPR: usize = 1;
10749    pub const INDEX_SEMICOLON: usize = 2;
10750    pub fn new_green(
10751        db: &dyn SyntaxGroup,
10752        attributes: AttributeListGreen,
10753        expr: ExprGreen,
10754        semicolon: OptionTerminalSemicolonGreen,
10755    ) -> StatementExprGreen {
10756        let children = [attributes.0, expr.0, semicolon.0];
10757        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
10758        StatementExprGreen(
10759            Arc::new(GreenNode {
10760                kind: SyntaxKind::StatementExpr,
10761                details: GreenNodeDetails::Node { children: children.into(), width },
10762            })
10763            .intern(db),
10764        )
10765    }
10766}
10767impl StatementExpr {
10768    pub fn attributes(&self, db: &dyn SyntaxGroup) -> AttributeList {
10769        AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
10770    }
10771    pub fn expr(&self, db: &dyn SyntaxGroup) -> Expr {
10772        Expr::from_syntax_node(db, self.node.get_children(db)[1])
10773    }
10774    pub fn semicolon(&self, db: &dyn SyntaxGroup) -> OptionTerminalSemicolon {
10775        OptionTerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[2])
10776    }
10777}
10778#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
10779pub struct StatementExprPtr(pub SyntaxStablePtrId);
10780impl StatementExprPtr {}
10781impl TypedStablePtr for StatementExprPtr {
10782    type SyntaxNode = StatementExpr;
10783    fn untyped(&self) -> SyntaxStablePtrId {
10784        self.0
10785    }
10786    fn lookup(&self, db: &dyn SyntaxGroup) -> StatementExpr {
10787        StatementExpr::from_syntax_node(db, self.0.lookup(db))
10788    }
10789}
10790impl From<StatementExprPtr> for SyntaxStablePtrId {
10791    fn from(ptr: StatementExprPtr) -> Self {
10792        ptr.untyped()
10793    }
10794}
10795#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
10796pub struct StatementExprGreen(pub GreenId);
10797impl TypedSyntaxNode for StatementExpr {
10798    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StatementExpr);
10799    type StablePtr = StatementExprPtr;
10800    type Green = StatementExprGreen;
10801    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
10802        StatementExprGreen(
10803            Arc::new(GreenNode {
10804                kind: SyntaxKind::StatementExpr,
10805                details: GreenNodeDetails::Node {
10806                    children: [
10807                        AttributeList::missing(db).0,
10808                        Expr::missing(db).0,
10809                        OptionTerminalSemicolon::missing(db).0,
10810                    ]
10811                    .into(),
10812                    width: TextWidth::default(),
10813                },
10814            })
10815            .intern(db),
10816        )
10817    }
10818    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
10819        let kind = node.kind(db);
10820        assert_eq!(
10821            kind,
10822            SyntaxKind::StatementExpr,
10823            "Unexpected SyntaxKind {:?}. Expected {:?}.",
10824            kind,
10825            SyntaxKind::StatementExpr
10826        );
10827        Self { node }
10828    }
10829    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
10830        let kind = node.kind(db);
10831        if kind == SyntaxKind::StatementExpr {
10832            Some(Self::from_syntax_node(db, node))
10833        } else {
10834            None
10835        }
10836    }
10837    fn as_syntax_node(&self) -> SyntaxNode {
10838        self.node
10839    }
10840    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
10841        StatementExprPtr(self.node.stable_ptr(db))
10842    }
10843}
10844#[derive(Clone, Debug, Eq, Hash, PartialEq)]
10845pub struct StatementContinue {
10846    node: SyntaxNode,
10847}
10848impl StatementContinue {
10849    pub const INDEX_ATTRIBUTES: usize = 0;
10850    pub const INDEX_CONTINUE_KW: usize = 1;
10851    pub const INDEX_SEMICOLON: usize = 2;
10852    pub fn new_green(
10853        db: &dyn SyntaxGroup,
10854        attributes: AttributeListGreen,
10855        continue_kw: TerminalContinueGreen,
10856        semicolon: TerminalSemicolonGreen,
10857    ) -> StatementContinueGreen {
10858        let children = [attributes.0, continue_kw.0, semicolon.0];
10859        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
10860        StatementContinueGreen(
10861            Arc::new(GreenNode {
10862                kind: SyntaxKind::StatementContinue,
10863                details: GreenNodeDetails::Node { children: children.into(), width },
10864            })
10865            .intern(db),
10866        )
10867    }
10868}
10869impl StatementContinue {
10870    pub fn attributes(&self, db: &dyn SyntaxGroup) -> AttributeList {
10871        AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
10872    }
10873    pub fn continue_kw(&self, db: &dyn SyntaxGroup) -> TerminalContinue {
10874        TerminalContinue::from_syntax_node(db, self.node.get_children(db)[1])
10875    }
10876    pub fn semicolon(&self, db: &dyn SyntaxGroup) -> TerminalSemicolon {
10877        TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[2])
10878    }
10879}
10880#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
10881pub struct StatementContinuePtr(pub SyntaxStablePtrId);
10882impl StatementContinuePtr {}
10883impl TypedStablePtr for StatementContinuePtr {
10884    type SyntaxNode = StatementContinue;
10885    fn untyped(&self) -> SyntaxStablePtrId {
10886        self.0
10887    }
10888    fn lookup(&self, db: &dyn SyntaxGroup) -> StatementContinue {
10889        StatementContinue::from_syntax_node(db, self.0.lookup(db))
10890    }
10891}
10892impl From<StatementContinuePtr> for SyntaxStablePtrId {
10893    fn from(ptr: StatementContinuePtr) -> Self {
10894        ptr.untyped()
10895    }
10896}
10897#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
10898pub struct StatementContinueGreen(pub GreenId);
10899impl TypedSyntaxNode for StatementContinue {
10900    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StatementContinue);
10901    type StablePtr = StatementContinuePtr;
10902    type Green = StatementContinueGreen;
10903    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
10904        StatementContinueGreen(
10905            Arc::new(GreenNode {
10906                kind: SyntaxKind::StatementContinue,
10907                details: GreenNodeDetails::Node {
10908                    children: [
10909                        AttributeList::missing(db).0,
10910                        TerminalContinue::missing(db).0,
10911                        TerminalSemicolon::missing(db).0,
10912                    ]
10913                    .into(),
10914                    width: TextWidth::default(),
10915                },
10916            })
10917            .intern(db),
10918        )
10919    }
10920    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
10921        let kind = node.kind(db);
10922        assert_eq!(
10923            kind,
10924            SyntaxKind::StatementContinue,
10925            "Unexpected SyntaxKind {:?}. Expected {:?}.",
10926            kind,
10927            SyntaxKind::StatementContinue
10928        );
10929        Self { node }
10930    }
10931    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
10932        let kind = node.kind(db);
10933        if kind == SyntaxKind::StatementContinue {
10934            Some(Self::from_syntax_node(db, node))
10935        } else {
10936            None
10937        }
10938    }
10939    fn as_syntax_node(&self) -> SyntaxNode {
10940        self.node
10941    }
10942    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
10943        StatementContinuePtr(self.node.stable_ptr(db))
10944    }
10945}
10946#[derive(Clone, Debug, Eq, Hash, PartialEq)]
10947pub struct ExprClause {
10948    node: SyntaxNode,
10949}
10950impl ExprClause {
10951    pub const INDEX_EXPR: usize = 0;
10952    pub fn new_green(db: &dyn SyntaxGroup, expr: ExprGreen) -> ExprClauseGreen {
10953        let children = [expr.0];
10954        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
10955        ExprClauseGreen(
10956            Arc::new(GreenNode {
10957                kind: SyntaxKind::ExprClause,
10958                details: GreenNodeDetails::Node { children: children.into(), width },
10959            })
10960            .intern(db),
10961        )
10962    }
10963}
10964impl ExprClause {
10965    pub fn expr(&self, db: &dyn SyntaxGroup) -> Expr {
10966        Expr::from_syntax_node(db, self.node.get_children(db)[0])
10967    }
10968}
10969#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
10970pub struct ExprClausePtr(pub SyntaxStablePtrId);
10971impl ExprClausePtr {}
10972impl TypedStablePtr for ExprClausePtr {
10973    type SyntaxNode = ExprClause;
10974    fn untyped(&self) -> SyntaxStablePtrId {
10975        self.0
10976    }
10977    fn lookup(&self, db: &dyn SyntaxGroup) -> ExprClause {
10978        ExprClause::from_syntax_node(db, self.0.lookup(db))
10979    }
10980}
10981impl From<ExprClausePtr> for SyntaxStablePtrId {
10982    fn from(ptr: ExprClausePtr) -> Self {
10983        ptr.untyped()
10984    }
10985}
10986#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
10987pub struct ExprClauseGreen(pub GreenId);
10988impl TypedSyntaxNode for ExprClause {
10989    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprClause);
10990    type StablePtr = ExprClausePtr;
10991    type Green = ExprClauseGreen;
10992    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
10993        ExprClauseGreen(
10994            Arc::new(GreenNode {
10995                kind: SyntaxKind::ExprClause,
10996                details: GreenNodeDetails::Node {
10997                    children: [Expr::missing(db).0].into(),
10998                    width: TextWidth::default(),
10999                },
11000            })
11001            .intern(db),
11002        )
11003    }
11004    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
11005        let kind = node.kind(db);
11006        assert_eq!(
11007            kind,
11008            SyntaxKind::ExprClause,
11009            "Unexpected SyntaxKind {:?}. Expected {:?}.",
11010            kind,
11011            SyntaxKind::ExprClause
11012        );
11013        Self { node }
11014    }
11015    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
11016        let kind = node.kind(db);
11017        if kind == SyntaxKind::ExprClause { Some(Self::from_syntax_node(db, node)) } else { None }
11018    }
11019    fn as_syntax_node(&self) -> SyntaxNode {
11020        self.node
11021    }
11022    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
11023        ExprClausePtr(self.node.stable_ptr(db))
11024    }
11025}
11026#[derive(Clone, Debug, Eq, Hash, PartialEq)]
11027pub enum OptionExprClause {
11028    Empty(OptionExprClauseEmpty),
11029    ExprClause(ExprClause),
11030}
11031#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
11032pub struct OptionExprClausePtr(pub SyntaxStablePtrId);
11033impl TypedStablePtr for OptionExprClausePtr {
11034    type SyntaxNode = OptionExprClause;
11035    fn untyped(&self) -> SyntaxStablePtrId {
11036        self.0
11037    }
11038    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionExprClause {
11039        OptionExprClause::from_syntax_node(db, self.0.lookup(db))
11040    }
11041}
11042impl From<OptionExprClausePtr> for SyntaxStablePtrId {
11043    fn from(ptr: OptionExprClausePtr) -> Self {
11044        ptr.untyped()
11045    }
11046}
11047impl From<OptionExprClauseEmptyPtr> for OptionExprClausePtr {
11048    fn from(value: OptionExprClauseEmptyPtr) -> Self {
11049        Self(value.0)
11050    }
11051}
11052impl From<ExprClausePtr> for OptionExprClausePtr {
11053    fn from(value: ExprClausePtr) -> Self {
11054        Self(value.0)
11055    }
11056}
11057impl From<OptionExprClauseEmptyGreen> for OptionExprClauseGreen {
11058    fn from(value: OptionExprClauseEmptyGreen) -> Self {
11059        Self(value.0)
11060    }
11061}
11062impl From<ExprClauseGreen> for OptionExprClauseGreen {
11063    fn from(value: ExprClauseGreen) -> Self {
11064        Self(value.0)
11065    }
11066}
11067#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
11068pub struct OptionExprClauseGreen(pub GreenId);
11069impl TypedSyntaxNode for OptionExprClause {
11070    const OPTIONAL_KIND: Option<SyntaxKind> = None;
11071    type StablePtr = OptionExprClausePtr;
11072    type Green = OptionExprClauseGreen;
11073    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
11074        panic!("No missing variant.");
11075    }
11076    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
11077        let kind = node.kind(db);
11078        match kind {
11079            SyntaxKind::OptionExprClauseEmpty => {
11080                OptionExprClause::Empty(OptionExprClauseEmpty::from_syntax_node(db, node))
11081            }
11082            SyntaxKind::ExprClause => {
11083                OptionExprClause::ExprClause(ExprClause::from_syntax_node(db, node))
11084            }
11085            _ => panic!(
11086                "Unexpected syntax kind {:?} when constructing {}.",
11087                kind, "OptionExprClause"
11088            ),
11089        }
11090    }
11091    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
11092        let kind = node.kind(db);
11093        match kind {
11094            SyntaxKind::OptionExprClauseEmpty => {
11095                Some(OptionExprClause::Empty(OptionExprClauseEmpty::from_syntax_node(db, node)))
11096            }
11097            SyntaxKind::ExprClause => {
11098                Some(OptionExprClause::ExprClause(ExprClause::from_syntax_node(db, node)))
11099            }
11100            _ => None,
11101        }
11102    }
11103    fn as_syntax_node(&self) -> SyntaxNode {
11104        match self {
11105            OptionExprClause::Empty(x) => x.as_syntax_node(),
11106            OptionExprClause::ExprClause(x) => x.as_syntax_node(),
11107        }
11108    }
11109    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
11110        OptionExprClausePtr(self.as_syntax_node().lookup_intern(db).stable_ptr)
11111    }
11112}
11113impl OptionExprClause {
11114    /// Checks if a kind of a variant of [OptionExprClause].
11115    pub fn is_variant(kind: SyntaxKind) -> bool {
11116        matches!(kind, SyntaxKind::OptionExprClauseEmpty | SyntaxKind::ExprClause)
11117    }
11118}
11119#[derive(Clone, Debug, Eq, Hash, PartialEq)]
11120pub struct OptionExprClauseEmpty {
11121    node: SyntaxNode,
11122}
11123impl OptionExprClauseEmpty {
11124    pub fn new_green(db: &dyn SyntaxGroup) -> OptionExprClauseEmptyGreen {
11125        let children = [];
11126        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
11127        OptionExprClauseEmptyGreen(
11128            Arc::new(GreenNode {
11129                kind: SyntaxKind::OptionExprClauseEmpty,
11130                details: GreenNodeDetails::Node { children: children.into(), width },
11131            })
11132            .intern(db),
11133        )
11134    }
11135}
11136impl OptionExprClauseEmpty {}
11137#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
11138pub struct OptionExprClauseEmptyPtr(pub SyntaxStablePtrId);
11139impl OptionExprClauseEmptyPtr {}
11140impl TypedStablePtr for OptionExprClauseEmptyPtr {
11141    type SyntaxNode = OptionExprClauseEmpty;
11142    fn untyped(&self) -> SyntaxStablePtrId {
11143        self.0
11144    }
11145    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionExprClauseEmpty {
11146        OptionExprClauseEmpty::from_syntax_node(db, self.0.lookup(db))
11147    }
11148}
11149impl From<OptionExprClauseEmptyPtr> for SyntaxStablePtrId {
11150    fn from(ptr: OptionExprClauseEmptyPtr) -> Self {
11151        ptr.untyped()
11152    }
11153}
11154#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
11155pub struct OptionExprClauseEmptyGreen(pub GreenId);
11156impl TypedSyntaxNode for OptionExprClauseEmpty {
11157    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionExprClauseEmpty);
11158    type StablePtr = OptionExprClauseEmptyPtr;
11159    type Green = OptionExprClauseEmptyGreen;
11160    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
11161        OptionExprClauseEmptyGreen(
11162            Arc::new(GreenNode {
11163                kind: SyntaxKind::OptionExprClauseEmpty,
11164                details: GreenNodeDetails::Node {
11165                    children: [].into(),
11166                    width: TextWidth::default(),
11167                },
11168            })
11169            .intern(db),
11170        )
11171    }
11172    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
11173        let kind = node.kind(db);
11174        assert_eq!(
11175            kind,
11176            SyntaxKind::OptionExprClauseEmpty,
11177            "Unexpected SyntaxKind {:?}. Expected {:?}.",
11178            kind,
11179            SyntaxKind::OptionExprClauseEmpty
11180        );
11181        Self { node }
11182    }
11183    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
11184        let kind = node.kind(db);
11185        if kind == SyntaxKind::OptionExprClauseEmpty {
11186            Some(Self::from_syntax_node(db, node))
11187        } else {
11188            None
11189        }
11190    }
11191    fn as_syntax_node(&self) -> SyntaxNode {
11192        self.node
11193    }
11194    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
11195        OptionExprClauseEmptyPtr(self.node.stable_ptr(db))
11196    }
11197}
11198#[derive(Clone, Debug, Eq, Hash, PartialEq)]
11199pub struct StatementReturn {
11200    node: SyntaxNode,
11201}
11202impl StatementReturn {
11203    pub const INDEX_ATTRIBUTES: usize = 0;
11204    pub const INDEX_RETURN_KW: usize = 1;
11205    pub const INDEX_EXPR_CLAUSE: usize = 2;
11206    pub const INDEX_SEMICOLON: usize = 3;
11207    pub fn new_green(
11208        db: &dyn SyntaxGroup,
11209        attributes: AttributeListGreen,
11210        return_kw: TerminalReturnGreen,
11211        expr_clause: OptionExprClauseGreen,
11212        semicolon: TerminalSemicolonGreen,
11213    ) -> StatementReturnGreen {
11214        let children = [attributes.0, return_kw.0, expr_clause.0, semicolon.0];
11215        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
11216        StatementReturnGreen(
11217            Arc::new(GreenNode {
11218                kind: SyntaxKind::StatementReturn,
11219                details: GreenNodeDetails::Node { children: children.into(), width },
11220            })
11221            .intern(db),
11222        )
11223    }
11224}
11225impl StatementReturn {
11226    pub fn attributes(&self, db: &dyn SyntaxGroup) -> AttributeList {
11227        AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
11228    }
11229    pub fn return_kw(&self, db: &dyn SyntaxGroup) -> TerminalReturn {
11230        TerminalReturn::from_syntax_node(db, self.node.get_children(db)[1])
11231    }
11232    pub fn expr_clause(&self, db: &dyn SyntaxGroup) -> OptionExprClause {
11233        OptionExprClause::from_syntax_node(db, self.node.get_children(db)[2])
11234    }
11235    pub fn semicolon(&self, db: &dyn SyntaxGroup) -> TerminalSemicolon {
11236        TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[3])
11237    }
11238}
11239#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
11240pub struct StatementReturnPtr(pub SyntaxStablePtrId);
11241impl StatementReturnPtr {}
11242impl TypedStablePtr for StatementReturnPtr {
11243    type SyntaxNode = StatementReturn;
11244    fn untyped(&self) -> SyntaxStablePtrId {
11245        self.0
11246    }
11247    fn lookup(&self, db: &dyn SyntaxGroup) -> StatementReturn {
11248        StatementReturn::from_syntax_node(db, self.0.lookup(db))
11249    }
11250}
11251impl From<StatementReturnPtr> for SyntaxStablePtrId {
11252    fn from(ptr: StatementReturnPtr) -> Self {
11253        ptr.untyped()
11254    }
11255}
11256#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
11257pub struct StatementReturnGreen(pub GreenId);
11258impl TypedSyntaxNode for StatementReturn {
11259    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StatementReturn);
11260    type StablePtr = StatementReturnPtr;
11261    type Green = StatementReturnGreen;
11262    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
11263        StatementReturnGreen(
11264            Arc::new(GreenNode {
11265                kind: SyntaxKind::StatementReturn,
11266                details: GreenNodeDetails::Node {
11267                    children: [
11268                        AttributeList::missing(db).0,
11269                        TerminalReturn::missing(db).0,
11270                        OptionExprClause::missing(db).0,
11271                        TerminalSemicolon::missing(db).0,
11272                    ]
11273                    .into(),
11274                    width: TextWidth::default(),
11275                },
11276            })
11277            .intern(db),
11278        )
11279    }
11280    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
11281        let kind = node.kind(db);
11282        assert_eq!(
11283            kind,
11284            SyntaxKind::StatementReturn,
11285            "Unexpected SyntaxKind {:?}. Expected {:?}.",
11286            kind,
11287            SyntaxKind::StatementReturn
11288        );
11289        Self { node }
11290    }
11291    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
11292        let kind = node.kind(db);
11293        if kind == SyntaxKind::StatementReturn {
11294            Some(Self::from_syntax_node(db, node))
11295        } else {
11296            None
11297        }
11298    }
11299    fn as_syntax_node(&self) -> SyntaxNode {
11300        self.node
11301    }
11302    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
11303        StatementReturnPtr(self.node.stable_ptr(db))
11304    }
11305}
11306#[derive(Clone, Debug, Eq, Hash, PartialEq)]
11307pub struct StatementBreak {
11308    node: SyntaxNode,
11309}
11310impl StatementBreak {
11311    pub const INDEX_ATTRIBUTES: usize = 0;
11312    pub const INDEX_BREAK_KW: usize = 1;
11313    pub const INDEX_EXPR_CLAUSE: usize = 2;
11314    pub const INDEX_SEMICOLON: usize = 3;
11315    pub fn new_green(
11316        db: &dyn SyntaxGroup,
11317        attributes: AttributeListGreen,
11318        break_kw: TerminalBreakGreen,
11319        expr_clause: OptionExprClauseGreen,
11320        semicolon: TerminalSemicolonGreen,
11321    ) -> StatementBreakGreen {
11322        let children = [attributes.0, break_kw.0, expr_clause.0, semicolon.0];
11323        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
11324        StatementBreakGreen(
11325            Arc::new(GreenNode {
11326                kind: SyntaxKind::StatementBreak,
11327                details: GreenNodeDetails::Node { children: children.into(), width },
11328            })
11329            .intern(db),
11330        )
11331    }
11332}
11333impl StatementBreak {
11334    pub fn attributes(&self, db: &dyn SyntaxGroup) -> AttributeList {
11335        AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
11336    }
11337    pub fn break_kw(&self, db: &dyn SyntaxGroup) -> TerminalBreak {
11338        TerminalBreak::from_syntax_node(db, self.node.get_children(db)[1])
11339    }
11340    pub fn expr_clause(&self, db: &dyn SyntaxGroup) -> OptionExprClause {
11341        OptionExprClause::from_syntax_node(db, self.node.get_children(db)[2])
11342    }
11343    pub fn semicolon(&self, db: &dyn SyntaxGroup) -> TerminalSemicolon {
11344        TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[3])
11345    }
11346}
11347#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
11348pub struct StatementBreakPtr(pub SyntaxStablePtrId);
11349impl StatementBreakPtr {}
11350impl TypedStablePtr for StatementBreakPtr {
11351    type SyntaxNode = StatementBreak;
11352    fn untyped(&self) -> SyntaxStablePtrId {
11353        self.0
11354    }
11355    fn lookup(&self, db: &dyn SyntaxGroup) -> StatementBreak {
11356        StatementBreak::from_syntax_node(db, self.0.lookup(db))
11357    }
11358}
11359impl From<StatementBreakPtr> for SyntaxStablePtrId {
11360    fn from(ptr: StatementBreakPtr) -> Self {
11361        ptr.untyped()
11362    }
11363}
11364#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
11365pub struct StatementBreakGreen(pub GreenId);
11366impl TypedSyntaxNode for StatementBreak {
11367    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StatementBreak);
11368    type StablePtr = StatementBreakPtr;
11369    type Green = StatementBreakGreen;
11370    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
11371        StatementBreakGreen(
11372            Arc::new(GreenNode {
11373                kind: SyntaxKind::StatementBreak,
11374                details: GreenNodeDetails::Node {
11375                    children: [
11376                        AttributeList::missing(db).0,
11377                        TerminalBreak::missing(db).0,
11378                        OptionExprClause::missing(db).0,
11379                        TerminalSemicolon::missing(db).0,
11380                    ]
11381                    .into(),
11382                    width: TextWidth::default(),
11383                },
11384            })
11385            .intern(db),
11386        )
11387    }
11388    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
11389        let kind = node.kind(db);
11390        assert_eq!(
11391            kind,
11392            SyntaxKind::StatementBreak,
11393            "Unexpected SyntaxKind {:?}. Expected {:?}.",
11394            kind,
11395            SyntaxKind::StatementBreak
11396        );
11397        Self { node }
11398    }
11399    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
11400        let kind = node.kind(db);
11401        if kind == SyntaxKind::StatementBreak {
11402            Some(Self::from_syntax_node(db, node))
11403        } else {
11404            None
11405        }
11406    }
11407    fn as_syntax_node(&self) -> SyntaxNode {
11408        self.node
11409    }
11410    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
11411        StatementBreakPtr(self.node.stable_ptr(db))
11412    }
11413}
11414#[derive(Clone, Debug, Eq, Hash, PartialEq)]
11415pub struct StatementItem {
11416    node: SyntaxNode,
11417}
11418impl StatementItem {
11419    pub const INDEX_ITEM: usize = 0;
11420    pub fn new_green(db: &dyn SyntaxGroup, item: ModuleItemGreen) -> StatementItemGreen {
11421        let children = [item.0];
11422        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
11423        StatementItemGreen(
11424            Arc::new(GreenNode {
11425                kind: SyntaxKind::StatementItem,
11426                details: GreenNodeDetails::Node { children: children.into(), width },
11427            })
11428            .intern(db),
11429        )
11430    }
11431}
11432impl StatementItem {
11433    pub fn item(&self, db: &dyn SyntaxGroup) -> ModuleItem {
11434        ModuleItem::from_syntax_node(db, self.node.get_children(db)[0])
11435    }
11436}
11437#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
11438pub struct StatementItemPtr(pub SyntaxStablePtrId);
11439impl StatementItemPtr {}
11440impl TypedStablePtr for StatementItemPtr {
11441    type SyntaxNode = StatementItem;
11442    fn untyped(&self) -> SyntaxStablePtrId {
11443        self.0
11444    }
11445    fn lookup(&self, db: &dyn SyntaxGroup) -> StatementItem {
11446        StatementItem::from_syntax_node(db, self.0.lookup(db))
11447    }
11448}
11449impl From<StatementItemPtr> for SyntaxStablePtrId {
11450    fn from(ptr: StatementItemPtr) -> Self {
11451        ptr.untyped()
11452    }
11453}
11454#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
11455pub struct StatementItemGreen(pub GreenId);
11456impl TypedSyntaxNode for StatementItem {
11457    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StatementItem);
11458    type StablePtr = StatementItemPtr;
11459    type Green = StatementItemGreen;
11460    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
11461        StatementItemGreen(
11462            Arc::new(GreenNode {
11463                kind: SyntaxKind::StatementItem,
11464                details: GreenNodeDetails::Node {
11465                    children: [ModuleItem::missing(db).0].into(),
11466                    width: TextWidth::default(),
11467                },
11468            })
11469            .intern(db),
11470        )
11471    }
11472    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
11473        let kind = node.kind(db);
11474        assert_eq!(
11475            kind,
11476            SyntaxKind::StatementItem,
11477            "Unexpected SyntaxKind {:?}. Expected {:?}.",
11478            kind,
11479            SyntaxKind::StatementItem
11480        );
11481        Self { node }
11482    }
11483    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
11484        let kind = node.kind(db);
11485        if kind == SyntaxKind::StatementItem {
11486            Some(Self::from_syntax_node(db, node))
11487        } else {
11488            None
11489        }
11490    }
11491    fn as_syntax_node(&self) -> SyntaxNode {
11492        self.node
11493    }
11494    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
11495        StatementItemPtr(self.node.stable_ptr(db))
11496    }
11497}
11498#[derive(Clone, Debug, Eq, Hash, PartialEq)]
11499pub struct Param {
11500    node: SyntaxNode,
11501}
11502impl Param {
11503    pub const INDEX_MODIFIERS: usize = 0;
11504    pub const INDEX_NAME: usize = 1;
11505    pub const INDEX_TYPE_CLAUSE: usize = 2;
11506    pub fn new_green(
11507        db: &dyn SyntaxGroup,
11508        modifiers: ModifierListGreen,
11509        name: TerminalIdentifierGreen,
11510        type_clause: OptionTypeClauseGreen,
11511    ) -> ParamGreen {
11512        let children = [modifiers.0, name.0, type_clause.0];
11513        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
11514        ParamGreen(
11515            Arc::new(GreenNode {
11516                kind: SyntaxKind::Param,
11517                details: GreenNodeDetails::Node { children: children.into(), width },
11518            })
11519            .intern(db),
11520        )
11521    }
11522}
11523impl Param {
11524    pub fn modifiers(&self, db: &dyn SyntaxGroup) -> ModifierList {
11525        ModifierList::from_syntax_node(db, self.node.get_children(db)[0])
11526    }
11527    pub fn name(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier {
11528        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[1])
11529    }
11530    pub fn type_clause(&self, db: &dyn SyntaxGroup) -> OptionTypeClause {
11531        OptionTypeClause::from_syntax_node(db, self.node.get_children(db)[2])
11532    }
11533}
11534#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
11535pub struct ParamPtr(pub SyntaxStablePtrId);
11536impl ParamPtr {
11537    pub fn name_green(self, db: &dyn SyntaxGroup) -> TerminalIdentifierGreen {
11538        let ptr = self.0.lookup_intern(db);
11539        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
11540            TerminalIdentifierGreen(key_fields[0])
11541        } else {
11542            panic!("Unexpected key field query on root.");
11543        }
11544    }
11545}
11546impl TypedStablePtr for ParamPtr {
11547    type SyntaxNode = Param;
11548    fn untyped(&self) -> SyntaxStablePtrId {
11549        self.0
11550    }
11551    fn lookup(&self, db: &dyn SyntaxGroup) -> Param {
11552        Param::from_syntax_node(db, self.0.lookup(db))
11553    }
11554}
11555impl From<ParamPtr> for SyntaxStablePtrId {
11556    fn from(ptr: ParamPtr) -> Self {
11557        ptr.untyped()
11558    }
11559}
11560#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
11561pub struct ParamGreen(pub GreenId);
11562impl TypedSyntaxNode for Param {
11563    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::Param);
11564    type StablePtr = ParamPtr;
11565    type Green = ParamGreen;
11566    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
11567        ParamGreen(
11568            Arc::new(GreenNode {
11569                kind: SyntaxKind::Param,
11570                details: GreenNodeDetails::Node {
11571                    children: [
11572                        ModifierList::missing(db).0,
11573                        TerminalIdentifier::missing(db).0,
11574                        OptionTypeClause::missing(db).0,
11575                    ]
11576                    .into(),
11577                    width: TextWidth::default(),
11578                },
11579            })
11580            .intern(db),
11581        )
11582    }
11583    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
11584        let kind = node.kind(db);
11585        assert_eq!(
11586            kind,
11587            SyntaxKind::Param,
11588            "Unexpected SyntaxKind {:?}. Expected {:?}.",
11589            kind,
11590            SyntaxKind::Param
11591        );
11592        Self { node }
11593    }
11594    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
11595        let kind = node.kind(db);
11596        if kind == SyntaxKind::Param { Some(Self::from_syntax_node(db, node)) } else { None }
11597    }
11598    fn as_syntax_node(&self) -> SyntaxNode {
11599        self.node
11600    }
11601    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
11602        ParamPtr(self.node.stable_ptr(db))
11603    }
11604}
11605#[derive(Clone, Debug, Eq, Hash, PartialEq)]
11606pub struct ModifierList(ElementList<Modifier, 1>);
11607impl Deref for ModifierList {
11608    type Target = ElementList<Modifier, 1>;
11609    fn deref(&self) -> &Self::Target {
11610        &self.0
11611    }
11612}
11613impl ModifierList {
11614    pub fn new_green(db: &dyn SyntaxGroup, children: &[ModifierGreen]) -> ModifierListGreen {
11615        let width = children.iter().map(|id| id.0.lookup_intern(db).width()).sum();
11616        ModifierListGreen(
11617            Arc::new(GreenNode {
11618                kind: SyntaxKind::ModifierList,
11619                details: GreenNodeDetails::Node {
11620                    children: children.iter().map(|x| x.0).collect(),
11621                    width,
11622                },
11623            })
11624            .intern(db),
11625        )
11626    }
11627}
11628#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
11629pub struct ModifierListPtr(pub SyntaxStablePtrId);
11630impl TypedStablePtr for ModifierListPtr {
11631    type SyntaxNode = ModifierList;
11632    fn untyped(&self) -> SyntaxStablePtrId {
11633        self.0
11634    }
11635    fn lookup(&self, db: &dyn SyntaxGroup) -> ModifierList {
11636        ModifierList::from_syntax_node(db, self.0.lookup(db))
11637    }
11638}
11639impl From<ModifierListPtr> for SyntaxStablePtrId {
11640    fn from(ptr: ModifierListPtr) -> Self {
11641        ptr.untyped()
11642    }
11643}
11644#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
11645pub struct ModifierListGreen(pub GreenId);
11646impl TypedSyntaxNode for ModifierList {
11647    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ModifierList);
11648    type StablePtr = ModifierListPtr;
11649    type Green = ModifierListGreen;
11650    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
11651        ModifierListGreen(
11652            Arc::new(GreenNode {
11653                kind: SyntaxKind::ModifierList,
11654                details: GreenNodeDetails::Node {
11655                    children: [].into(),
11656                    width: TextWidth::default(),
11657                },
11658            })
11659            .intern(db),
11660        )
11661    }
11662    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
11663        Self(ElementList::new(node))
11664    }
11665    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
11666        if node.kind(db) == SyntaxKind::ModifierList {
11667            Some(Self(ElementList::new(node)))
11668        } else {
11669            None
11670        }
11671    }
11672    fn as_syntax_node(&self) -> SyntaxNode {
11673        self.node
11674    }
11675    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
11676        ModifierListPtr(self.node.stable_ptr(db))
11677    }
11678}
11679#[derive(Clone, Debug, Eq, Hash, PartialEq)]
11680pub enum Modifier {
11681    Ref(TerminalRef),
11682    Mut(TerminalMut),
11683}
11684#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
11685pub struct ModifierPtr(pub SyntaxStablePtrId);
11686impl TypedStablePtr for ModifierPtr {
11687    type SyntaxNode = Modifier;
11688    fn untyped(&self) -> SyntaxStablePtrId {
11689        self.0
11690    }
11691    fn lookup(&self, db: &dyn SyntaxGroup) -> Modifier {
11692        Modifier::from_syntax_node(db, self.0.lookup(db))
11693    }
11694}
11695impl From<ModifierPtr> for SyntaxStablePtrId {
11696    fn from(ptr: ModifierPtr) -> Self {
11697        ptr.untyped()
11698    }
11699}
11700impl From<TerminalRefPtr> for ModifierPtr {
11701    fn from(value: TerminalRefPtr) -> Self {
11702        Self(value.0)
11703    }
11704}
11705impl From<TerminalMutPtr> for ModifierPtr {
11706    fn from(value: TerminalMutPtr) -> Self {
11707        Self(value.0)
11708    }
11709}
11710impl From<TerminalRefGreen> for ModifierGreen {
11711    fn from(value: TerminalRefGreen) -> Self {
11712        Self(value.0)
11713    }
11714}
11715impl From<TerminalMutGreen> for ModifierGreen {
11716    fn from(value: TerminalMutGreen) -> Self {
11717        Self(value.0)
11718    }
11719}
11720#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
11721pub struct ModifierGreen(pub GreenId);
11722impl TypedSyntaxNode for Modifier {
11723    const OPTIONAL_KIND: Option<SyntaxKind> = None;
11724    type StablePtr = ModifierPtr;
11725    type Green = ModifierGreen;
11726    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
11727        panic!("No missing variant.");
11728    }
11729    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
11730        let kind = node.kind(db);
11731        match kind {
11732            SyntaxKind::TerminalRef => Modifier::Ref(TerminalRef::from_syntax_node(db, node)),
11733            SyntaxKind::TerminalMut => Modifier::Mut(TerminalMut::from_syntax_node(db, node)),
11734            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "Modifier"),
11735        }
11736    }
11737    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
11738        let kind = node.kind(db);
11739        match kind {
11740            SyntaxKind::TerminalRef => Some(Modifier::Ref(TerminalRef::from_syntax_node(db, node))),
11741            SyntaxKind::TerminalMut => Some(Modifier::Mut(TerminalMut::from_syntax_node(db, node))),
11742            _ => None,
11743        }
11744    }
11745    fn as_syntax_node(&self) -> SyntaxNode {
11746        match self {
11747            Modifier::Ref(x) => x.as_syntax_node(),
11748            Modifier::Mut(x) => x.as_syntax_node(),
11749        }
11750    }
11751    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
11752        ModifierPtr(self.as_syntax_node().lookup_intern(db).stable_ptr)
11753    }
11754}
11755impl Modifier {
11756    /// Checks if a kind of a variant of [Modifier].
11757    pub fn is_variant(kind: SyntaxKind) -> bool {
11758        matches!(kind, SyntaxKind::TerminalRef | SyntaxKind::TerminalMut)
11759    }
11760}
11761#[derive(Clone, Debug, Eq, Hash, PartialEq)]
11762pub struct ParamList(ElementList<Param, 2>);
11763impl Deref for ParamList {
11764    type Target = ElementList<Param, 2>;
11765    fn deref(&self) -> &Self::Target {
11766        &self.0
11767    }
11768}
11769impl ParamList {
11770    pub fn new_green(
11771        db: &dyn SyntaxGroup,
11772        children: &[ParamListElementOrSeparatorGreen],
11773    ) -> ParamListGreen {
11774        let width = children.iter().map(|id| id.id().lookup_intern(db).width()).sum();
11775        ParamListGreen(
11776            Arc::new(GreenNode {
11777                kind: SyntaxKind::ParamList,
11778                details: GreenNodeDetails::Node {
11779                    children: children.iter().map(|x| x.id()).collect(),
11780                    width,
11781                },
11782            })
11783            .intern(db),
11784        )
11785    }
11786}
11787#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
11788pub struct ParamListPtr(pub SyntaxStablePtrId);
11789impl TypedStablePtr for ParamListPtr {
11790    type SyntaxNode = ParamList;
11791    fn untyped(&self) -> SyntaxStablePtrId {
11792        self.0
11793    }
11794    fn lookup(&self, db: &dyn SyntaxGroup) -> ParamList {
11795        ParamList::from_syntax_node(db, self.0.lookup(db))
11796    }
11797}
11798impl From<ParamListPtr> for SyntaxStablePtrId {
11799    fn from(ptr: ParamListPtr) -> Self {
11800        ptr.untyped()
11801    }
11802}
11803#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
11804pub enum ParamListElementOrSeparatorGreen {
11805    Separator(TerminalCommaGreen),
11806    Element(ParamGreen),
11807}
11808impl From<TerminalCommaGreen> for ParamListElementOrSeparatorGreen {
11809    fn from(value: TerminalCommaGreen) -> Self {
11810        ParamListElementOrSeparatorGreen::Separator(value)
11811    }
11812}
11813impl From<ParamGreen> for ParamListElementOrSeparatorGreen {
11814    fn from(value: ParamGreen) -> Self {
11815        ParamListElementOrSeparatorGreen::Element(value)
11816    }
11817}
11818impl ParamListElementOrSeparatorGreen {
11819    fn id(&self) -> GreenId {
11820        match self {
11821            ParamListElementOrSeparatorGreen::Separator(green) => green.0,
11822            ParamListElementOrSeparatorGreen::Element(green) => green.0,
11823        }
11824    }
11825}
11826#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
11827pub struct ParamListGreen(pub GreenId);
11828impl TypedSyntaxNode for ParamList {
11829    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ParamList);
11830    type StablePtr = ParamListPtr;
11831    type Green = ParamListGreen;
11832    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
11833        ParamListGreen(
11834            Arc::new(GreenNode {
11835                kind: SyntaxKind::ParamList,
11836                details: GreenNodeDetails::Node {
11837                    children: [].into(),
11838                    width: TextWidth::default(),
11839                },
11840            })
11841            .intern(db),
11842        )
11843    }
11844    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
11845        Self(ElementList::new(node))
11846    }
11847    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
11848        if node.kind(db) == SyntaxKind::ParamList {
11849            Some(Self(ElementList::new(node)))
11850        } else {
11851            None
11852        }
11853    }
11854    fn as_syntax_node(&self) -> SyntaxNode {
11855        self.node
11856    }
11857    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
11858        ParamListPtr(self.node.stable_ptr(db))
11859    }
11860}
11861#[derive(Clone, Debug, Eq, Hash, PartialEq)]
11862pub struct ImplicitsClause {
11863    node: SyntaxNode,
11864}
11865impl ImplicitsClause {
11866    pub const INDEX_IMPLICITS_KW: usize = 0;
11867    pub const INDEX_LPAREN: usize = 1;
11868    pub const INDEX_IMPLICITS: usize = 2;
11869    pub const INDEX_RPAREN: usize = 3;
11870    pub fn new_green(
11871        db: &dyn SyntaxGroup,
11872        implicits_kw: TerminalImplicitsGreen,
11873        lparen: TerminalLParenGreen,
11874        implicits: ImplicitsListGreen,
11875        rparen: TerminalRParenGreen,
11876    ) -> ImplicitsClauseGreen {
11877        let children = [implicits_kw.0, lparen.0, implicits.0, rparen.0];
11878        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
11879        ImplicitsClauseGreen(
11880            Arc::new(GreenNode {
11881                kind: SyntaxKind::ImplicitsClause,
11882                details: GreenNodeDetails::Node { children: children.into(), width },
11883            })
11884            .intern(db),
11885        )
11886    }
11887}
11888impl ImplicitsClause {
11889    pub fn implicits_kw(&self, db: &dyn SyntaxGroup) -> TerminalImplicits {
11890        TerminalImplicits::from_syntax_node(db, self.node.get_children(db)[0])
11891    }
11892    pub fn lparen(&self, db: &dyn SyntaxGroup) -> TerminalLParen {
11893        TerminalLParen::from_syntax_node(db, self.node.get_children(db)[1])
11894    }
11895    pub fn implicits(&self, db: &dyn SyntaxGroup) -> ImplicitsList {
11896        ImplicitsList::from_syntax_node(db, self.node.get_children(db)[2])
11897    }
11898    pub fn rparen(&self, db: &dyn SyntaxGroup) -> TerminalRParen {
11899        TerminalRParen::from_syntax_node(db, self.node.get_children(db)[3])
11900    }
11901}
11902#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
11903pub struct ImplicitsClausePtr(pub SyntaxStablePtrId);
11904impl ImplicitsClausePtr {}
11905impl TypedStablePtr for ImplicitsClausePtr {
11906    type SyntaxNode = ImplicitsClause;
11907    fn untyped(&self) -> SyntaxStablePtrId {
11908        self.0
11909    }
11910    fn lookup(&self, db: &dyn SyntaxGroup) -> ImplicitsClause {
11911        ImplicitsClause::from_syntax_node(db, self.0.lookup(db))
11912    }
11913}
11914impl From<ImplicitsClausePtr> for SyntaxStablePtrId {
11915    fn from(ptr: ImplicitsClausePtr) -> Self {
11916        ptr.untyped()
11917    }
11918}
11919#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
11920pub struct ImplicitsClauseGreen(pub GreenId);
11921impl TypedSyntaxNode for ImplicitsClause {
11922    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ImplicitsClause);
11923    type StablePtr = ImplicitsClausePtr;
11924    type Green = ImplicitsClauseGreen;
11925    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
11926        ImplicitsClauseGreen(
11927            Arc::new(GreenNode {
11928                kind: SyntaxKind::ImplicitsClause,
11929                details: GreenNodeDetails::Node {
11930                    children: [
11931                        TerminalImplicits::missing(db).0,
11932                        TerminalLParen::missing(db).0,
11933                        ImplicitsList::missing(db).0,
11934                        TerminalRParen::missing(db).0,
11935                    ]
11936                    .into(),
11937                    width: TextWidth::default(),
11938                },
11939            })
11940            .intern(db),
11941        )
11942    }
11943    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
11944        let kind = node.kind(db);
11945        assert_eq!(
11946            kind,
11947            SyntaxKind::ImplicitsClause,
11948            "Unexpected SyntaxKind {:?}. Expected {:?}.",
11949            kind,
11950            SyntaxKind::ImplicitsClause
11951        );
11952        Self { node }
11953    }
11954    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
11955        let kind = node.kind(db);
11956        if kind == SyntaxKind::ImplicitsClause {
11957            Some(Self::from_syntax_node(db, node))
11958        } else {
11959            None
11960        }
11961    }
11962    fn as_syntax_node(&self) -> SyntaxNode {
11963        self.node
11964    }
11965    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
11966        ImplicitsClausePtr(self.node.stable_ptr(db))
11967    }
11968}
11969#[derive(Clone, Debug, Eq, Hash, PartialEq)]
11970pub struct ImplicitsList(ElementList<ExprPath, 2>);
11971impl Deref for ImplicitsList {
11972    type Target = ElementList<ExprPath, 2>;
11973    fn deref(&self) -> &Self::Target {
11974        &self.0
11975    }
11976}
11977impl ImplicitsList {
11978    pub fn new_green(
11979        db: &dyn SyntaxGroup,
11980        children: &[ImplicitsListElementOrSeparatorGreen],
11981    ) -> ImplicitsListGreen {
11982        let width = children.iter().map(|id| id.id().lookup_intern(db).width()).sum();
11983        ImplicitsListGreen(
11984            Arc::new(GreenNode {
11985                kind: SyntaxKind::ImplicitsList,
11986                details: GreenNodeDetails::Node {
11987                    children: children.iter().map(|x| x.id()).collect(),
11988                    width,
11989                },
11990            })
11991            .intern(db),
11992        )
11993    }
11994}
11995#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
11996pub struct ImplicitsListPtr(pub SyntaxStablePtrId);
11997impl TypedStablePtr for ImplicitsListPtr {
11998    type SyntaxNode = ImplicitsList;
11999    fn untyped(&self) -> SyntaxStablePtrId {
12000        self.0
12001    }
12002    fn lookup(&self, db: &dyn SyntaxGroup) -> ImplicitsList {
12003        ImplicitsList::from_syntax_node(db, self.0.lookup(db))
12004    }
12005}
12006impl From<ImplicitsListPtr> for SyntaxStablePtrId {
12007    fn from(ptr: ImplicitsListPtr) -> Self {
12008        ptr.untyped()
12009    }
12010}
12011#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
12012pub enum ImplicitsListElementOrSeparatorGreen {
12013    Separator(TerminalCommaGreen),
12014    Element(ExprPathGreen),
12015}
12016impl From<TerminalCommaGreen> for ImplicitsListElementOrSeparatorGreen {
12017    fn from(value: TerminalCommaGreen) -> Self {
12018        ImplicitsListElementOrSeparatorGreen::Separator(value)
12019    }
12020}
12021impl From<ExprPathGreen> for ImplicitsListElementOrSeparatorGreen {
12022    fn from(value: ExprPathGreen) -> Self {
12023        ImplicitsListElementOrSeparatorGreen::Element(value)
12024    }
12025}
12026impl ImplicitsListElementOrSeparatorGreen {
12027    fn id(&self) -> GreenId {
12028        match self {
12029            ImplicitsListElementOrSeparatorGreen::Separator(green) => green.0,
12030            ImplicitsListElementOrSeparatorGreen::Element(green) => green.0,
12031        }
12032    }
12033}
12034#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
12035pub struct ImplicitsListGreen(pub GreenId);
12036impl TypedSyntaxNode for ImplicitsList {
12037    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ImplicitsList);
12038    type StablePtr = ImplicitsListPtr;
12039    type Green = ImplicitsListGreen;
12040    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
12041        ImplicitsListGreen(
12042            Arc::new(GreenNode {
12043                kind: SyntaxKind::ImplicitsList,
12044                details: GreenNodeDetails::Node {
12045                    children: [].into(),
12046                    width: TextWidth::default(),
12047                },
12048            })
12049            .intern(db),
12050        )
12051    }
12052    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
12053        Self(ElementList::new(node))
12054    }
12055    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
12056        if node.kind(db) == SyntaxKind::ImplicitsList {
12057            Some(Self(ElementList::new(node)))
12058        } else {
12059            None
12060        }
12061    }
12062    fn as_syntax_node(&self) -> SyntaxNode {
12063        self.node
12064    }
12065    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
12066        ImplicitsListPtr(self.node.stable_ptr(db))
12067    }
12068}
12069#[derive(Clone, Debug, Eq, Hash, PartialEq)]
12070pub enum OptionImplicitsClause {
12071    Empty(OptionImplicitsClauseEmpty),
12072    ImplicitsClause(ImplicitsClause),
12073}
12074#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
12075pub struct OptionImplicitsClausePtr(pub SyntaxStablePtrId);
12076impl TypedStablePtr for OptionImplicitsClausePtr {
12077    type SyntaxNode = OptionImplicitsClause;
12078    fn untyped(&self) -> SyntaxStablePtrId {
12079        self.0
12080    }
12081    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionImplicitsClause {
12082        OptionImplicitsClause::from_syntax_node(db, self.0.lookup(db))
12083    }
12084}
12085impl From<OptionImplicitsClausePtr> for SyntaxStablePtrId {
12086    fn from(ptr: OptionImplicitsClausePtr) -> Self {
12087        ptr.untyped()
12088    }
12089}
12090impl From<OptionImplicitsClauseEmptyPtr> for OptionImplicitsClausePtr {
12091    fn from(value: OptionImplicitsClauseEmptyPtr) -> Self {
12092        Self(value.0)
12093    }
12094}
12095impl From<ImplicitsClausePtr> for OptionImplicitsClausePtr {
12096    fn from(value: ImplicitsClausePtr) -> Self {
12097        Self(value.0)
12098    }
12099}
12100impl From<OptionImplicitsClauseEmptyGreen> for OptionImplicitsClauseGreen {
12101    fn from(value: OptionImplicitsClauseEmptyGreen) -> Self {
12102        Self(value.0)
12103    }
12104}
12105impl From<ImplicitsClauseGreen> for OptionImplicitsClauseGreen {
12106    fn from(value: ImplicitsClauseGreen) -> Self {
12107        Self(value.0)
12108    }
12109}
12110#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
12111pub struct OptionImplicitsClauseGreen(pub GreenId);
12112impl TypedSyntaxNode for OptionImplicitsClause {
12113    const OPTIONAL_KIND: Option<SyntaxKind> = None;
12114    type StablePtr = OptionImplicitsClausePtr;
12115    type Green = OptionImplicitsClauseGreen;
12116    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
12117        panic!("No missing variant.");
12118    }
12119    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
12120        let kind = node.kind(db);
12121        match kind {
12122            SyntaxKind::OptionImplicitsClauseEmpty => {
12123                OptionImplicitsClause::Empty(OptionImplicitsClauseEmpty::from_syntax_node(db, node))
12124            }
12125            SyntaxKind::ImplicitsClause => {
12126                OptionImplicitsClause::ImplicitsClause(ImplicitsClause::from_syntax_node(db, node))
12127            }
12128            _ => panic!(
12129                "Unexpected syntax kind {:?} when constructing {}.",
12130                kind, "OptionImplicitsClause"
12131            ),
12132        }
12133    }
12134    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
12135        let kind = node.kind(db);
12136        match kind {
12137            SyntaxKind::OptionImplicitsClauseEmpty => Some(OptionImplicitsClause::Empty(
12138                OptionImplicitsClauseEmpty::from_syntax_node(db, node),
12139            )),
12140            SyntaxKind::ImplicitsClause => Some(OptionImplicitsClause::ImplicitsClause(
12141                ImplicitsClause::from_syntax_node(db, node),
12142            )),
12143            _ => None,
12144        }
12145    }
12146    fn as_syntax_node(&self) -> SyntaxNode {
12147        match self {
12148            OptionImplicitsClause::Empty(x) => x.as_syntax_node(),
12149            OptionImplicitsClause::ImplicitsClause(x) => x.as_syntax_node(),
12150        }
12151    }
12152    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
12153        OptionImplicitsClausePtr(self.as_syntax_node().lookup_intern(db).stable_ptr)
12154    }
12155}
12156impl OptionImplicitsClause {
12157    /// Checks if a kind of a variant of [OptionImplicitsClause].
12158    pub fn is_variant(kind: SyntaxKind) -> bool {
12159        matches!(kind, SyntaxKind::OptionImplicitsClauseEmpty | SyntaxKind::ImplicitsClause)
12160    }
12161}
12162#[derive(Clone, Debug, Eq, Hash, PartialEq)]
12163pub struct OptionImplicitsClauseEmpty {
12164    node: SyntaxNode,
12165}
12166impl OptionImplicitsClauseEmpty {
12167    pub fn new_green(db: &dyn SyntaxGroup) -> OptionImplicitsClauseEmptyGreen {
12168        let children = [];
12169        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
12170        OptionImplicitsClauseEmptyGreen(
12171            Arc::new(GreenNode {
12172                kind: SyntaxKind::OptionImplicitsClauseEmpty,
12173                details: GreenNodeDetails::Node { children: children.into(), width },
12174            })
12175            .intern(db),
12176        )
12177    }
12178}
12179impl OptionImplicitsClauseEmpty {}
12180#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
12181pub struct OptionImplicitsClauseEmptyPtr(pub SyntaxStablePtrId);
12182impl OptionImplicitsClauseEmptyPtr {}
12183impl TypedStablePtr for OptionImplicitsClauseEmptyPtr {
12184    type SyntaxNode = OptionImplicitsClauseEmpty;
12185    fn untyped(&self) -> SyntaxStablePtrId {
12186        self.0
12187    }
12188    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionImplicitsClauseEmpty {
12189        OptionImplicitsClauseEmpty::from_syntax_node(db, self.0.lookup(db))
12190    }
12191}
12192impl From<OptionImplicitsClauseEmptyPtr> for SyntaxStablePtrId {
12193    fn from(ptr: OptionImplicitsClauseEmptyPtr) -> Self {
12194        ptr.untyped()
12195    }
12196}
12197#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
12198pub struct OptionImplicitsClauseEmptyGreen(pub GreenId);
12199impl TypedSyntaxNode for OptionImplicitsClauseEmpty {
12200    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionImplicitsClauseEmpty);
12201    type StablePtr = OptionImplicitsClauseEmptyPtr;
12202    type Green = OptionImplicitsClauseEmptyGreen;
12203    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
12204        OptionImplicitsClauseEmptyGreen(
12205            Arc::new(GreenNode {
12206                kind: SyntaxKind::OptionImplicitsClauseEmpty,
12207                details: GreenNodeDetails::Node {
12208                    children: [].into(),
12209                    width: TextWidth::default(),
12210                },
12211            })
12212            .intern(db),
12213        )
12214    }
12215    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
12216        let kind = node.kind(db);
12217        assert_eq!(
12218            kind,
12219            SyntaxKind::OptionImplicitsClauseEmpty,
12220            "Unexpected SyntaxKind {:?}. Expected {:?}.",
12221            kind,
12222            SyntaxKind::OptionImplicitsClauseEmpty
12223        );
12224        Self { node }
12225    }
12226    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
12227        let kind = node.kind(db);
12228        if kind == SyntaxKind::OptionImplicitsClauseEmpty {
12229            Some(Self::from_syntax_node(db, node))
12230        } else {
12231            None
12232        }
12233    }
12234    fn as_syntax_node(&self) -> SyntaxNode {
12235        self.node
12236    }
12237    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
12238        OptionImplicitsClauseEmptyPtr(self.node.stable_ptr(db))
12239    }
12240}
12241#[derive(Clone, Debug, Eq, Hash, PartialEq)]
12242pub enum OptionTerminalNoPanic {
12243    Empty(OptionTerminalNoPanicEmpty),
12244    TerminalNoPanic(TerminalNoPanic),
12245}
12246#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
12247pub struct OptionTerminalNoPanicPtr(pub SyntaxStablePtrId);
12248impl TypedStablePtr for OptionTerminalNoPanicPtr {
12249    type SyntaxNode = OptionTerminalNoPanic;
12250    fn untyped(&self) -> SyntaxStablePtrId {
12251        self.0
12252    }
12253    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionTerminalNoPanic {
12254        OptionTerminalNoPanic::from_syntax_node(db, self.0.lookup(db))
12255    }
12256}
12257impl From<OptionTerminalNoPanicPtr> for SyntaxStablePtrId {
12258    fn from(ptr: OptionTerminalNoPanicPtr) -> Self {
12259        ptr.untyped()
12260    }
12261}
12262impl From<OptionTerminalNoPanicEmptyPtr> for OptionTerminalNoPanicPtr {
12263    fn from(value: OptionTerminalNoPanicEmptyPtr) -> Self {
12264        Self(value.0)
12265    }
12266}
12267impl From<TerminalNoPanicPtr> for OptionTerminalNoPanicPtr {
12268    fn from(value: TerminalNoPanicPtr) -> Self {
12269        Self(value.0)
12270    }
12271}
12272impl From<OptionTerminalNoPanicEmptyGreen> for OptionTerminalNoPanicGreen {
12273    fn from(value: OptionTerminalNoPanicEmptyGreen) -> Self {
12274        Self(value.0)
12275    }
12276}
12277impl From<TerminalNoPanicGreen> for OptionTerminalNoPanicGreen {
12278    fn from(value: TerminalNoPanicGreen) -> Self {
12279        Self(value.0)
12280    }
12281}
12282#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
12283pub struct OptionTerminalNoPanicGreen(pub GreenId);
12284impl TypedSyntaxNode for OptionTerminalNoPanic {
12285    const OPTIONAL_KIND: Option<SyntaxKind> = None;
12286    type StablePtr = OptionTerminalNoPanicPtr;
12287    type Green = OptionTerminalNoPanicGreen;
12288    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
12289        panic!("No missing variant.");
12290    }
12291    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
12292        let kind = node.kind(db);
12293        match kind {
12294            SyntaxKind::OptionTerminalNoPanicEmpty => {
12295                OptionTerminalNoPanic::Empty(OptionTerminalNoPanicEmpty::from_syntax_node(db, node))
12296            }
12297            SyntaxKind::TerminalNoPanic => {
12298                OptionTerminalNoPanic::TerminalNoPanic(TerminalNoPanic::from_syntax_node(db, node))
12299            }
12300            _ => panic!(
12301                "Unexpected syntax kind {:?} when constructing {}.",
12302                kind, "OptionTerminalNoPanic"
12303            ),
12304        }
12305    }
12306    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
12307        let kind = node.kind(db);
12308        match kind {
12309            SyntaxKind::OptionTerminalNoPanicEmpty => Some(OptionTerminalNoPanic::Empty(
12310                OptionTerminalNoPanicEmpty::from_syntax_node(db, node),
12311            )),
12312            SyntaxKind::TerminalNoPanic => Some(OptionTerminalNoPanic::TerminalNoPanic(
12313                TerminalNoPanic::from_syntax_node(db, node),
12314            )),
12315            _ => None,
12316        }
12317    }
12318    fn as_syntax_node(&self) -> SyntaxNode {
12319        match self {
12320            OptionTerminalNoPanic::Empty(x) => x.as_syntax_node(),
12321            OptionTerminalNoPanic::TerminalNoPanic(x) => x.as_syntax_node(),
12322        }
12323    }
12324    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
12325        OptionTerminalNoPanicPtr(self.as_syntax_node().lookup_intern(db).stable_ptr)
12326    }
12327}
12328impl OptionTerminalNoPanic {
12329    /// Checks if a kind of a variant of [OptionTerminalNoPanic].
12330    pub fn is_variant(kind: SyntaxKind) -> bool {
12331        matches!(kind, SyntaxKind::OptionTerminalNoPanicEmpty | SyntaxKind::TerminalNoPanic)
12332    }
12333}
12334#[derive(Clone, Debug, Eq, Hash, PartialEq)]
12335pub struct OptionTerminalNoPanicEmpty {
12336    node: SyntaxNode,
12337}
12338impl OptionTerminalNoPanicEmpty {
12339    pub fn new_green(db: &dyn SyntaxGroup) -> OptionTerminalNoPanicEmptyGreen {
12340        let children = [];
12341        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
12342        OptionTerminalNoPanicEmptyGreen(
12343            Arc::new(GreenNode {
12344                kind: SyntaxKind::OptionTerminalNoPanicEmpty,
12345                details: GreenNodeDetails::Node { children: children.into(), width },
12346            })
12347            .intern(db),
12348        )
12349    }
12350}
12351impl OptionTerminalNoPanicEmpty {}
12352#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
12353pub struct OptionTerminalNoPanicEmptyPtr(pub SyntaxStablePtrId);
12354impl OptionTerminalNoPanicEmptyPtr {}
12355impl TypedStablePtr for OptionTerminalNoPanicEmptyPtr {
12356    type SyntaxNode = OptionTerminalNoPanicEmpty;
12357    fn untyped(&self) -> SyntaxStablePtrId {
12358        self.0
12359    }
12360    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionTerminalNoPanicEmpty {
12361        OptionTerminalNoPanicEmpty::from_syntax_node(db, self.0.lookup(db))
12362    }
12363}
12364impl From<OptionTerminalNoPanicEmptyPtr> for SyntaxStablePtrId {
12365    fn from(ptr: OptionTerminalNoPanicEmptyPtr) -> Self {
12366        ptr.untyped()
12367    }
12368}
12369#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
12370pub struct OptionTerminalNoPanicEmptyGreen(pub GreenId);
12371impl TypedSyntaxNode for OptionTerminalNoPanicEmpty {
12372    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionTerminalNoPanicEmpty);
12373    type StablePtr = OptionTerminalNoPanicEmptyPtr;
12374    type Green = OptionTerminalNoPanicEmptyGreen;
12375    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
12376        OptionTerminalNoPanicEmptyGreen(
12377            Arc::new(GreenNode {
12378                kind: SyntaxKind::OptionTerminalNoPanicEmpty,
12379                details: GreenNodeDetails::Node {
12380                    children: [].into(),
12381                    width: TextWidth::default(),
12382                },
12383            })
12384            .intern(db),
12385        )
12386    }
12387    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
12388        let kind = node.kind(db);
12389        assert_eq!(
12390            kind,
12391            SyntaxKind::OptionTerminalNoPanicEmpty,
12392            "Unexpected SyntaxKind {:?}. Expected {:?}.",
12393            kind,
12394            SyntaxKind::OptionTerminalNoPanicEmpty
12395        );
12396        Self { node }
12397    }
12398    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
12399        let kind = node.kind(db);
12400        if kind == SyntaxKind::OptionTerminalNoPanicEmpty {
12401            Some(Self::from_syntax_node(db, node))
12402        } else {
12403            None
12404        }
12405    }
12406    fn as_syntax_node(&self) -> SyntaxNode {
12407        self.node
12408    }
12409    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
12410        OptionTerminalNoPanicEmptyPtr(self.node.stable_ptr(db))
12411    }
12412}
12413#[derive(Clone, Debug, Eq, Hash, PartialEq)]
12414pub enum OptionTerminalConst {
12415    Empty(OptionTerminalConstEmpty),
12416    TerminalConst(TerminalConst),
12417}
12418#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
12419pub struct OptionTerminalConstPtr(pub SyntaxStablePtrId);
12420impl TypedStablePtr for OptionTerminalConstPtr {
12421    type SyntaxNode = OptionTerminalConst;
12422    fn untyped(&self) -> SyntaxStablePtrId {
12423        self.0
12424    }
12425    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionTerminalConst {
12426        OptionTerminalConst::from_syntax_node(db, self.0.lookup(db))
12427    }
12428}
12429impl From<OptionTerminalConstPtr> for SyntaxStablePtrId {
12430    fn from(ptr: OptionTerminalConstPtr) -> Self {
12431        ptr.untyped()
12432    }
12433}
12434impl From<OptionTerminalConstEmptyPtr> for OptionTerminalConstPtr {
12435    fn from(value: OptionTerminalConstEmptyPtr) -> Self {
12436        Self(value.0)
12437    }
12438}
12439impl From<TerminalConstPtr> for OptionTerminalConstPtr {
12440    fn from(value: TerminalConstPtr) -> Self {
12441        Self(value.0)
12442    }
12443}
12444impl From<OptionTerminalConstEmptyGreen> for OptionTerminalConstGreen {
12445    fn from(value: OptionTerminalConstEmptyGreen) -> Self {
12446        Self(value.0)
12447    }
12448}
12449impl From<TerminalConstGreen> for OptionTerminalConstGreen {
12450    fn from(value: TerminalConstGreen) -> Self {
12451        Self(value.0)
12452    }
12453}
12454#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
12455pub struct OptionTerminalConstGreen(pub GreenId);
12456impl TypedSyntaxNode for OptionTerminalConst {
12457    const OPTIONAL_KIND: Option<SyntaxKind> = None;
12458    type StablePtr = OptionTerminalConstPtr;
12459    type Green = OptionTerminalConstGreen;
12460    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
12461        panic!("No missing variant.");
12462    }
12463    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
12464        let kind = node.kind(db);
12465        match kind {
12466            SyntaxKind::OptionTerminalConstEmpty => {
12467                OptionTerminalConst::Empty(OptionTerminalConstEmpty::from_syntax_node(db, node))
12468            }
12469            SyntaxKind::TerminalConst => {
12470                OptionTerminalConst::TerminalConst(TerminalConst::from_syntax_node(db, node))
12471            }
12472            _ => panic!(
12473                "Unexpected syntax kind {:?} when constructing {}.",
12474                kind, "OptionTerminalConst"
12475            ),
12476        }
12477    }
12478    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
12479        let kind = node.kind(db);
12480        match kind {
12481            SyntaxKind::OptionTerminalConstEmpty => Some(OptionTerminalConst::Empty(
12482                OptionTerminalConstEmpty::from_syntax_node(db, node),
12483            )),
12484            SyntaxKind::TerminalConst => {
12485                Some(OptionTerminalConst::TerminalConst(TerminalConst::from_syntax_node(db, node)))
12486            }
12487            _ => None,
12488        }
12489    }
12490    fn as_syntax_node(&self) -> SyntaxNode {
12491        match self {
12492            OptionTerminalConst::Empty(x) => x.as_syntax_node(),
12493            OptionTerminalConst::TerminalConst(x) => x.as_syntax_node(),
12494        }
12495    }
12496    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
12497        OptionTerminalConstPtr(self.as_syntax_node().lookup_intern(db).stable_ptr)
12498    }
12499}
12500impl OptionTerminalConst {
12501    /// Checks if a kind of a variant of [OptionTerminalConst].
12502    pub fn is_variant(kind: SyntaxKind) -> bool {
12503        matches!(kind, SyntaxKind::OptionTerminalConstEmpty | SyntaxKind::TerminalConst)
12504    }
12505}
12506#[derive(Clone, Debug, Eq, Hash, PartialEq)]
12507pub struct OptionTerminalConstEmpty {
12508    node: SyntaxNode,
12509}
12510impl OptionTerminalConstEmpty {
12511    pub fn new_green(db: &dyn SyntaxGroup) -> OptionTerminalConstEmptyGreen {
12512        let children = [];
12513        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
12514        OptionTerminalConstEmptyGreen(
12515            Arc::new(GreenNode {
12516                kind: SyntaxKind::OptionTerminalConstEmpty,
12517                details: GreenNodeDetails::Node { children: children.into(), width },
12518            })
12519            .intern(db),
12520        )
12521    }
12522}
12523impl OptionTerminalConstEmpty {}
12524#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
12525pub struct OptionTerminalConstEmptyPtr(pub SyntaxStablePtrId);
12526impl OptionTerminalConstEmptyPtr {}
12527impl TypedStablePtr for OptionTerminalConstEmptyPtr {
12528    type SyntaxNode = OptionTerminalConstEmpty;
12529    fn untyped(&self) -> SyntaxStablePtrId {
12530        self.0
12531    }
12532    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionTerminalConstEmpty {
12533        OptionTerminalConstEmpty::from_syntax_node(db, self.0.lookup(db))
12534    }
12535}
12536impl From<OptionTerminalConstEmptyPtr> for SyntaxStablePtrId {
12537    fn from(ptr: OptionTerminalConstEmptyPtr) -> Self {
12538        ptr.untyped()
12539    }
12540}
12541#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
12542pub struct OptionTerminalConstEmptyGreen(pub GreenId);
12543impl TypedSyntaxNode for OptionTerminalConstEmpty {
12544    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionTerminalConstEmpty);
12545    type StablePtr = OptionTerminalConstEmptyPtr;
12546    type Green = OptionTerminalConstEmptyGreen;
12547    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
12548        OptionTerminalConstEmptyGreen(
12549            Arc::new(GreenNode {
12550                kind: SyntaxKind::OptionTerminalConstEmpty,
12551                details: GreenNodeDetails::Node {
12552                    children: [].into(),
12553                    width: TextWidth::default(),
12554                },
12555            })
12556            .intern(db),
12557        )
12558    }
12559    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
12560        let kind = node.kind(db);
12561        assert_eq!(
12562            kind,
12563            SyntaxKind::OptionTerminalConstEmpty,
12564            "Unexpected SyntaxKind {:?}. Expected {:?}.",
12565            kind,
12566            SyntaxKind::OptionTerminalConstEmpty
12567        );
12568        Self { node }
12569    }
12570    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
12571        let kind = node.kind(db);
12572        if kind == SyntaxKind::OptionTerminalConstEmpty {
12573            Some(Self::from_syntax_node(db, node))
12574        } else {
12575            None
12576        }
12577    }
12578    fn as_syntax_node(&self) -> SyntaxNode {
12579        self.node
12580    }
12581    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
12582        OptionTerminalConstEmptyPtr(self.node.stable_ptr(db))
12583    }
12584}
12585#[derive(Clone, Debug, Eq, Hash, PartialEq)]
12586pub struct FunctionSignature {
12587    node: SyntaxNode,
12588}
12589impl FunctionSignature {
12590    pub const INDEX_LPAREN: usize = 0;
12591    pub const INDEX_PARAMETERS: usize = 1;
12592    pub const INDEX_RPAREN: usize = 2;
12593    pub const INDEX_RET_TY: usize = 3;
12594    pub const INDEX_IMPLICITS_CLAUSE: usize = 4;
12595    pub const INDEX_OPTIONAL_NO_PANIC: usize = 5;
12596    pub fn new_green(
12597        db: &dyn SyntaxGroup,
12598        lparen: TerminalLParenGreen,
12599        parameters: ParamListGreen,
12600        rparen: TerminalRParenGreen,
12601        ret_ty: OptionReturnTypeClauseGreen,
12602        implicits_clause: OptionImplicitsClauseGreen,
12603        optional_no_panic: OptionTerminalNoPanicGreen,
12604    ) -> FunctionSignatureGreen {
12605        let children =
12606            [lparen.0, parameters.0, rparen.0, ret_ty.0, implicits_clause.0, optional_no_panic.0];
12607        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
12608        FunctionSignatureGreen(
12609            Arc::new(GreenNode {
12610                kind: SyntaxKind::FunctionSignature,
12611                details: GreenNodeDetails::Node { children: children.into(), width },
12612            })
12613            .intern(db),
12614        )
12615    }
12616}
12617impl FunctionSignature {
12618    pub fn lparen(&self, db: &dyn SyntaxGroup) -> TerminalLParen {
12619        TerminalLParen::from_syntax_node(db, self.node.get_children(db)[0])
12620    }
12621    pub fn parameters(&self, db: &dyn SyntaxGroup) -> ParamList {
12622        ParamList::from_syntax_node(db, self.node.get_children(db)[1])
12623    }
12624    pub fn rparen(&self, db: &dyn SyntaxGroup) -> TerminalRParen {
12625        TerminalRParen::from_syntax_node(db, self.node.get_children(db)[2])
12626    }
12627    pub fn ret_ty(&self, db: &dyn SyntaxGroup) -> OptionReturnTypeClause {
12628        OptionReturnTypeClause::from_syntax_node(db, self.node.get_children(db)[3])
12629    }
12630    pub fn implicits_clause(&self, db: &dyn SyntaxGroup) -> OptionImplicitsClause {
12631        OptionImplicitsClause::from_syntax_node(db, self.node.get_children(db)[4])
12632    }
12633    pub fn optional_no_panic(&self, db: &dyn SyntaxGroup) -> OptionTerminalNoPanic {
12634        OptionTerminalNoPanic::from_syntax_node(db, self.node.get_children(db)[5])
12635    }
12636}
12637#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
12638pub struct FunctionSignaturePtr(pub SyntaxStablePtrId);
12639impl FunctionSignaturePtr {}
12640impl TypedStablePtr for FunctionSignaturePtr {
12641    type SyntaxNode = FunctionSignature;
12642    fn untyped(&self) -> SyntaxStablePtrId {
12643        self.0
12644    }
12645    fn lookup(&self, db: &dyn SyntaxGroup) -> FunctionSignature {
12646        FunctionSignature::from_syntax_node(db, self.0.lookup(db))
12647    }
12648}
12649impl From<FunctionSignaturePtr> for SyntaxStablePtrId {
12650    fn from(ptr: FunctionSignaturePtr) -> Self {
12651        ptr.untyped()
12652    }
12653}
12654#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
12655pub struct FunctionSignatureGreen(pub GreenId);
12656impl TypedSyntaxNode for FunctionSignature {
12657    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::FunctionSignature);
12658    type StablePtr = FunctionSignaturePtr;
12659    type Green = FunctionSignatureGreen;
12660    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
12661        FunctionSignatureGreen(
12662            Arc::new(GreenNode {
12663                kind: SyntaxKind::FunctionSignature,
12664                details: GreenNodeDetails::Node {
12665                    children: [
12666                        TerminalLParen::missing(db).0,
12667                        ParamList::missing(db).0,
12668                        TerminalRParen::missing(db).0,
12669                        OptionReturnTypeClause::missing(db).0,
12670                        OptionImplicitsClause::missing(db).0,
12671                        OptionTerminalNoPanic::missing(db).0,
12672                    ]
12673                    .into(),
12674                    width: TextWidth::default(),
12675                },
12676            })
12677            .intern(db),
12678        )
12679    }
12680    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
12681        let kind = node.kind(db);
12682        assert_eq!(
12683            kind,
12684            SyntaxKind::FunctionSignature,
12685            "Unexpected SyntaxKind {:?}. Expected {:?}.",
12686            kind,
12687            SyntaxKind::FunctionSignature
12688        );
12689        Self { node }
12690    }
12691    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
12692        let kind = node.kind(db);
12693        if kind == SyntaxKind::FunctionSignature {
12694            Some(Self::from_syntax_node(db, node))
12695        } else {
12696            None
12697        }
12698    }
12699    fn as_syntax_node(&self) -> SyntaxNode {
12700        self.node
12701    }
12702    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
12703        FunctionSignaturePtr(self.node.stable_ptr(db))
12704    }
12705}
12706#[derive(Clone, Debug, Eq, Hash, PartialEq)]
12707pub struct Member {
12708    node: SyntaxNode,
12709}
12710impl Member {
12711    pub const INDEX_ATTRIBUTES: usize = 0;
12712    pub const INDEX_VISIBILITY: usize = 1;
12713    pub const INDEX_NAME: usize = 2;
12714    pub const INDEX_TYPE_CLAUSE: usize = 3;
12715    pub fn new_green(
12716        db: &dyn SyntaxGroup,
12717        attributes: AttributeListGreen,
12718        visibility: VisibilityGreen,
12719        name: TerminalIdentifierGreen,
12720        type_clause: TypeClauseGreen,
12721    ) -> MemberGreen {
12722        let children = [attributes.0, visibility.0, name.0, type_clause.0];
12723        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
12724        MemberGreen(
12725            Arc::new(GreenNode {
12726                kind: SyntaxKind::Member,
12727                details: GreenNodeDetails::Node { children: children.into(), width },
12728            })
12729            .intern(db),
12730        )
12731    }
12732}
12733impl Member {
12734    pub fn attributes(&self, db: &dyn SyntaxGroup) -> AttributeList {
12735        AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
12736    }
12737    pub fn visibility(&self, db: &dyn SyntaxGroup) -> Visibility {
12738        Visibility::from_syntax_node(db, self.node.get_children(db)[1])
12739    }
12740    pub fn name(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier {
12741        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[2])
12742    }
12743    pub fn type_clause(&self, db: &dyn SyntaxGroup) -> TypeClause {
12744        TypeClause::from_syntax_node(db, self.node.get_children(db)[3])
12745    }
12746}
12747#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
12748pub struct MemberPtr(pub SyntaxStablePtrId);
12749impl MemberPtr {
12750    pub fn name_green(self, db: &dyn SyntaxGroup) -> TerminalIdentifierGreen {
12751        let ptr = self.0.lookup_intern(db);
12752        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
12753            TerminalIdentifierGreen(key_fields[0])
12754        } else {
12755            panic!("Unexpected key field query on root.");
12756        }
12757    }
12758}
12759impl TypedStablePtr for MemberPtr {
12760    type SyntaxNode = Member;
12761    fn untyped(&self) -> SyntaxStablePtrId {
12762        self.0
12763    }
12764    fn lookup(&self, db: &dyn SyntaxGroup) -> Member {
12765        Member::from_syntax_node(db, self.0.lookup(db))
12766    }
12767}
12768impl From<MemberPtr> for SyntaxStablePtrId {
12769    fn from(ptr: MemberPtr) -> Self {
12770        ptr.untyped()
12771    }
12772}
12773#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
12774pub struct MemberGreen(pub GreenId);
12775impl TypedSyntaxNode for Member {
12776    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::Member);
12777    type StablePtr = MemberPtr;
12778    type Green = MemberGreen;
12779    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
12780        MemberGreen(
12781            Arc::new(GreenNode {
12782                kind: SyntaxKind::Member,
12783                details: GreenNodeDetails::Node {
12784                    children: [
12785                        AttributeList::missing(db).0,
12786                        Visibility::missing(db).0,
12787                        TerminalIdentifier::missing(db).0,
12788                        TypeClause::missing(db).0,
12789                    ]
12790                    .into(),
12791                    width: TextWidth::default(),
12792                },
12793            })
12794            .intern(db),
12795        )
12796    }
12797    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
12798        let kind = node.kind(db);
12799        assert_eq!(
12800            kind,
12801            SyntaxKind::Member,
12802            "Unexpected SyntaxKind {:?}. Expected {:?}.",
12803            kind,
12804            SyntaxKind::Member
12805        );
12806        Self { node }
12807    }
12808    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
12809        let kind = node.kind(db);
12810        if kind == SyntaxKind::Member { Some(Self::from_syntax_node(db, node)) } else { None }
12811    }
12812    fn as_syntax_node(&self) -> SyntaxNode {
12813        self.node
12814    }
12815    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
12816        MemberPtr(self.node.stable_ptr(db))
12817    }
12818}
12819#[derive(Clone, Debug, Eq, Hash, PartialEq)]
12820pub struct MemberList(ElementList<Member, 2>);
12821impl Deref for MemberList {
12822    type Target = ElementList<Member, 2>;
12823    fn deref(&self) -> &Self::Target {
12824        &self.0
12825    }
12826}
12827impl MemberList {
12828    pub fn new_green(
12829        db: &dyn SyntaxGroup,
12830        children: &[MemberListElementOrSeparatorGreen],
12831    ) -> MemberListGreen {
12832        let width = children.iter().map(|id| id.id().lookup_intern(db).width()).sum();
12833        MemberListGreen(
12834            Arc::new(GreenNode {
12835                kind: SyntaxKind::MemberList,
12836                details: GreenNodeDetails::Node {
12837                    children: children.iter().map(|x| x.id()).collect(),
12838                    width,
12839                },
12840            })
12841            .intern(db),
12842        )
12843    }
12844}
12845#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
12846pub struct MemberListPtr(pub SyntaxStablePtrId);
12847impl TypedStablePtr for MemberListPtr {
12848    type SyntaxNode = MemberList;
12849    fn untyped(&self) -> SyntaxStablePtrId {
12850        self.0
12851    }
12852    fn lookup(&self, db: &dyn SyntaxGroup) -> MemberList {
12853        MemberList::from_syntax_node(db, self.0.lookup(db))
12854    }
12855}
12856impl From<MemberListPtr> for SyntaxStablePtrId {
12857    fn from(ptr: MemberListPtr) -> Self {
12858        ptr.untyped()
12859    }
12860}
12861#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
12862pub enum MemberListElementOrSeparatorGreen {
12863    Separator(TerminalCommaGreen),
12864    Element(MemberGreen),
12865}
12866impl From<TerminalCommaGreen> for MemberListElementOrSeparatorGreen {
12867    fn from(value: TerminalCommaGreen) -> Self {
12868        MemberListElementOrSeparatorGreen::Separator(value)
12869    }
12870}
12871impl From<MemberGreen> for MemberListElementOrSeparatorGreen {
12872    fn from(value: MemberGreen) -> Self {
12873        MemberListElementOrSeparatorGreen::Element(value)
12874    }
12875}
12876impl MemberListElementOrSeparatorGreen {
12877    fn id(&self) -> GreenId {
12878        match self {
12879            MemberListElementOrSeparatorGreen::Separator(green) => green.0,
12880            MemberListElementOrSeparatorGreen::Element(green) => green.0,
12881        }
12882    }
12883}
12884#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
12885pub struct MemberListGreen(pub GreenId);
12886impl TypedSyntaxNode for MemberList {
12887    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::MemberList);
12888    type StablePtr = MemberListPtr;
12889    type Green = MemberListGreen;
12890    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
12891        MemberListGreen(
12892            Arc::new(GreenNode {
12893                kind: SyntaxKind::MemberList,
12894                details: GreenNodeDetails::Node {
12895                    children: [].into(),
12896                    width: TextWidth::default(),
12897                },
12898            })
12899            .intern(db),
12900        )
12901    }
12902    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
12903        Self(ElementList::new(node))
12904    }
12905    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
12906        if node.kind(db) == SyntaxKind::MemberList {
12907            Some(Self(ElementList::new(node)))
12908        } else {
12909            None
12910        }
12911    }
12912    fn as_syntax_node(&self) -> SyntaxNode {
12913        self.node
12914    }
12915    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
12916        MemberListPtr(self.node.stable_ptr(db))
12917    }
12918}
12919#[derive(Clone, Debug, Eq, Hash, PartialEq)]
12920pub struct Variant {
12921    node: SyntaxNode,
12922}
12923impl Variant {
12924    pub const INDEX_ATTRIBUTES: usize = 0;
12925    pub const INDEX_NAME: usize = 1;
12926    pub const INDEX_TYPE_CLAUSE: usize = 2;
12927    pub fn new_green(
12928        db: &dyn SyntaxGroup,
12929        attributes: AttributeListGreen,
12930        name: TerminalIdentifierGreen,
12931        type_clause: OptionTypeClauseGreen,
12932    ) -> VariantGreen {
12933        let children = [attributes.0, name.0, type_clause.0];
12934        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
12935        VariantGreen(
12936            Arc::new(GreenNode {
12937                kind: SyntaxKind::Variant,
12938                details: GreenNodeDetails::Node { children: children.into(), width },
12939            })
12940            .intern(db),
12941        )
12942    }
12943}
12944impl Variant {
12945    pub fn attributes(&self, db: &dyn SyntaxGroup) -> AttributeList {
12946        AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
12947    }
12948    pub fn name(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier {
12949        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[1])
12950    }
12951    pub fn type_clause(&self, db: &dyn SyntaxGroup) -> OptionTypeClause {
12952        OptionTypeClause::from_syntax_node(db, self.node.get_children(db)[2])
12953    }
12954}
12955#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
12956pub struct VariantPtr(pub SyntaxStablePtrId);
12957impl VariantPtr {
12958    pub fn name_green(self, db: &dyn SyntaxGroup) -> TerminalIdentifierGreen {
12959        let ptr = self.0.lookup_intern(db);
12960        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
12961            TerminalIdentifierGreen(key_fields[0])
12962        } else {
12963            panic!("Unexpected key field query on root.");
12964        }
12965    }
12966}
12967impl TypedStablePtr for VariantPtr {
12968    type SyntaxNode = Variant;
12969    fn untyped(&self) -> SyntaxStablePtrId {
12970        self.0
12971    }
12972    fn lookup(&self, db: &dyn SyntaxGroup) -> Variant {
12973        Variant::from_syntax_node(db, self.0.lookup(db))
12974    }
12975}
12976impl From<VariantPtr> for SyntaxStablePtrId {
12977    fn from(ptr: VariantPtr) -> Self {
12978        ptr.untyped()
12979    }
12980}
12981#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
12982pub struct VariantGreen(pub GreenId);
12983impl TypedSyntaxNode for Variant {
12984    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::Variant);
12985    type StablePtr = VariantPtr;
12986    type Green = VariantGreen;
12987    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
12988        VariantGreen(
12989            Arc::new(GreenNode {
12990                kind: SyntaxKind::Variant,
12991                details: GreenNodeDetails::Node {
12992                    children: [
12993                        AttributeList::missing(db).0,
12994                        TerminalIdentifier::missing(db).0,
12995                        OptionTypeClause::missing(db).0,
12996                    ]
12997                    .into(),
12998                    width: TextWidth::default(),
12999                },
13000            })
13001            .intern(db),
13002        )
13003    }
13004    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
13005        let kind = node.kind(db);
13006        assert_eq!(
13007            kind,
13008            SyntaxKind::Variant,
13009            "Unexpected SyntaxKind {:?}. Expected {:?}.",
13010            kind,
13011            SyntaxKind::Variant
13012        );
13013        Self { node }
13014    }
13015    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
13016        let kind = node.kind(db);
13017        if kind == SyntaxKind::Variant { Some(Self::from_syntax_node(db, node)) } else { None }
13018    }
13019    fn as_syntax_node(&self) -> SyntaxNode {
13020        self.node
13021    }
13022    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
13023        VariantPtr(self.node.stable_ptr(db))
13024    }
13025}
13026#[derive(Clone, Debug, Eq, Hash, PartialEq)]
13027pub struct VariantList(ElementList<Variant, 2>);
13028impl Deref for VariantList {
13029    type Target = ElementList<Variant, 2>;
13030    fn deref(&self) -> &Self::Target {
13031        &self.0
13032    }
13033}
13034impl VariantList {
13035    pub fn new_green(
13036        db: &dyn SyntaxGroup,
13037        children: &[VariantListElementOrSeparatorGreen],
13038    ) -> VariantListGreen {
13039        let width = children.iter().map(|id| id.id().lookup_intern(db).width()).sum();
13040        VariantListGreen(
13041            Arc::new(GreenNode {
13042                kind: SyntaxKind::VariantList,
13043                details: GreenNodeDetails::Node {
13044                    children: children.iter().map(|x| x.id()).collect(),
13045                    width,
13046                },
13047            })
13048            .intern(db),
13049        )
13050    }
13051}
13052#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
13053pub struct VariantListPtr(pub SyntaxStablePtrId);
13054impl TypedStablePtr for VariantListPtr {
13055    type SyntaxNode = VariantList;
13056    fn untyped(&self) -> SyntaxStablePtrId {
13057        self.0
13058    }
13059    fn lookup(&self, db: &dyn SyntaxGroup) -> VariantList {
13060        VariantList::from_syntax_node(db, self.0.lookup(db))
13061    }
13062}
13063impl From<VariantListPtr> for SyntaxStablePtrId {
13064    fn from(ptr: VariantListPtr) -> Self {
13065        ptr.untyped()
13066    }
13067}
13068#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
13069pub enum VariantListElementOrSeparatorGreen {
13070    Separator(TerminalCommaGreen),
13071    Element(VariantGreen),
13072}
13073impl From<TerminalCommaGreen> for VariantListElementOrSeparatorGreen {
13074    fn from(value: TerminalCommaGreen) -> Self {
13075        VariantListElementOrSeparatorGreen::Separator(value)
13076    }
13077}
13078impl From<VariantGreen> for VariantListElementOrSeparatorGreen {
13079    fn from(value: VariantGreen) -> Self {
13080        VariantListElementOrSeparatorGreen::Element(value)
13081    }
13082}
13083impl VariantListElementOrSeparatorGreen {
13084    fn id(&self) -> GreenId {
13085        match self {
13086            VariantListElementOrSeparatorGreen::Separator(green) => green.0,
13087            VariantListElementOrSeparatorGreen::Element(green) => green.0,
13088        }
13089    }
13090}
13091#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
13092pub struct VariantListGreen(pub GreenId);
13093impl TypedSyntaxNode for VariantList {
13094    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::VariantList);
13095    type StablePtr = VariantListPtr;
13096    type Green = VariantListGreen;
13097    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
13098        VariantListGreen(
13099            Arc::new(GreenNode {
13100                kind: SyntaxKind::VariantList,
13101                details: GreenNodeDetails::Node {
13102                    children: [].into(),
13103                    width: TextWidth::default(),
13104                },
13105            })
13106            .intern(db),
13107        )
13108    }
13109    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
13110        Self(ElementList::new(node))
13111    }
13112    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
13113        if node.kind(db) == SyntaxKind::VariantList {
13114            Some(Self(ElementList::new(node)))
13115        } else {
13116            None
13117        }
13118    }
13119    fn as_syntax_node(&self) -> SyntaxNode {
13120        self.node
13121    }
13122    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
13123        VariantListPtr(self.node.stable_ptr(db))
13124    }
13125}
13126#[derive(Clone, Debug, Eq, Hash, PartialEq)]
13127pub enum ModuleItem {
13128    Constant(ItemConstant),
13129    Module(ItemModule),
13130    Use(ItemUse),
13131    FreeFunction(FunctionWithBody),
13132    ExternFunction(ItemExternFunction),
13133    ExternType(ItemExternType),
13134    Trait(ItemTrait),
13135    Impl(ItemImpl),
13136    ImplAlias(ItemImplAlias),
13137    Struct(ItemStruct),
13138    Enum(ItemEnum),
13139    TypeAlias(ItemTypeAlias),
13140    InlineMacro(ItemInlineMacro),
13141    MacroDeclaration(ItemMacroDeclaration),
13142    HeaderDoc(ItemHeaderDoc),
13143    Missing(ModuleItemMissing),
13144}
13145#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
13146pub struct ModuleItemPtr(pub SyntaxStablePtrId);
13147impl TypedStablePtr for ModuleItemPtr {
13148    type SyntaxNode = ModuleItem;
13149    fn untyped(&self) -> SyntaxStablePtrId {
13150        self.0
13151    }
13152    fn lookup(&self, db: &dyn SyntaxGroup) -> ModuleItem {
13153        ModuleItem::from_syntax_node(db, self.0.lookup(db))
13154    }
13155}
13156impl From<ModuleItemPtr> for SyntaxStablePtrId {
13157    fn from(ptr: ModuleItemPtr) -> Self {
13158        ptr.untyped()
13159    }
13160}
13161impl From<ItemConstantPtr> for ModuleItemPtr {
13162    fn from(value: ItemConstantPtr) -> Self {
13163        Self(value.0)
13164    }
13165}
13166impl From<ItemModulePtr> for ModuleItemPtr {
13167    fn from(value: ItemModulePtr) -> Self {
13168        Self(value.0)
13169    }
13170}
13171impl From<ItemUsePtr> for ModuleItemPtr {
13172    fn from(value: ItemUsePtr) -> Self {
13173        Self(value.0)
13174    }
13175}
13176impl From<FunctionWithBodyPtr> for ModuleItemPtr {
13177    fn from(value: FunctionWithBodyPtr) -> Self {
13178        Self(value.0)
13179    }
13180}
13181impl From<ItemExternFunctionPtr> for ModuleItemPtr {
13182    fn from(value: ItemExternFunctionPtr) -> Self {
13183        Self(value.0)
13184    }
13185}
13186impl From<ItemExternTypePtr> for ModuleItemPtr {
13187    fn from(value: ItemExternTypePtr) -> Self {
13188        Self(value.0)
13189    }
13190}
13191impl From<ItemTraitPtr> for ModuleItemPtr {
13192    fn from(value: ItemTraitPtr) -> Self {
13193        Self(value.0)
13194    }
13195}
13196impl From<ItemImplPtr> for ModuleItemPtr {
13197    fn from(value: ItemImplPtr) -> Self {
13198        Self(value.0)
13199    }
13200}
13201impl From<ItemImplAliasPtr> for ModuleItemPtr {
13202    fn from(value: ItemImplAliasPtr) -> Self {
13203        Self(value.0)
13204    }
13205}
13206impl From<ItemStructPtr> for ModuleItemPtr {
13207    fn from(value: ItemStructPtr) -> Self {
13208        Self(value.0)
13209    }
13210}
13211impl From<ItemEnumPtr> for ModuleItemPtr {
13212    fn from(value: ItemEnumPtr) -> Self {
13213        Self(value.0)
13214    }
13215}
13216impl From<ItemTypeAliasPtr> for ModuleItemPtr {
13217    fn from(value: ItemTypeAliasPtr) -> Self {
13218        Self(value.0)
13219    }
13220}
13221impl From<ItemInlineMacroPtr> for ModuleItemPtr {
13222    fn from(value: ItemInlineMacroPtr) -> Self {
13223        Self(value.0)
13224    }
13225}
13226impl From<ItemMacroDeclarationPtr> for ModuleItemPtr {
13227    fn from(value: ItemMacroDeclarationPtr) -> Self {
13228        Self(value.0)
13229    }
13230}
13231impl From<ItemHeaderDocPtr> for ModuleItemPtr {
13232    fn from(value: ItemHeaderDocPtr) -> Self {
13233        Self(value.0)
13234    }
13235}
13236impl From<ModuleItemMissingPtr> for ModuleItemPtr {
13237    fn from(value: ModuleItemMissingPtr) -> Self {
13238        Self(value.0)
13239    }
13240}
13241impl From<ItemConstantGreen> for ModuleItemGreen {
13242    fn from(value: ItemConstantGreen) -> Self {
13243        Self(value.0)
13244    }
13245}
13246impl From<ItemModuleGreen> for ModuleItemGreen {
13247    fn from(value: ItemModuleGreen) -> Self {
13248        Self(value.0)
13249    }
13250}
13251impl From<ItemUseGreen> for ModuleItemGreen {
13252    fn from(value: ItemUseGreen) -> Self {
13253        Self(value.0)
13254    }
13255}
13256impl From<FunctionWithBodyGreen> for ModuleItemGreen {
13257    fn from(value: FunctionWithBodyGreen) -> Self {
13258        Self(value.0)
13259    }
13260}
13261impl From<ItemExternFunctionGreen> for ModuleItemGreen {
13262    fn from(value: ItemExternFunctionGreen) -> Self {
13263        Self(value.0)
13264    }
13265}
13266impl From<ItemExternTypeGreen> for ModuleItemGreen {
13267    fn from(value: ItemExternTypeGreen) -> Self {
13268        Self(value.0)
13269    }
13270}
13271impl From<ItemTraitGreen> for ModuleItemGreen {
13272    fn from(value: ItemTraitGreen) -> Self {
13273        Self(value.0)
13274    }
13275}
13276impl From<ItemImplGreen> for ModuleItemGreen {
13277    fn from(value: ItemImplGreen) -> Self {
13278        Self(value.0)
13279    }
13280}
13281impl From<ItemImplAliasGreen> for ModuleItemGreen {
13282    fn from(value: ItemImplAliasGreen) -> Self {
13283        Self(value.0)
13284    }
13285}
13286impl From<ItemStructGreen> for ModuleItemGreen {
13287    fn from(value: ItemStructGreen) -> Self {
13288        Self(value.0)
13289    }
13290}
13291impl From<ItemEnumGreen> for ModuleItemGreen {
13292    fn from(value: ItemEnumGreen) -> Self {
13293        Self(value.0)
13294    }
13295}
13296impl From<ItemTypeAliasGreen> for ModuleItemGreen {
13297    fn from(value: ItemTypeAliasGreen) -> Self {
13298        Self(value.0)
13299    }
13300}
13301impl From<ItemInlineMacroGreen> for ModuleItemGreen {
13302    fn from(value: ItemInlineMacroGreen) -> Self {
13303        Self(value.0)
13304    }
13305}
13306impl From<ItemMacroDeclarationGreen> for ModuleItemGreen {
13307    fn from(value: ItemMacroDeclarationGreen) -> Self {
13308        Self(value.0)
13309    }
13310}
13311impl From<ItemHeaderDocGreen> for ModuleItemGreen {
13312    fn from(value: ItemHeaderDocGreen) -> Self {
13313        Self(value.0)
13314    }
13315}
13316impl From<ModuleItemMissingGreen> for ModuleItemGreen {
13317    fn from(value: ModuleItemMissingGreen) -> Self {
13318        Self(value.0)
13319    }
13320}
13321#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
13322pub struct ModuleItemGreen(pub GreenId);
13323impl TypedSyntaxNode for ModuleItem {
13324    const OPTIONAL_KIND: Option<SyntaxKind> = None;
13325    type StablePtr = ModuleItemPtr;
13326    type Green = ModuleItemGreen;
13327    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
13328        ModuleItemGreen(ModuleItemMissing::missing(db).0)
13329    }
13330    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
13331        let kind = node.kind(db);
13332        match kind {
13333            SyntaxKind::ItemConstant => {
13334                ModuleItem::Constant(ItemConstant::from_syntax_node(db, node))
13335            }
13336            SyntaxKind::ItemModule => ModuleItem::Module(ItemModule::from_syntax_node(db, node)),
13337            SyntaxKind::ItemUse => ModuleItem::Use(ItemUse::from_syntax_node(db, node)),
13338            SyntaxKind::FunctionWithBody => {
13339                ModuleItem::FreeFunction(FunctionWithBody::from_syntax_node(db, node))
13340            }
13341            SyntaxKind::ItemExternFunction => {
13342                ModuleItem::ExternFunction(ItemExternFunction::from_syntax_node(db, node))
13343            }
13344            SyntaxKind::ItemExternType => {
13345                ModuleItem::ExternType(ItemExternType::from_syntax_node(db, node))
13346            }
13347            SyntaxKind::ItemTrait => ModuleItem::Trait(ItemTrait::from_syntax_node(db, node)),
13348            SyntaxKind::ItemImpl => ModuleItem::Impl(ItemImpl::from_syntax_node(db, node)),
13349            SyntaxKind::ItemImplAlias => {
13350                ModuleItem::ImplAlias(ItemImplAlias::from_syntax_node(db, node))
13351            }
13352            SyntaxKind::ItemStruct => ModuleItem::Struct(ItemStruct::from_syntax_node(db, node)),
13353            SyntaxKind::ItemEnum => ModuleItem::Enum(ItemEnum::from_syntax_node(db, node)),
13354            SyntaxKind::ItemTypeAlias => {
13355                ModuleItem::TypeAlias(ItemTypeAlias::from_syntax_node(db, node))
13356            }
13357            SyntaxKind::ItemInlineMacro => {
13358                ModuleItem::InlineMacro(ItemInlineMacro::from_syntax_node(db, node))
13359            }
13360            SyntaxKind::ItemMacroDeclaration => {
13361                ModuleItem::MacroDeclaration(ItemMacroDeclaration::from_syntax_node(db, node))
13362            }
13363            SyntaxKind::ItemHeaderDoc => {
13364                ModuleItem::HeaderDoc(ItemHeaderDoc::from_syntax_node(db, node))
13365            }
13366            SyntaxKind::ModuleItemMissing => {
13367                ModuleItem::Missing(ModuleItemMissing::from_syntax_node(db, node))
13368            }
13369            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "ModuleItem"),
13370        }
13371    }
13372    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
13373        let kind = node.kind(db);
13374        match kind {
13375            SyntaxKind::ItemConstant => {
13376                Some(ModuleItem::Constant(ItemConstant::from_syntax_node(db, node)))
13377            }
13378            SyntaxKind::ItemModule => {
13379                Some(ModuleItem::Module(ItemModule::from_syntax_node(db, node)))
13380            }
13381            SyntaxKind::ItemUse => Some(ModuleItem::Use(ItemUse::from_syntax_node(db, node))),
13382            SyntaxKind::FunctionWithBody => {
13383                Some(ModuleItem::FreeFunction(FunctionWithBody::from_syntax_node(db, node)))
13384            }
13385            SyntaxKind::ItemExternFunction => {
13386                Some(ModuleItem::ExternFunction(ItemExternFunction::from_syntax_node(db, node)))
13387            }
13388            SyntaxKind::ItemExternType => {
13389                Some(ModuleItem::ExternType(ItemExternType::from_syntax_node(db, node)))
13390            }
13391            SyntaxKind::ItemTrait => Some(ModuleItem::Trait(ItemTrait::from_syntax_node(db, node))),
13392            SyntaxKind::ItemImpl => Some(ModuleItem::Impl(ItemImpl::from_syntax_node(db, node))),
13393            SyntaxKind::ItemImplAlias => {
13394                Some(ModuleItem::ImplAlias(ItemImplAlias::from_syntax_node(db, node)))
13395            }
13396            SyntaxKind::ItemStruct => {
13397                Some(ModuleItem::Struct(ItemStruct::from_syntax_node(db, node)))
13398            }
13399            SyntaxKind::ItemEnum => Some(ModuleItem::Enum(ItemEnum::from_syntax_node(db, node))),
13400            SyntaxKind::ItemTypeAlias => {
13401                Some(ModuleItem::TypeAlias(ItemTypeAlias::from_syntax_node(db, node)))
13402            }
13403            SyntaxKind::ItemInlineMacro => {
13404                Some(ModuleItem::InlineMacro(ItemInlineMacro::from_syntax_node(db, node)))
13405            }
13406            SyntaxKind::ItemMacroDeclaration => {
13407                Some(ModuleItem::MacroDeclaration(ItemMacroDeclaration::from_syntax_node(db, node)))
13408            }
13409            SyntaxKind::ItemHeaderDoc => {
13410                Some(ModuleItem::HeaderDoc(ItemHeaderDoc::from_syntax_node(db, node)))
13411            }
13412            SyntaxKind::ModuleItemMissing => {
13413                Some(ModuleItem::Missing(ModuleItemMissing::from_syntax_node(db, node)))
13414            }
13415            _ => None,
13416        }
13417    }
13418    fn as_syntax_node(&self) -> SyntaxNode {
13419        match self {
13420            ModuleItem::Constant(x) => x.as_syntax_node(),
13421            ModuleItem::Module(x) => x.as_syntax_node(),
13422            ModuleItem::Use(x) => x.as_syntax_node(),
13423            ModuleItem::FreeFunction(x) => x.as_syntax_node(),
13424            ModuleItem::ExternFunction(x) => x.as_syntax_node(),
13425            ModuleItem::ExternType(x) => x.as_syntax_node(),
13426            ModuleItem::Trait(x) => x.as_syntax_node(),
13427            ModuleItem::Impl(x) => x.as_syntax_node(),
13428            ModuleItem::ImplAlias(x) => x.as_syntax_node(),
13429            ModuleItem::Struct(x) => x.as_syntax_node(),
13430            ModuleItem::Enum(x) => x.as_syntax_node(),
13431            ModuleItem::TypeAlias(x) => x.as_syntax_node(),
13432            ModuleItem::InlineMacro(x) => x.as_syntax_node(),
13433            ModuleItem::MacroDeclaration(x) => x.as_syntax_node(),
13434            ModuleItem::HeaderDoc(x) => x.as_syntax_node(),
13435            ModuleItem::Missing(x) => x.as_syntax_node(),
13436        }
13437    }
13438    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
13439        ModuleItemPtr(self.as_syntax_node().lookup_intern(db).stable_ptr)
13440    }
13441}
13442impl ModuleItem {
13443    /// Checks if a kind of a variant of [ModuleItem].
13444    pub fn is_variant(kind: SyntaxKind) -> bool {
13445        matches!(
13446            kind,
13447            SyntaxKind::ItemConstant
13448                | SyntaxKind::ItemModule
13449                | SyntaxKind::ItemUse
13450                | SyntaxKind::FunctionWithBody
13451                | SyntaxKind::ItemExternFunction
13452                | SyntaxKind::ItemExternType
13453                | SyntaxKind::ItemTrait
13454                | SyntaxKind::ItemImpl
13455                | SyntaxKind::ItemImplAlias
13456                | SyntaxKind::ItemStruct
13457                | SyntaxKind::ItemEnum
13458                | SyntaxKind::ItemTypeAlias
13459                | SyntaxKind::ItemInlineMacro
13460                | SyntaxKind::ItemMacroDeclaration
13461                | SyntaxKind::ItemHeaderDoc
13462                | SyntaxKind::ModuleItemMissing
13463        )
13464    }
13465}
13466#[derive(Clone, Debug, Eq, Hash, PartialEq)]
13467pub struct ModuleItemList(ElementList<ModuleItem, 1>);
13468impl Deref for ModuleItemList {
13469    type Target = ElementList<ModuleItem, 1>;
13470    fn deref(&self) -> &Self::Target {
13471        &self.0
13472    }
13473}
13474impl ModuleItemList {
13475    pub fn new_green(db: &dyn SyntaxGroup, children: &[ModuleItemGreen]) -> ModuleItemListGreen {
13476        let width = children.iter().map(|id| id.0.lookup_intern(db).width()).sum();
13477        ModuleItemListGreen(
13478            Arc::new(GreenNode {
13479                kind: SyntaxKind::ModuleItemList,
13480                details: GreenNodeDetails::Node {
13481                    children: children.iter().map(|x| x.0).collect(),
13482                    width,
13483                },
13484            })
13485            .intern(db),
13486        )
13487    }
13488}
13489#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
13490pub struct ModuleItemListPtr(pub SyntaxStablePtrId);
13491impl TypedStablePtr for ModuleItemListPtr {
13492    type SyntaxNode = ModuleItemList;
13493    fn untyped(&self) -> SyntaxStablePtrId {
13494        self.0
13495    }
13496    fn lookup(&self, db: &dyn SyntaxGroup) -> ModuleItemList {
13497        ModuleItemList::from_syntax_node(db, self.0.lookup(db))
13498    }
13499}
13500impl From<ModuleItemListPtr> for SyntaxStablePtrId {
13501    fn from(ptr: ModuleItemListPtr) -> Self {
13502        ptr.untyped()
13503    }
13504}
13505#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
13506pub struct ModuleItemListGreen(pub GreenId);
13507impl TypedSyntaxNode for ModuleItemList {
13508    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ModuleItemList);
13509    type StablePtr = ModuleItemListPtr;
13510    type Green = ModuleItemListGreen;
13511    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
13512        ModuleItemListGreen(
13513            Arc::new(GreenNode {
13514                kind: SyntaxKind::ModuleItemList,
13515                details: GreenNodeDetails::Node {
13516                    children: [].into(),
13517                    width: TextWidth::default(),
13518                },
13519            })
13520            .intern(db),
13521        )
13522    }
13523    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
13524        Self(ElementList::new(node))
13525    }
13526    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
13527        if node.kind(db) == SyntaxKind::ModuleItemList {
13528            Some(Self(ElementList::new(node)))
13529        } else {
13530            None
13531        }
13532    }
13533    fn as_syntax_node(&self) -> SyntaxNode {
13534        self.node
13535    }
13536    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
13537        ModuleItemListPtr(self.node.stable_ptr(db))
13538    }
13539}
13540#[derive(Clone, Debug, Eq, Hash, PartialEq)]
13541pub struct ModuleItemMissing {
13542    node: SyntaxNode,
13543}
13544impl ModuleItemMissing {
13545    pub fn new_green(db: &dyn SyntaxGroup) -> ModuleItemMissingGreen {
13546        let children = [];
13547        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
13548        ModuleItemMissingGreen(
13549            Arc::new(GreenNode {
13550                kind: SyntaxKind::ModuleItemMissing,
13551                details: GreenNodeDetails::Node { children: children.into(), width },
13552            })
13553            .intern(db),
13554        )
13555    }
13556}
13557impl ModuleItemMissing {}
13558#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
13559pub struct ModuleItemMissingPtr(pub SyntaxStablePtrId);
13560impl ModuleItemMissingPtr {}
13561impl TypedStablePtr for ModuleItemMissingPtr {
13562    type SyntaxNode = ModuleItemMissing;
13563    fn untyped(&self) -> SyntaxStablePtrId {
13564        self.0
13565    }
13566    fn lookup(&self, db: &dyn SyntaxGroup) -> ModuleItemMissing {
13567        ModuleItemMissing::from_syntax_node(db, self.0.lookup(db))
13568    }
13569}
13570impl From<ModuleItemMissingPtr> for SyntaxStablePtrId {
13571    fn from(ptr: ModuleItemMissingPtr) -> Self {
13572        ptr.untyped()
13573    }
13574}
13575#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
13576pub struct ModuleItemMissingGreen(pub GreenId);
13577impl TypedSyntaxNode for ModuleItemMissing {
13578    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ModuleItemMissing);
13579    type StablePtr = ModuleItemMissingPtr;
13580    type Green = ModuleItemMissingGreen;
13581    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
13582        ModuleItemMissingGreen(
13583            Arc::new(GreenNode {
13584                kind: SyntaxKind::ModuleItemMissing,
13585                details: GreenNodeDetails::Node {
13586                    children: [].into(),
13587                    width: TextWidth::default(),
13588                },
13589            })
13590            .intern(db),
13591        )
13592    }
13593    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
13594        let kind = node.kind(db);
13595        assert_eq!(
13596            kind,
13597            SyntaxKind::ModuleItemMissing,
13598            "Unexpected SyntaxKind {:?}. Expected {:?}.",
13599            kind,
13600            SyntaxKind::ModuleItemMissing
13601        );
13602        Self { node }
13603    }
13604    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
13605        let kind = node.kind(db);
13606        if kind == SyntaxKind::ModuleItemMissing {
13607            Some(Self::from_syntax_node(db, node))
13608        } else {
13609            None
13610        }
13611    }
13612    fn as_syntax_node(&self) -> SyntaxNode {
13613        self.node
13614    }
13615    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
13616        ModuleItemMissingPtr(self.node.stable_ptr(db))
13617    }
13618}
13619#[derive(Clone, Debug, Eq, Hash, PartialEq)]
13620pub struct Attribute {
13621    node: SyntaxNode,
13622}
13623impl Attribute {
13624    pub const INDEX_HASH: usize = 0;
13625    pub const INDEX_LBRACK: usize = 1;
13626    pub const INDEX_ATTR: usize = 2;
13627    pub const INDEX_ARGUMENTS: usize = 3;
13628    pub const INDEX_RBRACK: usize = 4;
13629    pub fn new_green(
13630        db: &dyn SyntaxGroup,
13631        hash: TerminalHashGreen,
13632        lbrack: TerminalLBrackGreen,
13633        attr: ExprPathGreen,
13634        arguments: OptionArgListParenthesizedGreen,
13635        rbrack: TerminalRBrackGreen,
13636    ) -> AttributeGreen {
13637        let children = [hash.0, lbrack.0, attr.0, arguments.0, rbrack.0];
13638        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
13639        AttributeGreen(
13640            Arc::new(GreenNode {
13641                kind: SyntaxKind::Attribute,
13642                details: GreenNodeDetails::Node { children: children.into(), width },
13643            })
13644            .intern(db),
13645        )
13646    }
13647}
13648impl Attribute {
13649    pub fn hash(&self, db: &dyn SyntaxGroup) -> TerminalHash {
13650        TerminalHash::from_syntax_node(db, self.node.get_children(db)[0])
13651    }
13652    pub fn lbrack(&self, db: &dyn SyntaxGroup) -> TerminalLBrack {
13653        TerminalLBrack::from_syntax_node(db, self.node.get_children(db)[1])
13654    }
13655    pub fn attr(&self, db: &dyn SyntaxGroup) -> ExprPath {
13656        ExprPath::from_syntax_node(db, self.node.get_children(db)[2])
13657    }
13658    pub fn arguments(&self, db: &dyn SyntaxGroup) -> OptionArgListParenthesized {
13659        OptionArgListParenthesized::from_syntax_node(db, self.node.get_children(db)[3])
13660    }
13661    pub fn rbrack(&self, db: &dyn SyntaxGroup) -> TerminalRBrack {
13662        TerminalRBrack::from_syntax_node(db, self.node.get_children(db)[4])
13663    }
13664}
13665#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
13666pub struct AttributePtr(pub SyntaxStablePtrId);
13667impl AttributePtr {}
13668impl TypedStablePtr for AttributePtr {
13669    type SyntaxNode = Attribute;
13670    fn untyped(&self) -> SyntaxStablePtrId {
13671        self.0
13672    }
13673    fn lookup(&self, db: &dyn SyntaxGroup) -> Attribute {
13674        Attribute::from_syntax_node(db, self.0.lookup(db))
13675    }
13676}
13677impl From<AttributePtr> for SyntaxStablePtrId {
13678    fn from(ptr: AttributePtr) -> Self {
13679        ptr.untyped()
13680    }
13681}
13682#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
13683pub struct AttributeGreen(pub GreenId);
13684impl TypedSyntaxNode for Attribute {
13685    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::Attribute);
13686    type StablePtr = AttributePtr;
13687    type Green = AttributeGreen;
13688    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
13689        AttributeGreen(
13690            Arc::new(GreenNode {
13691                kind: SyntaxKind::Attribute,
13692                details: GreenNodeDetails::Node {
13693                    children: [
13694                        TerminalHash::missing(db).0,
13695                        TerminalLBrack::missing(db).0,
13696                        ExprPath::missing(db).0,
13697                        OptionArgListParenthesized::missing(db).0,
13698                        TerminalRBrack::missing(db).0,
13699                    ]
13700                    .into(),
13701                    width: TextWidth::default(),
13702                },
13703            })
13704            .intern(db),
13705        )
13706    }
13707    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
13708        let kind = node.kind(db);
13709        assert_eq!(
13710            kind,
13711            SyntaxKind::Attribute,
13712            "Unexpected SyntaxKind {:?}. Expected {:?}.",
13713            kind,
13714            SyntaxKind::Attribute
13715        );
13716        Self { node }
13717    }
13718    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
13719        let kind = node.kind(db);
13720        if kind == SyntaxKind::Attribute { Some(Self::from_syntax_node(db, node)) } else { None }
13721    }
13722    fn as_syntax_node(&self) -> SyntaxNode {
13723        self.node
13724    }
13725    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
13726        AttributePtr(self.node.stable_ptr(db))
13727    }
13728}
13729#[derive(Clone, Debug, Eq, Hash, PartialEq)]
13730pub struct AttributeList(ElementList<Attribute, 1>);
13731impl Deref for AttributeList {
13732    type Target = ElementList<Attribute, 1>;
13733    fn deref(&self) -> &Self::Target {
13734        &self.0
13735    }
13736}
13737impl AttributeList {
13738    pub fn new_green(db: &dyn SyntaxGroup, children: &[AttributeGreen]) -> AttributeListGreen {
13739        let width = children.iter().map(|id| id.0.lookup_intern(db).width()).sum();
13740        AttributeListGreen(
13741            Arc::new(GreenNode {
13742                kind: SyntaxKind::AttributeList,
13743                details: GreenNodeDetails::Node {
13744                    children: children.iter().map(|x| x.0).collect(),
13745                    width,
13746                },
13747            })
13748            .intern(db),
13749        )
13750    }
13751}
13752#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
13753pub struct AttributeListPtr(pub SyntaxStablePtrId);
13754impl TypedStablePtr for AttributeListPtr {
13755    type SyntaxNode = AttributeList;
13756    fn untyped(&self) -> SyntaxStablePtrId {
13757        self.0
13758    }
13759    fn lookup(&self, db: &dyn SyntaxGroup) -> AttributeList {
13760        AttributeList::from_syntax_node(db, self.0.lookup(db))
13761    }
13762}
13763impl From<AttributeListPtr> for SyntaxStablePtrId {
13764    fn from(ptr: AttributeListPtr) -> Self {
13765        ptr.untyped()
13766    }
13767}
13768#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
13769pub struct AttributeListGreen(pub GreenId);
13770impl TypedSyntaxNode for AttributeList {
13771    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::AttributeList);
13772    type StablePtr = AttributeListPtr;
13773    type Green = AttributeListGreen;
13774    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
13775        AttributeListGreen(
13776            Arc::new(GreenNode {
13777                kind: SyntaxKind::AttributeList,
13778                details: GreenNodeDetails::Node {
13779                    children: [].into(),
13780                    width: TextWidth::default(),
13781                },
13782            })
13783            .intern(db),
13784        )
13785    }
13786    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
13787        Self(ElementList::new(node))
13788    }
13789    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
13790        if node.kind(db) == SyntaxKind::AttributeList {
13791            Some(Self(ElementList::new(node)))
13792        } else {
13793            None
13794        }
13795    }
13796    fn as_syntax_node(&self) -> SyntaxNode {
13797        self.node
13798    }
13799    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
13800        AttributeListPtr(self.node.stable_ptr(db))
13801    }
13802}
13803#[derive(Clone, Debug, Eq, Hash, PartialEq)]
13804pub struct VisibilityDefault {
13805    node: SyntaxNode,
13806}
13807impl VisibilityDefault {
13808    pub fn new_green(db: &dyn SyntaxGroup) -> VisibilityDefaultGreen {
13809        let children = [];
13810        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
13811        VisibilityDefaultGreen(
13812            Arc::new(GreenNode {
13813                kind: SyntaxKind::VisibilityDefault,
13814                details: GreenNodeDetails::Node { children: children.into(), width },
13815            })
13816            .intern(db),
13817        )
13818    }
13819}
13820impl VisibilityDefault {}
13821#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
13822pub struct VisibilityDefaultPtr(pub SyntaxStablePtrId);
13823impl VisibilityDefaultPtr {}
13824impl TypedStablePtr for VisibilityDefaultPtr {
13825    type SyntaxNode = VisibilityDefault;
13826    fn untyped(&self) -> SyntaxStablePtrId {
13827        self.0
13828    }
13829    fn lookup(&self, db: &dyn SyntaxGroup) -> VisibilityDefault {
13830        VisibilityDefault::from_syntax_node(db, self.0.lookup(db))
13831    }
13832}
13833impl From<VisibilityDefaultPtr> for SyntaxStablePtrId {
13834    fn from(ptr: VisibilityDefaultPtr) -> Self {
13835        ptr.untyped()
13836    }
13837}
13838#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
13839pub struct VisibilityDefaultGreen(pub GreenId);
13840impl TypedSyntaxNode for VisibilityDefault {
13841    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::VisibilityDefault);
13842    type StablePtr = VisibilityDefaultPtr;
13843    type Green = VisibilityDefaultGreen;
13844    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
13845        VisibilityDefaultGreen(
13846            Arc::new(GreenNode {
13847                kind: SyntaxKind::VisibilityDefault,
13848                details: GreenNodeDetails::Node {
13849                    children: [].into(),
13850                    width: TextWidth::default(),
13851                },
13852            })
13853            .intern(db),
13854        )
13855    }
13856    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
13857        let kind = node.kind(db);
13858        assert_eq!(
13859            kind,
13860            SyntaxKind::VisibilityDefault,
13861            "Unexpected SyntaxKind {:?}. Expected {:?}.",
13862            kind,
13863            SyntaxKind::VisibilityDefault
13864        );
13865        Self { node }
13866    }
13867    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
13868        let kind = node.kind(db);
13869        if kind == SyntaxKind::VisibilityDefault {
13870            Some(Self::from_syntax_node(db, node))
13871        } else {
13872            None
13873        }
13874    }
13875    fn as_syntax_node(&self) -> SyntaxNode {
13876        self.node
13877    }
13878    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
13879        VisibilityDefaultPtr(self.node.stable_ptr(db))
13880    }
13881}
13882#[derive(Clone, Debug, Eq, Hash, PartialEq)]
13883pub struct VisibilityPubArgumentClause {
13884    node: SyntaxNode,
13885}
13886impl VisibilityPubArgumentClause {
13887    pub const INDEX_LPAREN: usize = 0;
13888    pub const INDEX_ARGUMENT: usize = 1;
13889    pub const INDEX_RPAREN: usize = 2;
13890    pub fn new_green(
13891        db: &dyn SyntaxGroup,
13892        lparen: TerminalLParenGreen,
13893        argument: TerminalIdentifierGreen,
13894        rparen: TerminalRParenGreen,
13895    ) -> VisibilityPubArgumentClauseGreen {
13896        let children = [lparen.0, argument.0, rparen.0];
13897        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
13898        VisibilityPubArgumentClauseGreen(
13899            Arc::new(GreenNode {
13900                kind: SyntaxKind::VisibilityPubArgumentClause,
13901                details: GreenNodeDetails::Node { children: children.into(), width },
13902            })
13903            .intern(db),
13904        )
13905    }
13906}
13907impl VisibilityPubArgumentClause {
13908    pub fn lparen(&self, db: &dyn SyntaxGroup) -> TerminalLParen {
13909        TerminalLParen::from_syntax_node(db, self.node.get_children(db)[0])
13910    }
13911    pub fn argument(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier {
13912        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[1])
13913    }
13914    pub fn rparen(&self, db: &dyn SyntaxGroup) -> TerminalRParen {
13915        TerminalRParen::from_syntax_node(db, self.node.get_children(db)[2])
13916    }
13917}
13918#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
13919pub struct VisibilityPubArgumentClausePtr(pub SyntaxStablePtrId);
13920impl VisibilityPubArgumentClausePtr {}
13921impl TypedStablePtr for VisibilityPubArgumentClausePtr {
13922    type SyntaxNode = VisibilityPubArgumentClause;
13923    fn untyped(&self) -> SyntaxStablePtrId {
13924        self.0
13925    }
13926    fn lookup(&self, db: &dyn SyntaxGroup) -> VisibilityPubArgumentClause {
13927        VisibilityPubArgumentClause::from_syntax_node(db, self.0.lookup(db))
13928    }
13929}
13930impl From<VisibilityPubArgumentClausePtr> for SyntaxStablePtrId {
13931    fn from(ptr: VisibilityPubArgumentClausePtr) -> Self {
13932        ptr.untyped()
13933    }
13934}
13935#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
13936pub struct VisibilityPubArgumentClauseGreen(pub GreenId);
13937impl TypedSyntaxNode for VisibilityPubArgumentClause {
13938    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::VisibilityPubArgumentClause);
13939    type StablePtr = VisibilityPubArgumentClausePtr;
13940    type Green = VisibilityPubArgumentClauseGreen;
13941    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
13942        VisibilityPubArgumentClauseGreen(
13943            Arc::new(GreenNode {
13944                kind: SyntaxKind::VisibilityPubArgumentClause,
13945                details: GreenNodeDetails::Node {
13946                    children: [
13947                        TerminalLParen::missing(db).0,
13948                        TerminalIdentifier::missing(db).0,
13949                        TerminalRParen::missing(db).0,
13950                    ]
13951                    .into(),
13952                    width: TextWidth::default(),
13953                },
13954            })
13955            .intern(db),
13956        )
13957    }
13958    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
13959        let kind = node.kind(db);
13960        assert_eq!(
13961            kind,
13962            SyntaxKind::VisibilityPubArgumentClause,
13963            "Unexpected SyntaxKind {:?}. Expected {:?}.",
13964            kind,
13965            SyntaxKind::VisibilityPubArgumentClause
13966        );
13967        Self { node }
13968    }
13969    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
13970        let kind = node.kind(db);
13971        if kind == SyntaxKind::VisibilityPubArgumentClause {
13972            Some(Self::from_syntax_node(db, node))
13973        } else {
13974            None
13975        }
13976    }
13977    fn as_syntax_node(&self) -> SyntaxNode {
13978        self.node
13979    }
13980    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
13981        VisibilityPubArgumentClausePtr(self.node.stable_ptr(db))
13982    }
13983}
13984#[derive(Clone, Debug, Eq, Hash, PartialEq)]
13985pub enum OptionVisibilityPubArgumentClause {
13986    Empty(OptionVisibilityPubArgumentClauseEmpty),
13987    VisibilityPubArgumentClause(VisibilityPubArgumentClause),
13988}
13989#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
13990pub struct OptionVisibilityPubArgumentClausePtr(pub SyntaxStablePtrId);
13991impl TypedStablePtr for OptionVisibilityPubArgumentClausePtr {
13992    type SyntaxNode = OptionVisibilityPubArgumentClause;
13993    fn untyped(&self) -> SyntaxStablePtrId {
13994        self.0
13995    }
13996    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionVisibilityPubArgumentClause {
13997        OptionVisibilityPubArgumentClause::from_syntax_node(db, self.0.lookup(db))
13998    }
13999}
14000impl From<OptionVisibilityPubArgumentClausePtr> for SyntaxStablePtrId {
14001    fn from(ptr: OptionVisibilityPubArgumentClausePtr) -> Self {
14002        ptr.untyped()
14003    }
14004}
14005impl From<OptionVisibilityPubArgumentClauseEmptyPtr> for OptionVisibilityPubArgumentClausePtr {
14006    fn from(value: OptionVisibilityPubArgumentClauseEmptyPtr) -> Self {
14007        Self(value.0)
14008    }
14009}
14010impl From<VisibilityPubArgumentClausePtr> for OptionVisibilityPubArgumentClausePtr {
14011    fn from(value: VisibilityPubArgumentClausePtr) -> Self {
14012        Self(value.0)
14013    }
14014}
14015impl From<OptionVisibilityPubArgumentClauseEmptyGreen> for OptionVisibilityPubArgumentClauseGreen {
14016    fn from(value: OptionVisibilityPubArgumentClauseEmptyGreen) -> Self {
14017        Self(value.0)
14018    }
14019}
14020impl From<VisibilityPubArgumentClauseGreen> for OptionVisibilityPubArgumentClauseGreen {
14021    fn from(value: VisibilityPubArgumentClauseGreen) -> Self {
14022        Self(value.0)
14023    }
14024}
14025#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
14026pub struct OptionVisibilityPubArgumentClauseGreen(pub GreenId);
14027impl TypedSyntaxNode for OptionVisibilityPubArgumentClause {
14028    const OPTIONAL_KIND: Option<SyntaxKind> = None;
14029    type StablePtr = OptionVisibilityPubArgumentClausePtr;
14030    type Green = OptionVisibilityPubArgumentClauseGreen;
14031    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
14032        panic!("No missing variant.");
14033    }
14034    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
14035        let kind = node.kind(db);
14036        match kind {
14037            SyntaxKind::OptionVisibilityPubArgumentClauseEmpty => {
14038                OptionVisibilityPubArgumentClause::Empty(
14039                    OptionVisibilityPubArgumentClauseEmpty::from_syntax_node(db, node),
14040                )
14041            }
14042            SyntaxKind::VisibilityPubArgumentClause => {
14043                OptionVisibilityPubArgumentClause::VisibilityPubArgumentClause(
14044                    VisibilityPubArgumentClause::from_syntax_node(db, node),
14045                )
14046            }
14047            _ => panic!(
14048                "Unexpected syntax kind {:?} when constructing {}.",
14049                kind, "OptionVisibilityPubArgumentClause"
14050            ),
14051        }
14052    }
14053    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
14054        let kind = node.kind(db);
14055        match kind {
14056            SyntaxKind::OptionVisibilityPubArgumentClauseEmpty => {
14057                Some(OptionVisibilityPubArgumentClause::Empty(
14058                    OptionVisibilityPubArgumentClauseEmpty::from_syntax_node(db, node),
14059                ))
14060            }
14061            SyntaxKind::VisibilityPubArgumentClause => {
14062                Some(OptionVisibilityPubArgumentClause::VisibilityPubArgumentClause(
14063                    VisibilityPubArgumentClause::from_syntax_node(db, node),
14064                ))
14065            }
14066            _ => None,
14067        }
14068    }
14069    fn as_syntax_node(&self) -> SyntaxNode {
14070        match self {
14071            OptionVisibilityPubArgumentClause::Empty(x) => x.as_syntax_node(),
14072            OptionVisibilityPubArgumentClause::VisibilityPubArgumentClause(x) => x.as_syntax_node(),
14073        }
14074    }
14075    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
14076        OptionVisibilityPubArgumentClausePtr(self.as_syntax_node().lookup_intern(db).stable_ptr)
14077    }
14078}
14079impl OptionVisibilityPubArgumentClause {
14080    /// Checks if a kind of a variant of [OptionVisibilityPubArgumentClause].
14081    pub fn is_variant(kind: SyntaxKind) -> bool {
14082        matches!(
14083            kind,
14084            SyntaxKind::OptionVisibilityPubArgumentClauseEmpty
14085                | SyntaxKind::VisibilityPubArgumentClause
14086        )
14087    }
14088}
14089#[derive(Clone, Debug, Eq, Hash, PartialEq)]
14090pub struct OptionVisibilityPubArgumentClauseEmpty {
14091    node: SyntaxNode,
14092}
14093impl OptionVisibilityPubArgumentClauseEmpty {
14094    pub fn new_green(db: &dyn SyntaxGroup) -> OptionVisibilityPubArgumentClauseEmptyGreen {
14095        let children = [];
14096        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
14097        OptionVisibilityPubArgumentClauseEmptyGreen(
14098            Arc::new(GreenNode {
14099                kind: SyntaxKind::OptionVisibilityPubArgumentClauseEmpty,
14100                details: GreenNodeDetails::Node { children: children.into(), width },
14101            })
14102            .intern(db),
14103        )
14104    }
14105}
14106impl OptionVisibilityPubArgumentClauseEmpty {}
14107#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
14108pub struct OptionVisibilityPubArgumentClauseEmptyPtr(pub SyntaxStablePtrId);
14109impl OptionVisibilityPubArgumentClauseEmptyPtr {}
14110impl TypedStablePtr for OptionVisibilityPubArgumentClauseEmptyPtr {
14111    type SyntaxNode = OptionVisibilityPubArgumentClauseEmpty;
14112    fn untyped(&self) -> SyntaxStablePtrId {
14113        self.0
14114    }
14115    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionVisibilityPubArgumentClauseEmpty {
14116        OptionVisibilityPubArgumentClauseEmpty::from_syntax_node(db, self.0.lookup(db))
14117    }
14118}
14119impl From<OptionVisibilityPubArgumentClauseEmptyPtr> for SyntaxStablePtrId {
14120    fn from(ptr: OptionVisibilityPubArgumentClauseEmptyPtr) -> Self {
14121        ptr.untyped()
14122    }
14123}
14124#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
14125pub struct OptionVisibilityPubArgumentClauseEmptyGreen(pub GreenId);
14126impl TypedSyntaxNode for OptionVisibilityPubArgumentClauseEmpty {
14127    const OPTIONAL_KIND: Option<SyntaxKind> =
14128        Some(SyntaxKind::OptionVisibilityPubArgumentClauseEmpty);
14129    type StablePtr = OptionVisibilityPubArgumentClauseEmptyPtr;
14130    type Green = OptionVisibilityPubArgumentClauseEmptyGreen;
14131    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
14132        OptionVisibilityPubArgumentClauseEmptyGreen(
14133            Arc::new(GreenNode {
14134                kind: SyntaxKind::OptionVisibilityPubArgumentClauseEmpty,
14135                details: GreenNodeDetails::Node {
14136                    children: [].into(),
14137                    width: TextWidth::default(),
14138                },
14139            })
14140            .intern(db),
14141        )
14142    }
14143    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
14144        let kind = node.kind(db);
14145        assert_eq!(
14146            kind,
14147            SyntaxKind::OptionVisibilityPubArgumentClauseEmpty,
14148            "Unexpected SyntaxKind {:?}. Expected {:?}.",
14149            kind,
14150            SyntaxKind::OptionVisibilityPubArgumentClauseEmpty
14151        );
14152        Self { node }
14153    }
14154    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
14155        let kind = node.kind(db);
14156        if kind == SyntaxKind::OptionVisibilityPubArgumentClauseEmpty {
14157            Some(Self::from_syntax_node(db, node))
14158        } else {
14159            None
14160        }
14161    }
14162    fn as_syntax_node(&self) -> SyntaxNode {
14163        self.node
14164    }
14165    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
14166        OptionVisibilityPubArgumentClauseEmptyPtr(self.node.stable_ptr(db))
14167    }
14168}
14169#[derive(Clone, Debug, Eq, Hash, PartialEq)]
14170pub struct VisibilityPub {
14171    node: SyntaxNode,
14172}
14173impl VisibilityPub {
14174    pub const INDEX_PUB_KW: usize = 0;
14175    pub const INDEX_ARGUMENT_CLAUSE: usize = 1;
14176    pub fn new_green(
14177        db: &dyn SyntaxGroup,
14178        pub_kw: TerminalPubGreen,
14179        argument_clause: OptionVisibilityPubArgumentClauseGreen,
14180    ) -> VisibilityPubGreen {
14181        let children = [pub_kw.0, argument_clause.0];
14182        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
14183        VisibilityPubGreen(
14184            Arc::new(GreenNode {
14185                kind: SyntaxKind::VisibilityPub,
14186                details: GreenNodeDetails::Node { children: children.into(), width },
14187            })
14188            .intern(db),
14189        )
14190    }
14191}
14192impl VisibilityPub {
14193    pub fn pub_kw(&self, db: &dyn SyntaxGroup) -> TerminalPub {
14194        TerminalPub::from_syntax_node(db, self.node.get_children(db)[0])
14195    }
14196    pub fn argument_clause(&self, db: &dyn SyntaxGroup) -> OptionVisibilityPubArgumentClause {
14197        OptionVisibilityPubArgumentClause::from_syntax_node(db, self.node.get_children(db)[1])
14198    }
14199}
14200#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
14201pub struct VisibilityPubPtr(pub SyntaxStablePtrId);
14202impl VisibilityPubPtr {}
14203impl TypedStablePtr for VisibilityPubPtr {
14204    type SyntaxNode = VisibilityPub;
14205    fn untyped(&self) -> SyntaxStablePtrId {
14206        self.0
14207    }
14208    fn lookup(&self, db: &dyn SyntaxGroup) -> VisibilityPub {
14209        VisibilityPub::from_syntax_node(db, self.0.lookup(db))
14210    }
14211}
14212impl From<VisibilityPubPtr> for SyntaxStablePtrId {
14213    fn from(ptr: VisibilityPubPtr) -> Self {
14214        ptr.untyped()
14215    }
14216}
14217#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
14218pub struct VisibilityPubGreen(pub GreenId);
14219impl TypedSyntaxNode for VisibilityPub {
14220    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::VisibilityPub);
14221    type StablePtr = VisibilityPubPtr;
14222    type Green = VisibilityPubGreen;
14223    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
14224        VisibilityPubGreen(
14225            Arc::new(GreenNode {
14226                kind: SyntaxKind::VisibilityPub,
14227                details: GreenNodeDetails::Node {
14228                    children: [
14229                        TerminalPub::missing(db).0,
14230                        OptionVisibilityPubArgumentClause::missing(db).0,
14231                    ]
14232                    .into(),
14233                    width: TextWidth::default(),
14234                },
14235            })
14236            .intern(db),
14237        )
14238    }
14239    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
14240        let kind = node.kind(db);
14241        assert_eq!(
14242            kind,
14243            SyntaxKind::VisibilityPub,
14244            "Unexpected SyntaxKind {:?}. Expected {:?}.",
14245            kind,
14246            SyntaxKind::VisibilityPub
14247        );
14248        Self { node }
14249    }
14250    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
14251        let kind = node.kind(db);
14252        if kind == SyntaxKind::VisibilityPub {
14253            Some(Self::from_syntax_node(db, node))
14254        } else {
14255            None
14256        }
14257    }
14258    fn as_syntax_node(&self) -> SyntaxNode {
14259        self.node
14260    }
14261    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
14262        VisibilityPubPtr(self.node.stable_ptr(db))
14263    }
14264}
14265#[derive(Clone, Debug, Eq, Hash, PartialEq)]
14266pub enum Visibility {
14267    Default(VisibilityDefault),
14268    Pub(VisibilityPub),
14269}
14270#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
14271pub struct VisibilityPtr(pub SyntaxStablePtrId);
14272impl TypedStablePtr for VisibilityPtr {
14273    type SyntaxNode = Visibility;
14274    fn untyped(&self) -> SyntaxStablePtrId {
14275        self.0
14276    }
14277    fn lookup(&self, db: &dyn SyntaxGroup) -> Visibility {
14278        Visibility::from_syntax_node(db, self.0.lookup(db))
14279    }
14280}
14281impl From<VisibilityPtr> for SyntaxStablePtrId {
14282    fn from(ptr: VisibilityPtr) -> Self {
14283        ptr.untyped()
14284    }
14285}
14286impl From<VisibilityDefaultPtr> for VisibilityPtr {
14287    fn from(value: VisibilityDefaultPtr) -> Self {
14288        Self(value.0)
14289    }
14290}
14291impl From<VisibilityPubPtr> for VisibilityPtr {
14292    fn from(value: VisibilityPubPtr) -> Self {
14293        Self(value.0)
14294    }
14295}
14296impl From<VisibilityDefaultGreen> for VisibilityGreen {
14297    fn from(value: VisibilityDefaultGreen) -> Self {
14298        Self(value.0)
14299    }
14300}
14301impl From<VisibilityPubGreen> for VisibilityGreen {
14302    fn from(value: VisibilityPubGreen) -> Self {
14303        Self(value.0)
14304    }
14305}
14306#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
14307pub struct VisibilityGreen(pub GreenId);
14308impl TypedSyntaxNode for Visibility {
14309    const OPTIONAL_KIND: Option<SyntaxKind> = None;
14310    type StablePtr = VisibilityPtr;
14311    type Green = VisibilityGreen;
14312    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
14313        panic!("No missing variant.");
14314    }
14315    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
14316        let kind = node.kind(db);
14317        match kind {
14318            SyntaxKind::VisibilityDefault => {
14319                Visibility::Default(VisibilityDefault::from_syntax_node(db, node))
14320            }
14321            SyntaxKind::VisibilityPub => Visibility::Pub(VisibilityPub::from_syntax_node(db, node)),
14322            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "Visibility"),
14323        }
14324    }
14325    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
14326        let kind = node.kind(db);
14327        match kind {
14328            SyntaxKind::VisibilityDefault => {
14329                Some(Visibility::Default(VisibilityDefault::from_syntax_node(db, node)))
14330            }
14331            SyntaxKind::VisibilityPub => {
14332                Some(Visibility::Pub(VisibilityPub::from_syntax_node(db, node)))
14333            }
14334            _ => None,
14335        }
14336    }
14337    fn as_syntax_node(&self) -> SyntaxNode {
14338        match self {
14339            Visibility::Default(x) => x.as_syntax_node(),
14340            Visibility::Pub(x) => x.as_syntax_node(),
14341        }
14342    }
14343    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
14344        VisibilityPtr(self.as_syntax_node().lookup_intern(db).stable_ptr)
14345    }
14346}
14347impl Visibility {
14348    /// Checks if a kind of a variant of [Visibility].
14349    pub fn is_variant(kind: SyntaxKind) -> bool {
14350        matches!(kind, SyntaxKind::VisibilityDefault | SyntaxKind::VisibilityPub)
14351    }
14352}
14353#[derive(Clone, Debug, Eq, Hash, PartialEq)]
14354pub struct ItemModule {
14355    node: SyntaxNode,
14356}
14357impl ItemModule {
14358    pub const INDEX_ATTRIBUTES: usize = 0;
14359    pub const INDEX_VISIBILITY: usize = 1;
14360    pub const INDEX_MODULE_KW: usize = 2;
14361    pub const INDEX_NAME: usize = 3;
14362    pub const INDEX_BODY: usize = 4;
14363    pub fn new_green(
14364        db: &dyn SyntaxGroup,
14365        attributes: AttributeListGreen,
14366        visibility: VisibilityGreen,
14367        module_kw: TerminalModuleGreen,
14368        name: TerminalIdentifierGreen,
14369        body: MaybeModuleBodyGreen,
14370    ) -> ItemModuleGreen {
14371        let children = [attributes.0, visibility.0, module_kw.0, name.0, body.0];
14372        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
14373        ItemModuleGreen(
14374            Arc::new(GreenNode {
14375                kind: SyntaxKind::ItemModule,
14376                details: GreenNodeDetails::Node { children: children.into(), width },
14377            })
14378            .intern(db),
14379        )
14380    }
14381}
14382impl ItemModule {
14383    pub fn attributes(&self, db: &dyn SyntaxGroup) -> AttributeList {
14384        AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
14385    }
14386    pub fn visibility(&self, db: &dyn SyntaxGroup) -> Visibility {
14387        Visibility::from_syntax_node(db, self.node.get_children(db)[1])
14388    }
14389    pub fn module_kw(&self, db: &dyn SyntaxGroup) -> TerminalModule {
14390        TerminalModule::from_syntax_node(db, self.node.get_children(db)[2])
14391    }
14392    pub fn name(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier {
14393        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[3])
14394    }
14395    pub fn body(&self, db: &dyn SyntaxGroup) -> MaybeModuleBody {
14396        MaybeModuleBody::from_syntax_node(db, self.node.get_children(db)[4])
14397    }
14398}
14399#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
14400pub struct ItemModulePtr(pub SyntaxStablePtrId);
14401impl ItemModulePtr {
14402    pub fn name_green(self, db: &dyn SyntaxGroup) -> TerminalIdentifierGreen {
14403        let ptr = self.0.lookup_intern(db);
14404        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
14405            TerminalIdentifierGreen(key_fields[0])
14406        } else {
14407            panic!("Unexpected key field query on root.");
14408        }
14409    }
14410}
14411impl TypedStablePtr for ItemModulePtr {
14412    type SyntaxNode = ItemModule;
14413    fn untyped(&self) -> SyntaxStablePtrId {
14414        self.0
14415    }
14416    fn lookup(&self, db: &dyn SyntaxGroup) -> ItemModule {
14417        ItemModule::from_syntax_node(db, self.0.lookup(db))
14418    }
14419}
14420impl From<ItemModulePtr> for SyntaxStablePtrId {
14421    fn from(ptr: ItemModulePtr) -> Self {
14422        ptr.untyped()
14423    }
14424}
14425#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
14426pub struct ItemModuleGreen(pub GreenId);
14427impl TypedSyntaxNode for ItemModule {
14428    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemModule);
14429    type StablePtr = ItemModulePtr;
14430    type Green = ItemModuleGreen;
14431    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
14432        ItemModuleGreen(
14433            Arc::new(GreenNode {
14434                kind: SyntaxKind::ItemModule,
14435                details: GreenNodeDetails::Node {
14436                    children: [
14437                        AttributeList::missing(db).0,
14438                        Visibility::missing(db).0,
14439                        TerminalModule::missing(db).0,
14440                        TerminalIdentifier::missing(db).0,
14441                        MaybeModuleBody::missing(db).0,
14442                    ]
14443                    .into(),
14444                    width: TextWidth::default(),
14445                },
14446            })
14447            .intern(db),
14448        )
14449    }
14450    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
14451        let kind = node.kind(db);
14452        assert_eq!(
14453            kind,
14454            SyntaxKind::ItemModule,
14455            "Unexpected SyntaxKind {:?}. Expected {:?}.",
14456            kind,
14457            SyntaxKind::ItemModule
14458        );
14459        Self { node }
14460    }
14461    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
14462        let kind = node.kind(db);
14463        if kind == SyntaxKind::ItemModule { Some(Self::from_syntax_node(db, node)) } else { None }
14464    }
14465    fn as_syntax_node(&self) -> SyntaxNode {
14466        self.node
14467    }
14468    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
14469        ItemModulePtr(self.node.stable_ptr(db))
14470    }
14471}
14472#[derive(Clone, Debug, Eq, Hash, PartialEq)]
14473pub enum MaybeModuleBody {
14474    Some(ModuleBody),
14475    None(TerminalSemicolon),
14476}
14477#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
14478pub struct MaybeModuleBodyPtr(pub SyntaxStablePtrId);
14479impl TypedStablePtr for MaybeModuleBodyPtr {
14480    type SyntaxNode = MaybeModuleBody;
14481    fn untyped(&self) -> SyntaxStablePtrId {
14482        self.0
14483    }
14484    fn lookup(&self, db: &dyn SyntaxGroup) -> MaybeModuleBody {
14485        MaybeModuleBody::from_syntax_node(db, self.0.lookup(db))
14486    }
14487}
14488impl From<MaybeModuleBodyPtr> for SyntaxStablePtrId {
14489    fn from(ptr: MaybeModuleBodyPtr) -> Self {
14490        ptr.untyped()
14491    }
14492}
14493impl From<ModuleBodyPtr> for MaybeModuleBodyPtr {
14494    fn from(value: ModuleBodyPtr) -> Self {
14495        Self(value.0)
14496    }
14497}
14498impl From<TerminalSemicolonPtr> for MaybeModuleBodyPtr {
14499    fn from(value: TerminalSemicolonPtr) -> Self {
14500        Self(value.0)
14501    }
14502}
14503impl From<ModuleBodyGreen> for MaybeModuleBodyGreen {
14504    fn from(value: ModuleBodyGreen) -> Self {
14505        Self(value.0)
14506    }
14507}
14508impl From<TerminalSemicolonGreen> for MaybeModuleBodyGreen {
14509    fn from(value: TerminalSemicolonGreen) -> Self {
14510        Self(value.0)
14511    }
14512}
14513#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
14514pub struct MaybeModuleBodyGreen(pub GreenId);
14515impl TypedSyntaxNode for MaybeModuleBody {
14516    const OPTIONAL_KIND: Option<SyntaxKind> = None;
14517    type StablePtr = MaybeModuleBodyPtr;
14518    type Green = MaybeModuleBodyGreen;
14519    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
14520        panic!("No missing variant.");
14521    }
14522    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
14523        let kind = node.kind(db);
14524        match kind {
14525            SyntaxKind::ModuleBody => MaybeModuleBody::Some(ModuleBody::from_syntax_node(db, node)),
14526            SyntaxKind::TerminalSemicolon => {
14527                MaybeModuleBody::None(TerminalSemicolon::from_syntax_node(db, node))
14528            }
14529            _ => {
14530                panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "MaybeModuleBody")
14531            }
14532        }
14533    }
14534    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
14535        let kind = node.kind(db);
14536        match kind {
14537            SyntaxKind::ModuleBody => {
14538                Some(MaybeModuleBody::Some(ModuleBody::from_syntax_node(db, node)))
14539            }
14540            SyntaxKind::TerminalSemicolon => {
14541                Some(MaybeModuleBody::None(TerminalSemicolon::from_syntax_node(db, node)))
14542            }
14543            _ => None,
14544        }
14545    }
14546    fn as_syntax_node(&self) -> SyntaxNode {
14547        match self {
14548            MaybeModuleBody::Some(x) => x.as_syntax_node(),
14549            MaybeModuleBody::None(x) => x.as_syntax_node(),
14550        }
14551    }
14552    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
14553        MaybeModuleBodyPtr(self.as_syntax_node().lookup_intern(db).stable_ptr)
14554    }
14555}
14556impl MaybeModuleBody {
14557    /// Checks if a kind of a variant of [MaybeModuleBody].
14558    pub fn is_variant(kind: SyntaxKind) -> bool {
14559        matches!(kind, SyntaxKind::ModuleBody | SyntaxKind::TerminalSemicolon)
14560    }
14561}
14562#[derive(Clone, Debug, Eq, Hash, PartialEq)]
14563pub struct ModuleBody {
14564    node: SyntaxNode,
14565}
14566impl ModuleBody {
14567    pub const INDEX_LBRACE: usize = 0;
14568    pub const INDEX_ITEMS: usize = 1;
14569    pub const INDEX_RBRACE: usize = 2;
14570    pub fn new_green(
14571        db: &dyn SyntaxGroup,
14572        lbrace: TerminalLBraceGreen,
14573        items: ModuleItemListGreen,
14574        rbrace: TerminalRBraceGreen,
14575    ) -> ModuleBodyGreen {
14576        let children = [lbrace.0, items.0, rbrace.0];
14577        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
14578        ModuleBodyGreen(
14579            Arc::new(GreenNode {
14580                kind: SyntaxKind::ModuleBody,
14581                details: GreenNodeDetails::Node { children: children.into(), width },
14582            })
14583            .intern(db),
14584        )
14585    }
14586}
14587impl ModuleBody {
14588    pub fn lbrace(&self, db: &dyn SyntaxGroup) -> TerminalLBrace {
14589        TerminalLBrace::from_syntax_node(db, self.node.get_children(db)[0])
14590    }
14591    pub fn items(&self, db: &dyn SyntaxGroup) -> ModuleItemList {
14592        ModuleItemList::from_syntax_node(db, self.node.get_children(db)[1])
14593    }
14594    pub fn rbrace(&self, db: &dyn SyntaxGroup) -> TerminalRBrace {
14595        TerminalRBrace::from_syntax_node(db, self.node.get_children(db)[2])
14596    }
14597}
14598#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
14599pub struct ModuleBodyPtr(pub SyntaxStablePtrId);
14600impl ModuleBodyPtr {}
14601impl TypedStablePtr for ModuleBodyPtr {
14602    type SyntaxNode = ModuleBody;
14603    fn untyped(&self) -> SyntaxStablePtrId {
14604        self.0
14605    }
14606    fn lookup(&self, db: &dyn SyntaxGroup) -> ModuleBody {
14607        ModuleBody::from_syntax_node(db, self.0.lookup(db))
14608    }
14609}
14610impl From<ModuleBodyPtr> for SyntaxStablePtrId {
14611    fn from(ptr: ModuleBodyPtr) -> Self {
14612        ptr.untyped()
14613    }
14614}
14615#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
14616pub struct ModuleBodyGreen(pub GreenId);
14617impl TypedSyntaxNode for ModuleBody {
14618    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ModuleBody);
14619    type StablePtr = ModuleBodyPtr;
14620    type Green = ModuleBodyGreen;
14621    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
14622        ModuleBodyGreen(
14623            Arc::new(GreenNode {
14624                kind: SyntaxKind::ModuleBody,
14625                details: GreenNodeDetails::Node {
14626                    children: [
14627                        TerminalLBrace::missing(db).0,
14628                        ModuleItemList::missing(db).0,
14629                        TerminalRBrace::missing(db).0,
14630                    ]
14631                    .into(),
14632                    width: TextWidth::default(),
14633                },
14634            })
14635            .intern(db),
14636        )
14637    }
14638    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
14639        let kind = node.kind(db);
14640        assert_eq!(
14641            kind,
14642            SyntaxKind::ModuleBody,
14643            "Unexpected SyntaxKind {:?}. Expected {:?}.",
14644            kind,
14645            SyntaxKind::ModuleBody
14646        );
14647        Self { node }
14648    }
14649    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
14650        let kind = node.kind(db);
14651        if kind == SyntaxKind::ModuleBody { Some(Self::from_syntax_node(db, node)) } else { None }
14652    }
14653    fn as_syntax_node(&self) -> SyntaxNode {
14654        self.node
14655    }
14656    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
14657        ModuleBodyPtr(self.node.stable_ptr(db))
14658    }
14659}
14660#[derive(Clone, Debug, Eq, Hash, PartialEq)]
14661pub struct FunctionDeclaration {
14662    node: SyntaxNode,
14663}
14664impl FunctionDeclaration {
14665    pub const INDEX_OPTIONAL_CONST: usize = 0;
14666    pub const INDEX_FUNCTION_KW: usize = 1;
14667    pub const INDEX_NAME: usize = 2;
14668    pub const INDEX_GENERIC_PARAMS: usize = 3;
14669    pub const INDEX_SIGNATURE: usize = 4;
14670    pub fn new_green(
14671        db: &dyn SyntaxGroup,
14672        optional_const: OptionTerminalConstGreen,
14673        function_kw: TerminalFunctionGreen,
14674        name: TerminalIdentifierGreen,
14675        generic_params: OptionWrappedGenericParamListGreen,
14676        signature: FunctionSignatureGreen,
14677    ) -> FunctionDeclarationGreen {
14678        let children = [optional_const.0, function_kw.0, name.0, generic_params.0, signature.0];
14679        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
14680        FunctionDeclarationGreen(
14681            Arc::new(GreenNode {
14682                kind: SyntaxKind::FunctionDeclaration,
14683                details: GreenNodeDetails::Node { children: children.into(), width },
14684            })
14685            .intern(db),
14686        )
14687    }
14688}
14689impl FunctionDeclaration {
14690    pub fn optional_const(&self, db: &dyn SyntaxGroup) -> OptionTerminalConst {
14691        OptionTerminalConst::from_syntax_node(db, self.node.get_children(db)[0])
14692    }
14693    pub fn function_kw(&self, db: &dyn SyntaxGroup) -> TerminalFunction {
14694        TerminalFunction::from_syntax_node(db, self.node.get_children(db)[1])
14695    }
14696    pub fn name(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier {
14697        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[2])
14698    }
14699    pub fn generic_params(&self, db: &dyn SyntaxGroup) -> OptionWrappedGenericParamList {
14700        OptionWrappedGenericParamList::from_syntax_node(db, self.node.get_children(db)[3])
14701    }
14702    pub fn signature(&self, db: &dyn SyntaxGroup) -> FunctionSignature {
14703        FunctionSignature::from_syntax_node(db, self.node.get_children(db)[4])
14704    }
14705}
14706#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
14707pub struct FunctionDeclarationPtr(pub SyntaxStablePtrId);
14708impl FunctionDeclarationPtr {
14709    pub fn name_green(self, db: &dyn SyntaxGroup) -> TerminalIdentifierGreen {
14710        let ptr = self.0.lookup_intern(db);
14711        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
14712            TerminalIdentifierGreen(key_fields[0])
14713        } else {
14714            panic!("Unexpected key field query on root.");
14715        }
14716    }
14717}
14718impl TypedStablePtr for FunctionDeclarationPtr {
14719    type SyntaxNode = FunctionDeclaration;
14720    fn untyped(&self) -> SyntaxStablePtrId {
14721        self.0
14722    }
14723    fn lookup(&self, db: &dyn SyntaxGroup) -> FunctionDeclaration {
14724        FunctionDeclaration::from_syntax_node(db, self.0.lookup(db))
14725    }
14726}
14727impl From<FunctionDeclarationPtr> for SyntaxStablePtrId {
14728    fn from(ptr: FunctionDeclarationPtr) -> Self {
14729        ptr.untyped()
14730    }
14731}
14732#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
14733pub struct FunctionDeclarationGreen(pub GreenId);
14734impl TypedSyntaxNode for FunctionDeclaration {
14735    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::FunctionDeclaration);
14736    type StablePtr = FunctionDeclarationPtr;
14737    type Green = FunctionDeclarationGreen;
14738    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
14739        FunctionDeclarationGreen(
14740            Arc::new(GreenNode {
14741                kind: SyntaxKind::FunctionDeclaration,
14742                details: GreenNodeDetails::Node {
14743                    children: [
14744                        OptionTerminalConst::missing(db).0,
14745                        TerminalFunction::missing(db).0,
14746                        TerminalIdentifier::missing(db).0,
14747                        OptionWrappedGenericParamList::missing(db).0,
14748                        FunctionSignature::missing(db).0,
14749                    ]
14750                    .into(),
14751                    width: TextWidth::default(),
14752                },
14753            })
14754            .intern(db),
14755        )
14756    }
14757    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
14758        let kind = node.kind(db);
14759        assert_eq!(
14760            kind,
14761            SyntaxKind::FunctionDeclaration,
14762            "Unexpected SyntaxKind {:?}. Expected {:?}.",
14763            kind,
14764            SyntaxKind::FunctionDeclaration
14765        );
14766        Self { node }
14767    }
14768    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
14769        let kind = node.kind(db);
14770        if kind == SyntaxKind::FunctionDeclaration {
14771            Some(Self::from_syntax_node(db, node))
14772        } else {
14773            None
14774        }
14775    }
14776    fn as_syntax_node(&self) -> SyntaxNode {
14777        self.node
14778    }
14779    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
14780        FunctionDeclarationPtr(self.node.stable_ptr(db))
14781    }
14782}
14783#[derive(Clone, Debug, Eq, Hash, PartialEq)]
14784pub struct ItemConstant {
14785    node: SyntaxNode,
14786}
14787impl ItemConstant {
14788    pub const INDEX_ATTRIBUTES: usize = 0;
14789    pub const INDEX_VISIBILITY: usize = 1;
14790    pub const INDEX_CONST_KW: usize = 2;
14791    pub const INDEX_NAME: usize = 3;
14792    pub const INDEX_TYPE_CLAUSE: usize = 4;
14793    pub const INDEX_EQ: usize = 5;
14794    pub const INDEX_VALUE: usize = 6;
14795    pub const INDEX_SEMICOLON: usize = 7;
14796    pub fn new_green(
14797        db: &dyn SyntaxGroup,
14798        attributes: AttributeListGreen,
14799        visibility: VisibilityGreen,
14800        const_kw: TerminalConstGreen,
14801        name: TerminalIdentifierGreen,
14802        type_clause: TypeClauseGreen,
14803        eq: TerminalEqGreen,
14804        value: ExprGreen,
14805        semicolon: TerminalSemicolonGreen,
14806    ) -> ItemConstantGreen {
14807        let children = [
14808            attributes.0,
14809            visibility.0,
14810            const_kw.0,
14811            name.0,
14812            type_clause.0,
14813            eq.0,
14814            value.0,
14815            semicolon.0,
14816        ];
14817        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
14818        ItemConstantGreen(
14819            Arc::new(GreenNode {
14820                kind: SyntaxKind::ItemConstant,
14821                details: GreenNodeDetails::Node { children: children.into(), width },
14822            })
14823            .intern(db),
14824        )
14825    }
14826}
14827impl ItemConstant {
14828    pub fn attributes(&self, db: &dyn SyntaxGroup) -> AttributeList {
14829        AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
14830    }
14831    pub fn visibility(&self, db: &dyn SyntaxGroup) -> Visibility {
14832        Visibility::from_syntax_node(db, self.node.get_children(db)[1])
14833    }
14834    pub fn const_kw(&self, db: &dyn SyntaxGroup) -> TerminalConst {
14835        TerminalConst::from_syntax_node(db, self.node.get_children(db)[2])
14836    }
14837    pub fn name(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier {
14838        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[3])
14839    }
14840    pub fn type_clause(&self, db: &dyn SyntaxGroup) -> TypeClause {
14841        TypeClause::from_syntax_node(db, self.node.get_children(db)[4])
14842    }
14843    pub fn eq(&self, db: &dyn SyntaxGroup) -> TerminalEq {
14844        TerminalEq::from_syntax_node(db, self.node.get_children(db)[5])
14845    }
14846    pub fn value(&self, db: &dyn SyntaxGroup) -> Expr {
14847        Expr::from_syntax_node(db, self.node.get_children(db)[6])
14848    }
14849    pub fn semicolon(&self, db: &dyn SyntaxGroup) -> TerminalSemicolon {
14850        TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[7])
14851    }
14852}
14853#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
14854pub struct ItemConstantPtr(pub SyntaxStablePtrId);
14855impl ItemConstantPtr {
14856    pub fn name_green(self, db: &dyn SyntaxGroup) -> TerminalIdentifierGreen {
14857        let ptr = self.0.lookup_intern(db);
14858        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
14859            TerminalIdentifierGreen(key_fields[0])
14860        } else {
14861            panic!("Unexpected key field query on root.");
14862        }
14863    }
14864}
14865impl TypedStablePtr for ItemConstantPtr {
14866    type SyntaxNode = ItemConstant;
14867    fn untyped(&self) -> SyntaxStablePtrId {
14868        self.0
14869    }
14870    fn lookup(&self, db: &dyn SyntaxGroup) -> ItemConstant {
14871        ItemConstant::from_syntax_node(db, self.0.lookup(db))
14872    }
14873}
14874impl From<ItemConstantPtr> for SyntaxStablePtrId {
14875    fn from(ptr: ItemConstantPtr) -> Self {
14876        ptr.untyped()
14877    }
14878}
14879#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
14880pub struct ItemConstantGreen(pub GreenId);
14881impl TypedSyntaxNode for ItemConstant {
14882    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemConstant);
14883    type StablePtr = ItemConstantPtr;
14884    type Green = ItemConstantGreen;
14885    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
14886        ItemConstantGreen(
14887            Arc::new(GreenNode {
14888                kind: SyntaxKind::ItemConstant,
14889                details: GreenNodeDetails::Node {
14890                    children: [
14891                        AttributeList::missing(db).0,
14892                        Visibility::missing(db).0,
14893                        TerminalConst::missing(db).0,
14894                        TerminalIdentifier::missing(db).0,
14895                        TypeClause::missing(db).0,
14896                        TerminalEq::missing(db).0,
14897                        Expr::missing(db).0,
14898                        TerminalSemicolon::missing(db).0,
14899                    ]
14900                    .into(),
14901                    width: TextWidth::default(),
14902                },
14903            })
14904            .intern(db),
14905        )
14906    }
14907    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
14908        let kind = node.kind(db);
14909        assert_eq!(
14910            kind,
14911            SyntaxKind::ItemConstant,
14912            "Unexpected SyntaxKind {:?}. Expected {:?}.",
14913            kind,
14914            SyntaxKind::ItemConstant
14915        );
14916        Self { node }
14917    }
14918    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
14919        let kind = node.kind(db);
14920        if kind == SyntaxKind::ItemConstant { Some(Self::from_syntax_node(db, node)) } else { None }
14921    }
14922    fn as_syntax_node(&self) -> SyntaxNode {
14923        self.node
14924    }
14925    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
14926        ItemConstantPtr(self.node.stable_ptr(db))
14927    }
14928}
14929#[derive(Clone, Debug, Eq, Hash, PartialEq)]
14930pub struct FunctionWithBody {
14931    node: SyntaxNode,
14932}
14933impl FunctionWithBody {
14934    pub const INDEX_ATTRIBUTES: usize = 0;
14935    pub const INDEX_VISIBILITY: usize = 1;
14936    pub const INDEX_DECLARATION: usize = 2;
14937    pub const INDEX_BODY: usize = 3;
14938    pub fn new_green(
14939        db: &dyn SyntaxGroup,
14940        attributes: AttributeListGreen,
14941        visibility: VisibilityGreen,
14942        declaration: FunctionDeclarationGreen,
14943        body: ExprBlockGreen,
14944    ) -> FunctionWithBodyGreen {
14945        let children = [attributes.0, visibility.0, declaration.0, body.0];
14946        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
14947        FunctionWithBodyGreen(
14948            Arc::new(GreenNode {
14949                kind: SyntaxKind::FunctionWithBody,
14950                details: GreenNodeDetails::Node { children: children.into(), width },
14951            })
14952            .intern(db),
14953        )
14954    }
14955}
14956impl FunctionWithBody {
14957    pub fn attributes(&self, db: &dyn SyntaxGroup) -> AttributeList {
14958        AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
14959    }
14960    pub fn visibility(&self, db: &dyn SyntaxGroup) -> Visibility {
14961        Visibility::from_syntax_node(db, self.node.get_children(db)[1])
14962    }
14963    pub fn declaration(&self, db: &dyn SyntaxGroup) -> FunctionDeclaration {
14964        FunctionDeclaration::from_syntax_node(db, self.node.get_children(db)[2])
14965    }
14966    pub fn body(&self, db: &dyn SyntaxGroup) -> ExprBlock {
14967        ExprBlock::from_syntax_node(db, self.node.get_children(db)[3])
14968    }
14969}
14970#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
14971pub struct FunctionWithBodyPtr(pub SyntaxStablePtrId);
14972impl FunctionWithBodyPtr {
14973    pub fn declaration_green(self, db: &dyn SyntaxGroup) -> FunctionDeclarationGreen {
14974        let ptr = self.0.lookup_intern(db);
14975        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
14976            FunctionDeclarationGreen(key_fields[0])
14977        } else {
14978            panic!("Unexpected key field query on root.");
14979        }
14980    }
14981}
14982impl TypedStablePtr for FunctionWithBodyPtr {
14983    type SyntaxNode = FunctionWithBody;
14984    fn untyped(&self) -> SyntaxStablePtrId {
14985        self.0
14986    }
14987    fn lookup(&self, db: &dyn SyntaxGroup) -> FunctionWithBody {
14988        FunctionWithBody::from_syntax_node(db, self.0.lookup(db))
14989    }
14990}
14991impl From<FunctionWithBodyPtr> for SyntaxStablePtrId {
14992    fn from(ptr: FunctionWithBodyPtr) -> Self {
14993        ptr.untyped()
14994    }
14995}
14996#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
14997pub struct FunctionWithBodyGreen(pub GreenId);
14998impl TypedSyntaxNode for FunctionWithBody {
14999    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::FunctionWithBody);
15000    type StablePtr = FunctionWithBodyPtr;
15001    type Green = FunctionWithBodyGreen;
15002    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
15003        FunctionWithBodyGreen(
15004            Arc::new(GreenNode {
15005                kind: SyntaxKind::FunctionWithBody,
15006                details: GreenNodeDetails::Node {
15007                    children: [
15008                        AttributeList::missing(db).0,
15009                        Visibility::missing(db).0,
15010                        FunctionDeclaration::missing(db).0,
15011                        ExprBlock::missing(db).0,
15012                    ]
15013                    .into(),
15014                    width: TextWidth::default(),
15015                },
15016            })
15017            .intern(db),
15018        )
15019    }
15020    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
15021        let kind = node.kind(db);
15022        assert_eq!(
15023            kind,
15024            SyntaxKind::FunctionWithBody,
15025            "Unexpected SyntaxKind {:?}. Expected {:?}.",
15026            kind,
15027            SyntaxKind::FunctionWithBody
15028        );
15029        Self { node }
15030    }
15031    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
15032        let kind = node.kind(db);
15033        if kind == SyntaxKind::FunctionWithBody {
15034            Some(Self::from_syntax_node(db, node))
15035        } else {
15036            None
15037        }
15038    }
15039    fn as_syntax_node(&self) -> SyntaxNode {
15040        self.node
15041    }
15042    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
15043        FunctionWithBodyPtr(self.node.stable_ptr(db))
15044    }
15045}
15046#[derive(Clone, Debug, Eq, Hash, PartialEq)]
15047pub struct ItemExternFunction {
15048    node: SyntaxNode,
15049}
15050impl ItemExternFunction {
15051    pub const INDEX_ATTRIBUTES: usize = 0;
15052    pub const INDEX_VISIBILITY: usize = 1;
15053    pub const INDEX_EXTERN_KW: usize = 2;
15054    pub const INDEX_DECLARATION: usize = 3;
15055    pub const INDEX_SEMICOLON: usize = 4;
15056    pub fn new_green(
15057        db: &dyn SyntaxGroup,
15058        attributes: AttributeListGreen,
15059        visibility: VisibilityGreen,
15060        extern_kw: TerminalExternGreen,
15061        declaration: FunctionDeclarationGreen,
15062        semicolon: TerminalSemicolonGreen,
15063    ) -> ItemExternFunctionGreen {
15064        let children = [attributes.0, visibility.0, extern_kw.0, declaration.0, semicolon.0];
15065        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
15066        ItemExternFunctionGreen(
15067            Arc::new(GreenNode {
15068                kind: SyntaxKind::ItemExternFunction,
15069                details: GreenNodeDetails::Node { children: children.into(), width },
15070            })
15071            .intern(db),
15072        )
15073    }
15074}
15075impl ItemExternFunction {
15076    pub fn attributes(&self, db: &dyn SyntaxGroup) -> AttributeList {
15077        AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
15078    }
15079    pub fn visibility(&self, db: &dyn SyntaxGroup) -> Visibility {
15080        Visibility::from_syntax_node(db, self.node.get_children(db)[1])
15081    }
15082    pub fn extern_kw(&self, db: &dyn SyntaxGroup) -> TerminalExtern {
15083        TerminalExtern::from_syntax_node(db, self.node.get_children(db)[2])
15084    }
15085    pub fn declaration(&self, db: &dyn SyntaxGroup) -> FunctionDeclaration {
15086        FunctionDeclaration::from_syntax_node(db, self.node.get_children(db)[3])
15087    }
15088    pub fn semicolon(&self, db: &dyn SyntaxGroup) -> TerminalSemicolon {
15089        TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[4])
15090    }
15091}
15092#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
15093pub struct ItemExternFunctionPtr(pub SyntaxStablePtrId);
15094impl ItemExternFunctionPtr {
15095    pub fn declaration_green(self, db: &dyn SyntaxGroup) -> FunctionDeclarationGreen {
15096        let ptr = self.0.lookup_intern(db);
15097        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
15098            FunctionDeclarationGreen(key_fields[0])
15099        } else {
15100            panic!("Unexpected key field query on root.");
15101        }
15102    }
15103}
15104impl TypedStablePtr for ItemExternFunctionPtr {
15105    type SyntaxNode = ItemExternFunction;
15106    fn untyped(&self) -> SyntaxStablePtrId {
15107        self.0
15108    }
15109    fn lookup(&self, db: &dyn SyntaxGroup) -> ItemExternFunction {
15110        ItemExternFunction::from_syntax_node(db, self.0.lookup(db))
15111    }
15112}
15113impl From<ItemExternFunctionPtr> for SyntaxStablePtrId {
15114    fn from(ptr: ItemExternFunctionPtr) -> Self {
15115        ptr.untyped()
15116    }
15117}
15118#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
15119pub struct ItemExternFunctionGreen(pub GreenId);
15120impl TypedSyntaxNode for ItemExternFunction {
15121    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemExternFunction);
15122    type StablePtr = ItemExternFunctionPtr;
15123    type Green = ItemExternFunctionGreen;
15124    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
15125        ItemExternFunctionGreen(
15126            Arc::new(GreenNode {
15127                kind: SyntaxKind::ItemExternFunction,
15128                details: GreenNodeDetails::Node {
15129                    children: [
15130                        AttributeList::missing(db).0,
15131                        Visibility::missing(db).0,
15132                        TerminalExtern::missing(db).0,
15133                        FunctionDeclaration::missing(db).0,
15134                        TerminalSemicolon::missing(db).0,
15135                    ]
15136                    .into(),
15137                    width: TextWidth::default(),
15138                },
15139            })
15140            .intern(db),
15141        )
15142    }
15143    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
15144        let kind = node.kind(db);
15145        assert_eq!(
15146            kind,
15147            SyntaxKind::ItemExternFunction,
15148            "Unexpected SyntaxKind {:?}. Expected {:?}.",
15149            kind,
15150            SyntaxKind::ItemExternFunction
15151        );
15152        Self { node }
15153    }
15154    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
15155        let kind = node.kind(db);
15156        if kind == SyntaxKind::ItemExternFunction {
15157            Some(Self::from_syntax_node(db, node))
15158        } else {
15159            None
15160        }
15161    }
15162    fn as_syntax_node(&self) -> SyntaxNode {
15163        self.node
15164    }
15165    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
15166        ItemExternFunctionPtr(self.node.stable_ptr(db))
15167    }
15168}
15169#[derive(Clone, Debug, Eq, Hash, PartialEq)]
15170pub struct ItemExternType {
15171    node: SyntaxNode,
15172}
15173impl ItemExternType {
15174    pub const INDEX_ATTRIBUTES: usize = 0;
15175    pub const INDEX_VISIBILITY: usize = 1;
15176    pub const INDEX_EXTERN_KW: usize = 2;
15177    pub const INDEX_TYPE_KW: usize = 3;
15178    pub const INDEX_NAME: usize = 4;
15179    pub const INDEX_GENERIC_PARAMS: usize = 5;
15180    pub const INDEX_SEMICOLON: usize = 6;
15181    pub fn new_green(
15182        db: &dyn SyntaxGroup,
15183        attributes: AttributeListGreen,
15184        visibility: VisibilityGreen,
15185        extern_kw: TerminalExternGreen,
15186        type_kw: TerminalTypeGreen,
15187        name: TerminalIdentifierGreen,
15188        generic_params: OptionWrappedGenericParamListGreen,
15189        semicolon: TerminalSemicolonGreen,
15190    ) -> ItemExternTypeGreen {
15191        let children = [
15192            attributes.0,
15193            visibility.0,
15194            extern_kw.0,
15195            type_kw.0,
15196            name.0,
15197            generic_params.0,
15198            semicolon.0,
15199        ];
15200        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
15201        ItemExternTypeGreen(
15202            Arc::new(GreenNode {
15203                kind: SyntaxKind::ItemExternType,
15204                details: GreenNodeDetails::Node { children: children.into(), width },
15205            })
15206            .intern(db),
15207        )
15208    }
15209}
15210impl ItemExternType {
15211    pub fn attributes(&self, db: &dyn SyntaxGroup) -> AttributeList {
15212        AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
15213    }
15214    pub fn visibility(&self, db: &dyn SyntaxGroup) -> Visibility {
15215        Visibility::from_syntax_node(db, self.node.get_children(db)[1])
15216    }
15217    pub fn extern_kw(&self, db: &dyn SyntaxGroup) -> TerminalExtern {
15218        TerminalExtern::from_syntax_node(db, self.node.get_children(db)[2])
15219    }
15220    pub fn type_kw(&self, db: &dyn SyntaxGroup) -> TerminalType {
15221        TerminalType::from_syntax_node(db, self.node.get_children(db)[3])
15222    }
15223    pub fn name(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier {
15224        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[4])
15225    }
15226    pub fn generic_params(&self, db: &dyn SyntaxGroup) -> OptionWrappedGenericParamList {
15227        OptionWrappedGenericParamList::from_syntax_node(db, self.node.get_children(db)[5])
15228    }
15229    pub fn semicolon(&self, db: &dyn SyntaxGroup) -> TerminalSemicolon {
15230        TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[6])
15231    }
15232}
15233#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
15234pub struct ItemExternTypePtr(pub SyntaxStablePtrId);
15235impl ItemExternTypePtr {
15236    pub fn name_green(self, db: &dyn SyntaxGroup) -> TerminalIdentifierGreen {
15237        let ptr = self.0.lookup_intern(db);
15238        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
15239            TerminalIdentifierGreen(key_fields[0])
15240        } else {
15241            panic!("Unexpected key field query on root.");
15242        }
15243    }
15244}
15245impl TypedStablePtr for ItemExternTypePtr {
15246    type SyntaxNode = ItemExternType;
15247    fn untyped(&self) -> SyntaxStablePtrId {
15248        self.0
15249    }
15250    fn lookup(&self, db: &dyn SyntaxGroup) -> ItemExternType {
15251        ItemExternType::from_syntax_node(db, self.0.lookup(db))
15252    }
15253}
15254impl From<ItemExternTypePtr> for SyntaxStablePtrId {
15255    fn from(ptr: ItemExternTypePtr) -> Self {
15256        ptr.untyped()
15257    }
15258}
15259#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
15260pub struct ItemExternTypeGreen(pub GreenId);
15261impl TypedSyntaxNode for ItemExternType {
15262    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemExternType);
15263    type StablePtr = ItemExternTypePtr;
15264    type Green = ItemExternTypeGreen;
15265    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
15266        ItemExternTypeGreen(
15267            Arc::new(GreenNode {
15268                kind: SyntaxKind::ItemExternType,
15269                details: GreenNodeDetails::Node {
15270                    children: [
15271                        AttributeList::missing(db).0,
15272                        Visibility::missing(db).0,
15273                        TerminalExtern::missing(db).0,
15274                        TerminalType::missing(db).0,
15275                        TerminalIdentifier::missing(db).0,
15276                        OptionWrappedGenericParamList::missing(db).0,
15277                        TerminalSemicolon::missing(db).0,
15278                    ]
15279                    .into(),
15280                    width: TextWidth::default(),
15281                },
15282            })
15283            .intern(db),
15284        )
15285    }
15286    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
15287        let kind = node.kind(db);
15288        assert_eq!(
15289            kind,
15290            SyntaxKind::ItemExternType,
15291            "Unexpected SyntaxKind {:?}. Expected {:?}.",
15292            kind,
15293            SyntaxKind::ItemExternType
15294        );
15295        Self { node }
15296    }
15297    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
15298        let kind = node.kind(db);
15299        if kind == SyntaxKind::ItemExternType {
15300            Some(Self::from_syntax_node(db, node))
15301        } else {
15302            None
15303        }
15304    }
15305    fn as_syntax_node(&self) -> SyntaxNode {
15306        self.node
15307    }
15308    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
15309        ItemExternTypePtr(self.node.stable_ptr(db))
15310    }
15311}
15312#[derive(Clone, Debug, Eq, Hash, PartialEq)]
15313pub struct ItemTrait {
15314    node: SyntaxNode,
15315}
15316impl ItemTrait {
15317    pub const INDEX_ATTRIBUTES: usize = 0;
15318    pub const INDEX_VISIBILITY: usize = 1;
15319    pub const INDEX_TRAIT_KW: usize = 2;
15320    pub const INDEX_NAME: usize = 3;
15321    pub const INDEX_GENERIC_PARAMS: usize = 4;
15322    pub const INDEX_BODY: usize = 5;
15323    pub fn new_green(
15324        db: &dyn SyntaxGroup,
15325        attributes: AttributeListGreen,
15326        visibility: VisibilityGreen,
15327        trait_kw: TerminalTraitGreen,
15328        name: TerminalIdentifierGreen,
15329        generic_params: OptionWrappedGenericParamListGreen,
15330        body: MaybeTraitBodyGreen,
15331    ) -> ItemTraitGreen {
15332        let children = [attributes.0, visibility.0, trait_kw.0, name.0, generic_params.0, body.0];
15333        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
15334        ItemTraitGreen(
15335            Arc::new(GreenNode {
15336                kind: SyntaxKind::ItemTrait,
15337                details: GreenNodeDetails::Node { children: children.into(), width },
15338            })
15339            .intern(db),
15340        )
15341    }
15342}
15343impl ItemTrait {
15344    pub fn attributes(&self, db: &dyn SyntaxGroup) -> AttributeList {
15345        AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
15346    }
15347    pub fn visibility(&self, db: &dyn SyntaxGroup) -> Visibility {
15348        Visibility::from_syntax_node(db, self.node.get_children(db)[1])
15349    }
15350    pub fn trait_kw(&self, db: &dyn SyntaxGroup) -> TerminalTrait {
15351        TerminalTrait::from_syntax_node(db, self.node.get_children(db)[2])
15352    }
15353    pub fn name(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier {
15354        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[3])
15355    }
15356    pub fn generic_params(&self, db: &dyn SyntaxGroup) -> OptionWrappedGenericParamList {
15357        OptionWrappedGenericParamList::from_syntax_node(db, self.node.get_children(db)[4])
15358    }
15359    pub fn body(&self, db: &dyn SyntaxGroup) -> MaybeTraitBody {
15360        MaybeTraitBody::from_syntax_node(db, self.node.get_children(db)[5])
15361    }
15362}
15363#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
15364pub struct ItemTraitPtr(pub SyntaxStablePtrId);
15365impl ItemTraitPtr {
15366    pub fn name_green(self, db: &dyn SyntaxGroup) -> TerminalIdentifierGreen {
15367        let ptr = self.0.lookup_intern(db);
15368        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
15369            TerminalIdentifierGreen(key_fields[0])
15370        } else {
15371            panic!("Unexpected key field query on root.");
15372        }
15373    }
15374}
15375impl TypedStablePtr for ItemTraitPtr {
15376    type SyntaxNode = ItemTrait;
15377    fn untyped(&self) -> SyntaxStablePtrId {
15378        self.0
15379    }
15380    fn lookup(&self, db: &dyn SyntaxGroup) -> ItemTrait {
15381        ItemTrait::from_syntax_node(db, self.0.lookup(db))
15382    }
15383}
15384impl From<ItemTraitPtr> for SyntaxStablePtrId {
15385    fn from(ptr: ItemTraitPtr) -> Self {
15386        ptr.untyped()
15387    }
15388}
15389#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
15390pub struct ItemTraitGreen(pub GreenId);
15391impl TypedSyntaxNode for ItemTrait {
15392    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemTrait);
15393    type StablePtr = ItemTraitPtr;
15394    type Green = ItemTraitGreen;
15395    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
15396        ItemTraitGreen(
15397            Arc::new(GreenNode {
15398                kind: SyntaxKind::ItemTrait,
15399                details: GreenNodeDetails::Node {
15400                    children: [
15401                        AttributeList::missing(db).0,
15402                        Visibility::missing(db).0,
15403                        TerminalTrait::missing(db).0,
15404                        TerminalIdentifier::missing(db).0,
15405                        OptionWrappedGenericParamList::missing(db).0,
15406                        MaybeTraitBody::missing(db).0,
15407                    ]
15408                    .into(),
15409                    width: TextWidth::default(),
15410                },
15411            })
15412            .intern(db),
15413        )
15414    }
15415    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
15416        let kind = node.kind(db);
15417        assert_eq!(
15418            kind,
15419            SyntaxKind::ItemTrait,
15420            "Unexpected SyntaxKind {:?}. Expected {:?}.",
15421            kind,
15422            SyntaxKind::ItemTrait
15423        );
15424        Self { node }
15425    }
15426    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
15427        let kind = node.kind(db);
15428        if kind == SyntaxKind::ItemTrait { Some(Self::from_syntax_node(db, node)) } else { None }
15429    }
15430    fn as_syntax_node(&self) -> SyntaxNode {
15431        self.node
15432    }
15433    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
15434        ItemTraitPtr(self.node.stable_ptr(db))
15435    }
15436}
15437#[derive(Clone, Debug, Eq, Hash, PartialEq)]
15438pub enum MaybeTraitBody {
15439    Some(TraitBody),
15440    None(TerminalSemicolon),
15441}
15442#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
15443pub struct MaybeTraitBodyPtr(pub SyntaxStablePtrId);
15444impl TypedStablePtr for MaybeTraitBodyPtr {
15445    type SyntaxNode = MaybeTraitBody;
15446    fn untyped(&self) -> SyntaxStablePtrId {
15447        self.0
15448    }
15449    fn lookup(&self, db: &dyn SyntaxGroup) -> MaybeTraitBody {
15450        MaybeTraitBody::from_syntax_node(db, self.0.lookup(db))
15451    }
15452}
15453impl From<MaybeTraitBodyPtr> for SyntaxStablePtrId {
15454    fn from(ptr: MaybeTraitBodyPtr) -> Self {
15455        ptr.untyped()
15456    }
15457}
15458impl From<TraitBodyPtr> for MaybeTraitBodyPtr {
15459    fn from(value: TraitBodyPtr) -> Self {
15460        Self(value.0)
15461    }
15462}
15463impl From<TerminalSemicolonPtr> for MaybeTraitBodyPtr {
15464    fn from(value: TerminalSemicolonPtr) -> Self {
15465        Self(value.0)
15466    }
15467}
15468impl From<TraitBodyGreen> for MaybeTraitBodyGreen {
15469    fn from(value: TraitBodyGreen) -> Self {
15470        Self(value.0)
15471    }
15472}
15473impl From<TerminalSemicolonGreen> for MaybeTraitBodyGreen {
15474    fn from(value: TerminalSemicolonGreen) -> Self {
15475        Self(value.0)
15476    }
15477}
15478#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
15479pub struct MaybeTraitBodyGreen(pub GreenId);
15480impl TypedSyntaxNode for MaybeTraitBody {
15481    const OPTIONAL_KIND: Option<SyntaxKind> = None;
15482    type StablePtr = MaybeTraitBodyPtr;
15483    type Green = MaybeTraitBodyGreen;
15484    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
15485        panic!("No missing variant.");
15486    }
15487    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
15488        let kind = node.kind(db);
15489        match kind {
15490            SyntaxKind::TraitBody => MaybeTraitBody::Some(TraitBody::from_syntax_node(db, node)),
15491            SyntaxKind::TerminalSemicolon => {
15492                MaybeTraitBody::None(TerminalSemicolon::from_syntax_node(db, node))
15493            }
15494            _ => {
15495                panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "MaybeTraitBody")
15496            }
15497        }
15498    }
15499    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
15500        let kind = node.kind(db);
15501        match kind {
15502            SyntaxKind::TraitBody => {
15503                Some(MaybeTraitBody::Some(TraitBody::from_syntax_node(db, node)))
15504            }
15505            SyntaxKind::TerminalSemicolon => {
15506                Some(MaybeTraitBody::None(TerminalSemicolon::from_syntax_node(db, node)))
15507            }
15508            _ => None,
15509        }
15510    }
15511    fn as_syntax_node(&self) -> SyntaxNode {
15512        match self {
15513            MaybeTraitBody::Some(x) => x.as_syntax_node(),
15514            MaybeTraitBody::None(x) => x.as_syntax_node(),
15515        }
15516    }
15517    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
15518        MaybeTraitBodyPtr(self.as_syntax_node().lookup_intern(db).stable_ptr)
15519    }
15520}
15521impl MaybeTraitBody {
15522    /// Checks if a kind of a variant of [MaybeTraitBody].
15523    pub fn is_variant(kind: SyntaxKind) -> bool {
15524        matches!(kind, SyntaxKind::TraitBody | SyntaxKind::TerminalSemicolon)
15525    }
15526}
15527#[derive(Clone, Debug, Eq, Hash, PartialEq)]
15528pub struct TraitBody {
15529    node: SyntaxNode,
15530}
15531impl TraitBody {
15532    pub const INDEX_LBRACE: usize = 0;
15533    pub const INDEX_ITEMS: usize = 1;
15534    pub const INDEX_RBRACE: usize = 2;
15535    pub fn new_green(
15536        db: &dyn SyntaxGroup,
15537        lbrace: TerminalLBraceGreen,
15538        items: TraitItemListGreen,
15539        rbrace: TerminalRBraceGreen,
15540    ) -> TraitBodyGreen {
15541        let children = [lbrace.0, items.0, rbrace.0];
15542        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
15543        TraitBodyGreen(
15544            Arc::new(GreenNode {
15545                kind: SyntaxKind::TraitBody,
15546                details: GreenNodeDetails::Node { children: children.into(), width },
15547            })
15548            .intern(db),
15549        )
15550    }
15551}
15552impl TraitBody {
15553    pub fn lbrace(&self, db: &dyn SyntaxGroup) -> TerminalLBrace {
15554        TerminalLBrace::from_syntax_node(db, self.node.get_children(db)[0])
15555    }
15556    pub fn items(&self, db: &dyn SyntaxGroup) -> TraitItemList {
15557        TraitItemList::from_syntax_node(db, self.node.get_children(db)[1])
15558    }
15559    pub fn rbrace(&self, db: &dyn SyntaxGroup) -> TerminalRBrace {
15560        TerminalRBrace::from_syntax_node(db, self.node.get_children(db)[2])
15561    }
15562}
15563#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
15564pub struct TraitBodyPtr(pub SyntaxStablePtrId);
15565impl TraitBodyPtr {}
15566impl TypedStablePtr for TraitBodyPtr {
15567    type SyntaxNode = TraitBody;
15568    fn untyped(&self) -> SyntaxStablePtrId {
15569        self.0
15570    }
15571    fn lookup(&self, db: &dyn SyntaxGroup) -> TraitBody {
15572        TraitBody::from_syntax_node(db, self.0.lookup(db))
15573    }
15574}
15575impl From<TraitBodyPtr> for SyntaxStablePtrId {
15576    fn from(ptr: TraitBodyPtr) -> Self {
15577        ptr.untyped()
15578    }
15579}
15580#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
15581pub struct TraitBodyGreen(pub GreenId);
15582impl TypedSyntaxNode for TraitBody {
15583    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TraitBody);
15584    type StablePtr = TraitBodyPtr;
15585    type Green = TraitBodyGreen;
15586    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
15587        TraitBodyGreen(
15588            Arc::new(GreenNode {
15589                kind: SyntaxKind::TraitBody,
15590                details: GreenNodeDetails::Node {
15591                    children: [
15592                        TerminalLBrace::missing(db).0,
15593                        TraitItemList::missing(db).0,
15594                        TerminalRBrace::missing(db).0,
15595                    ]
15596                    .into(),
15597                    width: TextWidth::default(),
15598                },
15599            })
15600            .intern(db),
15601        )
15602    }
15603    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
15604        let kind = node.kind(db);
15605        assert_eq!(
15606            kind,
15607            SyntaxKind::TraitBody,
15608            "Unexpected SyntaxKind {:?}. Expected {:?}.",
15609            kind,
15610            SyntaxKind::TraitBody
15611        );
15612        Self { node }
15613    }
15614    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
15615        let kind = node.kind(db);
15616        if kind == SyntaxKind::TraitBody { Some(Self::from_syntax_node(db, node)) } else { None }
15617    }
15618    fn as_syntax_node(&self) -> SyntaxNode {
15619        self.node
15620    }
15621    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
15622        TraitBodyPtr(self.node.stable_ptr(db))
15623    }
15624}
15625#[derive(Clone, Debug, Eq, Hash, PartialEq)]
15626pub struct TraitItemList(ElementList<TraitItem, 1>);
15627impl Deref for TraitItemList {
15628    type Target = ElementList<TraitItem, 1>;
15629    fn deref(&self) -> &Self::Target {
15630        &self.0
15631    }
15632}
15633impl TraitItemList {
15634    pub fn new_green(db: &dyn SyntaxGroup, children: &[TraitItemGreen]) -> TraitItemListGreen {
15635        let width = children.iter().map(|id| id.0.lookup_intern(db).width()).sum();
15636        TraitItemListGreen(
15637            Arc::new(GreenNode {
15638                kind: SyntaxKind::TraitItemList,
15639                details: GreenNodeDetails::Node {
15640                    children: children.iter().map(|x| x.0).collect(),
15641                    width,
15642                },
15643            })
15644            .intern(db),
15645        )
15646    }
15647}
15648#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
15649pub struct TraitItemListPtr(pub SyntaxStablePtrId);
15650impl TypedStablePtr for TraitItemListPtr {
15651    type SyntaxNode = TraitItemList;
15652    fn untyped(&self) -> SyntaxStablePtrId {
15653        self.0
15654    }
15655    fn lookup(&self, db: &dyn SyntaxGroup) -> TraitItemList {
15656        TraitItemList::from_syntax_node(db, self.0.lookup(db))
15657    }
15658}
15659impl From<TraitItemListPtr> for SyntaxStablePtrId {
15660    fn from(ptr: TraitItemListPtr) -> Self {
15661        ptr.untyped()
15662    }
15663}
15664#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
15665pub struct TraitItemListGreen(pub GreenId);
15666impl TypedSyntaxNode for TraitItemList {
15667    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TraitItemList);
15668    type StablePtr = TraitItemListPtr;
15669    type Green = TraitItemListGreen;
15670    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
15671        TraitItemListGreen(
15672            Arc::new(GreenNode {
15673                kind: SyntaxKind::TraitItemList,
15674                details: GreenNodeDetails::Node {
15675                    children: [].into(),
15676                    width: TextWidth::default(),
15677                },
15678            })
15679            .intern(db),
15680        )
15681    }
15682    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
15683        Self(ElementList::new(node))
15684    }
15685    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
15686        if node.kind(db) == SyntaxKind::TraitItemList {
15687            Some(Self(ElementList::new(node)))
15688        } else {
15689            None
15690        }
15691    }
15692    fn as_syntax_node(&self) -> SyntaxNode {
15693        self.node
15694    }
15695    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
15696        TraitItemListPtr(self.node.stable_ptr(db))
15697    }
15698}
15699#[derive(Clone, Debug, Eq, Hash, PartialEq)]
15700pub enum TraitItem {
15701    Function(TraitItemFunction),
15702    Type(TraitItemType),
15703    Constant(TraitItemConstant),
15704    Impl(TraitItemImpl),
15705    Missing(TraitItemMissing),
15706}
15707#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
15708pub struct TraitItemPtr(pub SyntaxStablePtrId);
15709impl TypedStablePtr for TraitItemPtr {
15710    type SyntaxNode = TraitItem;
15711    fn untyped(&self) -> SyntaxStablePtrId {
15712        self.0
15713    }
15714    fn lookup(&self, db: &dyn SyntaxGroup) -> TraitItem {
15715        TraitItem::from_syntax_node(db, self.0.lookup(db))
15716    }
15717}
15718impl From<TraitItemPtr> for SyntaxStablePtrId {
15719    fn from(ptr: TraitItemPtr) -> Self {
15720        ptr.untyped()
15721    }
15722}
15723impl From<TraitItemFunctionPtr> for TraitItemPtr {
15724    fn from(value: TraitItemFunctionPtr) -> Self {
15725        Self(value.0)
15726    }
15727}
15728impl From<TraitItemTypePtr> for TraitItemPtr {
15729    fn from(value: TraitItemTypePtr) -> Self {
15730        Self(value.0)
15731    }
15732}
15733impl From<TraitItemConstantPtr> for TraitItemPtr {
15734    fn from(value: TraitItemConstantPtr) -> Self {
15735        Self(value.0)
15736    }
15737}
15738impl From<TraitItemImplPtr> for TraitItemPtr {
15739    fn from(value: TraitItemImplPtr) -> Self {
15740        Self(value.0)
15741    }
15742}
15743impl From<TraitItemMissingPtr> for TraitItemPtr {
15744    fn from(value: TraitItemMissingPtr) -> Self {
15745        Self(value.0)
15746    }
15747}
15748impl From<TraitItemFunctionGreen> for TraitItemGreen {
15749    fn from(value: TraitItemFunctionGreen) -> Self {
15750        Self(value.0)
15751    }
15752}
15753impl From<TraitItemTypeGreen> for TraitItemGreen {
15754    fn from(value: TraitItemTypeGreen) -> Self {
15755        Self(value.0)
15756    }
15757}
15758impl From<TraitItemConstantGreen> for TraitItemGreen {
15759    fn from(value: TraitItemConstantGreen) -> Self {
15760        Self(value.0)
15761    }
15762}
15763impl From<TraitItemImplGreen> for TraitItemGreen {
15764    fn from(value: TraitItemImplGreen) -> Self {
15765        Self(value.0)
15766    }
15767}
15768impl From<TraitItemMissingGreen> for TraitItemGreen {
15769    fn from(value: TraitItemMissingGreen) -> Self {
15770        Self(value.0)
15771    }
15772}
15773#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
15774pub struct TraitItemGreen(pub GreenId);
15775impl TypedSyntaxNode for TraitItem {
15776    const OPTIONAL_KIND: Option<SyntaxKind> = None;
15777    type StablePtr = TraitItemPtr;
15778    type Green = TraitItemGreen;
15779    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
15780        TraitItemGreen(TraitItemMissing::missing(db).0)
15781    }
15782    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
15783        let kind = node.kind(db);
15784        match kind {
15785            SyntaxKind::TraitItemFunction => {
15786                TraitItem::Function(TraitItemFunction::from_syntax_node(db, node))
15787            }
15788            SyntaxKind::TraitItemType => TraitItem::Type(TraitItemType::from_syntax_node(db, node)),
15789            SyntaxKind::TraitItemConstant => {
15790                TraitItem::Constant(TraitItemConstant::from_syntax_node(db, node))
15791            }
15792            SyntaxKind::TraitItemImpl => TraitItem::Impl(TraitItemImpl::from_syntax_node(db, node)),
15793            SyntaxKind::TraitItemMissing => {
15794                TraitItem::Missing(TraitItemMissing::from_syntax_node(db, node))
15795            }
15796            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "TraitItem"),
15797        }
15798    }
15799    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
15800        let kind = node.kind(db);
15801        match kind {
15802            SyntaxKind::TraitItemFunction => {
15803                Some(TraitItem::Function(TraitItemFunction::from_syntax_node(db, node)))
15804            }
15805            SyntaxKind::TraitItemType => {
15806                Some(TraitItem::Type(TraitItemType::from_syntax_node(db, node)))
15807            }
15808            SyntaxKind::TraitItemConstant => {
15809                Some(TraitItem::Constant(TraitItemConstant::from_syntax_node(db, node)))
15810            }
15811            SyntaxKind::TraitItemImpl => {
15812                Some(TraitItem::Impl(TraitItemImpl::from_syntax_node(db, node)))
15813            }
15814            SyntaxKind::TraitItemMissing => {
15815                Some(TraitItem::Missing(TraitItemMissing::from_syntax_node(db, node)))
15816            }
15817            _ => None,
15818        }
15819    }
15820    fn as_syntax_node(&self) -> SyntaxNode {
15821        match self {
15822            TraitItem::Function(x) => x.as_syntax_node(),
15823            TraitItem::Type(x) => x.as_syntax_node(),
15824            TraitItem::Constant(x) => x.as_syntax_node(),
15825            TraitItem::Impl(x) => x.as_syntax_node(),
15826            TraitItem::Missing(x) => x.as_syntax_node(),
15827        }
15828    }
15829    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
15830        TraitItemPtr(self.as_syntax_node().lookup_intern(db).stable_ptr)
15831    }
15832}
15833impl TraitItem {
15834    /// Checks if a kind of a variant of [TraitItem].
15835    pub fn is_variant(kind: SyntaxKind) -> bool {
15836        matches!(
15837            kind,
15838            SyntaxKind::TraitItemFunction
15839                | SyntaxKind::TraitItemType
15840                | SyntaxKind::TraitItemConstant
15841                | SyntaxKind::TraitItemImpl
15842                | SyntaxKind::TraitItemMissing
15843        )
15844    }
15845}
15846#[derive(Clone, Debug, Eq, Hash, PartialEq)]
15847pub struct TraitItemMissing {
15848    node: SyntaxNode,
15849}
15850impl TraitItemMissing {
15851    pub fn new_green(db: &dyn SyntaxGroup) -> TraitItemMissingGreen {
15852        let children = [];
15853        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
15854        TraitItemMissingGreen(
15855            Arc::new(GreenNode {
15856                kind: SyntaxKind::TraitItemMissing,
15857                details: GreenNodeDetails::Node { children: children.into(), width },
15858            })
15859            .intern(db),
15860        )
15861    }
15862}
15863impl TraitItemMissing {}
15864#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
15865pub struct TraitItemMissingPtr(pub SyntaxStablePtrId);
15866impl TraitItemMissingPtr {}
15867impl TypedStablePtr for TraitItemMissingPtr {
15868    type SyntaxNode = TraitItemMissing;
15869    fn untyped(&self) -> SyntaxStablePtrId {
15870        self.0
15871    }
15872    fn lookup(&self, db: &dyn SyntaxGroup) -> TraitItemMissing {
15873        TraitItemMissing::from_syntax_node(db, self.0.lookup(db))
15874    }
15875}
15876impl From<TraitItemMissingPtr> for SyntaxStablePtrId {
15877    fn from(ptr: TraitItemMissingPtr) -> Self {
15878        ptr.untyped()
15879    }
15880}
15881#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
15882pub struct TraitItemMissingGreen(pub GreenId);
15883impl TypedSyntaxNode for TraitItemMissing {
15884    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TraitItemMissing);
15885    type StablePtr = TraitItemMissingPtr;
15886    type Green = TraitItemMissingGreen;
15887    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
15888        TraitItemMissingGreen(
15889            Arc::new(GreenNode {
15890                kind: SyntaxKind::TraitItemMissing,
15891                details: GreenNodeDetails::Node {
15892                    children: [].into(),
15893                    width: TextWidth::default(),
15894                },
15895            })
15896            .intern(db),
15897        )
15898    }
15899    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
15900        let kind = node.kind(db);
15901        assert_eq!(
15902            kind,
15903            SyntaxKind::TraitItemMissing,
15904            "Unexpected SyntaxKind {:?}. Expected {:?}.",
15905            kind,
15906            SyntaxKind::TraitItemMissing
15907        );
15908        Self { node }
15909    }
15910    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
15911        let kind = node.kind(db);
15912        if kind == SyntaxKind::TraitItemMissing {
15913            Some(Self::from_syntax_node(db, node))
15914        } else {
15915            None
15916        }
15917    }
15918    fn as_syntax_node(&self) -> SyntaxNode {
15919        self.node
15920    }
15921    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
15922        TraitItemMissingPtr(self.node.stable_ptr(db))
15923    }
15924}
15925#[derive(Clone, Debug, Eq, Hash, PartialEq)]
15926pub struct TraitItemFunction {
15927    node: SyntaxNode,
15928}
15929impl TraitItemFunction {
15930    pub const INDEX_ATTRIBUTES: usize = 0;
15931    pub const INDEX_DECLARATION: usize = 1;
15932    pub const INDEX_BODY: usize = 2;
15933    pub fn new_green(
15934        db: &dyn SyntaxGroup,
15935        attributes: AttributeListGreen,
15936        declaration: FunctionDeclarationGreen,
15937        body: MaybeTraitFunctionBodyGreen,
15938    ) -> TraitItemFunctionGreen {
15939        let children = [attributes.0, declaration.0, body.0];
15940        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
15941        TraitItemFunctionGreen(
15942            Arc::new(GreenNode {
15943                kind: SyntaxKind::TraitItemFunction,
15944                details: GreenNodeDetails::Node { children: children.into(), width },
15945            })
15946            .intern(db),
15947        )
15948    }
15949}
15950impl TraitItemFunction {
15951    pub fn attributes(&self, db: &dyn SyntaxGroup) -> AttributeList {
15952        AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
15953    }
15954    pub fn declaration(&self, db: &dyn SyntaxGroup) -> FunctionDeclaration {
15955        FunctionDeclaration::from_syntax_node(db, self.node.get_children(db)[1])
15956    }
15957    pub fn body(&self, db: &dyn SyntaxGroup) -> MaybeTraitFunctionBody {
15958        MaybeTraitFunctionBody::from_syntax_node(db, self.node.get_children(db)[2])
15959    }
15960}
15961#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
15962pub struct TraitItemFunctionPtr(pub SyntaxStablePtrId);
15963impl TraitItemFunctionPtr {
15964    pub fn declaration_green(self, db: &dyn SyntaxGroup) -> FunctionDeclarationGreen {
15965        let ptr = self.0.lookup_intern(db);
15966        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
15967            FunctionDeclarationGreen(key_fields[0])
15968        } else {
15969            panic!("Unexpected key field query on root.");
15970        }
15971    }
15972}
15973impl TypedStablePtr for TraitItemFunctionPtr {
15974    type SyntaxNode = TraitItemFunction;
15975    fn untyped(&self) -> SyntaxStablePtrId {
15976        self.0
15977    }
15978    fn lookup(&self, db: &dyn SyntaxGroup) -> TraitItemFunction {
15979        TraitItemFunction::from_syntax_node(db, self.0.lookup(db))
15980    }
15981}
15982impl From<TraitItemFunctionPtr> for SyntaxStablePtrId {
15983    fn from(ptr: TraitItemFunctionPtr) -> Self {
15984        ptr.untyped()
15985    }
15986}
15987#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
15988pub struct TraitItemFunctionGreen(pub GreenId);
15989impl TypedSyntaxNode for TraitItemFunction {
15990    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TraitItemFunction);
15991    type StablePtr = TraitItemFunctionPtr;
15992    type Green = TraitItemFunctionGreen;
15993    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
15994        TraitItemFunctionGreen(
15995            Arc::new(GreenNode {
15996                kind: SyntaxKind::TraitItemFunction,
15997                details: GreenNodeDetails::Node {
15998                    children: [
15999                        AttributeList::missing(db).0,
16000                        FunctionDeclaration::missing(db).0,
16001                        MaybeTraitFunctionBody::missing(db).0,
16002                    ]
16003                    .into(),
16004                    width: TextWidth::default(),
16005                },
16006            })
16007            .intern(db),
16008        )
16009    }
16010    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
16011        let kind = node.kind(db);
16012        assert_eq!(
16013            kind,
16014            SyntaxKind::TraitItemFunction,
16015            "Unexpected SyntaxKind {:?}. Expected {:?}.",
16016            kind,
16017            SyntaxKind::TraitItemFunction
16018        );
16019        Self { node }
16020    }
16021    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
16022        let kind = node.kind(db);
16023        if kind == SyntaxKind::TraitItemFunction {
16024            Some(Self::from_syntax_node(db, node))
16025        } else {
16026            None
16027        }
16028    }
16029    fn as_syntax_node(&self) -> SyntaxNode {
16030        self.node
16031    }
16032    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
16033        TraitItemFunctionPtr(self.node.stable_ptr(db))
16034    }
16035}
16036#[derive(Clone, Debug, Eq, Hash, PartialEq)]
16037pub struct TraitItemType {
16038    node: SyntaxNode,
16039}
16040impl TraitItemType {
16041    pub const INDEX_ATTRIBUTES: usize = 0;
16042    pub const INDEX_TYPE_KW: usize = 1;
16043    pub const INDEX_NAME: usize = 2;
16044    pub const INDEX_GENERIC_PARAMS: usize = 3;
16045    pub const INDEX_SEMICOLON: usize = 4;
16046    pub fn new_green(
16047        db: &dyn SyntaxGroup,
16048        attributes: AttributeListGreen,
16049        type_kw: TerminalTypeGreen,
16050        name: TerminalIdentifierGreen,
16051        generic_params: OptionWrappedGenericParamListGreen,
16052        semicolon: TerminalSemicolonGreen,
16053    ) -> TraitItemTypeGreen {
16054        let children = [attributes.0, type_kw.0, name.0, generic_params.0, semicolon.0];
16055        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
16056        TraitItemTypeGreen(
16057            Arc::new(GreenNode {
16058                kind: SyntaxKind::TraitItemType,
16059                details: GreenNodeDetails::Node { children: children.into(), width },
16060            })
16061            .intern(db),
16062        )
16063    }
16064}
16065impl TraitItemType {
16066    pub fn attributes(&self, db: &dyn SyntaxGroup) -> AttributeList {
16067        AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
16068    }
16069    pub fn type_kw(&self, db: &dyn SyntaxGroup) -> TerminalType {
16070        TerminalType::from_syntax_node(db, self.node.get_children(db)[1])
16071    }
16072    pub fn name(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier {
16073        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[2])
16074    }
16075    pub fn generic_params(&self, db: &dyn SyntaxGroup) -> OptionWrappedGenericParamList {
16076        OptionWrappedGenericParamList::from_syntax_node(db, self.node.get_children(db)[3])
16077    }
16078    pub fn semicolon(&self, db: &dyn SyntaxGroup) -> TerminalSemicolon {
16079        TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[4])
16080    }
16081}
16082#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
16083pub struct TraitItemTypePtr(pub SyntaxStablePtrId);
16084impl TraitItemTypePtr {
16085    pub fn name_green(self, db: &dyn SyntaxGroup) -> TerminalIdentifierGreen {
16086        let ptr = self.0.lookup_intern(db);
16087        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
16088            TerminalIdentifierGreen(key_fields[0])
16089        } else {
16090            panic!("Unexpected key field query on root.");
16091        }
16092    }
16093}
16094impl TypedStablePtr for TraitItemTypePtr {
16095    type SyntaxNode = TraitItemType;
16096    fn untyped(&self) -> SyntaxStablePtrId {
16097        self.0
16098    }
16099    fn lookup(&self, db: &dyn SyntaxGroup) -> TraitItemType {
16100        TraitItemType::from_syntax_node(db, self.0.lookup(db))
16101    }
16102}
16103impl From<TraitItemTypePtr> for SyntaxStablePtrId {
16104    fn from(ptr: TraitItemTypePtr) -> Self {
16105        ptr.untyped()
16106    }
16107}
16108#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
16109pub struct TraitItemTypeGreen(pub GreenId);
16110impl TypedSyntaxNode for TraitItemType {
16111    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TraitItemType);
16112    type StablePtr = TraitItemTypePtr;
16113    type Green = TraitItemTypeGreen;
16114    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
16115        TraitItemTypeGreen(
16116            Arc::new(GreenNode {
16117                kind: SyntaxKind::TraitItemType,
16118                details: GreenNodeDetails::Node {
16119                    children: [
16120                        AttributeList::missing(db).0,
16121                        TerminalType::missing(db).0,
16122                        TerminalIdentifier::missing(db).0,
16123                        OptionWrappedGenericParamList::missing(db).0,
16124                        TerminalSemicolon::missing(db).0,
16125                    ]
16126                    .into(),
16127                    width: TextWidth::default(),
16128                },
16129            })
16130            .intern(db),
16131        )
16132    }
16133    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
16134        let kind = node.kind(db);
16135        assert_eq!(
16136            kind,
16137            SyntaxKind::TraitItemType,
16138            "Unexpected SyntaxKind {:?}. Expected {:?}.",
16139            kind,
16140            SyntaxKind::TraitItemType
16141        );
16142        Self { node }
16143    }
16144    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
16145        let kind = node.kind(db);
16146        if kind == SyntaxKind::TraitItemType {
16147            Some(Self::from_syntax_node(db, node))
16148        } else {
16149            None
16150        }
16151    }
16152    fn as_syntax_node(&self) -> SyntaxNode {
16153        self.node
16154    }
16155    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
16156        TraitItemTypePtr(self.node.stable_ptr(db))
16157    }
16158}
16159#[derive(Clone, Debug, Eq, Hash, PartialEq)]
16160pub struct TraitItemConstant {
16161    node: SyntaxNode,
16162}
16163impl TraitItemConstant {
16164    pub const INDEX_ATTRIBUTES: usize = 0;
16165    pub const INDEX_CONST_KW: usize = 1;
16166    pub const INDEX_NAME: usize = 2;
16167    pub const INDEX_TYPE_CLAUSE: usize = 3;
16168    pub const INDEX_SEMICOLON: usize = 4;
16169    pub fn new_green(
16170        db: &dyn SyntaxGroup,
16171        attributes: AttributeListGreen,
16172        const_kw: TerminalConstGreen,
16173        name: TerminalIdentifierGreen,
16174        type_clause: TypeClauseGreen,
16175        semicolon: TerminalSemicolonGreen,
16176    ) -> TraitItemConstantGreen {
16177        let children = [attributes.0, const_kw.0, name.0, type_clause.0, semicolon.0];
16178        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
16179        TraitItemConstantGreen(
16180            Arc::new(GreenNode {
16181                kind: SyntaxKind::TraitItemConstant,
16182                details: GreenNodeDetails::Node { children: children.into(), width },
16183            })
16184            .intern(db),
16185        )
16186    }
16187}
16188impl TraitItemConstant {
16189    pub fn attributes(&self, db: &dyn SyntaxGroup) -> AttributeList {
16190        AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
16191    }
16192    pub fn const_kw(&self, db: &dyn SyntaxGroup) -> TerminalConst {
16193        TerminalConst::from_syntax_node(db, self.node.get_children(db)[1])
16194    }
16195    pub fn name(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier {
16196        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[2])
16197    }
16198    pub fn type_clause(&self, db: &dyn SyntaxGroup) -> TypeClause {
16199        TypeClause::from_syntax_node(db, self.node.get_children(db)[3])
16200    }
16201    pub fn semicolon(&self, db: &dyn SyntaxGroup) -> TerminalSemicolon {
16202        TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[4])
16203    }
16204}
16205#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
16206pub struct TraitItemConstantPtr(pub SyntaxStablePtrId);
16207impl TraitItemConstantPtr {
16208    pub fn name_green(self, db: &dyn SyntaxGroup) -> TerminalIdentifierGreen {
16209        let ptr = self.0.lookup_intern(db);
16210        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
16211            TerminalIdentifierGreen(key_fields[0])
16212        } else {
16213            panic!("Unexpected key field query on root.");
16214        }
16215    }
16216}
16217impl TypedStablePtr for TraitItemConstantPtr {
16218    type SyntaxNode = TraitItemConstant;
16219    fn untyped(&self) -> SyntaxStablePtrId {
16220        self.0
16221    }
16222    fn lookup(&self, db: &dyn SyntaxGroup) -> TraitItemConstant {
16223        TraitItemConstant::from_syntax_node(db, self.0.lookup(db))
16224    }
16225}
16226impl From<TraitItemConstantPtr> for SyntaxStablePtrId {
16227    fn from(ptr: TraitItemConstantPtr) -> Self {
16228        ptr.untyped()
16229    }
16230}
16231#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
16232pub struct TraitItemConstantGreen(pub GreenId);
16233impl TypedSyntaxNode for TraitItemConstant {
16234    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TraitItemConstant);
16235    type StablePtr = TraitItemConstantPtr;
16236    type Green = TraitItemConstantGreen;
16237    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
16238        TraitItemConstantGreen(
16239            Arc::new(GreenNode {
16240                kind: SyntaxKind::TraitItemConstant,
16241                details: GreenNodeDetails::Node {
16242                    children: [
16243                        AttributeList::missing(db).0,
16244                        TerminalConst::missing(db).0,
16245                        TerminalIdentifier::missing(db).0,
16246                        TypeClause::missing(db).0,
16247                        TerminalSemicolon::missing(db).0,
16248                    ]
16249                    .into(),
16250                    width: TextWidth::default(),
16251                },
16252            })
16253            .intern(db),
16254        )
16255    }
16256    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
16257        let kind = node.kind(db);
16258        assert_eq!(
16259            kind,
16260            SyntaxKind::TraitItemConstant,
16261            "Unexpected SyntaxKind {:?}. Expected {:?}.",
16262            kind,
16263            SyntaxKind::TraitItemConstant
16264        );
16265        Self { node }
16266    }
16267    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
16268        let kind = node.kind(db);
16269        if kind == SyntaxKind::TraitItemConstant {
16270            Some(Self::from_syntax_node(db, node))
16271        } else {
16272            None
16273        }
16274    }
16275    fn as_syntax_node(&self) -> SyntaxNode {
16276        self.node
16277    }
16278    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
16279        TraitItemConstantPtr(self.node.stable_ptr(db))
16280    }
16281}
16282#[derive(Clone, Debug, Eq, Hash, PartialEq)]
16283pub struct TraitItemImpl {
16284    node: SyntaxNode,
16285}
16286impl TraitItemImpl {
16287    pub const INDEX_ATTRIBUTES: usize = 0;
16288    pub const INDEX_IMPL_KW: usize = 1;
16289    pub const INDEX_NAME: usize = 2;
16290    pub const INDEX_COLON: usize = 3;
16291    pub const INDEX_TRAIT_PATH: usize = 4;
16292    pub const INDEX_SEMICOLON: usize = 5;
16293    pub fn new_green(
16294        db: &dyn SyntaxGroup,
16295        attributes: AttributeListGreen,
16296        impl_kw: TerminalImplGreen,
16297        name: TerminalIdentifierGreen,
16298        colon: TerminalColonGreen,
16299        trait_path: ExprPathGreen,
16300        semicolon: TerminalSemicolonGreen,
16301    ) -> TraitItemImplGreen {
16302        let children = [attributes.0, impl_kw.0, name.0, colon.0, trait_path.0, semicolon.0];
16303        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
16304        TraitItemImplGreen(
16305            Arc::new(GreenNode {
16306                kind: SyntaxKind::TraitItemImpl,
16307                details: GreenNodeDetails::Node { children: children.into(), width },
16308            })
16309            .intern(db),
16310        )
16311    }
16312}
16313impl TraitItemImpl {
16314    pub fn attributes(&self, db: &dyn SyntaxGroup) -> AttributeList {
16315        AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
16316    }
16317    pub fn impl_kw(&self, db: &dyn SyntaxGroup) -> TerminalImpl {
16318        TerminalImpl::from_syntax_node(db, self.node.get_children(db)[1])
16319    }
16320    pub fn name(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier {
16321        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[2])
16322    }
16323    pub fn colon(&self, db: &dyn SyntaxGroup) -> TerminalColon {
16324        TerminalColon::from_syntax_node(db, self.node.get_children(db)[3])
16325    }
16326    pub fn trait_path(&self, db: &dyn SyntaxGroup) -> ExprPath {
16327        ExprPath::from_syntax_node(db, self.node.get_children(db)[4])
16328    }
16329    pub fn semicolon(&self, db: &dyn SyntaxGroup) -> TerminalSemicolon {
16330        TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[5])
16331    }
16332}
16333#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
16334pub struct TraitItemImplPtr(pub SyntaxStablePtrId);
16335impl TraitItemImplPtr {
16336    pub fn name_green(self, db: &dyn SyntaxGroup) -> TerminalIdentifierGreen {
16337        let ptr = self.0.lookup_intern(db);
16338        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
16339            TerminalIdentifierGreen(key_fields[0])
16340        } else {
16341            panic!("Unexpected key field query on root.");
16342        }
16343    }
16344}
16345impl TypedStablePtr for TraitItemImplPtr {
16346    type SyntaxNode = TraitItemImpl;
16347    fn untyped(&self) -> SyntaxStablePtrId {
16348        self.0
16349    }
16350    fn lookup(&self, db: &dyn SyntaxGroup) -> TraitItemImpl {
16351        TraitItemImpl::from_syntax_node(db, self.0.lookup(db))
16352    }
16353}
16354impl From<TraitItemImplPtr> for SyntaxStablePtrId {
16355    fn from(ptr: TraitItemImplPtr) -> Self {
16356        ptr.untyped()
16357    }
16358}
16359#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
16360pub struct TraitItemImplGreen(pub GreenId);
16361impl TypedSyntaxNode for TraitItemImpl {
16362    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TraitItemImpl);
16363    type StablePtr = TraitItemImplPtr;
16364    type Green = TraitItemImplGreen;
16365    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
16366        TraitItemImplGreen(
16367            Arc::new(GreenNode {
16368                kind: SyntaxKind::TraitItemImpl,
16369                details: GreenNodeDetails::Node {
16370                    children: [
16371                        AttributeList::missing(db).0,
16372                        TerminalImpl::missing(db).0,
16373                        TerminalIdentifier::missing(db).0,
16374                        TerminalColon::missing(db).0,
16375                        ExprPath::missing(db).0,
16376                        TerminalSemicolon::missing(db).0,
16377                    ]
16378                    .into(),
16379                    width: TextWidth::default(),
16380                },
16381            })
16382            .intern(db),
16383        )
16384    }
16385    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
16386        let kind = node.kind(db);
16387        assert_eq!(
16388            kind,
16389            SyntaxKind::TraitItemImpl,
16390            "Unexpected SyntaxKind {:?}. Expected {:?}.",
16391            kind,
16392            SyntaxKind::TraitItemImpl
16393        );
16394        Self { node }
16395    }
16396    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
16397        let kind = node.kind(db);
16398        if kind == SyntaxKind::TraitItemImpl {
16399            Some(Self::from_syntax_node(db, node))
16400        } else {
16401            None
16402        }
16403    }
16404    fn as_syntax_node(&self) -> SyntaxNode {
16405        self.node
16406    }
16407    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
16408        TraitItemImplPtr(self.node.stable_ptr(db))
16409    }
16410}
16411#[derive(Clone, Debug, Eq, Hash, PartialEq)]
16412pub enum MaybeTraitFunctionBody {
16413    Some(ExprBlock),
16414    None(TerminalSemicolon),
16415}
16416#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
16417pub struct MaybeTraitFunctionBodyPtr(pub SyntaxStablePtrId);
16418impl TypedStablePtr for MaybeTraitFunctionBodyPtr {
16419    type SyntaxNode = MaybeTraitFunctionBody;
16420    fn untyped(&self) -> SyntaxStablePtrId {
16421        self.0
16422    }
16423    fn lookup(&self, db: &dyn SyntaxGroup) -> MaybeTraitFunctionBody {
16424        MaybeTraitFunctionBody::from_syntax_node(db, self.0.lookup(db))
16425    }
16426}
16427impl From<MaybeTraitFunctionBodyPtr> for SyntaxStablePtrId {
16428    fn from(ptr: MaybeTraitFunctionBodyPtr) -> Self {
16429        ptr.untyped()
16430    }
16431}
16432impl From<ExprBlockPtr> for MaybeTraitFunctionBodyPtr {
16433    fn from(value: ExprBlockPtr) -> Self {
16434        Self(value.0)
16435    }
16436}
16437impl From<TerminalSemicolonPtr> for MaybeTraitFunctionBodyPtr {
16438    fn from(value: TerminalSemicolonPtr) -> Self {
16439        Self(value.0)
16440    }
16441}
16442impl From<ExprBlockGreen> for MaybeTraitFunctionBodyGreen {
16443    fn from(value: ExprBlockGreen) -> Self {
16444        Self(value.0)
16445    }
16446}
16447impl From<TerminalSemicolonGreen> for MaybeTraitFunctionBodyGreen {
16448    fn from(value: TerminalSemicolonGreen) -> Self {
16449        Self(value.0)
16450    }
16451}
16452#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
16453pub struct MaybeTraitFunctionBodyGreen(pub GreenId);
16454impl TypedSyntaxNode for MaybeTraitFunctionBody {
16455    const OPTIONAL_KIND: Option<SyntaxKind> = None;
16456    type StablePtr = MaybeTraitFunctionBodyPtr;
16457    type Green = MaybeTraitFunctionBodyGreen;
16458    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
16459        panic!("No missing variant.");
16460    }
16461    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
16462        let kind = node.kind(db);
16463        match kind {
16464            SyntaxKind::ExprBlock => {
16465                MaybeTraitFunctionBody::Some(ExprBlock::from_syntax_node(db, node))
16466            }
16467            SyntaxKind::TerminalSemicolon => {
16468                MaybeTraitFunctionBody::None(TerminalSemicolon::from_syntax_node(db, node))
16469            }
16470            _ => panic!(
16471                "Unexpected syntax kind {:?} when constructing {}.",
16472                kind, "MaybeTraitFunctionBody"
16473            ),
16474        }
16475    }
16476    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
16477        let kind = node.kind(db);
16478        match kind {
16479            SyntaxKind::ExprBlock => {
16480                Some(MaybeTraitFunctionBody::Some(ExprBlock::from_syntax_node(db, node)))
16481            }
16482            SyntaxKind::TerminalSemicolon => {
16483                Some(MaybeTraitFunctionBody::None(TerminalSemicolon::from_syntax_node(db, node)))
16484            }
16485            _ => None,
16486        }
16487    }
16488    fn as_syntax_node(&self) -> SyntaxNode {
16489        match self {
16490            MaybeTraitFunctionBody::Some(x) => x.as_syntax_node(),
16491            MaybeTraitFunctionBody::None(x) => x.as_syntax_node(),
16492        }
16493    }
16494    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
16495        MaybeTraitFunctionBodyPtr(self.as_syntax_node().lookup_intern(db).stable_ptr)
16496    }
16497}
16498impl MaybeTraitFunctionBody {
16499    /// Checks if a kind of a variant of [MaybeTraitFunctionBody].
16500    pub fn is_variant(kind: SyntaxKind) -> bool {
16501        matches!(kind, SyntaxKind::ExprBlock | SyntaxKind::TerminalSemicolon)
16502    }
16503}
16504#[derive(Clone, Debug, Eq, Hash, PartialEq)]
16505pub struct ItemImpl {
16506    node: SyntaxNode,
16507}
16508impl ItemImpl {
16509    pub const INDEX_ATTRIBUTES: usize = 0;
16510    pub const INDEX_VISIBILITY: usize = 1;
16511    pub const INDEX_IMPL_KW: usize = 2;
16512    pub const INDEX_NAME: usize = 3;
16513    pub const INDEX_GENERIC_PARAMS: usize = 4;
16514    pub const INDEX_OF_KW: usize = 5;
16515    pub const INDEX_TRAIT_PATH: usize = 6;
16516    pub const INDEX_BODY: usize = 7;
16517    pub fn new_green(
16518        db: &dyn SyntaxGroup,
16519        attributes: AttributeListGreen,
16520        visibility: VisibilityGreen,
16521        impl_kw: TerminalImplGreen,
16522        name: TerminalIdentifierGreen,
16523        generic_params: OptionWrappedGenericParamListGreen,
16524        of_kw: TerminalOfGreen,
16525        trait_path: ExprPathGreen,
16526        body: MaybeImplBodyGreen,
16527    ) -> ItemImplGreen {
16528        let children = [
16529            attributes.0,
16530            visibility.0,
16531            impl_kw.0,
16532            name.0,
16533            generic_params.0,
16534            of_kw.0,
16535            trait_path.0,
16536            body.0,
16537        ];
16538        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
16539        ItemImplGreen(
16540            Arc::new(GreenNode {
16541                kind: SyntaxKind::ItemImpl,
16542                details: GreenNodeDetails::Node { children: children.into(), width },
16543            })
16544            .intern(db),
16545        )
16546    }
16547}
16548impl ItemImpl {
16549    pub fn attributes(&self, db: &dyn SyntaxGroup) -> AttributeList {
16550        AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
16551    }
16552    pub fn visibility(&self, db: &dyn SyntaxGroup) -> Visibility {
16553        Visibility::from_syntax_node(db, self.node.get_children(db)[1])
16554    }
16555    pub fn impl_kw(&self, db: &dyn SyntaxGroup) -> TerminalImpl {
16556        TerminalImpl::from_syntax_node(db, self.node.get_children(db)[2])
16557    }
16558    pub fn name(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier {
16559        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[3])
16560    }
16561    pub fn generic_params(&self, db: &dyn SyntaxGroup) -> OptionWrappedGenericParamList {
16562        OptionWrappedGenericParamList::from_syntax_node(db, self.node.get_children(db)[4])
16563    }
16564    pub fn of_kw(&self, db: &dyn SyntaxGroup) -> TerminalOf {
16565        TerminalOf::from_syntax_node(db, self.node.get_children(db)[5])
16566    }
16567    pub fn trait_path(&self, db: &dyn SyntaxGroup) -> ExprPath {
16568        ExprPath::from_syntax_node(db, self.node.get_children(db)[6])
16569    }
16570    pub fn body(&self, db: &dyn SyntaxGroup) -> MaybeImplBody {
16571        MaybeImplBody::from_syntax_node(db, self.node.get_children(db)[7])
16572    }
16573}
16574#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
16575pub struct ItemImplPtr(pub SyntaxStablePtrId);
16576impl ItemImplPtr {
16577    pub fn name_green(self, db: &dyn SyntaxGroup) -> TerminalIdentifierGreen {
16578        let ptr = self.0.lookup_intern(db);
16579        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
16580            TerminalIdentifierGreen(key_fields[0])
16581        } else {
16582            panic!("Unexpected key field query on root.");
16583        }
16584    }
16585}
16586impl TypedStablePtr for ItemImplPtr {
16587    type SyntaxNode = ItemImpl;
16588    fn untyped(&self) -> SyntaxStablePtrId {
16589        self.0
16590    }
16591    fn lookup(&self, db: &dyn SyntaxGroup) -> ItemImpl {
16592        ItemImpl::from_syntax_node(db, self.0.lookup(db))
16593    }
16594}
16595impl From<ItemImplPtr> for SyntaxStablePtrId {
16596    fn from(ptr: ItemImplPtr) -> Self {
16597        ptr.untyped()
16598    }
16599}
16600#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
16601pub struct ItemImplGreen(pub GreenId);
16602impl TypedSyntaxNode for ItemImpl {
16603    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemImpl);
16604    type StablePtr = ItemImplPtr;
16605    type Green = ItemImplGreen;
16606    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
16607        ItemImplGreen(
16608            Arc::new(GreenNode {
16609                kind: SyntaxKind::ItemImpl,
16610                details: GreenNodeDetails::Node {
16611                    children: [
16612                        AttributeList::missing(db).0,
16613                        Visibility::missing(db).0,
16614                        TerminalImpl::missing(db).0,
16615                        TerminalIdentifier::missing(db).0,
16616                        OptionWrappedGenericParamList::missing(db).0,
16617                        TerminalOf::missing(db).0,
16618                        ExprPath::missing(db).0,
16619                        MaybeImplBody::missing(db).0,
16620                    ]
16621                    .into(),
16622                    width: TextWidth::default(),
16623                },
16624            })
16625            .intern(db),
16626        )
16627    }
16628    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
16629        let kind = node.kind(db);
16630        assert_eq!(
16631            kind,
16632            SyntaxKind::ItemImpl,
16633            "Unexpected SyntaxKind {:?}. Expected {:?}.",
16634            kind,
16635            SyntaxKind::ItemImpl
16636        );
16637        Self { node }
16638    }
16639    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
16640        let kind = node.kind(db);
16641        if kind == SyntaxKind::ItemImpl { Some(Self::from_syntax_node(db, node)) } else { None }
16642    }
16643    fn as_syntax_node(&self) -> SyntaxNode {
16644        self.node
16645    }
16646    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
16647        ItemImplPtr(self.node.stable_ptr(db))
16648    }
16649}
16650#[derive(Clone, Debug, Eq, Hash, PartialEq)]
16651pub struct ItemHeaderDoc {
16652    node: SyntaxNode,
16653}
16654impl ItemHeaderDoc {
16655    pub const INDEX_EMPTY: usize = 0;
16656    pub fn new_green(db: &dyn SyntaxGroup, empty: TerminalEmptyGreen) -> ItemHeaderDocGreen {
16657        let children = [empty.0];
16658        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
16659        ItemHeaderDocGreen(
16660            Arc::new(GreenNode {
16661                kind: SyntaxKind::ItemHeaderDoc,
16662                details: GreenNodeDetails::Node { children: children.into(), width },
16663            })
16664            .intern(db),
16665        )
16666    }
16667}
16668impl ItemHeaderDoc {
16669    pub fn empty(&self, db: &dyn SyntaxGroup) -> TerminalEmpty {
16670        TerminalEmpty::from_syntax_node(db, self.node.get_children(db)[0])
16671    }
16672}
16673#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
16674pub struct ItemHeaderDocPtr(pub SyntaxStablePtrId);
16675impl ItemHeaderDocPtr {}
16676impl TypedStablePtr for ItemHeaderDocPtr {
16677    type SyntaxNode = ItemHeaderDoc;
16678    fn untyped(&self) -> SyntaxStablePtrId {
16679        self.0
16680    }
16681    fn lookup(&self, db: &dyn SyntaxGroup) -> ItemHeaderDoc {
16682        ItemHeaderDoc::from_syntax_node(db, self.0.lookup(db))
16683    }
16684}
16685impl From<ItemHeaderDocPtr> for SyntaxStablePtrId {
16686    fn from(ptr: ItemHeaderDocPtr) -> Self {
16687        ptr.untyped()
16688    }
16689}
16690#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
16691pub struct ItemHeaderDocGreen(pub GreenId);
16692impl TypedSyntaxNode for ItemHeaderDoc {
16693    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemHeaderDoc);
16694    type StablePtr = ItemHeaderDocPtr;
16695    type Green = ItemHeaderDocGreen;
16696    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
16697        ItemHeaderDocGreen(
16698            Arc::new(GreenNode {
16699                kind: SyntaxKind::ItemHeaderDoc,
16700                details: GreenNodeDetails::Node {
16701                    children: [TerminalEmpty::missing(db).0].into(),
16702                    width: TextWidth::default(),
16703                },
16704            })
16705            .intern(db),
16706        )
16707    }
16708    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
16709        let kind = node.kind(db);
16710        assert_eq!(
16711            kind,
16712            SyntaxKind::ItemHeaderDoc,
16713            "Unexpected SyntaxKind {:?}. Expected {:?}.",
16714            kind,
16715            SyntaxKind::ItemHeaderDoc
16716        );
16717        Self { node }
16718    }
16719    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
16720        let kind = node.kind(db);
16721        if kind == SyntaxKind::ItemHeaderDoc {
16722            Some(Self::from_syntax_node(db, node))
16723        } else {
16724            None
16725        }
16726    }
16727    fn as_syntax_node(&self) -> SyntaxNode {
16728        self.node
16729    }
16730    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
16731        ItemHeaderDocPtr(self.node.stable_ptr(db))
16732    }
16733}
16734#[derive(Clone, Debug, Eq, Hash, PartialEq)]
16735pub enum MaybeImplBody {
16736    Some(ImplBody),
16737    None(TerminalSemicolon),
16738}
16739#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
16740pub struct MaybeImplBodyPtr(pub SyntaxStablePtrId);
16741impl TypedStablePtr for MaybeImplBodyPtr {
16742    type SyntaxNode = MaybeImplBody;
16743    fn untyped(&self) -> SyntaxStablePtrId {
16744        self.0
16745    }
16746    fn lookup(&self, db: &dyn SyntaxGroup) -> MaybeImplBody {
16747        MaybeImplBody::from_syntax_node(db, self.0.lookup(db))
16748    }
16749}
16750impl From<MaybeImplBodyPtr> for SyntaxStablePtrId {
16751    fn from(ptr: MaybeImplBodyPtr) -> Self {
16752        ptr.untyped()
16753    }
16754}
16755impl From<ImplBodyPtr> for MaybeImplBodyPtr {
16756    fn from(value: ImplBodyPtr) -> Self {
16757        Self(value.0)
16758    }
16759}
16760impl From<TerminalSemicolonPtr> for MaybeImplBodyPtr {
16761    fn from(value: TerminalSemicolonPtr) -> Self {
16762        Self(value.0)
16763    }
16764}
16765impl From<ImplBodyGreen> for MaybeImplBodyGreen {
16766    fn from(value: ImplBodyGreen) -> Self {
16767        Self(value.0)
16768    }
16769}
16770impl From<TerminalSemicolonGreen> for MaybeImplBodyGreen {
16771    fn from(value: TerminalSemicolonGreen) -> Self {
16772        Self(value.0)
16773    }
16774}
16775#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
16776pub struct MaybeImplBodyGreen(pub GreenId);
16777impl TypedSyntaxNode for MaybeImplBody {
16778    const OPTIONAL_KIND: Option<SyntaxKind> = None;
16779    type StablePtr = MaybeImplBodyPtr;
16780    type Green = MaybeImplBodyGreen;
16781    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
16782        panic!("No missing variant.");
16783    }
16784    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
16785        let kind = node.kind(db);
16786        match kind {
16787            SyntaxKind::ImplBody => MaybeImplBody::Some(ImplBody::from_syntax_node(db, node)),
16788            SyntaxKind::TerminalSemicolon => {
16789                MaybeImplBody::None(TerminalSemicolon::from_syntax_node(db, node))
16790            }
16791            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "MaybeImplBody"),
16792        }
16793    }
16794    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
16795        let kind = node.kind(db);
16796        match kind {
16797            SyntaxKind::ImplBody => Some(MaybeImplBody::Some(ImplBody::from_syntax_node(db, node))),
16798            SyntaxKind::TerminalSemicolon => {
16799                Some(MaybeImplBody::None(TerminalSemicolon::from_syntax_node(db, node)))
16800            }
16801            _ => None,
16802        }
16803    }
16804    fn as_syntax_node(&self) -> SyntaxNode {
16805        match self {
16806            MaybeImplBody::Some(x) => x.as_syntax_node(),
16807            MaybeImplBody::None(x) => x.as_syntax_node(),
16808        }
16809    }
16810    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
16811        MaybeImplBodyPtr(self.as_syntax_node().lookup_intern(db).stable_ptr)
16812    }
16813}
16814impl MaybeImplBody {
16815    /// Checks if a kind of a variant of [MaybeImplBody].
16816    pub fn is_variant(kind: SyntaxKind) -> bool {
16817        matches!(kind, SyntaxKind::ImplBody | SyntaxKind::TerminalSemicolon)
16818    }
16819}
16820#[derive(Clone, Debug, Eq, Hash, PartialEq)]
16821pub struct ImplBody {
16822    node: SyntaxNode,
16823}
16824impl ImplBody {
16825    pub const INDEX_LBRACE: usize = 0;
16826    pub const INDEX_ITEMS: usize = 1;
16827    pub const INDEX_RBRACE: usize = 2;
16828    pub fn new_green(
16829        db: &dyn SyntaxGroup,
16830        lbrace: TerminalLBraceGreen,
16831        items: ImplItemListGreen,
16832        rbrace: TerminalRBraceGreen,
16833    ) -> ImplBodyGreen {
16834        let children = [lbrace.0, items.0, rbrace.0];
16835        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
16836        ImplBodyGreen(
16837            Arc::new(GreenNode {
16838                kind: SyntaxKind::ImplBody,
16839                details: GreenNodeDetails::Node { children: children.into(), width },
16840            })
16841            .intern(db),
16842        )
16843    }
16844}
16845impl ImplBody {
16846    pub fn lbrace(&self, db: &dyn SyntaxGroup) -> TerminalLBrace {
16847        TerminalLBrace::from_syntax_node(db, self.node.get_children(db)[0])
16848    }
16849    pub fn items(&self, db: &dyn SyntaxGroup) -> ImplItemList {
16850        ImplItemList::from_syntax_node(db, self.node.get_children(db)[1])
16851    }
16852    pub fn rbrace(&self, db: &dyn SyntaxGroup) -> TerminalRBrace {
16853        TerminalRBrace::from_syntax_node(db, self.node.get_children(db)[2])
16854    }
16855}
16856#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
16857pub struct ImplBodyPtr(pub SyntaxStablePtrId);
16858impl ImplBodyPtr {}
16859impl TypedStablePtr for ImplBodyPtr {
16860    type SyntaxNode = ImplBody;
16861    fn untyped(&self) -> SyntaxStablePtrId {
16862        self.0
16863    }
16864    fn lookup(&self, db: &dyn SyntaxGroup) -> ImplBody {
16865        ImplBody::from_syntax_node(db, self.0.lookup(db))
16866    }
16867}
16868impl From<ImplBodyPtr> for SyntaxStablePtrId {
16869    fn from(ptr: ImplBodyPtr) -> Self {
16870        ptr.untyped()
16871    }
16872}
16873#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
16874pub struct ImplBodyGreen(pub GreenId);
16875impl TypedSyntaxNode for ImplBody {
16876    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ImplBody);
16877    type StablePtr = ImplBodyPtr;
16878    type Green = ImplBodyGreen;
16879    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
16880        ImplBodyGreen(
16881            Arc::new(GreenNode {
16882                kind: SyntaxKind::ImplBody,
16883                details: GreenNodeDetails::Node {
16884                    children: [
16885                        TerminalLBrace::missing(db).0,
16886                        ImplItemList::missing(db).0,
16887                        TerminalRBrace::missing(db).0,
16888                    ]
16889                    .into(),
16890                    width: TextWidth::default(),
16891                },
16892            })
16893            .intern(db),
16894        )
16895    }
16896    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
16897        let kind = node.kind(db);
16898        assert_eq!(
16899            kind,
16900            SyntaxKind::ImplBody,
16901            "Unexpected SyntaxKind {:?}. Expected {:?}.",
16902            kind,
16903            SyntaxKind::ImplBody
16904        );
16905        Self { node }
16906    }
16907    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
16908        let kind = node.kind(db);
16909        if kind == SyntaxKind::ImplBody { Some(Self::from_syntax_node(db, node)) } else { None }
16910    }
16911    fn as_syntax_node(&self) -> SyntaxNode {
16912        self.node
16913    }
16914    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
16915        ImplBodyPtr(self.node.stable_ptr(db))
16916    }
16917}
16918#[derive(Clone, Debug, Eq, Hash, PartialEq)]
16919pub struct ImplItemList(ElementList<ImplItem, 1>);
16920impl Deref for ImplItemList {
16921    type Target = ElementList<ImplItem, 1>;
16922    fn deref(&self) -> &Self::Target {
16923        &self.0
16924    }
16925}
16926impl ImplItemList {
16927    pub fn new_green(db: &dyn SyntaxGroup, children: &[ImplItemGreen]) -> ImplItemListGreen {
16928        let width = children.iter().map(|id| id.0.lookup_intern(db).width()).sum();
16929        ImplItemListGreen(
16930            Arc::new(GreenNode {
16931                kind: SyntaxKind::ImplItemList,
16932                details: GreenNodeDetails::Node {
16933                    children: children.iter().map(|x| x.0).collect(),
16934                    width,
16935                },
16936            })
16937            .intern(db),
16938        )
16939    }
16940}
16941#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
16942pub struct ImplItemListPtr(pub SyntaxStablePtrId);
16943impl TypedStablePtr for ImplItemListPtr {
16944    type SyntaxNode = ImplItemList;
16945    fn untyped(&self) -> SyntaxStablePtrId {
16946        self.0
16947    }
16948    fn lookup(&self, db: &dyn SyntaxGroup) -> ImplItemList {
16949        ImplItemList::from_syntax_node(db, self.0.lookup(db))
16950    }
16951}
16952impl From<ImplItemListPtr> for SyntaxStablePtrId {
16953    fn from(ptr: ImplItemListPtr) -> Self {
16954        ptr.untyped()
16955    }
16956}
16957#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
16958pub struct ImplItemListGreen(pub GreenId);
16959impl TypedSyntaxNode for ImplItemList {
16960    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ImplItemList);
16961    type StablePtr = ImplItemListPtr;
16962    type Green = ImplItemListGreen;
16963    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
16964        ImplItemListGreen(
16965            Arc::new(GreenNode {
16966                kind: SyntaxKind::ImplItemList,
16967                details: GreenNodeDetails::Node {
16968                    children: [].into(),
16969                    width: TextWidth::default(),
16970                },
16971            })
16972            .intern(db),
16973        )
16974    }
16975    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
16976        Self(ElementList::new(node))
16977    }
16978    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
16979        if node.kind(db) == SyntaxKind::ImplItemList {
16980            Some(Self(ElementList::new(node)))
16981        } else {
16982            None
16983        }
16984    }
16985    fn as_syntax_node(&self) -> SyntaxNode {
16986        self.node
16987    }
16988    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
16989        ImplItemListPtr(self.node.stable_ptr(db))
16990    }
16991}
16992#[derive(Clone, Debug, Eq, Hash, PartialEq)]
16993pub enum ImplItem {
16994    Function(FunctionWithBody),
16995    Type(ItemTypeAlias),
16996    Constant(ItemConstant),
16997    Impl(ItemImplAlias),
16998    Module(ItemModule),
16999    Use(ItemUse),
17000    ExternFunction(ItemExternFunction),
17001    ExternType(ItemExternType),
17002    Trait(ItemTrait),
17003    Struct(ItemStruct),
17004    Enum(ItemEnum),
17005    Missing(ImplItemMissing),
17006}
17007#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
17008pub struct ImplItemPtr(pub SyntaxStablePtrId);
17009impl TypedStablePtr for ImplItemPtr {
17010    type SyntaxNode = ImplItem;
17011    fn untyped(&self) -> SyntaxStablePtrId {
17012        self.0
17013    }
17014    fn lookup(&self, db: &dyn SyntaxGroup) -> ImplItem {
17015        ImplItem::from_syntax_node(db, self.0.lookup(db))
17016    }
17017}
17018impl From<ImplItemPtr> for SyntaxStablePtrId {
17019    fn from(ptr: ImplItemPtr) -> Self {
17020        ptr.untyped()
17021    }
17022}
17023impl From<FunctionWithBodyPtr> for ImplItemPtr {
17024    fn from(value: FunctionWithBodyPtr) -> Self {
17025        Self(value.0)
17026    }
17027}
17028impl From<ItemTypeAliasPtr> for ImplItemPtr {
17029    fn from(value: ItemTypeAliasPtr) -> Self {
17030        Self(value.0)
17031    }
17032}
17033impl From<ItemConstantPtr> for ImplItemPtr {
17034    fn from(value: ItemConstantPtr) -> Self {
17035        Self(value.0)
17036    }
17037}
17038impl From<ItemImplAliasPtr> for ImplItemPtr {
17039    fn from(value: ItemImplAliasPtr) -> Self {
17040        Self(value.0)
17041    }
17042}
17043impl From<ItemModulePtr> for ImplItemPtr {
17044    fn from(value: ItemModulePtr) -> Self {
17045        Self(value.0)
17046    }
17047}
17048impl From<ItemUsePtr> for ImplItemPtr {
17049    fn from(value: ItemUsePtr) -> Self {
17050        Self(value.0)
17051    }
17052}
17053impl From<ItemExternFunctionPtr> for ImplItemPtr {
17054    fn from(value: ItemExternFunctionPtr) -> Self {
17055        Self(value.0)
17056    }
17057}
17058impl From<ItemExternTypePtr> for ImplItemPtr {
17059    fn from(value: ItemExternTypePtr) -> Self {
17060        Self(value.0)
17061    }
17062}
17063impl From<ItemTraitPtr> for ImplItemPtr {
17064    fn from(value: ItemTraitPtr) -> Self {
17065        Self(value.0)
17066    }
17067}
17068impl From<ItemStructPtr> for ImplItemPtr {
17069    fn from(value: ItemStructPtr) -> Self {
17070        Self(value.0)
17071    }
17072}
17073impl From<ItemEnumPtr> for ImplItemPtr {
17074    fn from(value: ItemEnumPtr) -> Self {
17075        Self(value.0)
17076    }
17077}
17078impl From<ImplItemMissingPtr> for ImplItemPtr {
17079    fn from(value: ImplItemMissingPtr) -> Self {
17080        Self(value.0)
17081    }
17082}
17083impl From<FunctionWithBodyGreen> for ImplItemGreen {
17084    fn from(value: FunctionWithBodyGreen) -> Self {
17085        Self(value.0)
17086    }
17087}
17088impl From<ItemTypeAliasGreen> for ImplItemGreen {
17089    fn from(value: ItemTypeAliasGreen) -> Self {
17090        Self(value.0)
17091    }
17092}
17093impl From<ItemConstantGreen> for ImplItemGreen {
17094    fn from(value: ItemConstantGreen) -> Self {
17095        Self(value.0)
17096    }
17097}
17098impl From<ItemImplAliasGreen> for ImplItemGreen {
17099    fn from(value: ItemImplAliasGreen) -> Self {
17100        Self(value.0)
17101    }
17102}
17103impl From<ItemModuleGreen> for ImplItemGreen {
17104    fn from(value: ItemModuleGreen) -> Self {
17105        Self(value.0)
17106    }
17107}
17108impl From<ItemUseGreen> for ImplItemGreen {
17109    fn from(value: ItemUseGreen) -> Self {
17110        Self(value.0)
17111    }
17112}
17113impl From<ItemExternFunctionGreen> for ImplItemGreen {
17114    fn from(value: ItemExternFunctionGreen) -> Self {
17115        Self(value.0)
17116    }
17117}
17118impl From<ItemExternTypeGreen> for ImplItemGreen {
17119    fn from(value: ItemExternTypeGreen) -> Self {
17120        Self(value.0)
17121    }
17122}
17123impl From<ItemTraitGreen> for ImplItemGreen {
17124    fn from(value: ItemTraitGreen) -> Self {
17125        Self(value.0)
17126    }
17127}
17128impl From<ItemStructGreen> for ImplItemGreen {
17129    fn from(value: ItemStructGreen) -> Self {
17130        Self(value.0)
17131    }
17132}
17133impl From<ItemEnumGreen> for ImplItemGreen {
17134    fn from(value: ItemEnumGreen) -> Self {
17135        Self(value.0)
17136    }
17137}
17138impl From<ImplItemMissingGreen> for ImplItemGreen {
17139    fn from(value: ImplItemMissingGreen) -> Self {
17140        Self(value.0)
17141    }
17142}
17143#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
17144pub struct ImplItemGreen(pub GreenId);
17145impl TypedSyntaxNode for ImplItem {
17146    const OPTIONAL_KIND: Option<SyntaxKind> = None;
17147    type StablePtr = ImplItemPtr;
17148    type Green = ImplItemGreen;
17149    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
17150        ImplItemGreen(ImplItemMissing::missing(db).0)
17151    }
17152    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
17153        let kind = node.kind(db);
17154        match kind {
17155            SyntaxKind::FunctionWithBody => {
17156                ImplItem::Function(FunctionWithBody::from_syntax_node(db, node))
17157            }
17158            SyntaxKind::ItemTypeAlias => ImplItem::Type(ItemTypeAlias::from_syntax_node(db, node)),
17159            SyntaxKind::ItemConstant => {
17160                ImplItem::Constant(ItemConstant::from_syntax_node(db, node))
17161            }
17162            SyntaxKind::ItemImplAlias => ImplItem::Impl(ItemImplAlias::from_syntax_node(db, node)),
17163            SyntaxKind::ItemModule => ImplItem::Module(ItemModule::from_syntax_node(db, node)),
17164            SyntaxKind::ItemUse => ImplItem::Use(ItemUse::from_syntax_node(db, node)),
17165            SyntaxKind::ItemExternFunction => {
17166                ImplItem::ExternFunction(ItemExternFunction::from_syntax_node(db, node))
17167            }
17168            SyntaxKind::ItemExternType => {
17169                ImplItem::ExternType(ItemExternType::from_syntax_node(db, node))
17170            }
17171            SyntaxKind::ItemTrait => ImplItem::Trait(ItemTrait::from_syntax_node(db, node)),
17172            SyntaxKind::ItemStruct => ImplItem::Struct(ItemStruct::from_syntax_node(db, node)),
17173            SyntaxKind::ItemEnum => ImplItem::Enum(ItemEnum::from_syntax_node(db, node)),
17174            SyntaxKind::ImplItemMissing => {
17175                ImplItem::Missing(ImplItemMissing::from_syntax_node(db, node))
17176            }
17177            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "ImplItem"),
17178        }
17179    }
17180    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
17181        let kind = node.kind(db);
17182        match kind {
17183            SyntaxKind::FunctionWithBody => {
17184                Some(ImplItem::Function(FunctionWithBody::from_syntax_node(db, node)))
17185            }
17186            SyntaxKind::ItemTypeAlias => {
17187                Some(ImplItem::Type(ItemTypeAlias::from_syntax_node(db, node)))
17188            }
17189            SyntaxKind::ItemConstant => {
17190                Some(ImplItem::Constant(ItemConstant::from_syntax_node(db, node)))
17191            }
17192            SyntaxKind::ItemImplAlias => {
17193                Some(ImplItem::Impl(ItemImplAlias::from_syntax_node(db, node)))
17194            }
17195            SyntaxKind::ItemModule => {
17196                Some(ImplItem::Module(ItemModule::from_syntax_node(db, node)))
17197            }
17198            SyntaxKind::ItemUse => Some(ImplItem::Use(ItemUse::from_syntax_node(db, node))),
17199            SyntaxKind::ItemExternFunction => {
17200                Some(ImplItem::ExternFunction(ItemExternFunction::from_syntax_node(db, node)))
17201            }
17202            SyntaxKind::ItemExternType => {
17203                Some(ImplItem::ExternType(ItemExternType::from_syntax_node(db, node)))
17204            }
17205            SyntaxKind::ItemTrait => Some(ImplItem::Trait(ItemTrait::from_syntax_node(db, node))),
17206            SyntaxKind::ItemStruct => {
17207                Some(ImplItem::Struct(ItemStruct::from_syntax_node(db, node)))
17208            }
17209            SyntaxKind::ItemEnum => Some(ImplItem::Enum(ItemEnum::from_syntax_node(db, node))),
17210            SyntaxKind::ImplItemMissing => {
17211                Some(ImplItem::Missing(ImplItemMissing::from_syntax_node(db, node)))
17212            }
17213            _ => None,
17214        }
17215    }
17216    fn as_syntax_node(&self) -> SyntaxNode {
17217        match self {
17218            ImplItem::Function(x) => x.as_syntax_node(),
17219            ImplItem::Type(x) => x.as_syntax_node(),
17220            ImplItem::Constant(x) => x.as_syntax_node(),
17221            ImplItem::Impl(x) => x.as_syntax_node(),
17222            ImplItem::Module(x) => x.as_syntax_node(),
17223            ImplItem::Use(x) => x.as_syntax_node(),
17224            ImplItem::ExternFunction(x) => x.as_syntax_node(),
17225            ImplItem::ExternType(x) => x.as_syntax_node(),
17226            ImplItem::Trait(x) => x.as_syntax_node(),
17227            ImplItem::Struct(x) => x.as_syntax_node(),
17228            ImplItem::Enum(x) => x.as_syntax_node(),
17229            ImplItem::Missing(x) => x.as_syntax_node(),
17230        }
17231    }
17232    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
17233        ImplItemPtr(self.as_syntax_node().lookup_intern(db).stable_ptr)
17234    }
17235}
17236impl ImplItem {
17237    /// Checks if a kind of a variant of [ImplItem].
17238    pub fn is_variant(kind: SyntaxKind) -> bool {
17239        matches!(
17240            kind,
17241            SyntaxKind::FunctionWithBody
17242                | SyntaxKind::ItemTypeAlias
17243                | SyntaxKind::ItemConstant
17244                | SyntaxKind::ItemImplAlias
17245                | SyntaxKind::ItemModule
17246                | SyntaxKind::ItemUse
17247                | SyntaxKind::ItemExternFunction
17248                | SyntaxKind::ItemExternType
17249                | SyntaxKind::ItemTrait
17250                | SyntaxKind::ItemStruct
17251                | SyntaxKind::ItemEnum
17252                | SyntaxKind::ImplItemMissing
17253        )
17254    }
17255}
17256#[derive(Clone, Debug, Eq, Hash, PartialEq)]
17257pub struct ImplItemMissing {
17258    node: SyntaxNode,
17259}
17260impl ImplItemMissing {
17261    pub fn new_green(db: &dyn SyntaxGroup) -> ImplItemMissingGreen {
17262        let children = [];
17263        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
17264        ImplItemMissingGreen(
17265            Arc::new(GreenNode {
17266                kind: SyntaxKind::ImplItemMissing,
17267                details: GreenNodeDetails::Node { children: children.into(), width },
17268            })
17269            .intern(db),
17270        )
17271    }
17272}
17273impl ImplItemMissing {}
17274#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
17275pub struct ImplItemMissingPtr(pub SyntaxStablePtrId);
17276impl ImplItemMissingPtr {}
17277impl TypedStablePtr for ImplItemMissingPtr {
17278    type SyntaxNode = ImplItemMissing;
17279    fn untyped(&self) -> SyntaxStablePtrId {
17280        self.0
17281    }
17282    fn lookup(&self, db: &dyn SyntaxGroup) -> ImplItemMissing {
17283        ImplItemMissing::from_syntax_node(db, self.0.lookup(db))
17284    }
17285}
17286impl From<ImplItemMissingPtr> for SyntaxStablePtrId {
17287    fn from(ptr: ImplItemMissingPtr) -> Self {
17288        ptr.untyped()
17289    }
17290}
17291#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
17292pub struct ImplItemMissingGreen(pub GreenId);
17293impl TypedSyntaxNode for ImplItemMissing {
17294    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ImplItemMissing);
17295    type StablePtr = ImplItemMissingPtr;
17296    type Green = ImplItemMissingGreen;
17297    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
17298        ImplItemMissingGreen(
17299            Arc::new(GreenNode {
17300                kind: SyntaxKind::ImplItemMissing,
17301                details: GreenNodeDetails::Node {
17302                    children: [].into(),
17303                    width: TextWidth::default(),
17304                },
17305            })
17306            .intern(db),
17307        )
17308    }
17309    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
17310        let kind = node.kind(db);
17311        assert_eq!(
17312            kind,
17313            SyntaxKind::ImplItemMissing,
17314            "Unexpected SyntaxKind {:?}. Expected {:?}.",
17315            kind,
17316            SyntaxKind::ImplItemMissing
17317        );
17318        Self { node }
17319    }
17320    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
17321        let kind = node.kind(db);
17322        if kind == SyntaxKind::ImplItemMissing {
17323            Some(Self::from_syntax_node(db, node))
17324        } else {
17325            None
17326        }
17327    }
17328    fn as_syntax_node(&self) -> SyntaxNode {
17329        self.node
17330    }
17331    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
17332        ImplItemMissingPtr(self.node.stable_ptr(db))
17333    }
17334}
17335#[derive(Clone, Debug, Eq, Hash, PartialEq)]
17336pub struct ItemImplAlias {
17337    node: SyntaxNode,
17338}
17339impl ItemImplAlias {
17340    pub const INDEX_ATTRIBUTES: usize = 0;
17341    pub const INDEX_VISIBILITY: usize = 1;
17342    pub const INDEX_IMPL_KW: usize = 2;
17343    pub const INDEX_NAME: usize = 3;
17344    pub const INDEX_GENERIC_PARAMS: usize = 4;
17345    pub const INDEX_EQ: usize = 5;
17346    pub const INDEX_IMPL_PATH: usize = 6;
17347    pub const INDEX_SEMICOLON: usize = 7;
17348    pub fn new_green(
17349        db: &dyn SyntaxGroup,
17350        attributes: AttributeListGreen,
17351        visibility: VisibilityGreen,
17352        impl_kw: TerminalImplGreen,
17353        name: TerminalIdentifierGreen,
17354        generic_params: OptionWrappedGenericParamListGreen,
17355        eq: TerminalEqGreen,
17356        impl_path: ExprPathGreen,
17357        semicolon: TerminalSemicolonGreen,
17358    ) -> ItemImplAliasGreen {
17359        let children = [
17360            attributes.0,
17361            visibility.0,
17362            impl_kw.0,
17363            name.0,
17364            generic_params.0,
17365            eq.0,
17366            impl_path.0,
17367            semicolon.0,
17368        ];
17369        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
17370        ItemImplAliasGreen(
17371            Arc::new(GreenNode {
17372                kind: SyntaxKind::ItemImplAlias,
17373                details: GreenNodeDetails::Node { children: children.into(), width },
17374            })
17375            .intern(db),
17376        )
17377    }
17378}
17379impl ItemImplAlias {
17380    pub fn attributes(&self, db: &dyn SyntaxGroup) -> AttributeList {
17381        AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
17382    }
17383    pub fn visibility(&self, db: &dyn SyntaxGroup) -> Visibility {
17384        Visibility::from_syntax_node(db, self.node.get_children(db)[1])
17385    }
17386    pub fn impl_kw(&self, db: &dyn SyntaxGroup) -> TerminalImpl {
17387        TerminalImpl::from_syntax_node(db, self.node.get_children(db)[2])
17388    }
17389    pub fn name(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier {
17390        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[3])
17391    }
17392    pub fn generic_params(&self, db: &dyn SyntaxGroup) -> OptionWrappedGenericParamList {
17393        OptionWrappedGenericParamList::from_syntax_node(db, self.node.get_children(db)[4])
17394    }
17395    pub fn eq(&self, db: &dyn SyntaxGroup) -> TerminalEq {
17396        TerminalEq::from_syntax_node(db, self.node.get_children(db)[5])
17397    }
17398    pub fn impl_path(&self, db: &dyn SyntaxGroup) -> ExprPath {
17399        ExprPath::from_syntax_node(db, self.node.get_children(db)[6])
17400    }
17401    pub fn semicolon(&self, db: &dyn SyntaxGroup) -> TerminalSemicolon {
17402        TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[7])
17403    }
17404}
17405#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
17406pub struct ItemImplAliasPtr(pub SyntaxStablePtrId);
17407impl ItemImplAliasPtr {
17408    pub fn name_green(self, db: &dyn SyntaxGroup) -> TerminalIdentifierGreen {
17409        let ptr = self.0.lookup_intern(db);
17410        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
17411            TerminalIdentifierGreen(key_fields[0])
17412        } else {
17413            panic!("Unexpected key field query on root.");
17414        }
17415    }
17416}
17417impl TypedStablePtr for ItemImplAliasPtr {
17418    type SyntaxNode = ItemImplAlias;
17419    fn untyped(&self) -> SyntaxStablePtrId {
17420        self.0
17421    }
17422    fn lookup(&self, db: &dyn SyntaxGroup) -> ItemImplAlias {
17423        ItemImplAlias::from_syntax_node(db, self.0.lookup(db))
17424    }
17425}
17426impl From<ItemImplAliasPtr> for SyntaxStablePtrId {
17427    fn from(ptr: ItemImplAliasPtr) -> Self {
17428        ptr.untyped()
17429    }
17430}
17431#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
17432pub struct ItemImplAliasGreen(pub GreenId);
17433impl TypedSyntaxNode for ItemImplAlias {
17434    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemImplAlias);
17435    type StablePtr = ItemImplAliasPtr;
17436    type Green = ItemImplAliasGreen;
17437    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
17438        ItemImplAliasGreen(
17439            Arc::new(GreenNode {
17440                kind: SyntaxKind::ItemImplAlias,
17441                details: GreenNodeDetails::Node {
17442                    children: [
17443                        AttributeList::missing(db).0,
17444                        Visibility::missing(db).0,
17445                        TerminalImpl::missing(db).0,
17446                        TerminalIdentifier::missing(db).0,
17447                        OptionWrappedGenericParamList::missing(db).0,
17448                        TerminalEq::missing(db).0,
17449                        ExprPath::missing(db).0,
17450                        TerminalSemicolon::missing(db).0,
17451                    ]
17452                    .into(),
17453                    width: TextWidth::default(),
17454                },
17455            })
17456            .intern(db),
17457        )
17458    }
17459    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
17460        let kind = node.kind(db);
17461        assert_eq!(
17462            kind,
17463            SyntaxKind::ItemImplAlias,
17464            "Unexpected SyntaxKind {:?}. Expected {:?}.",
17465            kind,
17466            SyntaxKind::ItemImplAlias
17467        );
17468        Self { node }
17469    }
17470    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
17471        let kind = node.kind(db);
17472        if kind == SyntaxKind::ItemImplAlias {
17473            Some(Self::from_syntax_node(db, node))
17474        } else {
17475            None
17476        }
17477    }
17478    fn as_syntax_node(&self) -> SyntaxNode {
17479        self.node
17480    }
17481    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
17482        ItemImplAliasPtr(self.node.stable_ptr(db))
17483    }
17484}
17485#[derive(Clone, Debug, Eq, Hash, PartialEq)]
17486pub struct ItemStruct {
17487    node: SyntaxNode,
17488}
17489impl ItemStruct {
17490    pub const INDEX_ATTRIBUTES: usize = 0;
17491    pub const INDEX_VISIBILITY: usize = 1;
17492    pub const INDEX_STRUCT_KW: usize = 2;
17493    pub const INDEX_NAME: usize = 3;
17494    pub const INDEX_GENERIC_PARAMS: usize = 4;
17495    pub const INDEX_LBRACE: usize = 5;
17496    pub const INDEX_MEMBERS: usize = 6;
17497    pub const INDEX_RBRACE: usize = 7;
17498    pub fn new_green(
17499        db: &dyn SyntaxGroup,
17500        attributes: AttributeListGreen,
17501        visibility: VisibilityGreen,
17502        struct_kw: TerminalStructGreen,
17503        name: TerminalIdentifierGreen,
17504        generic_params: OptionWrappedGenericParamListGreen,
17505        lbrace: TerminalLBraceGreen,
17506        members: MemberListGreen,
17507        rbrace: TerminalRBraceGreen,
17508    ) -> ItemStructGreen {
17509        let children = [
17510            attributes.0,
17511            visibility.0,
17512            struct_kw.0,
17513            name.0,
17514            generic_params.0,
17515            lbrace.0,
17516            members.0,
17517            rbrace.0,
17518        ];
17519        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
17520        ItemStructGreen(
17521            Arc::new(GreenNode {
17522                kind: SyntaxKind::ItemStruct,
17523                details: GreenNodeDetails::Node { children: children.into(), width },
17524            })
17525            .intern(db),
17526        )
17527    }
17528}
17529impl ItemStruct {
17530    pub fn attributes(&self, db: &dyn SyntaxGroup) -> AttributeList {
17531        AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
17532    }
17533    pub fn visibility(&self, db: &dyn SyntaxGroup) -> Visibility {
17534        Visibility::from_syntax_node(db, self.node.get_children(db)[1])
17535    }
17536    pub fn struct_kw(&self, db: &dyn SyntaxGroup) -> TerminalStruct {
17537        TerminalStruct::from_syntax_node(db, self.node.get_children(db)[2])
17538    }
17539    pub fn name(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier {
17540        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[3])
17541    }
17542    pub fn generic_params(&self, db: &dyn SyntaxGroup) -> OptionWrappedGenericParamList {
17543        OptionWrappedGenericParamList::from_syntax_node(db, self.node.get_children(db)[4])
17544    }
17545    pub fn lbrace(&self, db: &dyn SyntaxGroup) -> TerminalLBrace {
17546        TerminalLBrace::from_syntax_node(db, self.node.get_children(db)[5])
17547    }
17548    pub fn members(&self, db: &dyn SyntaxGroup) -> MemberList {
17549        MemberList::from_syntax_node(db, self.node.get_children(db)[6])
17550    }
17551    pub fn rbrace(&self, db: &dyn SyntaxGroup) -> TerminalRBrace {
17552        TerminalRBrace::from_syntax_node(db, self.node.get_children(db)[7])
17553    }
17554}
17555#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
17556pub struct ItemStructPtr(pub SyntaxStablePtrId);
17557impl ItemStructPtr {
17558    pub fn name_green(self, db: &dyn SyntaxGroup) -> TerminalIdentifierGreen {
17559        let ptr = self.0.lookup_intern(db);
17560        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
17561            TerminalIdentifierGreen(key_fields[0])
17562        } else {
17563            panic!("Unexpected key field query on root.");
17564        }
17565    }
17566}
17567impl TypedStablePtr for ItemStructPtr {
17568    type SyntaxNode = ItemStruct;
17569    fn untyped(&self) -> SyntaxStablePtrId {
17570        self.0
17571    }
17572    fn lookup(&self, db: &dyn SyntaxGroup) -> ItemStruct {
17573        ItemStruct::from_syntax_node(db, self.0.lookup(db))
17574    }
17575}
17576impl From<ItemStructPtr> for SyntaxStablePtrId {
17577    fn from(ptr: ItemStructPtr) -> Self {
17578        ptr.untyped()
17579    }
17580}
17581#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
17582pub struct ItemStructGreen(pub GreenId);
17583impl TypedSyntaxNode for ItemStruct {
17584    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemStruct);
17585    type StablePtr = ItemStructPtr;
17586    type Green = ItemStructGreen;
17587    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
17588        ItemStructGreen(
17589            Arc::new(GreenNode {
17590                kind: SyntaxKind::ItemStruct,
17591                details: GreenNodeDetails::Node {
17592                    children: [
17593                        AttributeList::missing(db).0,
17594                        Visibility::missing(db).0,
17595                        TerminalStruct::missing(db).0,
17596                        TerminalIdentifier::missing(db).0,
17597                        OptionWrappedGenericParamList::missing(db).0,
17598                        TerminalLBrace::missing(db).0,
17599                        MemberList::missing(db).0,
17600                        TerminalRBrace::missing(db).0,
17601                    ]
17602                    .into(),
17603                    width: TextWidth::default(),
17604                },
17605            })
17606            .intern(db),
17607        )
17608    }
17609    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
17610        let kind = node.kind(db);
17611        assert_eq!(
17612            kind,
17613            SyntaxKind::ItemStruct,
17614            "Unexpected SyntaxKind {:?}. Expected {:?}.",
17615            kind,
17616            SyntaxKind::ItemStruct
17617        );
17618        Self { node }
17619    }
17620    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
17621        let kind = node.kind(db);
17622        if kind == SyntaxKind::ItemStruct { Some(Self::from_syntax_node(db, node)) } else { None }
17623    }
17624    fn as_syntax_node(&self) -> SyntaxNode {
17625        self.node
17626    }
17627    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
17628        ItemStructPtr(self.node.stable_ptr(db))
17629    }
17630}
17631#[derive(Clone, Debug, Eq, Hash, PartialEq)]
17632pub struct ItemEnum {
17633    node: SyntaxNode,
17634}
17635impl ItemEnum {
17636    pub const INDEX_ATTRIBUTES: usize = 0;
17637    pub const INDEX_VISIBILITY: usize = 1;
17638    pub const INDEX_ENUM_KW: usize = 2;
17639    pub const INDEX_NAME: usize = 3;
17640    pub const INDEX_GENERIC_PARAMS: usize = 4;
17641    pub const INDEX_LBRACE: usize = 5;
17642    pub const INDEX_VARIANTS: usize = 6;
17643    pub const INDEX_RBRACE: usize = 7;
17644    pub fn new_green(
17645        db: &dyn SyntaxGroup,
17646        attributes: AttributeListGreen,
17647        visibility: VisibilityGreen,
17648        enum_kw: TerminalEnumGreen,
17649        name: TerminalIdentifierGreen,
17650        generic_params: OptionWrappedGenericParamListGreen,
17651        lbrace: TerminalLBraceGreen,
17652        variants: VariantListGreen,
17653        rbrace: TerminalRBraceGreen,
17654    ) -> ItemEnumGreen {
17655        let children = [
17656            attributes.0,
17657            visibility.0,
17658            enum_kw.0,
17659            name.0,
17660            generic_params.0,
17661            lbrace.0,
17662            variants.0,
17663            rbrace.0,
17664        ];
17665        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
17666        ItemEnumGreen(
17667            Arc::new(GreenNode {
17668                kind: SyntaxKind::ItemEnum,
17669                details: GreenNodeDetails::Node { children: children.into(), width },
17670            })
17671            .intern(db),
17672        )
17673    }
17674}
17675impl ItemEnum {
17676    pub fn attributes(&self, db: &dyn SyntaxGroup) -> AttributeList {
17677        AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
17678    }
17679    pub fn visibility(&self, db: &dyn SyntaxGroup) -> Visibility {
17680        Visibility::from_syntax_node(db, self.node.get_children(db)[1])
17681    }
17682    pub fn enum_kw(&self, db: &dyn SyntaxGroup) -> TerminalEnum {
17683        TerminalEnum::from_syntax_node(db, self.node.get_children(db)[2])
17684    }
17685    pub fn name(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier {
17686        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[3])
17687    }
17688    pub fn generic_params(&self, db: &dyn SyntaxGroup) -> OptionWrappedGenericParamList {
17689        OptionWrappedGenericParamList::from_syntax_node(db, self.node.get_children(db)[4])
17690    }
17691    pub fn lbrace(&self, db: &dyn SyntaxGroup) -> TerminalLBrace {
17692        TerminalLBrace::from_syntax_node(db, self.node.get_children(db)[5])
17693    }
17694    pub fn variants(&self, db: &dyn SyntaxGroup) -> VariantList {
17695        VariantList::from_syntax_node(db, self.node.get_children(db)[6])
17696    }
17697    pub fn rbrace(&self, db: &dyn SyntaxGroup) -> TerminalRBrace {
17698        TerminalRBrace::from_syntax_node(db, self.node.get_children(db)[7])
17699    }
17700}
17701#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
17702pub struct ItemEnumPtr(pub SyntaxStablePtrId);
17703impl ItemEnumPtr {
17704    pub fn name_green(self, db: &dyn SyntaxGroup) -> TerminalIdentifierGreen {
17705        let ptr = self.0.lookup_intern(db);
17706        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
17707            TerminalIdentifierGreen(key_fields[0])
17708        } else {
17709            panic!("Unexpected key field query on root.");
17710        }
17711    }
17712}
17713impl TypedStablePtr for ItemEnumPtr {
17714    type SyntaxNode = ItemEnum;
17715    fn untyped(&self) -> SyntaxStablePtrId {
17716        self.0
17717    }
17718    fn lookup(&self, db: &dyn SyntaxGroup) -> ItemEnum {
17719        ItemEnum::from_syntax_node(db, self.0.lookup(db))
17720    }
17721}
17722impl From<ItemEnumPtr> for SyntaxStablePtrId {
17723    fn from(ptr: ItemEnumPtr) -> Self {
17724        ptr.untyped()
17725    }
17726}
17727#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
17728pub struct ItemEnumGreen(pub GreenId);
17729impl TypedSyntaxNode for ItemEnum {
17730    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemEnum);
17731    type StablePtr = ItemEnumPtr;
17732    type Green = ItemEnumGreen;
17733    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
17734        ItemEnumGreen(
17735            Arc::new(GreenNode {
17736                kind: SyntaxKind::ItemEnum,
17737                details: GreenNodeDetails::Node {
17738                    children: [
17739                        AttributeList::missing(db).0,
17740                        Visibility::missing(db).0,
17741                        TerminalEnum::missing(db).0,
17742                        TerminalIdentifier::missing(db).0,
17743                        OptionWrappedGenericParamList::missing(db).0,
17744                        TerminalLBrace::missing(db).0,
17745                        VariantList::missing(db).0,
17746                        TerminalRBrace::missing(db).0,
17747                    ]
17748                    .into(),
17749                    width: TextWidth::default(),
17750                },
17751            })
17752            .intern(db),
17753        )
17754    }
17755    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
17756        let kind = node.kind(db);
17757        assert_eq!(
17758            kind,
17759            SyntaxKind::ItemEnum,
17760            "Unexpected SyntaxKind {:?}. Expected {:?}.",
17761            kind,
17762            SyntaxKind::ItemEnum
17763        );
17764        Self { node }
17765    }
17766    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
17767        let kind = node.kind(db);
17768        if kind == SyntaxKind::ItemEnum { Some(Self::from_syntax_node(db, node)) } else { None }
17769    }
17770    fn as_syntax_node(&self) -> SyntaxNode {
17771        self.node
17772    }
17773    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
17774        ItemEnumPtr(self.node.stable_ptr(db))
17775    }
17776}
17777#[derive(Clone, Debug, Eq, Hash, PartialEq)]
17778pub struct ItemTypeAlias {
17779    node: SyntaxNode,
17780}
17781impl ItemTypeAlias {
17782    pub const INDEX_ATTRIBUTES: usize = 0;
17783    pub const INDEX_VISIBILITY: usize = 1;
17784    pub const INDEX_TYPE_KW: usize = 2;
17785    pub const INDEX_NAME: usize = 3;
17786    pub const INDEX_GENERIC_PARAMS: usize = 4;
17787    pub const INDEX_EQ: usize = 5;
17788    pub const INDEX_TY: usize = 6;
17789    pub const INDEX_SEMICOLON: usize = 7;
17790    pub fn new_green(
17791        db: &dyn SyntaxGroup,
17792        attributes: AttributeListGreen,
17793        visibility: VisibilityGreen,
17794        type_kw: TerminalTypeGreen,
17795        name: TerminalIdentifierGreen,
17796        generic_params: OptionWrappedGenericParamListGreen,
17797        eq: TerminalEqGreen,
17798        ty: ExprGreen,
17799        semicolon: TerminalSemicolonGreen,
17800    ) -> ItemTypeAliasGreen {
17801        let children = [
17802            attributes.0,
17803            visibility.0,
17804            type_kw.0,
17805            name.0,
17806            generic_params.0,
17807            eq.0,
17808            ty.0,
17809            semicolon.0,
17810        ];
17811        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
17812        ItemTypeAliasGreen(
17813            Arc::new(GreenNode {
17814                kind: SyntaxKind::ItemTypeAlias,
17815                details: GreenNodeDetails::Node { children: children.into(), width },
17816            })
17817            .intern(db),
17818        )
17819    }
17820}
17821impl ItemTypeAlias {
17822    pub fn attributes(&self, db: &dyn SyntaxGroup) -> AttributeList {
17823        AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
17824    }
17825    pub fn visibility(&self, db: &dyn SyntaxGroup) -> Visibility {
17826        Visibility::from_syntax_node(db, self.node.get_children(db)[1])
17827    }
17828    pub fn type_kw(&self, db: &dyn SyntaxGroup) -> TerminalType {
17829        TerminalType::from_syntax_node(db, self.node.get_children(db)[2])
17830    }
17831    pub fn name(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier {
17832        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[3])
17833    }
17834    pub fn generic_params(&self, db: &dyn SyntaxGroup) -> OptionWrappedGenericParamList {
17835        OptionWrappedGenericParamList::from_syntax_node(db, self.node.get_children(db)[4])
17836    }
17837    pub fn eq(&self, db: &dyn SyntaxGroup) -> TerminalEq {
17838        TerminalEq::from_syntax_node(db, self.node.get_children(db)[5])
17839    }
17840    pub fn ty(&self, db: &dyn SyntaxGroup) -> Expr {
17841        Expr::from_syntax_node(db, self.node.get_children(db)[6])
17842    }
17843    pub fn semicolon(&self, db: &dyn SyntaxGroup) -> TerminalSemicolon {
17844        TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[7])
17845    }
17846}
17847#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
17848pub struct ItemTypeAliasPtr(pub SyntaxStablePtrId);
17849impl ItemTypeAliasPtr {
17850    pub fn name_green(self, db: &dyn SyntaxGroup) -> TerminalIdentifierGreen {
17851        let ptr = self.0.lookup_intern(db);
17852        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
17853            TerminalIdentifierGreen(key_fields[0])
17854        } else {
17855            panic!("Unexpected key field query on root.");
17856        }
17857    }
17858}
17859impl TypedStablePtr for ItemTypeAliasPtr {
17860    type SyntaxNode = ItemTypeAlias;
17861    fn untyped(&self) -> SyntaxStablePtrId {
17862        self.0
17863    }
17864    fn lookup(&self, db: &dyn SyntaxGroup) -> ItemTypeAlias {
17865        ItemTypeAlias::from_syntax_node(db, self.0.lookup(db))
17866    }
17867}
17868impl From<ItemTypeAliasPtr> for SyntaxStablePtrId {
17869    fn from(ptr: ItemTypeAliasPtr) -> Self {
17870        ptr.untyped()
17871    }
17872}
17873#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
17874pub struct ItemTypeAliasGreen(pub GreenId);
17875impl TypedSyntaxNode for ItemTypeAlias {
17876    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemTypeAlias);
17877    type StablePtr = ItemTypeAliasPtr;
17878    type Green = ItemTypeAliasGreen;
17879    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
17880        ItemTypeAliasGreen(
17881            Arc::new(GreenNode {
17882                kind: SyntaxKind::ItemTypeAlias,
17883                details: GreenNodeDetails::Node {
17884                    children: [
17885                        AttributeList::missing(db).0,
17886                        Visibility::missing(db).0,
17887                        TerminalType::missing(db).0,
17888                        TerminalIdentifier::missing(db).0,
17889                        OptionWrappedGenericParamList::missing(db).0,
17890                        TerminalEq::missing(db).0,
17891                        Expr::missing(db).0,
17892                        TerminalSemicolon::missing(db).0,
17893                    ]
17894                    .into(),
17895                    width: TextWidth::default(),
17896                },
17897            })
17898            .intern(db),
17899        )
17900    }
17901    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
17902        let kind = node.kind(db);
17903        assert_eq!(
17904            kind,
17905            SyntaxKind::ItemTypeAlias,
17906            "Unexpected SyntaxKind {:?}. Expected {:?}.",
17907            kind,
17908            SyntaxKind::ItemTypeAlias
17909        );
17910        Self { node }
17911    }
17912    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
17913        let kind = node.kind(db);
17914        if kind == SyntaxKind::ItemTypeAlias {
17915            Some(Self::from_syntax_node(db, node))
17916        } else {
17917            None
17918        }
17919    }
17920    fn as_syntax_node(&self) -> SyntaxNode {
17921        self.node
17922    }
17923    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
17924        ItemTypeAliasPtr(self.node.stable_ptr(db))
17925    }
17926}
17927#[derive(Clone, Debug, Eq, Hash, PartialEq)]
17928pub struct ItemUse {
17929    node: SyntaxNode,
17930}
17931impl ItemUse {
17932    pub const INDEX_ATTRIBUTES: usize = 0;
17933    pub const INDEX_VISIBILITY: usize = 1;
17934    pub const INDEX_USE_KW: usize = 2;
17935    pub const INDEX_USE_PATH: usize = 3;
17936    pub const INDEX_SEMICOLON: usize = 4;
17937    pub fn new_green(
17938        db: &dyn SyntaxGroup,
17939        attributes: AttributeListGreen,
17940        visibility: VisibilityGreen,
17941        use_kw: TerminalUseGreen,
17942        use_path: UsePathGreen,
17943        semicolon: TerminalSemicolonGreen,
17944    ) -> ItemUseGreen {
17945        let children = [attributes.0, visibility.0, use_kw.0, use_path.0, semicolon.0];
17946        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
17947        ItemUseGreen(
17948            Arc::new(GreenNode {
17949                kind: SyntaxKind::ItemUse,
17950                details: GreenNodeDetails::Node { children: children.into(), width },
17951            })
17952            .intern(db),
17953        )
17954    }
17955}
17956impl ItemUse {
17957    pub fn attributes(&self, db: &dyn SyntaxGroup) -> AttributeList {
17958        AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
17959    }
17960    pub fn visibility(&self, db: &dyn SyntaxGroup) -> Visibility {
17961        Visibility::from_syntax_node(db, self.node.get_children(db)[1])
17962    }
17963    pub fn use_kw(&self, db: &dyn SyntaxGroup) -> TerminalUse {
17964        TerminalUse::from_syntax_node(db, self.node.get_children(db)[2])
17965    }
17966    pub fn use_path(&self, db: &dyn SyntaxGroup) -> UsePath {
17967        UsePath::from_syntax_node(db, self.node.get_children(db)[3])
17968    }
17969    pub fn semicolon(&self, db: &dyn SyntaxGroup) -> TerminalSemicolon {
17970        TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[4])
17971    }
17972}
17973#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
17974pub struct ItemUsePtr(pub SyntaxStablePtrId);
17975impl ItemUsePtr {
17976    pub fn use_path_green(self, db: &dyn SyntaxGroup) -> UsePathGreen {
17977        let ptr = self.0.lookup_intern(db);
17978        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
17979            UsePathGreen(key_fields[0])
17980        } else {
17981            panic!("Unexpected key field query on root.");
17982        }
17983    }
17984}
17985impl TypedStablePtr for ItemUsePtr {
17986    type SyntaxNode = ItemUse;
17987    fn untyped(&self) -> SyntaxStablePtrId {
17988        self.0
17989    }
17990    fn lookup(&self, db: &dyn SyntaxGroup) -> ItemUse {
17991        ItemUse::from_syntax_node(db, self.0.lookup(db))
17992    }
17993}
17994impl From<ItemUsePtr> for SyntaxStablePtrId {
17995    fn from(ptr: ItemUsePtr) -> Self {
17996        ptr.untyped()
17997    }
17998}
17999#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
18000pub struct ItemUseGreen(pub GreenId);
18001impl TypedSyntaxNode for ItemUse {
18002    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemUse);
18003    type StablePtr = ItemUsePtr;
18004    type Green = ItemUseGreen;
18005    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
18006        ItemUseGreen(
18007            Arc::new(GreenNode {
18008                kind: SyntaxKind::ItemUse,
18009                details: GreenNodeDetails::Node {
18010                    children: [
18011                        AttributeList::missing(db).0,
18012                        Visibility::missing(db).0,
18013                        TerminalUse::missing(db).0,
18014                        UsePath::missing(db).0,
18015                        TerminalSemicolon::missing(db).0,
18016                    ]
18017                    .into(),
18018                    width: TextWidth::default(),
18019                },
18020            })
18021            .intern(db),
18022        )
18023    }
18024    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
18025        let kind = node.kind(db);
18026        assert_eq!(
18027            kind,
18028            SyntaxKind::ItemUse,
18029            "Unexpected SyntaxKind {:?}. Expected {:?}.",
18030            kind,
18031            SyntaxKind::ItemUse
18032        );
18033        Self { node }
18034    }
18035    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
18036        let kind = node.kind(db);
18037        if kind == SyntaxKind::ItemUse { Some(Self::from_syntax_node(db, node)) } else { None }
18038    }
18039    fn as_syntax_node(&self) -> SyntaxNode {
18040        self.node
18041    }
18042    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
18043        ItemUsePtr(self.node.stable_ptr(db))
18044    }
18045}
18046#[derive(Clone, Debug, Eq, Hash, PartialEq)]
18047pub enum UsePath {
18048    Leaf(UsePathLeaf),
18049    Single(UsePathSingle),
18050    Multi(UsePathMulti),
18051    Star(UsePathStar),
18052}
18053#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
18054pub struct UsePathPtr(pub SyntaxStablePtrId);
18055impl TypedStablePtr for UsePathPtr {
18056    type SyntaxNode = UsePath;
18057    fn untyped(&self) -> SyntaxStablePtrId {
18058        self.0
18059    }
18060    fn lookup(&self, db: &dyn SyntaxGroup) -> UsePath {
18061        UsePath::from_syntax_node(db, self.0.lookup(db))
18062    }
18063}
18064impl From<UsePathPtr> for SyntaxStablePtrId {
18065    fn from(ptr: UsePathPtr) -> Self {
18066        ptr.untyped()
18067    }
18068}
18069impl From<UsePathLeafPtr> for UsePathPtr {
18070    fn from(value: UsePathLeafPtr) -> Self {
18071        Self(value.0)
18072    }
18073}
18074impl From<UsePathSinglePtr> for UsePathPtr {
18075    fn from(value: UsePathSinglePtr) -> Self {
18076        Self(value.0)
18077    }
18078}
18079impl From<UsePathMultiPtr> for UsePathPtr {
18080    fn from(value: UsePathMultiPtr) -> Self {
18081        Self(value.0)
18082    }
18083}
18084impl From<UsePathStarPtr> for UsePathPtr {
18085    fn from(value: UsePathStarPtr) -> Self {
18086        Self(value.0)
18087    }
18088}
18089impl From<UsePathLeafGreen> for UsePathGreen {
18090    fn from(value: UsePathLeafGreen) -> Self {
18091        Self(value.0)
18092    }
18093}
18094impl From<UsePathSingleGreen> for UsePathGreen {
18095    fn from(value: UsePathSingleGreen) -> Self {
18096        Self(value.0)
18097    }
18098}
18099impl From<UsePathMultiGreen> for UsePathGreen {
18100    fn from(value: UsePathMultiGreen) -> Self {
18101        Self(value.0)
18102    }
18103}
18104impl From<UsePathStarGreen> for UsePathGreen {
18105    fn from(value: UsePathStarGreen) -> Self {
18106        Self(value.0)
18107    }
18108}
18109#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
18110pub struct UsePathGreen(pub GreenId);
18111impl TypedSyntaxNode for UsePath {
18112    const OPTIONAL_KIND: Option<SyntaxKind> = None;
18113    type StablePtr = UsePathPtr;
18114    type Green = UsePathGreen;
18115    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
18116        panic!("No missing variant.");
18117    }
18118    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
18119        let kind = node.kind(db);
18120        match kind {
18121            SyntaxKind::UsePathLeaf => UsePath::Leaf(UsePathLeaf::from_syntax_node(db, node)),
18122            SyntaxKind::UsePathSingle => UsePath::Single(UsePathSingle::from_syntax_node(db, node)),
18123            SyntaxKind::UsePathMulti => UsePath::Multi(UsePathMulti::from_syntax_node(db, node)),
18124            SyntaxKind::UsePathStar => UsePath::Star(UsePathStar::from_syntax_node(db, node)),
18125            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "UsePath"),
18126        }
18127    }
18128    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
18129        let kind = node.kind(db);
18130        match kind {
18131            SyntaxKind::UsePathLeaf => Some(UsePath::Leaf(UsePathLeaf::from_syntax_node(db, node))),
18132            SyntaxKind::UsePathSingle => {
18133                Some(UsePath::Single(UsePathSingle::from_syntax_node(db, node)))
18134            }
18135            SyntaxKind::UsePathMulti => {
18136                Some(UsePath::Multi(UsePathMulti::from_syntax_node(db, node)))
18137            }
18138            SyntaxKind::UsePathStar => Some(UsePath::Star(UsePathStar::from_syntax_node(db, node))),
18139            _ => None,
18140        }
18141    }
18142    fn as_syntax_node(&self) -> SyntaxNode {
18143        match self {
18144            UsePath::Leaf(x) => x.as_syntax_node(),
18145            UsePath::Single(x) => x.as_syntax_node(),
18146            UsePath::Multi(x) => x.as_syntax_node(),
18147            UsePath::Star(x) => x.as_syntax_node(),
18148        }
18149    }
18150    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
18151        UsePathPtr(self.as_syntax_node().lookup_intern(db).stable_ptr)
18152    }
18153}
18154impl UsePath {
18155    /// Checks if a kind of a variant of [UsePath].
18156    pub fn is_variant(kind: SyntaxKind) -> bool {
18157        matches!(
18158            kind,
18159            SyntaxKind::UsePathLeaf
18160                | SyntaxKind::UsePathSingle
18161                | SyntaxKind::UsePathMulti
18162                | SyntaxKind::UsePathStar
18163        )
18164    }
18165}
18166#[derive(Clone, Debug, Eq, Hash, PartialEq)]
18167pub struct UsePathLeaf {
18168    node: SyntaxNode,
18169}
18170impl UsePathLeaf {
18171    pub const INDEX_IDENT: usize = 0;
18172    pub const INDEX_ALIAS_CLAUSE: usize = 1;
18173    pub fn new_green(
18174        db: &dyn SyntaxGroup,
18175        ident: PathSegmentGreen,
18176        alias_clause: OptionAliasClauseGreen,
18177    ) -> UsePathLeafGreen {
18178        let children = [ident.0, alias_clause.0];
18179        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
18180        UsePathLeafGreen(
18181            Arc::new(GreenNode {
18182                kind: SyntaxKind::UsePathLeaf,
18183                details: GreenNodeDetails::Node { children: children.into(), width },
18184            })
18185            .intern(db),
18186        )
18187    }
18188}
18189impl UsePathLeaf {
18190    pub fn ident(&self, db: &dyn SyntaxGroup) -> PathSegment {
18191        PathSegment::from_syntax_node(db, self.node.get_children(db)[0])
18192    }
18193    pub fn alias_clause(&self, db: &dyn SyntaxGroup) -> OptionAliasClause {
18194        OptionAliasClause::from_syntax_node(db, self.node.get_children(db)[1])
18195    }
18196}
18197#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
18198pub struct UsePathLeafPtr(pub SyntaxStablePtrId);
18199impl UsePathLeafPtr {
18200    pub fn ident_green(self, db: &dyn SyntaxGroup) -> PathSegmentGreen {
18201        let ptr = self.0.lookup_intern(db);
18202        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
18203            PathSegmentGreen(key_fields[0])
18204        } else {
18205            panic!("Unexpected key field query on root.");
18206        }
18207    }
18208    pub fn alias_clause_green(self, db: &dyn SyntaxGroup) -> OptionAliasClauseGreen {
18209        let ptr = self.0.lookup_intern(db);
18210        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
18211            OptionAliasClauseGreen(key_fields[1])
18212        } else {
18213            panic!("Unexpected key field query on root.");
18214        }
18215    }
18216}
18217impl TypedStablePtr for UsePathLeafPtr {
18218    type SyntaxNode = UsePathLeaf;
18219    fn untyped(&self) -> SyntaxStablePtrId {
18220        self.0
18221    }
18222    fn lookup(&self, db: &dyn SyntaxGroup) -> UsePathLeaf {
18223        UsePathLeaf::from_syntax_node(db, self.0.lookup(db))
18224    }
18225}
18226impl From<UsePathLeafPtr> for SyntaxStablePtrId {
18227    fn from(ptr: UsePathLeafPtr) -> Self {
18228        ptr.untyped()
18229    }
18230}
18231#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
18232pub struct UsePathLeafGreen(pub GreenId);
18233impl TypedSyntaxNode for UsePathLeaf {
18234    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::UsePathLeaf);
18235    type StablePtr = UsePathLeafPtr;
18236    type Green = UsePathLeafGreen;
18237    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
18238        UsePathLeafGreen(
18239            Arc::new(GreenNode {
18240                kind: SyntaxKind::UsePathLeaf,
18241                details: GreenNodeDetails::Node {
18242                    children: [PathSegment::missing(db).0, OptionAliasClause::missing(db).0].into(),
18243                    width: TextWidth::default(),
18244                },
18245            })
18246            .intern(db),
18247        )
18248    }
18249    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
18250        let kind = node.kind(db);
18251        assert_eq!(
18252            kind,
18253            SyntaxKind::UsePathLeaf,
18254            "Unexpected SyntaxKind {:?}. Expected {:?}.",
18255            kind,
18256            SyntaxKind::UsePathLeaf
18257        );
18258        Self { node }
18259    }
18260    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
18261        let kind = node.kind(db);
18262        if kind == SyntaxKind::UsePathLeaf { Some(Self::from_syntax_node(db, node)) } else { None }
18263    }
18264    fn as_syntax_node(&self) -> SyntaxNode {
18265        self.node
18266    }
18267    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
18268        UsePathLeafPtr(self.node.stable_ptr(db))
18269    }
18270}
18271#[derive(Clone, Debug, Eq, Hash, PartialEq)]
18272pub struct UsePathSingle {
18273    node: SyntaxNode,
18274}
18275impl UsePathSingle {
18276    pub const INDEX_IDENT: usize = 0;
18277    pub const INDEX_COLON_COLON: usize = 1;
18278    pub const INDEX_USE_PATH: usize = 2;
18279    pub fn new_green(
18280        db: &dyn SyntaxGroup,
18281        ident: PathSegmentGreen,
18282        colon_colon: TerminalColonColonGreen,
18283        use_path: UsePathGreen,
18284    ) -> UsePathSingleGreen {
18285        let children = [ident.0, colon_colon.0, use_path.0];
18286        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
18287        UsePathSingleGreen(
18288            Arc::new(GreenNode {
18289                kind: SyntaxKind::UsePathSingle,
18290                details: GreenNodeDetails::Node { children: children.into(), width },
18291            })
18292            .intern(db),
18293        )
18294    }
18295}
18296impl UsePathSingle {
18297    pub fn ident(&self, db: &dyn SyntaxGroup) -> PathSegment {
18298        PathSegment::from_syntax_node(db, self.node.get_children(db)[0])
18299    }
18300    pub fn colon_colon(&self, db: &dyn SyntaxGroup) -> TerminalColonColon {
18301        TerminalColonColon::from_syntax_node(db, self.node.get_children(db)[1])
18302    }
18303    pub fn use_path(&self, db: &dyn SyntaxGroup) -> UsePath {
18304        UsePath::from_syntax_node(db, self.node.get_children(db)[2])
18305    }
18306}
18307#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
18308pub struct UsePathSinglePtr(pub SyntaxStablePtrId);
18309impl UsePathSinglePtr {}
18310impl TypedStablePtr for UsePathSinglePtr {
18311    type SyntaxNode = UsePathSingle;
18312    fn untyped(&self) -> SyntaxStablePtrId {
18313        self.0
18314    }
18315    fn lookup(&self, db: &dyn SyntaxGroup) -> UsePathSingle {
18316        UsePathSingle::from_syntax_node(db, self.0.lookup(db))
18317    }
18318}
18319impl From<UsePathSinglePtr> for SyntaxStablePtrId {
18320    fn from(ptr: UsePathSinglePtr) -> Self {
18321        ptr.untyped()
18322    }
18323}
18324#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
18325pub struct UsePathSingleGreen(pub GreenId);
18326impl TypedSyntaxNode for UsePathSingle {
18327    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::UsePathSingle);
18328    type StablePtr = UsePathSinglePtr;
18329    type Green = UsePathSingleGreen;
18330    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
18331        UsePathSingleGreen(
18332            Arc::new(GreenNode {
18333                kind: SyntaxKind::UsePathSingle,
18334                details: GreenNodeDetails::Node {
18335                    children: [
18336                        PathSegment::missing(db).0,
18337                        TerminalColonColon::missing(db).0,
18338                        UsePath::missing(db).0,
18339                    ]
18340                    .into(),
18341                    width: TextWidth::default(),
18342                },
18343            })
18344            .intern(db),
18345        )
18346    }
18347    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
18348        let kind = node.kind(db);
18349        assert_eq!(
18350            kind,
18351            SyntaxKind::UsePathSingle,
18352            "Unexpected SyntaxKind {:?}. Expected {:?}.",
18353            kind,
18354            SyntaxKind::UsePathSingle
18355        );
18356        Self { node }
18357    }
18358    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
18359        let kind = node.kind(db);
18360        if kind == SyntaxKind::UsePathSingle {
18361            Some(Self::from_syntax_node(db, node))
18362        } else {
18363            None
18364        }
18365    }
18366    fn as_syntax_node(&self) -> SyntaxNode {
18367        self.node
18368    }
18369    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
18370        UsePathSinglePtr(self.node.stable_ptr(db))
18371    }
18372}
18373#[derive(Clone, Debug, Eq, Hash, PartialEq)]
18374pub struct UsePathMulti {
18375    node: SyntaxNode,
18376}
18377impl UsePathMulti {
18378    pub const INDEX_LBRACE: usize = 0;
18379    pub const INDEX_USE_PATHS: usize = 1;
18380    pub const INDEX_RBRACE: usize = 2;
18381    pub fn new_green(
18382        db: &dyn SyntaxGroup,
18383        lbrace: TerminalLBraceGreen,
18384        use_paths: UsePathListGreen,
18385        rbrace: TerminalRBraceGreen,
18386    ) -> UsePathMultiGreen {
18387        let children = [lbrace.0, use_paths.0, rbrace.0];
18388        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
18389        UsePathMultiGreen(
18390            Arc::new(GreenNode {
18391                kind: SyntaxKind::UsePathMulti,
18392                details: GreenNodeDetails::Node { children: children.into(), width },
18393            })
18394            .intern(db),
18395        )
18396    }
18397}
18398impl UsePathMulti {
18399    pub fn lbrace(&self, db: &dyn SyntaxGroup) -> TerminalLBrace {
18400        TerminalLBrace::from_syntax_node(db, self.node.get_children(db)[0])
18401    }
18402    pub fn use_paths(&self, db: &dyn SyntaxGroup) -> UsePathList {
18403        UsePathList::from_syntax_node(db, self.node.get_children(db)[1])
18404    }
18405    pub fn rbrace(&self, db: &dyn SyntaxGroup) -> TerminalRBrace {
18406        TerminalRBrace::from_syntax_node(db, self.node.get_children(db)[2])
18407    }
18408}
18409#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
18410pub struct UsePathMultiPtr(pub SyntaxStablePtrId);
18411impl UsePathMultiPtr {}
18412impl TypedStablePtr for UsePathMultiPtr {
18413    type SyntaxNode = UsePathMulti;
18414    fn untyped(&self) -> SyntaxStablePtrId {
18415        self.0
18416    }
18417    fn lookup(&self, db: &dyn SyntaxGroup) -> UsePathMulti {
18418        UsePathMulti::from_syntax_node(db, self.0.lookup(db))
18419    }
18420}
18421impl From<UsePathMultiPtr> for SyntaxStablePtrId {
18422    fn from(ptr: UsePathMultiPtr) -> Self {
18423        ptr.untyped()
18424    }
18425}
18426#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
18427pub struct UsePathMultiGreen(pub GreenId);
18428impl TypedSyntaxNode for UsePathMulti {
18429    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::UsePathMulti);
18430    type StablePtr = UsePathMultiPtr;
18431    type Green = UsePathMultiGreen;
18432    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
18433        UsePathMultiGreen(
18434            Arc::new(GreenNode {
18435                kind: SyntaxKind::UsePathMulti,
18436                details: GreenNodeDetails::Node {
18437                    children: [
18438                        TerminalLBrace::missing(db).0,
18439                        UsePathList::missing(db).0,
18440                        TerminalRBrace::missing(db).0,
18441                    ]
18442                    .into(),
18443                    width: TextWidth::default(),
18444                },
18445            })
18446            .intern(db),
18447        )
18448    }
18449    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
18450        let kind = node.kind(db);
18451        assert_eq!(
18452            kind,
18453            SyntaxKind::UsePathMulti,
18454            "Unexpected SyntaxKind {:?}. Expected {:?}.",
18455            kind,
18456            SyntaxKind::UsePathMulti
18457        );
18458        Self { node }
18459    }
18460    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
18461        let kind = node.kind(db);
18462        if kind == SyntaxKind::UsePathMulti { Some(Self::from_syntax_node(db, node)) } else { None }
18463    }
18464    fn as_syntax_node(&self) -> SyntaxNode {
18465        self.node
18466    }
18467    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
18468        UsePathMultiPtr(self.node.stable_ptr(db))
18469    }
18470}
18471#[derive(Clone, Debug, Eq, Hash, PartialEq)]
18472pub struct UsePathStar {
18473    node: SyntaxNode,
18474}
18475impl UsePathStar {
18476    pub const INDEX_STAR: usize = 0;
18477    pub fn new_green(db: &dyn SyntaxGroup, star: TerminalMulGreen) -> UsePathStarGreen {
18478        let children = [star.0];
18479        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
18480        UsePathStarGreen(
18481            Arc::new(GreenNode {
18482                kind: SyntaxKind::UsePathStar,
18483                details: GreenNodeDetails::Node { children: children.into(), width },
18484            })
18485            .intern(db),
18486        )
18487    }
18488}
18489impl UsePathStar {
18490    pub fn star(&self, db: &dyn SyntaxGroup) -> TerminalMul {
18491        TerminalMul::from_syntax_node(db, self.node.get_children(db)[0])
18492    }
18493}
18494#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
18495pub struct UsePathStarPtr(pub SyntaxStablePtrId);
18496impl UsePathStarPtr {}
18497impl TypedStablePtr for UsePathStarPtr {
18498    type SyntaxNode = UsePathStar;
18499    fn untyped(&self) -> SyntaxStablePtrId {
18500        self.0
18501    }
18502    fn lookup(&self, db: &dyn SyntaxGroup) -> UsePathStar {
18503        UsePathStar::from_syntax_node(db, self.0.lookup(db))
18504    }
18505}
18506impl From<UsePathStarPtr> for SyntaxStablePtrId {
18507    fn from(ptr: UsePathStarPtr) -> Self {
18508        ptr.untyped()
18509    }
18510}
18511#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
18512pub struct UsePathStarGreen(pub GreenId);
18513impl TypedSyntaxNode for UsePathStar {
18514    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::UsePathStar);
18515    type StablePtr = UsePathStarPtr;
18516    type Green = UsePathStarGreen;
18517    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
18518        UsePathStarGreen(
18519            Arc::new(GreenNode {
18520                kind: SyntaxKind::UsePathStar,
18521                details: GreenNodeDetails::Node {
18522                    children: [TerminalMul::missing(db).0].into(),
18523                    width: TextWidth::default(),
18524                },
18525            })
18526            .intern(db),
18527        )
18528    }
18529    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
18530        let kind = node.kind(db);
18531        assert_eq!(
18532            kind,
18533            SyntaxKind::UsePathStar,
18534            "Unexpected SyntaxKind {:?}. Expected {:?}.",
18535            kind,
18536            SyntaxKind::UsePathStar
18537        );
18538        Self { node }
18539    }
18540    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
18541        let kind = node.kind(db);
18542        if kind == SyntaxKind::UsePathStar { Some(Self::from_syntax_node(db, node)) } else { None }
18543    }
18544    fn as_syntax_node(&self) -> SyntaxNode {
18545        self.node
18546    }
18547    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
18548        UsePathStarPtr(self.node.stable_ptr(db))
18549    }
18550}
18551#[derive(Clone, Debug, Eq, Hash, PartialEq)]
18552pub struct UsePathList(ElementList<UsePath, 2>);
18553impl Deref for UsePathList {
18554    type Target = ElementList<UsePath, 2>;
18555    fn deref(&self) -> &Self::Target {
18556        &self.0
18557    }
18558}
18559impl UsePathList {
18560    pub fn new_green(
18561        db: &dyn SyntaxGroup,
18562        children: &[UsePathListElementOrSeparatorGreen],
18563    ) -> UsePathListGreen {
18564        let width = children.iter().map(|id| id.id().lookup_intern(db).width()).sum();
18565        UsePathListGreen(
18566            Arc::new(GreenNode {
18567                kind: SyntaxKind::UsePathList,
18568                details: GreenNodeDetails::Node {
18569                    children: children.iter().map(|x| x.id()).collect(),
18570                    width,
18571                },
18572            })
18573            .intern(db),
18574        )
18575    }
18576}
18577#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
18578pub struct UsePathListPtr(pub SyntaxStablePtrId);
18579impl TypedStablePtr for UsePathListPtr {
18580    type SyntaxNode = UsePathList;
18581    fn untyped(&self) -> SyntaxStablePtrId {
18582        self.0
18583    }
18584    fn lookup(&self, db: &dyn SyntaxGroup) -> UsePathList {
18585        UsePathList::from_syntax_node(db, self.0.lookup(db))
18586    }
18587}
18588impl From<UsePathListPtr> for SyntaxStablePtrId {
18589    fn from(ptr: UsePathListPtr) -> Self {
18590        ptr.untyped()
18591    }
18592}
18593#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
18594pub enum UsePathListElementOrSeparatorGreen {
18595    Separator(TerminalCommaGreen),
18596    Element(UsePathGreen),
18597}
18598impl From<TerminalCommaGreen> for UsePathListElementOrSeparatorGreen {
18599    fn from(value: TerminalCommaGreen) -> Self {
18600        UsePathListElementOrSeparatorGreen::Separator(value)
18601    }
18602}
18603impl From<UsePathGreen> for UsePathListElementOrSeparatorGreen {
18604    fn from(value: UsePathGreen) -> Self {
18605        UsePathListElementOrSeparatorGreen::Element(value)
18606    }
18607}
18608impl UsePathListElementOrSeparatorGreen {
18609    fn id(&self) -> GreenId {
18610        match self {
18611            UsePathListElementOrSeparatorGreen::Separator(green) => green.0,
18612            UsePathListElementOrSeparatorGreen::Element(green) => green.0,
18613        }
18614    }
18615}
18616#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
18617pub struct UsePathListGreen(pub GreenId);
18618impl TypedSyntaxNode for UsePathList {
18619    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::UsePathList);
18620    type StablePtr = UsePathListPtr;
18621    type Green = UsePathListGreen;
18622    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
18623        UsePathListGreen(
18624            Arc::new(GreenNode {
18625                kind: SyntaxKind::UsePathList,
18626                details: GreenNodeDetails::Node {
18627                    children: [].into(),
18628                    width: TextWidth::default(),
18629                },
18630            })
18631            .intern(db),
18632        )
18633    }
18634    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
18635        Self(ElementList::new(node))
18636    }
18637    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
18638        if node.kind(db) == SyntaxKind::UsePathList {
18639            Some(Self(ElementList::new(node)))
18640        } else {
18641            None
18642        }
18643    }
18644    fn as_syntax_node(&self) -> SyntaxNode {
18645        self.node
18646    }
18647    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
18648        UsePathListPtr(self.node.stable_ptr(db))
18649    }
18650}
18651#[derive(Clone, Debug, Eq, Hash, PartialEq)]
18652pub struct AliasClause {
18653    node: SyntaxNode,
18654}
18655impl AliasClause {
18656    pub const INDEX_AS_KW: usize = 0;
18657    pub const INDEX_ALIAS: usize = 1;
18658    pub fn new_green(
18659        db: &dyn SyntaxGroup,
18660        as_kw: TerminalAsGreen,
18661        alias: TerminalIdentifierGreen,
18662    ) -> AliasClauseGreen {
18663        let children = [as_kw.0, alias.0];
18664        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
18665        AliasClauseGreen(
18666            Arc::new(GreenNode {
18667                kind: SyntaxKind::AliasClause,
18668                details: GreenNodeDetails::Node { children: children.into(), width },
18669            })
18670            .intern(db),
18671        )
18672    }
18673}
18674impl AliasClause {
18675    pub fn as_kw(&self, db: &dyn SyntaxGroup) -> TerminalAs {
18676        TerminalAs::from_syntax_node(db, self.node.get_children(db)[0])
18677    }
18678    pub fn alias(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier {
18679        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[1])
18680    }
18681}
18682#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
18683pub struct AliasClausePtr(pub SyntaxStablePtrId);
18684impl AliasClausePtr {
18685    pub fn alias_green(self, db: &dyn SyntaxGroup) -> TerminalIdentifierGreen {
18686        let ptr = self.0.lookup_intern(db);
18687        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
18688            TerminalIdentifierGreen(key_fields[0])
18689        } else {
18690            panic!("Unexpected key field query on root.");
18691        }
18692    }
18693}
18694impl TypedStablePtr for AliasClausePtr {
18695    type SyntaxNode = AliasClause;
18696    fn untyped(&self) -> SyntaxStablePtrId {
18697        self.0
18698    }
18699    fn lookup(&self, db: &dyn SyntaxGroup) -> AliasClause {
18700        AliasClause::from_syntax_node(db, self.0.lookup(db))
18701    }
18702}
18703impl From<AliasClausePtr> for SyntaxStablePtrId {
18704    fn from(ptr: AliasClausePtr) -> Self {
18705        ptr.untyped()
18706    }
18707}
18708#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
18709pub struct AliasClauseGreen(pub GreenId);
18710impl TypedSyntaxNode for AliasClause {
18711    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::AliasClause);
18712    type StablePtr = AliasClausePtr;
18713    type Green = AliasClauseGreen;
18714    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
18715        AliasClauseGreen(
18716            Arc::new(GreenNode {
18717                kind: SyntaxKind::AliasClause,
18718                details: GreenNodeDetails::Node {
18719                    children: [TerminalAs::missing(db).0, TerminalIdentifier::missing(db).0].into(),
18720                    width: TextWidth::default(),
18721                },
18722            })
18723            .intern(db),
18724        )
18725    }
18726    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
18727        let kind = node.kind(db);
18728        assert_eq!(
18729            kind,
18730            SyntaxKind::AliasClause,
18731            "Unexpected SyntaxKind {:?}. Expected {:?}.",
18732            kind,
18733            SyntaxKind::AliasClause
18734        );
18735        Self { node }
18736    }
18737    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
18738        let kind = node.kind(db);
18739        if kind == SyntaxKind::AliasClause { Some(Self::from_syntax_node(db, node)) } else { None }
18740    }
18741    fn as_syntax_node(&self) -> SyntaxNode {
18742        self.node
18743    }
18744    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
18745        AliasClausePtr(self.node.stable_ptr(db))
18746    }
18747}
18748#[derive(Clone, Debug, Eq, Hash, PartialEq)]
18749pub enum OptionAliasClause {
18750    Empty(OptionAliasClauseEmpty),
18751    AliasClause(AliasClause),
18752}
18753#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
18754pub struct OptionAliasClausePtr(pub SyntaxStablePtrId);
18755impl TypedStablePtr for OptionAliasClausePtr {
18756    type SyntaxNode = OptionAliasClause;
18757    fn untyped(&self) -> SyntaxStablePtrId {
18758        self.0
18759    }
18760    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionAliasClause {
18761        OptionAliasClause::from_syntax_node(db, self.0.lookup(db))
18762    }
18763}
18764impl From<OptionAliasClausePtr> for SyntaxStablePtrId {
18765    fn from(ptr: OptionAliasClausePtr) -> Self {
18766        ptr.untyped()
18767    }
18768}
18769impl From<OptionAliasClauseEmptyPtr> for OptionAliasClausePtr {
18770    fn from(value: OptionAliasClauseEmptyPtr) -> Self {
18771        Self(value.0)
18772    }
18773}
18774impl From<AliasClausePtr> for OptionAliasClausePtr {
18775    fn from(value: AliasClausePtr) -> Self {
18776        Self(value.0)
18777    }
18778}
18779impl From<OptionAliasClauseEmptyGreen> for OptionAliasClauseGreen {
18780    fn from(value: OptionAliasClauseEmptyGreen) -> Self {
18781        Self(value.0)
18782    }
18783}
18784impl From<AliasClauseGreen> for OptionAliasClauseGreen {
18785    fn from(value: AliasClauseGreen) -> Self {
18786        Self(value.0)
18787    }
18788}
18789#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
18790pub struct OptionAliasClauseGreen(pub GreenId);
18791impl TypedSyntaxNode for OptionAliasClause {
18792    const OPTIONAL_KIND: Option<SyntaxKind> = None;
18793    type StablePtr = OptionAliasClausePtr;
18794    type Green = OptionAliasClauseGreen;
18795    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
18796        panic!("No missing variant.");
18797    }
18798    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
18799        let kind = node.kind(db);
18800        match kind {
18801            SyntaxKind::OptionAliasClauseEmpty => {
18802                OptionAliasClause::Empty(OptionAliasClauseEmpty::from_syntax_node(db, node))
18803            }
18804            SyntaxKind::AliasClause => {
18805                OptionAliasClause::AliasClause(AliasClause::from_syntax_node(db, node))
18806            }
18807            _ => panic!(
18808                "Unexpected syntax kind {:?} when constructing {}.",
18809                kind, "OptionAliasClause"
18810            ),
18811        }
18812    }
18813    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
18814        let kind = node.kind(db);
18815        match kind {
18816            SyntaxKind::OptionAliasClauseEmpty => {
18817                Some(OptionAliasClause::Empty(OptionAliasClauseEmpty::from_syntax_node(db, node)))
18818            }
18819            SyntaxKind::AliasClause => {
18820                Some(OptionAliasClause::AliasClause(AliasClause::from_syntax_node(db, node)))
18821            }
18822            _ => None,
18823        }
18824    }
18825    fn as_syntax_node(&self) -> SyntaxNode {
18826        match self {
18827            OptionAliasClause::Empty(x) => x.as_syntax_node(),
18828            OptionAliasClause::AliasClause(x) => x.as_syntax_node(),
18829        }
18830    }
18831    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
18832        OptionAliasClausePtr(self.as_syntax_node().lookup_intern(db).stable_ptr)
18833    }
18834}
18835impl OptionAliasClause {
18836    /// Checks if a kind of a variant of [OptionAliasClause].
18837    pub fn is_variant(kind: SyntaxKind) -> bool {
18838        matches!(kind, SyntaxKind::OptionAliasClauseEmpty | SyntaxKind::AliasClause)
18839    }
18840}
18841#[derive(Clone, Debug, Eq, Hash, PartialEq)]
18842pub struct OptionAliasClauseEmpty {
18843    node: SyntaxNode,
18844}
18845impl OptionAliasClauseEmpty {
18846    pub fn new_green(db: &dyn SyntaxGroup) -> OptionAliasClauseEmptyGreen {
18847        let children = [];
18848        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
18849        OptionAliasClauseEmptyGreen(
18850            Arc::new(GreenNode {
18851                kind: SyntaxKind::OptionAliasClauseEmpty,
18852                details: GreenNodeDetails::Node { children: children.into(), width },
18853            })
18854            .intern(db),
18855        )
18856    }
18857}
18858impl OptionAliasClauseEmpty {}
18859#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
18860pub struct OptionAliasClauseEmptyPtr(pub SyntaxStablePtrId);
18861impl OptionAliasClauseEmptyPtr {}
18862impl TypedStablePtr for OptionAliasClauseEmptyPtr {
18863    type SyntaxNode = OptionAliasClauseEmpty;
18864    fn untyped(&self) -> SyntaxStablePtrId {
18865        self.0
18866    }
18867    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionAliasClauseEmpty {
18868        OptionAliasClauseEmpty::from_syntax_node(db, self.0.lookup(db))
18869    }
18870}
18871impl From<OptionAliasClauseEmptyPtr> for SyntaxStablePtrId {
18872    fn from(ptr: OptionAliasClauseEmptyPtr) -> Self {
18873        ptr.untyped()
18874    }
18875}
18876#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
18877pub struct OptionAliasClauseEmptyGreen(pub GreenId);
18878impl TypedSyntaxNode for OptionAliasClauseEmpty {
18879    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionAliasClauseEmpty);
18880    type StablePtr = OptionAliasClauseEmptyPtr;
18881    type Green = OptionAliasClauseEmptyGreen;
18882    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
18883        OptionAliasClauseEmptyGreen(
18884            Arc::new(GreenNode {
18885                kind: SyntaxKind::OptionAliasClauseEmpty,
18886                details: GreenNodeDetails::Node {
18887                    children: [].into(),
18888                    width: TextWidth::default(),
18889                },
18890            })
18891            .intern(db),
18892        )
18893    }
18894    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
18895        let kind = node.kind(db);
18896        assert_eq!(
18897            kind,
18898            SyntaxKind::OptionAliasClauseEmpty,
18899            "Unexpected SyntaxKind {:?}. Expected {:?}.",
18900            kind,
18901            SyntaxKind::OptionAliasClauseEmpty
18902        );
18903        Self { node }
18904    }
18905    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
18906        let kind = node.kind(db);
18907        if kind == SyntaxKind::OptionAliasClauseEmpty {
18908            Some(Self::from_syntax_node(db, node))
18909        } else {
18910            None
18911        }
18912    }
18913    fn as_syntax_node(&self) -> SyntaxNode {
18914        self.node
18915    }
18916    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
18917        OptionAliasClauseEmptyPtr(self.node.stable_ptr(db))
18918    }
18919}
18920#[derive(Clone, Debug, Eq, Hash, PartialEq)]
18921pub enum GenericArg {
18922    Unnamed(GenericArgUnnamed),
18923    Named(GenericArgNamed),
18924}
18925#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
18926pub struct GenericArgPtr(pub SyntaxStablePtrId);
18927impl TypedStablePtr for GenericArgPtr {
18928    type SyntaxNode = GenericArg;
18929    fn untyped(&self) -> SyntaxStablePtrId {
18930        self.0
18931    }
18932    fn lookup(&self, db: &dyn SyntaxGroup) -> GenericArg {
18933        GenericArg::from_syntax_node(db, self.0.lookup(db))
18934    }
18935}
18936impl From<GenericArgPtr> for SyntaxStablePtrId {
18937    fn from(ptr: GenericArgPtr) -> Self {
18938        ptr.untyped()
18939    }
18940}
18941impl From<GenericArgUnnamedPtr> for GenericArgPtr {
18942    fn from(value: GenericArgUnnamedPtr) -> Self {
18943        Self(value.0)
18944    }
18945}
18946impl From<GenericArgNamedPtr> for GenericArgPtr {
18947    fn from(value: GenericArgNamedPtr) -> Self {
18948        Self(value.0)
18949    }
18950}
18951impl From<GenericArgUnnamedGreen> for GenericArgGreen {
18952    fn from(value: GenericArgUnnamedGreen) -> Self {
18953        Self(value.0)
18954    }
18955}
18956impl From<GenericArgNamedGreen> for GenericArgGreen {
18957    fn from(value: GenericArgNamedGreen) -> Self {
18958        Self(value.0)
18959    }
18960}
18961#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
18962pub struct GenericArgGreen(pub GreenId);
18963impl TypedSyntaxNode for GenericArg {
18964    const OPTIONAL_KIND: Option<SyntaxKind> = None;
18965    type StablePtr = GenericArgPtr;
18966    type Green = GenericArgGreen;
18967    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
18968        panic!("No missing variant.");
18969    }
18970    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
18971        let kind = node.kind(db);
18972        match kind {
18973            SyntaxKind::GenericArgUnnamed => {
18974                GenericArg::Unnamed(GenericArgUnnamed::from_syntax_node(db, node))
18975            }
18976            SyntaxKind::GenericArgNamed => {
18977                GenericArg::Named(GenericArgNamed::from_syntax_node(db, node))
18978            }
18979            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "GenericArg"),
18980        }
18981    }
18982    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
18983        let kind = node.kind(db);
18984        match kind {
18985            SyntaxKind::GenericArgUnnamed => {
18986                Some(GenericArg::Unnamed(GenericArgUnnamed::from_syntax_node(db, node)))
18987            }
18988            SyntaxKind::GenericArgNamed => {
18989                Some(GenericArg::Named(GenericArgNamed::from_syntax_node(db, node)))
18990            }
18991            _ => None,
18992        }
18993    }
18994    fn as_syntax_node(&self) -> SyntaxNode {
18995        match self {
18996            GenericArg::Unnamed(x) => x.as_syntax_node(),
18997            GenericArg::Named(x) => x.as_syntax_node(),
18998        }
18999    }
19000    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
19001        GenericArgPtr(self.as_syntax_node().lookup_intern(db).stable_ptr)
19002    }
19003}
19004impl GenericArg {
19005    /// Checks if a kind of a variant of [GenericArg].
19006    pub fn is_variant(kind: SyntaxKind) -> bool {
19007        matches!(kind, SyntaxKind::GenericArgUnnamed | SyntaxKind::GenericArgNamed)
19008    }
19009}
19010#[derive(Clone, Debug, Eq, Hash, PartialEq)]
19011pub struct GenericArgNamed {
19012    node: SyntaxNode,
19013}
19014impl GenericArgNamed {
19015    pub const INDEX_NAME: usize = 0;
19016    pub const INDEX_COLON: usize = 1;
19017    pub const INDEX_VALUE: usize = 2;
19018    pub fn new_green(
19019        db: &dyn SyntaxGroup,
19020        name: TerminalIdentifierGreen,
19021        colon: TerminalColonGreen,
19022        value: GenericArgValueGreen,
19023    ) -> GenericArgNamedGreen {
19024        let children = [name.0, colon.0, value.0];
19025        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
19026        GenericArgNamedGreen(
19027            Arc::new(GreenNode {
19028                kind: SyntaxKind::GenericArgNamed,
19029                details: GreenNodeDetails::Node { children: children.into(), width },
19030            })
19031            .intern(db),
19032        )
19033    }
19034}
19035impl GenericArgNamed {
19036    pub fn name(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier {
19037        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[0])
19038    }
19039    pub fn colon(&self, db: &dyn SyntaxGroup) -> TerminalColon {
19040        TerminalColon::from_syntax_node(db, self.node.get_children(db)[1])
19041    }
19042    pub fn value(&self, db: &dyn SyntaxGroup) -> GenericArgValue {
19043        GenericArgValue::from_syntax_node(db, self.node.get_children(db)[2])
19044    }
19045}
19046#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
19047pub struct GenericArgNamedPtr(pub SyntaxStablePtrId);
19048impl GenericArgNamedPtr {}
19049impl TypedStablePtr for GenericArgNamedPtr {
19050    type SyntaxNode = GenericArgNamed;
19051    fn untyped(&self) -> SyntaxStablePtrId {
19052        self.0
19053    }
19054    fn lookup(&self, db: &dyn SyntaxGroup) -> GenericArgNamed {
19055        GenericArgNamed::from_syntax_node(db, self.0.lookup(db))
19056    }
19057}
19058impl From<GenericArgNamedPtr> for SyntaxStablePtrId {
19059    fn from(ptr: GenericArgNamedPtr) -> Self {
19060        ptr.untyped()
19061    }
19062}
19063#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
19064pub struct GenericArgNamedGreen(pub GreenId);
19065impl TypedSyntaxNode for GenericArgNamed {
19066    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::GenericArgNamed);
19067    type StablePtr = GenericArgNamedPtr;
19068    type Green = GenericArgNamedGreen;
19069    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
19070        GenericArgNamedGreen(
19071            Arc::new(GreenNode {
19072                kind: SyntaxKind::GenericArgNamed,
19073                details: GreenNodeDetails::Node {
19074                    children: [
19075                        TerminalIdentifier::missing(db).0,
19076                        TerminalColon::missing(db).0,
19077                        GenericArgValue::missing(db).0,
19078                    ]
19079                    .into(),
19080                    width: TextWidth::default(),
19081                },
19082            })
19083            .intern(db),
19084        )
19085    }
19086    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
19087        let kind = node.kind(db);
19088        assert_eq!(
19089            kind,
19090            SyntaxKind::GenericArgNamed,
19091            "Unexpected SyntaxKind {:?}. Expected {:?}.",
19092            kind,
19093            SyntaxKind::GenericArgNamed
19094        );
19095        Self { node }
19096    }
19097    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
19098        let kind = node.kind(db);
19099        if kind == SyntaxKind::GenericArgNamed {
19100            Some(Self::from_syntax_node(db, node))
19101        } else {
19102            None
19103        }
19104    }
19105    fn as_syntax_node(&self) -> SyntaxNode {
19106        self.node
19107    }
19108    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
19109        GenericArgNamedPtr(self.node.stable_ptr(db))
19110    }
19111}
19112#[derive(Clone, Debug, Eq, Hash, PartialEq)]
19113pub struct GenericArgUnnamed {
19114    node: SyntaxNode,
19115}
19116impl GenericArgUnnamed {
19117    pub const INDEX_VALUE: usize = 0;
19118    pub fn new_green(db: &dyn SyntaxGroup, value: GenericArgValueGreen) -> GenericArgUnnamedGreen {
19119        let children = [value.0];
19120        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
19121        GenericArgUnnamedGreen(
19122            Arc::new(GreenNode {
19123                kind: SyntaxKind::GenericArgUnnamed,
19124                details: GreenNodeDetails::Node { children: children.into(), width },
19125            })
19126            .intern(db),
19127        )
19128    }
19129}
19130impl GenericArgUnnamed {
19131    pub fn value(&self, db: &dyn SyntaxGroup) -> GenericArgValue {
19132        GenericArgValue::from_syntax_node(db, self.node.get_children(db)[0])
19133    }
19134}
19135#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
19136pub struct GenericArgUnnamedPtr(pub SyntaxStablePtrId);
19137impl GenericArgUnnamedPtr {}
19138impl TypedStablePtr for GenericArgUnnamedPtr {
19139    type SyntaxNode = GenericArgUnnamed;
19140    fn untyped(&self) -> SyntaxStablePtrId {
19141        self.0
19142    }
19143    fn lookup(&self, db: &dyn SyntaxGroup) -> GenericArgUnnamed {
19144        GenericArgUnnamed::from_syntax_node(db, self.0.lookup(db))
19145    }
19146}
19147impl From<GenericArgUnnamedPtr> for SyntaxStablePtrId {
19148    fn from(ptr: GenericArgUnnamedPtr) -> Self {
19149        ptr.untyped()
19150    }
19151}
19152#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
19153pub struct GenericArgUnnamedGreen(pub GreenId);
19154impl TypedSyntaxNode for GenericArgUnnamed {
19155    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::GenericArgUnnamed);
19156    type StablePtr = GenericArgUnnamedPtr;
19157    type Green = GenericArgUnnamedGreen;
19158    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
19159        GenericArgUnnamedGreen(
19160            Arc::new(GreenNode {
19161                kind: SyntaxKind::GenericArgUnnamed,
19162                details: GreenNodeDetails::Node {
19163                    children: [GenericArgValue::missing(db).0].into(),
19164                    width: TextWidth::default(),
19165                },
19166            })
19167            .intern(db),
19168        )
19169    }
19170    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
19171        let kind = node.kind(db);
19172        assert_eq!(
19173            kind,
19174            SyntaxKind::GenericArgUnnamed,
19175            "Unexpected SyntaxKind {:?}. Expected {:?}.",
19176            kind,
19177            SyntaxKind::GenericArgUnnamed
19178        );
19179        Self { node }
19180    }
19181    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
19182        let kind = node.kind(db);
19183        if kind == SyntaxKind::GenericArgUnnamed {
19184            Some(Self::from_syntax_node(db, node))
19185        } else {
19186            None
19187        }
19188    }
19189    fn as_syntax_node(&self) -> SyntaxNode {
19190        self.node
19191    }
19192    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
19193        GenericArgUnnamedPtr(self.node.stable_ptr(db))
19194    }
19195}
19196#[derive(Clone, Debug, Eq, Hash, PartialEq)]
19197pub enum GenericArgValue {
19198    Expr(GenericArgValueExpr),
19199    Underscore(TerminalUnderscore),
19200}
19201#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
19202pub struct GenericArgValuePtr(pub SyntaxStablePtrId);
19203impl TypedStablePtr for GenericArgValuePtr {
19204    type SyntaxNode = GenericArgValue;
19205    fn untyped(&self) -> SyntaxStablePtrId {
19206        self.0
19207    }
19208    fn lookup(&self, db: &dyn SyntaxGroup) -> GenericArgValue {
19209        GenericArgValue::from_syntax_node(db, self.0.lookup(db))
19210    }
19211}
19212impl From<GenericArgValuePtr> for SyntaxStablePtrId {
19213    fn from(ptr: GenericArgValuePtr) -> Self {
19214        ptr.untyped()
19215    }
19216}
19217impl From<GenericArgValueExprPtr> for GenericArgValuePtr {
19218    fn from(value: GenericArgValueExprPtr) -> Self {
19219        Self(value.0)
19220    }
19221}
19222impl From<TerminalUnderscorePtr> for GenericArgValuePtr {
19223    fn from(value: TerminalUnderscorePtr) -> Self {
19224        Self(value.0)
19225    }
19226}
19227impl From<GenericArgValueExprGreen> for GenericArgValueGreen {
19228    fn from(value: GenericArgValueExprGreen) -> Self {
19229        Self(value.0)
19230    }
19231}
19232impl From<TerminalUnderscoreGreen> for GenericArgValueGreen {
19233    fn from(value: TerminalUnderscoreGreen) -> Self {
19234        Self(value.0)
19235    }
19236}
19237#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
19238pub struct GenericArgValueGreen(pub GreenId);
19239impl TypedSyntaxNode for GenericArgValue {
19240    const OPTIONAL_KIND: Option<SyntaxKind> = None;
19241    type StablePtr = GenericArgValuePtr;
19242    type Green = GenericArgValueGreen;
19243    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
19244        panic!("No missing variant.");
19245    }
19246    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
19247        let kind = node.kind(db);
19248        match kind {
19249            SyntaxKind::GenericArgValueExpr => {
19250                GenericArgValue::Expr(GenericArgValueExpr::from_syntax_node(db, node))
19251            }
19252            SyntaxKind::TerminalUnderscore => {
19253                GenericArgValue::Underscore(TerminalUnderscore::from_syntax_node(db, node))
19254            }
19255            _ => {
19256                panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "GenericArgValue")
19257            }
19258        }
19259    }
19260    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
19261        let kind = node.kind(db);
19262        match kind {
19263            SyntaxKind::GenericArgValueExpr => {
19264                Some(GenericArgValue::Expr(GenericArgValueExpr::from_syntax_node(db, node)))
19265            }
19266            SyntaxKind::TerminalUnderscore => {
19267                Some(GenericArgValue::Underscore(TerminalUnderscore::from_syntax_node(db, node)))
19268            }
19269            _ => None,
19270        }
19271    }
19272    fn as_syntax_node(&self) -> SyntaxNode {
19273        match self {
19274            GenericArgValue::Expr(x) => x.as_syntax_node(),
19275            GenericArgValue::Underscore(x) => x.as_syntax_node(),
19276        }
19277    }
19278    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
19279        GenericArgValuePtr(self.as_syntax_node().lookup_intern(db).stable_ptr)
19280    }
19281}
19282impl GenericArgValue {
19283    /// Checks if a kind of a variant of [GenericArgValue].
19284    pub fn is_variant(kind: SyntaxKind) -> bool {
19285        matches!(kind, SyntaxKind::GenericArgValueExpr | SyntaxKind::TerminalUnderscore)
19286    }
19287}
19288#[derive(Clone, Debug, Eq, Hash, PartialEq)]
19289pub struct GenericArgValueExpr {
19290    node: SyntaxNode,
19291}
19292impl GenericArgValueExpr {
19293    pub const INDEX_EXPR: usize = 0;
19294    pub fn new_green(db: &dyn SyntaxGroup, expr: ExprGreen) -> GenericArgValueExprGreen {
19295        let children = [expr.0];
19296        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
19297        GenericArgValueExprGreen(
19298            Arc::new(GreenNode {
19299                kind: SyntaxKind::GenericArgValueExpr,
19300                details: GreenNodeDetails::Node { children: children.into(), width },
19301            })
19302            .intern(db),
19303        )
19304    }
19305}
19306impl GenericArgValueExpr {
19307    pub fn expr(&self, db: &dyn SyntaxGroup) -> Expr {
19308        Expr::from_syntax_node(db, self.node.get_children(db)[0])
19309    }
19310}
19311#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
19312pub struct GenericArgValueExprPtr(pub SyntaxStablePtrId);
19313impl GenericArgValueExprPtr {}
19314impl TypedStablePtr for GenericArgValueExprPtr {
19315    type SyntaxNode = GenericArgValueExpr;
19316    fn untyped(&self) -> SyntaxStablePtrId {
19317        self.0
19318    }
19319    fn lookup(&self, db: &dyn SyntaxGroup) -> GenericArgValueExpr {
19320        GenericArgValueExpr::from_syntax_node(db, self.0.lookup(db))
19321    }
19322}
19323impl From<GenericArgValueExprPtr> for SyntaxStablePtrId {
19324    fn from(ptr: GenericArgValueExprPtr) -> Self {
19325        ptr.untyped()
19326    }
19327}
19328#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
19329pub struct GenericArgValueExprGreen(pub GreenId);
19330impl TypedSyntaxNode for GenericArgValueExpr {
19331    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::GenericArgValueExpr);
19332    type StablePtr = GenericArgValueExprPtr;
19333    type Green = GenericArgValueExprGreen;
19334    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
19335        GenericArgValueExprGreen(
19336            Arc::new(GreenNode {
19337                kind: SyntaxKind::GenericArgValueExpr,
19338                details: GreenNodeDetails::Node {
19339                    children: [Expr::missing(db).0].into(),
19340                    width: TextWidth::default(),
19341                },
19342            })
19343            .intern(db),
19344        )
19345    }
19346    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
19347        let kind = node.kind(db);
19348        assert_eq!(
19349            kind,
19350            SyntaxKind::GenericArgValueExpr,
19351            "Unexpected SyntaxKind {:?}. Expected {:?}.",
19352            kind,
19353            SyntaxKind::GenericArgValueExpr
19354        );
19355        Self { node }
19356    }
19357    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
19358        let kind = node.kind(db);
19359        if kind == SyntaxKind::GenericArgValueExpr {
19360            Some(Self::from_syntax_node(db, node))
19361        } else {
19362            None
19363        }
19364    }
19365    fn as_syntax_node(&self) -> SyntaxNode {
19366        self.node
19367    }
19368    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
19369        GenericArgValueExprPtr(self.node.stable_ptr(db))
19370    }
19371}
19372#[derive(Clone, Debug, Eq, Hash, PartialEq)]
19373pub struct GenericArgs {
19374    node: SyntaxNode,
19375}
19376impl GenericArgs {
19377    pub const INDEX_LANGLE: usize = 0;
19378    pub const INDEX_GENERIC_ARGS: usize = 1;
19379    pub const INDEX_RANGLE: usize = 2;
19380    pub fn new_green(
19381        db: &dyn SyntaxGroup,
19382        langle: TerminalLTGreen,
19383        generic_args: GenericArgListGreen,
19384        rangle: TerminalGTGreen,
19385    ) -> GenericArgsGreen {
19386        let children = [langle.0, generic_args.0, rangle.0];
19387        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
19388        GenericArgsGreen(
19389            Arc::new(GreenNode {
19390                kind: SyntaxKind::GenericArgs,
19391                details: GreenNodeDetails::Node { children: children.into(), width },
19392            })
19393            .intern(db),
19394        )
19395    }
19396}
19397impl GenericArgs {
19398    pub fn langle(&self, db: &dyn SyntaxGroup) -> TerminalLT {
19399        TerminalLT::from_syntax_node(db, self.node.get_children(db)[0])
19400    }
19401    pub fn generic_args(&self, db: &dyn SyntaxGroup) -> GenericArgList {
19402        GenericArgList::from_syntax_node(db, self.node.get_children(db)[1])
19403    }
19404    pub fn rangle(&self, db: &dyn SyntaxGroup) -> TerminalGT {
19405        TerminalGT::from_syntax_node(db, self.node.get_children(db)[2])
19406    }
19407}
19408#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
19409pub struct GenericArgsPtr(pub SyntaxStablePtrId);
19410impl GenericArgsPtr {}
19411impl TypedStablePtr for GenericArgsPtr {
19412    type SyntaxNode = GenericArgs;
19413    fn untyped(&self) -> SyntaxStablePtrId {
19414        self.0
19415    }
19416    fn lookup(&self, db: &dyn SyntaxGroup) -> GenericArgs {
19417        GenericArgs::from_syntax_node(db, self.0.lookup(db))
19418    }
19419}
19420impl From<GenericArgsPtr> for SyntaxStablePtrId {
19421    fn from(ptr: GenericArgsPtr) -> Self {
19422        ptr.untyped()
19423    }
19424}
19425#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
19426pub struct GenericArgsGreen(pub GreenId);
19427impl TypedSyntaxNode for GenericArgs {
19428    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::GenericArgs);
19429    type StablePtr = GenericArgsPtr;
19430    type Green = GenericArgsGreen;
19431    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
19432        GenericArgsGreen(
19433            Arc::new(GreenNode {
19434                kind: SyntaxKind::GenericArgs,
19435                details: GreenNodeDetails::Node {
19436                    children: [
19437                        TerminalLT::missing(db).0,
19438                        GenericArgList::missing(db).0,
19439                        TerminalGT::missing(db).0,
19440                    ]
19441                    .into(),
19442                    width: TextWidth::default(),
19443                },
19444            })
19445            .intern(db),
19446        )
19447    }
19448    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
19449        let kind = node.kind(db);
19450        assert_eq!(
19451            kind,
19452            SyntaxKind::GenericArgs,
19453            "Unexpected SyntaxKind {:?}. Expected {:?}.",
19454            kind,
19455            SyntaxKind::GenericArgs
19456        );
19457        Self { node }
19458    }
19459    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
19460        let kind = node.kind(db);
19461        if kind == SyntaxKind::GenericArgs { Some(Self::from_syntax_node(db, node)) } else { None }
19462    }
19463    fn as_syntax_node(&self) -> SyntaxNode {
19464        self.node
19465    }
19466    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
19467        GenericArgsPtr(self.node.stable_ptr(db))
19468    }
19469}
19470#[derive(Clone, Debug, Eq, Hash, PartialEq)]
19471pub struct GenericArgList(ElementList<GenericArg, 2>);
19472impl Deref for GenericArgList {
19473    type Target = ElementList<GenericArg, 2>;
19474    fn deref(&self) -> &Self::Target {
19475        &self.0
19476    }
19477}
19478impl GenericArgList {
19479    pub fn new_green(
19480        db: &dyn SyntaxGroup,
19481        children: &[GenericArgListElementOrSeparatorGreen],
19482    ) -> GenericArgListGreen {
19483        let width = children.iter().map(|id| id.id().lookup_intern(db).width()).sum();
19484        GenericArgListGreen(
19485            Arc::new(GreenNode {
19486                kind: SyntaxKind::GenericArgList,
19487                details: GreenNodeDetails::Node {
19488                    children: children.iter().map(|x| x.id()).collect(),
19489                    width,
19490                },
19491            })
19492            .intern(db),
19493        )
19494    }
19495}
19496#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
19497pub struct GenericArgListPtr(pub SyntaxStablePtrId);
19498impl TypedStablePtr for GenericArgListPtr {
19499    type SyntaxNode = GenericArgList;
19500    fn untyped(&self) -> SyntaxStablePtrId {
19501        self.0
19502    }
19503    fn lookup(&self, db: &dyn SyntaxGroup) -> GenericArgList {
19504        GenericArgList::from_syntax_node(db, self.0.lookup(db))
19505    }
19506}
19507impl From<GenericArgListPtr> for SyntaxStablePtrId {
19508    fn from(ptr: GenericArgListPtr) -> Self {
19509        ptr.untyped()
19510    }
19511}
19512#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
19513pub enum GenericArgListElementOrSeparatorGreen {
19514    Separator(TerminalCommaGreen),
19515    Element(GenericArgGreen),
19516}
19517impl From<TerminalCommaGreen> for GenericArgListElementOrSeparatorGreen {
19518    fn from(value: TerminalCommaGreen) -> Self {
19519        GenericArgListElementOrSeparatorGreen::Separator(value)
19520    }
19521}
19522impl From<GenericArgGreen> for GenericArgListElementOrSeparatorGreen {
19523    fn from(value: GenericArgGreen) -> Self {
19524        GenericArgListElementOrSeparatorGreen::Element(value)
19525    }
19526}
19527impl GenericArgListElementOrSeparatorGreen {
19528    fn id(&self) -> GreenId {
19529        match self {
19530            GenericArgListElementOrSeparatorGreen::Separator(green) => green.0,
19531            GenericArgListElementOrSeparatorGreen::Element(green) => green.0,
19532        }
19533    }
19534}
19535#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
19536pub struct GenericArgListGreen(pub GreenId);
19537impl TypedSyntaxNode for GenericArgList {
19538    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::GenericArgList);
19539    type StablePtr = GenericArgListPtr;
19540    type Green = GenericArgListGreen;
19541    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
19542        GenericArgListGreen(
19543            Arc::new(GreenNode {
19544                kind: SyntaxKind::GenericArgList,
19545                details: GreenNodeDetails::Node {
19546                    children: [].into(),
19547                    width: TextWidth::default(),
19548                },
19549            })
19550            .intern(db),
19551        )
19552    }
19553    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
19554        Self(ElementList::new(node))
19555    }
19556    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
19557        if node.kind(db) == SyntaxKind::GenericArgList {
19558            Some(Self(ElementList::new(node)))
19559        } else {
19560            None
19561        }
19562    }
19563    fn as_syntax_node(&self) -> SyntaxNode {
19564        self.node
19565    }
19566    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
19567        GenericArgListPtr(self.node.stable_ptr(db))
19568    }
19569}
19570#[derive(Clone, Debug, Eq, Hash, PartialEq)]
19571pub struct AssociatedItemConstraint {
19572    node: SyntaxNode,
19573}
19574impl AssociatedItemConstraint {
19575    pub const INDEX_ITEM: usize = 0;
19576    pub const INDEX_COLON: usize = 1;
19577    pub const INDEX_VALUE: usize = 2;
19578    pub fn new_green(
19579        db: &dyn SyntaxGroup,
19580        item: TerminalIdentifierGreen,
19581        colon: TerminalColonGreen,
19582        value: ExprGreen,
19583    ) -> AssociatedItemConstraintGreen {
19584        let children = [item.0, colon.0, value.0];
19585        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
19586        AssociatedItemConstraintGreen(
19587            Arc::new(GreenNode {
19588                kind: SyntaxKind::AssociatedItemConstraint,
19589                details: GreenNodeDetails::Node { children: children.into(), width },
19590            })
19591            .intern(db),
19592        )
19593    }
19594}
19595impl AssociatedItemConstraint {
19596    pub fn item(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier {
19597        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[0])
19598    }
19599    pub fn colon(&self, db: &dyn SyntaxGroup) -> TerminalColon {
19600        TerminalColon::from_syntax_node(db, self.node.get_children(db)[1])
19601    }
19602    pub fn value(&self, db: &dyn SyntaxGroup) -> Expr {
19603        Expr::from_syntax_node(db, self.node.get_children(db)[2])
19604    }
19605}
19606#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
19607pub struct AssociatedItemConstraintPtr(pub SyntaxStablePtrId);
19608impl AssociatedItemConstraintPtr {}
19609impl TypedStablePtr for AssociatedItemConstraintPtr {
19610    type SyntaxNode = AssociatedItemConstraint;
19611    fn untyped(&self) -> SyntaxStablePtrId {
19612        self.0
19613    }
19614    fn lookup(&self, db: &dyn SyntaxGroup) -> AssociatedItemConstraint {
19615        AssociatedItemConstraint::from_syntax_node(db, self.0.lookup(db))
19616    }
19617}
19618impl From<AssociatedItemConstraintPtr> for SyntaxStablePtrId {
19619    fn from(ptr: AssociatedItemConstraintPtr) -> Self {
19620        ptr.untyped()
19621    }
19622}
19623#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
19624pub struct AssociatedItemConstraintGreen(pub GreenId);
19625impl TypedSyntaxNode for AssociatedItemConstraint {
19626    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::AssociatedItemConstraint);
19627    type StablePtr = AssociatedItemConstraintPtr;
19628    type Green = AssociatedItemConstraintGreen;
19629    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
19630        AssociatedItemConstraintGreen(
19631            Arc::new(GreenNode {
19632                kind: SyntaxKind::AssociatedItemConstraint,
19633                details: GreenNodeDetails::Node {
19634                    children: [
19635                        TerminalIdentifier::missing(db).0,
19636                        TerminalColon::missing(db).0,
19637                        Expr::missing(db).0,
19638                    ]
19639                    .into(),
19640                    width: TextWidth::default(),
19641                },
19642            })
19643            .intern(db),
19644        )
19645    }
19646    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
19647        let kind = node.kind(db);
19648        assert_eq!(
19649            kind,
19650            SyntaxKind::AssociatedItemConstraint,
19651            "Unexpected SyntaxKind {:?}. Expected {:?}.",
19652            kind,
19653            SyntaxKind::AssociatedItemConstraint
19654        );
19655        Self { node }
19656    }
19657    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
19658        let kind = node.kind(db);
19659        if kind == SyntaxKind::AssociatedItemConstraint {
19660            Some(Self::from_syntax_node(db, node))
19661        } else {
19662            None
19663        }
19664    }
19665    fn as_syntax_node(&self) -> SyntaxNode {
19666        self.node
19667    }
19668    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
19669        AssociatedItemConstraintPtr(self.node.stable_ptr(db))
19670    }
19671}
19672#[derive(Clone, Debug, Eq, Hash, PartialEq)]
19673pub struct AssociatedItemConstraints {
19674    node: SyntaxNode,
19675}
19676impl AssociatedItemConstraints {
19677    pub const INDEX_LBRACK: usize = 0;
19678    pub const INDEX_ASSOCIATED_ITEM_CONSTRAINTS: usize = 1;
19679    pub const INDEX_RBRACK: usize = 2;
19680    pub fn new_green(
19681        db: &dyn SyntaxGroup,
19682        lbrack: TerminalLBrackGreen,
19683        associated_item_constraints: AssociatedItemConstraintListGreen,
19684        rbrack: TerminalRBrackGreen,
19685    ) -> AssociatedItemConstraintsGreen {
19686        let children = [lbrack.0, associated_item_constraints.0, rbrack.0];
19687        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
19688        AssociatedItemConstraintsGreen(
19689            Arc::new(GreenNode {
19690                kind: SyntaxKind::AssociatedItemConstraints,
19691                details: GreenNodeDetails::Node { children: children.into(), width },
19692            })
19693            .intern(db),
19694        )
19695    }
19696}
19697impl AssociatedItemConstraints {
19698    pub fn lbrack(&self, db: &dyn SyntaxGroup) -> TerminalLBrack {
19699        TerminalLBrack::from_syntax_node(db, self.node.get_children(db)[0])
19700    }
19701    pub fn associated_item_constraints(
19702        &self,
19703        db: &dyn SyntaxGroup,
19704    ) -> AssociatedItemConstraintList {
19705        AssociatedItemConstraintList::from_syntax_node(db, self.node.get_children(db)[1])
19706    }
19707    pub fn rbrack(&self, db: &dyn SyntaxGroup) -> TerminalRBrack {
19708        TerminalRBrack::from_syntax_node(db, self.node.get_children(db)[2])
19709    }
19710}
19711#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
19712pub struct AssociatedItemConstraintsPtr(pub SyntaxStablePtrId);
19713impl AssociatedItemConstraintsPtr {}
19714impl TypedStablePtr for AssociatedItemConstraintsPtr {
19715    type SyntaxNode = AssociatedItemConstraints;
19716    fn untyped(&self) -> SyntaxStablePtrId {
19717        self.0
19718    }
19719    fn lookup(&self, db: &dyn SyntaxGroup) -> AssociatedItemConstraints {
19720        AssociatedItemConstraints::from_syntax_node(db, self.0.lookup(db))
19721    }
19722}
19723impl From<AssociatedItemConstraintsPtr> for SyntaxStablePtrId {
19724    fn from(ptr: AssociatedItemConstraintsPtr) -> Self {
19725        ptr.untyped()
19726    }
19727}
19728#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
19729pub struct AssociatedItemConstraintsGreen(pub GreenId);
19730impl TypedSyntaxNode for AssociatedItemConstraints {
19731    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::AssociatedItemConstraints);
19732    type StablePtr = AssociatedItemConstraintsPtr;
19733    type Green = AssociatedItemConstraintsGreen;
19734    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
19735        AssociatedItemConstraintsGreen(
19736            Arc::new(GreenNode {
19737                kind: SyntaxKind::AssociatedItemConstraints,
19738                details: GreenNodeDetails::Node {
19739                    children: [
19740                        TerminalLBrack::missing(db).0,
19741                        AssociatedItemConstraintList::missing(db).0,
19742                        TerminalRBrack::missing(db).0,
19743                    ]
19744                    .into(),
19745                    width: TextWidth::default(),
19746                },
19747            })
19748            .intern(db),
19749        )
19750    }
19751    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
19752        let kind = node.kind(db);
19753        assert_eq!(
19754            kind,
19755            SyntaxKind::AssociatedItemConstraints,
19756            "Unexpected SyntaxKind {:?}. Expected {:?}.",
19757            kind,
19758            SyntaxKind::AssociatedItemConstraints
19759        );
19760        Self { node }
19761    }
19762    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
19763        let kind = node.kind(db);
19764        if kind == SyntaxKind::AssociatedItemConstraints {
19765            Some(Self::from_syntax_node(db, node))
19766        } else {
19767            None
19768        }
19769    }
19770    fn as_syntax_node(&self) -> SyntaxNode {
19771        self.node
19772    }
19773    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
19774        AssociatedItemConstraintsPtr(self.node.stable_ptr(db))
19775    }
19776}
19777#[derive(Clone, Debug, Eq, Hash, PartialEq)]
19778pub struct AssociatedItemConstraintList(ElementList<AssociatedItemConstraint, 2>);
19779impl Deref for AssociatedItemConstraintList {
19780    type Target = ElementList<AssociatedItemConstraint, 2>;
19781    fn deref(&self) -> &Self::Target {
19782        &self.0
19783    }
19784}
19785impl AssociatedItemConstraintList {
19786    pub fn new_green(
19787        db: &dyn SyntaxGroup,
19788        children: &[AssociatedItemConstraintListElementOrSeparatorGreen],
19789    ) -> AssociatedItemConstraintListGreen {
19790        let width = children.iter().map(|id| id.id().lookup_intern(db).width()).sum();
19791        AssociatedItemConstraintListGreen(
19792            Arc::new(GreenNode {
19793                kind: SyntaxKind::AssociatedItemConstraintList,
19794                details: GreenNodeDetails::Node {
19795                    children: children.iter().map(|x| x.id()).collect(),
19796                    width,
19797                },
19798            })
19799            .intern(db),
19800        )
19801    }
19802}
19803#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
19804pub struct AssociatedItemConstraintListPtr(pub SyntaxStablePtrId);
19805impl TypedStablePtr for AssociatedItemConstraintListPtr {
19806    type SyntaxNode = AssociatedItemConstraintList;
19807    fn untyped(&self) -> SyntaxStablePtrId {
19808        self.0
19809    }
19810    fn lookup(&self, db: &dyn SyntaxGroup) -> AssociatedItemConstraintList {
19811        AssociatedItemConstraintList::from_syntax_node(db, self.0.lookup(db))
19812    }
19813}
19814impl From<AssociatedItemConstraintListPtr> for SyntaxStablePtrId {
19815    fn from(ptr: AssociatedItemConstraintListPtr) -> Self {
19816        ptr.untyped()
19817    }
19818}
19819#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
19820pub enum AssociatedItemConstraintListElementOrSeparatorGreen {
19821    Separator(TerminalCommaGreen),
19822    Element(AssociatedItemConstraintGreen),
19823}
19824impl From<TerminalCommaGreen> for AssociatedItemConstraintListElementOrSeparatorGreen {
19825    fn from(value: TerminalCommaGreen) -> Self {
19826        AssociatedItemConstraintListElementOrSeparatorGreen::Separator(value)
19827    }
19828}
19829impl From<AssociatedItemConstraintGreen> for AssociatedItemConstraintListElementOrSeparatorGreen {
19830    fn from(value: AssociatedItemConstraintGreen) -> Self {
19831        AssociatedItemConstraintListElementOrSeparatorGreen::Element(value)
19832    }
19833}
19834impl AssociatedItemConstraintListElementOrSeparatorGreen {
19835    fn id(&self) -> GreenId {
19836        match self {
19837            AssociatedItemConstraintListElementOrSeparatorGreen::Separator(green) => green.0,
19838            AssociatedItemConstraintListElementOrSeparatorGreen::Element(green) => green.0,
19839        }
19840    }
19841}
19842#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
19843pub struct AssociatedItemConstraintListGreen(pub GreenId);
19844impl TypedSyntaxNode for AssociatedItemConstraintList {
19845    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::AssociatedItemConstraintList);
19846    type StablePtr = AssociatedItemConstraintListPtr;
19847    type Green = AssociatedItemConstraintListGreen;
19848    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
19849        AssociatedItemConstraintListGreen(
19850            Arc::new(GreenNode {
19851                kind: SyntaxKind::AssociatedItemConstraintList,
19852                details: GreenNodeDetails::Node {
19853                    children: [].into(),
19854                    width: TextWidth::default(),
19855                },
19856            })
19857            .intern(db),
19858        )
19859    }
19860    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
19861        Self(ElementList::new(node))
19862    }
19863    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
19864        if node.kind(db) == SyntaxKind::AssociatedItemConstraintList {
19865            Some(Self(ElementList::new(node)))
19866        } else {
19867            None
19868        }
19869    }
19870    fn as_syntax_node(&self) -> SyntaxNode {
19871        self.node
19872    }
19873    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
19874        AssociatedItemConstraintListPtr(self.node.stable_ptr(db))
19875    }
19876}
19877#[derive(Clone, Debug, Eq, Hash, PartialEq)]
19878pub enum OptionAssociatedItemConstraints {
19879    Empty(OptionAssociatedItemConstraintsEmpty),
19880    AssociatedItemConstraints(AssociatedItemConstraints),
19881}
19882#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
19883pub struct OptionAssociatedItemConstraintsPtr(pub SyntaxStablePtrId);
19884impl TypedStablePtr for OptionAssociatedItemConstraintsPtr {
19885    type SyntaxNode = OptionAssociatedItemConstraints;
19886    fn untyped(&self) -> SyntaxStablePtrId {
19887        self.0
19888    }
19889    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionAssociatedItemConstraints {
19890        OptionAssociatedItemConstraints::from_syntax_node(db, self.0.lookup(db))
19891    }
19892}
19893impl From<OptionAssociatedItemConstraintsPtr> for SyntaxStablePtrId {
19894    fn from(ptr: OptionAssociatedItemConstraintsPtr) -> Self {
19895        ptr.untyped()
19896    }
19897}
19898impl From<OptionAssociatedItemConstraintsEmptyPtr> for OptionAssociatedItemConstraintsPtr {
19899    fn from(value: OptionAssociatedItemConstraintsEmptyPtr) -> Self {
19900        Self(value.0)
19901    }
19902}
19903impl From<AssociatedItemConstraintsPtr> for OptionAssociatedItemConstraintsPtr {
19904    fn from(value: AssociatedItemConstraintsPtr) -> Self {
19905        Self(value.0)
19906    }
19907}
19908impl From<OptionAssociatedItemConstraintsEmptyGreen> for OptionAssociatedItemConstraintsGreen {
19909    fn from(value: OptionAssociatedItemConstraintsEmptyGreen) -> Self {
19910        Self(value.0)
19911    }
19912}
19913impl From<AssociatedItemConstraintsGreen> for OptionAssociatedItemConstraintsGreen {
19914    fn from(value: AssociatedItemConstraintsGreen) -> Self {
19915        Self(value.0)
19916    }
19917}
19918#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
19919pub struct OptionAssociatedItemConstraintsGreen(pub GreenId);
19920impl TypedSyntaxNode for OptionAssociatedItemConstraints {
19921    const OPTIONAL_KIND: Option<SyntaxKind> = None;
19922    type StablePtr = OptionAssociatedItemConstraintsPtr;
19923    type Green = OptionAssociatedItemConstraintsGreen;
19924    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
19925        panic!("No missing variant.");
19926    }
19927    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
19928        let kind = node.kind(db);
19929        match kind {
19930            SyntaxKind::OptionAssociatedItemConstraintsEmpty => {
19931                OptionAssociatedItemConstraints::Empty(
19932                    OptionAssociatedItemConstraintsEmpty::from_syntax_node(db, node),
19933                )
19934            }
19935            SyntaxKind::AssociatedItemConstraints => {
19936                OptionAssociatedItemConstraints::AssociatedItemConstraints(
19937                    AssociatedItemConstraints::from_syntax_node(db, node),
19938                )
19939            }
19940            _ => panic!(
19941                "Unexpected syntax kind {:?} when constructing {}.",
19942                kind, "OptionAssociatedItemConstraints"
19943            ),
19944        }
19945    }
19946    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
19947        let kind = node.kind(db);
19948        match kind {
19949            SyntaxKind::OptionAssociatedItemConstraintsEmpty => {
19950                Some(OptionAssociatedItemConstraints::Empty(
19951                    OptionAssociatedItemConstraintsEmpty::from_syntax_node(db, node),
19952                ))
19953            }
19954            SyntaxKind::AssociatedItemConstraints => {
19955                Some(OptionAssociatedItemConstraints::AssociatedItemConstraints(
19956                    AssociatedItemConstraints::from_syntax_node(db, node),
19957                ))
19958            }
19959            _ => None,
19960        }
19961    }
19962    fn as_syntax_node(&self) -> SyntaxNode {
19963        match self {
19964            OptionAssociatedItemConstraints::Empty(x) => x.as_syntax_node(),
19965            OptionAssociatedItemConstraints::AssociatedItemConstraints(x) => x.as_syntax_node(),
19966        }
19967    }
19968    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
19969        OptionAssociatedItemConstraintsPtr(self.as_syntax_node().lookup_intern(db).stable_ptr)
19970    }
19971}
19972impl OptionAssociatedItemConstraints {
19973    /// Checks if a kind of a variant of [OptionAssociatedItemConstraints].
19974    pub fn is_variant(kind: SyntaxKind) -> bool {
19975        matches!(
19976            kind,
19977            SyntaxKind::OptionAssociatedItemConstraintsEmpty
19978                | SyntaxKind::AssociatedItemConstraints
19979        )
19980    }
19981}
19982#[derive(Clone, Debug, Eq, Hash, PartialEq)]
19983pub struct OptionAssociatedItemConstraintsEmpty {
19984    node: SyntaxNode,
19985}
19986impl OptionAssociatedItemConstraintsEmpty {
19987    pub fn new_green(db: &dyn SyntaxGroup) -> OptionAssociatedItemConstraintsEmptyGreen {
19988        let children = [];
19989        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
19990        OptionAssociatedItemConstraintsEmptyGreen(
19991            Arc::new(GreenNode {
19992                kind: SyntaxKind::OptionAssociatedItemConstraintsEmpty,
19993                details: GreenNodeDetails::Node { children: children.into(), width },
19994            })
19995            .intern(db),
19996        )
19997    }
19998}
19999impl OptionAssociatedItemConstraintsEmpty {}
20000#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
20001pub struct OptionAssociatedItemConstraintsEmptyPtr(pub SyntaxStablePtrId);
20002impl OptionAssociatedItemConstraintsEmptyPtr {}
20003impl TypedStablePtr for OptionAssociatedItemConstraintsEmptyPtr {
20004    type SyntaxNode = OptionAssociatedItemConstraintsEmpty;
20005    fn untyped(&self) -> SyntaxStablePtrId {
20006        self.0
20007    }
20008    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionAssociatedItemConstraintsEmpty {
20009        OptionAssociatedItemConstraintsEmpty::from_syntax_node(db, self.0.lookup(db))
20010    }
20011}
20012impl From<OptionAssociatedItemConstraintsEmptyPtr> for SyntaxStablePtrId {
20013    fn from(ptr: OptionAssociatedItemConstraintsEmptyPtr) -> Self {
20014        ptr.untyped()
20015    }
20016}
20017#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
20018pub struct OptionAssociatedItemConstraintsEmptyGreen(pub GreenId);
20019impl TypedSyntaxNode for OptionAssociatedItemConstraintsEmpty {
20020    const OPTIONAL_KIND: Option<SyntaxKind> =
20021        Some(SyntaxKind::OptionAssociatedItemConstraintsEmpty);
20022    type StablePtr = OptionAssociatedItemConstraintsEmptyPtr;
20023    type Green = OptionAssociatedItemConstraintsEmptyGreen;
20024    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
20025        OptionAssociatedItemConstraintsEmptyGreen(
20026            Arc::new(GreenNode {
20027                kind: SyntaxKind::OptionAssociatedItemConstraintsEmpty,
20028                details: GreenNodeDetails::Node {
20029                    children: [].into(),
20030                    width: TextWidth::default(),
20031                },
20032            })
20033            .intern(db),
20034        )
20035    }
20036    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
20037        let kind = node.kind(db);
20038        assert_eq!(
20039            kind,
20040            SyntaxKind::OptionAssociatedItemConstraintsEmpty,
20041            "Unexpected SyntaxKind {:?}. Expected {:?}.",
20042            kind,
20043            SyntaxKind::OptionAssociatedItemConstraintsEmpty
20044        );
20045        Self { node }
20046    }
20047    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
20048        let kind = node.kind(db);
20049        if kind == SyntaxKind::OptionAssociatedItemConstraintsEmpty {
20050            Some(Self::from_syntax_node(db, node))
20051        } else {
20052            None
20053        }
20054    }
20055    fn as_syntax_node(&self) -> SyntaxNode {
20056        self.node
20057    }
20058    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
20059        OptionAssociatedItemConstraintsEmptyPtr(self.node.stable_ptr(db))
20060    }
20061}
20062#[derive(Clone, Debug, Eq, Hash, PartialEq)]
20063pub enum OptionWrappedGenericParamList {
20064    Empty(OptionWrappedGenericParamListEmpty),
20065    WrappedGenericParamList(WrappedGenericParamList),
20066}
20067#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
20068pub struct OptionWrappedGenericParamListPtr(pub SyntaxStablePtrId);
20069impl TypedStablePtr for OptionWrappedGenericParamListPtr {
20070    type SyntaxNode = OptionWrappedGenericParamList;
20071    fn untyped(&self) -> SyntaxStablePtrId {
20072        self.0
20073    }
20074    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionWrappedGenericParamList {
20075        OptionWrappedGenericParamList::from_syntax_node(db, self.0.lookup(db))
20076    }
20077}
20078impl From<OptionWrappedGenericParamListPtr> for SyntaxStablePtrId {
20079    fn from(ptr: OptionWrappedGenericParamListPtr) -> Self {
20080        ptr.untyped()
20081    }
20082}
20083impl From<OptionWrappedGenericParamListEmptyPtr> for OptionWrappedGenericParamListPtr {
20084    fn from(value: OptionWrappedGenericParamListEmptyPtr) -> Self {
20085        Self(value.0)
20086    }
20087}
20088impl From<WrappedGenericParamListPtr> for OptionWrappedGenericParamListPtr {
20089    fn from(value: WrappedGenericParamListPtr) -> Self {
20090        Self(value.0)
20091    }
20092}
20093impl From<OptionWrappedGenericParamListEmptyGreen> for OptionWrappedGenericParamListGreen {
20094    fn from(value: OptionWrappedGenericParamListEmptyGreen) -> Self {
20095        Self(value.0)
20096    }
20097}
20098impl From<WrappedGenericParamListGreen> for OptionWrappedGenericParamListGreen {
20099    fn from(value: WrappedGenericParamListGreen) -> Self {
20100        Self(value.0)
20101    }
20102}
20103#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
20104pub struct OptionWrappedGenericParamListGreen(pub GreenId);
20105impl TypedSyntaxNode for OptionWrappedGenericParamList {
20106    const OPTIONAL_KIND: Option<SyntaxKind> = None;
20107    type StablePtr = OptionWrappedGenericParamListPtr;
20108    type Green = OptionWrappedGenericParamListGreen;
20109    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
20110        panic!("No missing variant.");
20111    }
20112    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
20113        let kind = node.kind(db);
20114        match kind {
20115            SyntaxKind::OptionWrappedGenericParamListEmpty => OptionWrappedGenericParamList::Empty(
20116                OptionWrappedGenericParamListEmpty::from_syntax_node(db, node),
20117            ),
20118            SyntaxKind::WrappedGenericParamList => {
20119                OptionWrappedGenericParamList::WrappedGenericParamList(
20120                    WrappedGenericParamList::from_syntax_node(db, node),
20121                )
20122            }
20123            _ => panic!(
20124                "Unexpected syntax kind {:?} when constructing {}.",
20125                kind, "OptionWrappedGenericParamList"
20126            ),
20127        }
20128    }
20129    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
20130        let kind = node.kind(db);
20131        match kind {
20132            SyntaxKind::OptionWrappedGenericParamListEmpty => {
20133                Some(OptionWrappedGenericParamList::Empty(
20134                    OptionWrappedGenericParamListEmpty::from_syntax_node(db, node),
20135                ))
20136            }
20137            SyntaxKind::WrappedGenericParamList => {
20138                Some(OptionWrappedGenericParamList::WrappedGenericParamList(
20139                    WrappedGenericParamList::from_syntax_node(db, node),
20140                ))
20141            }
20142            _ => None,
20143        }
20144    }
20145    fn as_syntax_node(&self) -> SyntaxNode {
20146        match self {
20147            OptionWrappedGenericParamList::Empty(x) => x.as_syntax_node(),
20148            OptionWrappedGenericParamList::WrappedGenericParamList(x) => x.as_syntax_node(),
20149        }
20150    }
20151    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
20152        OptionWrappedGenericParamListPtr(self.as_syntax_node().lookup_intern(db).stable_ptr)
20153    }
20154}
20155impl OptionWrappedGenericParamList {
20156    /// Checks if a kind of a variant of [OptionWrappedGenericParamList].
20157    pub fn is_variant(kind: SyntaxKind) -> bool {
20158        matches!(
20159            kind,
20160            SyntaxKind::OptionWrappedGenericParamListEmpty | SyntaxKind::WrappedGenericParamList
20161        )
20162    }
20163}
20164#[derive(Clone, Debug, Eq, Hash, PartialEq)]
20165pub struct OptionWrappedGenericParamListEmpty {
20166    node: SyntaxNode,
20167}
20168impl OptionWrappedGenericParamListEmpty {
20169    pub fn new_green(db: &dyn SyntaxGroup) -> OptionWrappedGenericParamListEmptyGreen {
20170        let children = [];
20171        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
20172        OptionWrappedGenericParamListEmptyGreen(
20173            Arc::new(GreenNode {
20174                kind: SyntaxKind::OptionWrappedGenericParamListEmpty,
20175                details: GreenNodeDetails::Node { children: children.into(), width },
20176            })
20177            .intern(db),
20178        )
20179    }
20180}
20181impl OptionWrappedGenericParamListEmpty {}
20182#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
20183pub struct OptionWrappedGenericParamListEmptyPtr(pub SyntaxStablePtrId);
20184impl OptionWrappedGenericParamListEmptyPtr {}
20185impl TypedStablePtr for OptionWrappedGenericParamListEmptyPtr {
20186    type SyntaxNode = OptionWrappedGenericParamListEmpty;
20187    fn untyped(&self) -> SyntaxStablePtrId {
20188        self.0
20189    }
20190    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionWrappedGenericParamListEmpty {
20191        OptionWrappedGenericParamListEmpty::from_syntax_node(db, self.0.lookup(db))
20192    }
20193}
20194impl From<OptionWrappedGenericParamListEmptyPtr> for SyntaxStablePtrId {
20195    fn from(ptr: OptionWrappedGenericParamListEmptyPtr) -> Self {
20196        ptr.untyped()
20197    }
20198}
20199#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
20200pub struct OptionWrappedGenericParamListEmptyGreen(pub GreenId);
20201impl TypedSyntaxNode for OptionWrappedGenericParamListEmpty {
20202    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionWrappedGenericParamListEmpty);
20203    type StablePtr = OptionWrappedGenericParamListEmptyPtr;
20204    type Green = OptionWrappedGenericParamListEmptyGreen;
20205    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
20206        OptionWrappedGenericParamListEmptyGreen(
20207            Arc::new(GreenNode {
20208                kind: SyntaxKind::OptionWrappedGenericParamListEmpty,
20209                details: GreenNodeDetails::Node {
20210                    children: [].into(),
20211                    width: TextWidth::default(),
20212                },
20213            })
20214            .intern(db),
20215        )
20216    }
20217    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
20218        let kind = node.kind(db);
20219        assert_eq!(
20220            kind,
20221            SyntaxKind::OptionWrappedGenericParamListEmpty,
20222            "Unexpected SyntaxKind {:?}. Expected {:?}.",
20223            kind,
20224            SyntaxKind::OptionWrappedGenericParamListEmpty
20225        );
20226        Self { node }
20227    }
20228    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
20229        let kind = node.kind(db);
20230        if kind == SyntaxKind::OptionWrappedGenericParamListEmpty {
20231            Some(Self::from_syntax_node(db, node))
20232        } else {
20233            None
20234        }
20235    }
20236    fn as_syntax_node(&self) -> SyntaxNode {
20237        self.node
20238    }
20239    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
20240        OptionWrappedGenericParamListEmptyPtr(self.node.stable_ptr(db))
20241    }
20242}
20243#[derive(Clone, Debug, Eq, Hash, PartialEq)]
20244pub struct WrappedGenericParamList {
20245    node: SyntaxNode,
20246}
20247impl WrappedGenericParamList {
20248    pub const INDEX_LANGLE: usize = 0;
20249    pub const INDEX_GENERIC_PARAMS: usize = 1;
20250    pub const INDEX_RANGLE: usize = 2;
20251    pub fn new_green(
20252        db: &dyn SyntaxGroup,
20253        langle: TerminalLTGreen,
20254        generic_params: GenericParamListGreen,
20255        rangle: TerminalGTGreen,
20256    ) -> WrappedGenericParamListGreen {
20257        let children = [langle.0, generic_params.0, rangle.0];
20258        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
20259        WrappedGenericParamListGreen(
20260            Arc::new(GreenNode {
20261                kind: SyntaxKind::WrappedGenericParamList,
20262                details: GreenNodeDetails::Node { children: children.into(), width },
20263            })
20264            .intern(db),
20265        )
20266    }
20267}
20268impl WrappedGenericParamList {
20269    pub fn langle(&self, db: &dyn SyntaxGroup) -> TerminalLT {
20270        TerminalLT::from_syntax_node(db, self.node.get_children(db)[0])
20271    }
20272    pub fn generic_params(&self, db: &dyn SyntaxGroup) -> GenericParamList {
20273        GenericParamList::from_syntax_node(db, self.node.get_children(db)[1])
20274    }
20275    pub fn rangle(&self, db: &dyn SyntaxGroup) -> TerminalGT {
20276        TerminalGT::from_syntax_node(db, self.node.get_children(db)[2])
20277    }
20278}
20279#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
20280pub struct WrappedGenericParamListPtr(pub SyntaxStablePtrId);
20281impl WrappedGenericParamListPtr {}
20282impl TypedStablePtr for WrappedGenericParamListPtr {
20283    type SyntaxNode = WrappedGenericParamList;
20284    fn untyped(&self) -> SyntaxStablePtrId {
20285        self.0
20286    }
20287    fn lookup(&self, db: &dyn SyntaxGroup) -> WrappedGenericParamList {
20288        WrappedGenericParamList::from_syntax_node(db, self.0.lookup(db))
20289    }
20290}
20291impl From<WrappedGenericParamListPtr> for SyntaxStablePtrId {
20292    fn from(ptr: WrappedGenericParamListPtr) -> Self {
20293        ptr.untyped()
20294    }
20295}
20296#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
20297pub struct WrappedGenericParamListGreen(pub GreenId);
20298impl TypedSyntaxNode for WrappedGenericParamList {
20299    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::WrappedGenericParamList);
20300    type StablePtr = WrappedGenericParamListPtr;
20301    type Green = WrappedGenericParamListGreen;
20302    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
20303        WrappedGenericParamListGreen(
20304            Arc::new(GreenNode {
20305                kind: SyntaxKind::WrappedGenericParamList,
20306                details: GreenNodeDetails::Node {
20307                    children: [
20308                        TerminalLT::missing(db).0,
20309                        GenericParamList::missing(db).0,
20310                        TerminalGT::missing(db).0,
20311                    ]
20312                    .into(),
20313                    width: TextWidth::default(),
20314                },
20315            })
20316            .intern(db),
20317        )
20318    }
20319    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
20320        let kind = node.kind(db);
20321        assert_eq!(
20322            kind,
20323            SyntaxKind::WrappedGenericParamList,
20324            "Unexpected SyntaxKind {:?}. Expected {:?}.",
20325            kind,
20326            SyntaxKind::WrappedGenericParamList
20327        );
20328        Self { node }
20329    }
20330    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
20331        let kind = node.kind(db);
20332        if kind == SyntaxKind::WrappedGenericParamList {
20333            Some(Self::from_syntax_node(db, node))
20334        } else {
20335            None
20336        }
20337    }
20338    fn as_syntax_node(&self) -> SyntaxNode {
20339        self.node
20340    }
20341    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
20342        WrappedGenericParamListPtr(self.node.stable_ptr(db))
20343    }
20344}
20345#[derive(Clone, Debug, Eq, Hash, PartialEq)]
20346pub struct GenericParamList(ElementList<GenericParam, 2>);
20347impl Deref for GenericParamList {
20348    type Target = ElementList<GenericParam, 2>;
20349    fn deref(&self) -> &Self::Target {
20350        &self.0
20351    }
20352}
20353impl GenericParamList {
20354    pub fn new_green(
20355        db: &dyn SyntaxGroup,
20356        children: &[GenericParamListElementOrSeparatorGreen],
20357    ) -> GenericParamListGreen {
20358        let width = children.iter().map(|id| id.id().lookup_intern(db).width()).sum();
20359        GenericParamListGreen(
20360            Arc::new(GreenNode {
20361                kind: SyntaxKind::GenericParamList,
20362                details: GreenNodeDetails::Node {
20363                    children: children.iter().map(|x| x.id()).collect(),
20364                    width,
20365                },
20366            })
20367            .intern(db),
20368        )
20369    }
20370}
20371#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
20372pub struct GenericParamListPtr(pub SyntaxStablePtrId);
20373impl TypedStablePtr for GenericParamListPtr {
20374    type SyntaxNode = GenericParamList;
20375    fn untyped(&self) -> SyntaxStablePtrId {
20376        self.0
20377    }
20378    fn lookup(&self, db: &dyn SyntaxGroup) -> GenericParamList {
20379        GenericParamList::from_syntax_node(db, self.0.lookup(db))
20380    }
20381}
20382impl From<GenericParamListPtr> for SyntaxStablePtrId {
20383    fn from(ptr: GenericParamListPtr) -> Self {
20384        ptr.untyped()
20385    }
20386}
20387#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
20388pub enum GenericParamListElementOrSeparatorGreen {
20389    Separator(TerminalCommaGreen),
20390    Element(GenericParamGreen),
20391}
20392impl From<TerminalCommaGreen> for GenericParamListElementOrSeparatorGreen {
20393    fn from(value: TerminalCommaGreen) -> Self {
20394        GenericParamListElementOrSeparatorGreen::Separator(value)
20395    }
20396}
20397impl From<GenericParamGreen> for GenericParamListElementOrSeparatorGreen {
20398    fn from(value: GenericParamGreen) -> Self {
20399        GenericParamListElementOrSeparatorGreen::Element(value)
20400    }
20401}
20402impl GenericParamListElementOrSeparatorGreen {
20403    fn id(&self) -> GreenId {
20404        match self {
20405            GenericParamListElementOrSeparatorGreen::Separator(green) => green.0,
20406            GenericParamListElementOrSeparatorGreen::Element(green) => green.0,
20407        }
20408    }
20409}
20410#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
20411pub struct GenericParamListGreen(pub GreenId);
20412impl TypedSyntaxNode for GenericParamList {
20413    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::GenericParamList);
20414    type StablePtr = GenericParamListPtr;
20415    type Green = GenericParamListGreen;
20416    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
20417        GenericParamListGreen(
20418            Arc::new(GreenNode {
20419                kind: SyntaxKind::GenericParamList,
20420                details: GreenNodeDetails::Node {
20421                    children: [].into(),
20422                    width: TextWidth::default(),
20423                },
20424            })
20425            .intern(db),
20426        )
20427    }
20428    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
20429        Self(ElementList::new(node))
20430    }
20431    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
20432        if node.kind(db) == SyntaxKind::GenericParamList {
20433            Some(Self(ElementList::new(node)))
20434        } else {
20435            None
20436        }
20437    }
20438    fn as_syntax_node(&self) -> SyntaxNode {
20439        self.node
20440    }
20441    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
20442        GenericParamListPtr(self.node.stable_ptr(db))
20443    }
20444}
20445#[derive(Clone, Debug, Eq, Hash, PartialEq)]
20446pub enum GenericParam {
20447    Type(GenericParamType),
20448    Const(GenericParamConst),
20449    ImplNamed(GenericParamImplNamed),
20450    ImplAnonymous(GenericParamImplAnonymous),
20451    NegativeImpl(GenericParamNegativeImpl),
20452}
20453#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
20454pub struct GenericParamPtr(pub SyntaxStablePtrId);
20455impl TypedStablePtr for GenericParamPtr {
20456    type SyntaxNode = GenericParam;
20457    fn untyped(&self) -> SyntaxStablePtrId {
20458        self.0
20459    }
20460    fn lookup(&self, db: &dyn SyntaxGroup) -> GenericParam {
20461        GenericParam::from_syntax_node(db, self.0.lookup(db))
20462    }
20463}
20464impl From<GenericParamPtr> for SyntaxStablePtrId {
20465    fn from(ptr: GenericParamPtr) -> Self {
20466        ptr.untyped()
20467    }
20468}
20469impl From<GenericParamTypePtr> for GenericParamPtr {
20470    fn from(value: GenericParamTypePtr) -> Self {
20471        Self(value.0)
20472    }
20473}
20474impl From<GenericParamConstPtr> for GenericParamPtr {
20475    fn from(value: GenericParamConstPtr) -> Self {
20476        Self(value.0)
20477    }
20478}
20479impl From<GenericParamImplNamedPtr> for GenericParamPtr {
20480    fn from(value: GenericParamImplNamedPtr) -> Self {
20481        Self(value.0)
20482    }
20483}
20484impl From<GenericParamImplAnonymousPtr> for GenericParamPtr {
20485    fn from(value: GenericParamImplAnonymousPtr) -> Self {
20486        Self(value.0)
20487    }
20488}
20489impl From<GenericParamNegativeImplPtr> for GenericParamPtr {
20490    fn from(value: GenericParamNegativeImplPtr) -> Self {
20491        Self(value.0)
20492    }
20493}
20494impl From<GenericParamTypeGreen> for GenericParamGreen {
20495    fn from(value: GenericParamTypeGreen) -> Self {
20496        Self(value.0)
20497    }
20498}
20499impl From<GenericParamConstGreen> for GenericParamGreen {
20500    fn from(value: GenericParamConstGreen) -> Self {
20501        Self(value.0)
20502    }
20503}
20504impl From<GenericParamImplNamedGreen> for GenericParamGreen {
20505    fn from(value: GenericParamImplNamedGreen) -> Self {
20506        Self(value.0)
20507    }
20508}
20509impl From<GenericParamImplAnonymousGreen> for GenericParamGreen {
20510    fn from(value: GenericParamImplAnonymousGreen) -> Self {
20511        Self(value.0)
20512    }
20513}
20514impl From<GenericParamNegativeImplGreen> for GenericParamGreen {
20515    fn from(value: GenericParamNegativeImplGreen) -> Self {
20516        Self(value.0)
20517    }
20518}
20519#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
20520pub struct GenericParamGreen(pub GreenId);
20521impl TypedSyntaxNode for GenericParam {
20522    const OPTIONAL_KIND: Option<SyntaxKind> = None;
20523    type StablePtr = GenericParamPtr;
20524    type Green = GenericParamGreen;
20525    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
20526        panic!("No missing variant.");
20527    }
20528    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
20529        let kind = node.kind(db);
20530        match kind {
20531            SyntaxKind::GenericParamType => {
20532                GenericParam::Type(GenericParamType::from_syntax_node(db, node))
20533            }
20534            SyntaxKind::GenericParamConst => {
20535                GenericParam::Const(GenericParamConst::from_syntax_node(db, node))
20536            }
20537            SyntaxKind::GenericParamImplNamed => {
20538                GenericParam::ImplNamed(GenericParamImplNamed::from_syntax_node(db, node))
20539            }
20540            SyntaxKind::GenericParamImplAnonymous => {
20541                GenericParam::ImplAnonymous(GenericParamImplAnonymous::from_syntax_node(db, node))
20542            }
20543            SyntaxKind::GenericParamNegativeImpl => {
20544                GenericParam::NegativeImpl(GenericParamNegativeImpl::from_syntax_node(db, node))
20545            }
20546            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "GenericParam"),
20547        }
20548    }
20549    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
20550        let kind = node.kind(db);
20551        match kind {
20552            SyntaxKind::GenericParamType => {
20553                Some(GenericParam::Type(GenericParamType::from_syntax_node(db, node)))
20554            }
20555            SyntaxKind::GenericParamConst => {
20556                Some(GenericParam::Const(GenericParamConst::from_syntax_node(db, node)))
20557            }
20558            SyntaxKind::GenericParamImplNamed => {
20559                Some(GenericParam::ImplNamed(GenericParamImplNamed::from_syntax_node(db, node)))
20560            }
20561            SyntaxKind::GenericParamImplAnonymous => Some(GenericParam::ImplAnonymous(
20562                GenericParamImplAnonymous::from_syntax_node(db, node),
20563            )),
20564            SyntaxKind::GenericParamNegativeImpl => Some(GenericParam::NegativeImpl(
20565                GenericParamNegativeImpl::from_syntax_node(db, node),
20566            )),
20567            _ => None,
20568        }
20569    }
20570    fn as_syntax_node(&self) -> SyntaxNode {
20571        match self {
20572            GenericParam::Type(x) => x.as_syntax_node(),
20573            GenericParam::Const(x) => x.as_syntax_node(),
20574            GenericParam::ImplNamed(x) => x.as_syntax_node(),
20575            GenericParam::ImplAnonymous(x) => x.as_syntax_node(),
20576            GenericParam::NegativeImpl(x) => x.as_syntax_node(),
20577        }
20578    }
20579    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
20580        GenericParamPtr(self.as_syntax_node().lookup_intern(db).stable_ptr)
20581    }
20582}
20583impl GenericParam {
20584    /// Checks if a kind of a variant of [GenericParam].
20585    pub fn is_variant(kind: SyntaxKind) -> bool {
20586        matches!(
20587            kind,
20588            SyntaxKind::GenericParamType
20589                | SyntaxKind::GenericParamConst
20590                | SyntaxKind::GenericParamImplNamed
20591                | SyntaxKind::GenericParamImplAnonymous
20592                | SyntaxKind::GenericParamNegativeImpl
20593        )
20594    }
20595}
20596#[derive(Clone, Debug, Eq, Hash, PartialEq)]
20597pub struct GenericParamType {
20598    node: SyntaxNode,
20599}
20600impl GenericParamType {
20601    pub const INDEX_NAME: usize = 0;
20602    pub fn new_green(db: &dyn SyntaxGroup, name: TerminalIdentifierGreen) -> GenericParamTypeGreen {
20603        let children = [name.0];
20604        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
20605        GenericParamTypeGreen(
20606            Arc::new(GreenNode {
20607                kind: SyntaxKind::GenericParamType,
20608                details: GreenNodeDetails::Node { children: children.into(), width },
20609            })
20610            .intern(db),
20611        )
20612    }
20613}
20614impl GenericParamType {
20615    pub fn name(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier {
20616        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[0])
20617    }
20618}
20619#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
20620pub struct GenericParamTypePtr(pub SyntaxStablePtrId);
20621impl GenericParamTypePtr {
20622    pub fn name_green(self, db: &dyn SyntaxGroup) -> TerminalIdentifierGreen {
20623        let ptr = self.0.lookup_intern(db);
20624        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
20625            TerminalIdentifierGreen(key_fields[0])
20626        } else {
20627            panic!("Unexpected key field query on root.");
20628        }
20629    }
20630}
20631impl TypedStablePtr for GenericParamTypePtr {
20632    type SyntaxNode = GenericParamType;
20633    fn untyped(&self) -> SyntaxStablePtrId {
20634        self.0
20635    }
20636    fn lookup(&self, db: &dyn SyntaxGroup) -> GenericParamType {
20637        GenericParamType::from_syntax_node(db, self.0.lookup(db))
20638    }
20639}
20640impl From<GenericParamTypePtr> for SyntaxStablePtrId {
20641    fn from(ptr: GenericParamTypePtr) -> Self {
20642        ptr.untyped()
20643    }
20644}
20645#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
20646pub struct GenericParamTypeGreen(pub GreenId);
20647impl TypedSyntaxNode for GenericParamType {
20648    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::GenericParamType);
20649    type StablePtr = GenericParamTypePtr;
20650    type Green = GenericParamTypeGreen;
20651    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
20652        GenericParamTypeGreen(
20653            Arc::new(GreenNode {
20654                kind: SyntaxKind::GenericParamType,
20655                details: GreenNodeDetails::Node {
20656                    children: [TerminalIdentifier::missing(db).0].into(),
20657                    width: TextWidth::default(),
20658                },
20659            })
20660            .intern(db),
20661        )
20662    }
20663    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
20664        let kind = node.kind(db);
20665        assert_eq!(
20666            kind,
20667            SyntaxKind::GenericParamType,
20668            "Unexpected SyntaxKind {:?}. Expected {:?}.",
20669            kind,
20670            SyntaxKind::GenericParamType
20671        );
20672        Self { node }
20673    }
20674    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
20675        let kind = node.kind(db);
20676        if kind == SyntaxKind::GenericParamType {
20677            Some(Self::from_syntax_node(db, node))
20678        } else {
20679            None
20680        }
20681    }
20682    fn as_syntax_node(&self) -> SyntaxNode {
20683        self.node
20684    }
20685    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
20686        GenericParamTypePtr(self.node.stable_ptr(db))
20687    }
20688}
20689#[derive(Clone, Debug, Eq, Hash, PartialEq)]
20690pub struct GenericParamConst {
20691    node: SyntaxNode,
20692}
20693impl GenericParamConst {
20694    pub const INDEX_CONST_KW: usize = 0;
20695    pub const INDEX_NAME: usize = 1;
20696    pub const INDEX_COLON: usize = 2;
20697    pub const INDEX_TY: usize = 3;
20698    pub fn new_green(
20699        db: &dyn SyntaxGroup,
20700        const_kw: TerminalConstGreen,
20701        name: TerminalIdentifierGreen,
20702        colon: TerminalColonGreen,
20703        ty: ExprGreen,
20704    ) -> GenericParamConstGreen {
20705        let children = [const_kw.0, name.0, colon.0, ty.0];
20706        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
20707        GenericParamConstGreen(
20708            Arc::new(GreenNode {
20709                kind: SyntaxKind::GenericParamConst,
20710                details: GreenNodeDetails::Node { children: children.into(), width },
20711            })
20712            .intern(db),
20713        )
20714    }
20715}
20716impl GenericParamConst {
20717    pub fn const_kw(&self, db: &dyn SyntaxGroup) -> TerminalConst {
20718        TerminalConst::from_syntax_node(db, self.node.get_children(db)[0])
20719    }
20720    pub fn name(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier {
20721        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[1])
20722    }
20723    pub fn colon(&self, db: &dyn SyntaxGroup) -> TerminalColon {
20724        TerminalColon::from_syntax_node(db, self.node.get_children(db)[2])
20725    }
20726    pub fn ty(&self, db: &dyn SyntaxGroup) -> Expr {
20727        Expr::from_syntax_node(db, self.node.get_children(db)[3])
20728    }
20729}
20730#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
20731pub struct GenericParamConstPtr(pub SyntaxStablePtrId);
20732impl GenericParamConstPtr {
20733    pub fn name_green(self, db: &dyn SyntaxGroup) -> TerminalIdentifierGreen {
20734        let ptr = self.0.lookup_intern(db);
20735        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
20736            TerminalIdentifierGreen(key_fields[0])
20737        } else {
20738            panic!("Unexpected key field query on root.");
20739        }
20740    }
20741}
20742impl TypedStablePtr for GenericParamConstPtr {
20743    type SyntaxNode = GenericParamConst;
20744    fn untyped(&self) -> SyntaxStablePtrId {
20745        self.0
20746    }
20747    fn lookup(&self, db: &dyn SyntaxGroup) -> GenericParamConst {
20748        GenericParamConst::from_syntax_node(db, self.0.lookup(db))
20749    }
20750}
20751impl From<GenericParamConstPtr> for SyntaxStablePtrId {
20752    fn from(ptr: GenericParamConstPtr) -> Self {
20753        ptr.untyped()
20754    }
20755}
20756#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
20757pub struct GenericParamConstGreen(pub GreenId);
20758impl TypedSyntaxNode for GenericParamConst {
20759    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::GenericParamConst);
20760    type StablePtr = GenericParamConstPtr;
20761    type Green = GenericParamConstGreen;
20762    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
20763        GenericParamConstGreen(
20764            Arc::new(GreenNode {
20765                kind: SyntaxKind::GenericParamConst,
20766                details: GreenNodeDetails::Node {
20767                    children: [
20768                        TerminalConst::missing(db).0,
20769                        TerminalIdentifier::missing(db).0,
20770                        TerminalColon::missing(db).0,
20771                        Expr::missing(db).0,
20772                    ]
20773                    .into(),
20774                    width: TextWidth::default(),
20775                },
20776            })
20777            .intern(db),
20778        )
20779    }
20780    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
20781        let kind = node.kind(db);
20782        assert_eq!(
20783            kind,
20784            SyntaxKind::GenericParamConst,
20785            "Unexpected SyntaxKind {:?}. Expected {:?}.",
20786            kind,
20787            SyntaxKind::GenericParamConst
20788        );
20789        Self { node }
20790    }
20791    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
20792        let kind = node.kind(db);
20793        if kind == SyntaxKind::GenericParamConst {
20794            Some(Self::from_syntax_node(db, node))
20795        } else {
20796            None
20797        }
20798    }
20799    fn as_syntax_node(&self) -> SyntaxNode {
20800        self.node
20801    }
20802    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
20803        GenericParamConstPtr(self.node.stable_ptr(db))
20804    }
20805}
20806#[derive(Clone, Debug, Eq, Hash, PartialEq)]
20807pub struct GenericParamImplNamed {
20808    node: SyntaxNode,
20809}
20810impl GenericParamImplNamed {
20811    pub const INDEX_IMPL_KW: usize = 0;
20812    pub const INDEX_NAME: usize = 1;
20813    pub const INDEX_COLON: usize = 2;
20814    pub const INDEX_TRAIT_PATH: usize = 3;
20815    pub const INDEX_TYPE_CONSTRAINS: usize = 4;
20816    pub fn new_green(
20817        db: &dyn SyntaxGroup,
20818        impl_kw: TerminalImplGreen,
20819        name: TerminalIdentifierGreen,
20820        colon: TerminalColonGreen,
20821        trait_path: ExprPathGreen,
20822        type_constrains: OptionAssociatedItemConstraintsGreen,
20823    ) -> GenericParamImplNamedGreen {
20824        let children = [impl_kw.0, name.0, colon.0, trait_path.0, type_constrains.0];
20825        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
20826        GenericParamImplNamedGreen(
20827            Arc::new(GreenNode {
20828                kind: SyntaxKind::GenericParamImplNamed,
20829                details: GreenNodeDetails::Node { children: children.into(), width },
20830            })
20831            .intern(db),
20832        )
20833    }
20834}
20835impl GenericParamImplNamed {
20836    pub fn impl_kw(&self, db: &dyn SyntaxGroup) -> TerminalImpl {
20837        TerminalImpl::from_syntax_node(db, self.node.get_children(db)[0])
20838    }
20839    pub fn name(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier {
20840        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[1])
20841    }
20842    pub fn colon(&self, db: &dyn SyntaxGroup) -> TerminalColon {
20843        TerminalColon::from_syntax_node(db, self.node.get_children(db)[2])
20844    }
20845    pub fn trait_path(&self, db: &dyn SyntaxGroup) -> ExprPath {
20846        ExprPath::from_syntax_node(db, self.node.get_children(db)[3])
20847    }
20848    pub fn type_constrains(&self, db: &dyn SyntaxGroup) -> OptionAssociatedItemConstraints {
20849        OptionAssociatedItemConstraints::from_syntax_node(db, self.node.get_children(db)[4])
20850    }
20851}
20852#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
20853pub struct GenericParamImplNamedPtr(pub SyntaxStablePtrId);
20854impl GenericParamImplNamedPtr {
20855    pub fn name_green(self, db: &dyn SyntaxGroup) -> TerminalIdentifierGreen {
20856        let ptr = self.0.lookup_intern(db);
20857        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
20858            TerminalIdentifierGreen(key_fields[0])
20859        } else {
20860            panic!("Unexpected key field query on root.");
20861        }
20862    }
20863}
20864impl TypedStablePtr for GenericParamImplNamedPtr {
20865    type SyntaxNode = GenericParamImplNamed;
20866    fn untyped(&self) -> SyntaxStablePtrId {
20867        self.0
20868    }
20869    fn lookup(&self, db: &dyn SyntaxGroup) -> GenericParamImplNamed {
20870        GenericParamImplNamed::from_syntax_node(db, self.0.lookup(db))
20871    }
20872}
20873impl From<GenericParamImplNamedPtr> for SyntaxStablePtrId {
20874    fn from(ptr: GenericParamImplNamedPtr) -> Self {
20875        ptr.untyped()
20876    }
20877}
20878#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
20879pub struct GenericParamImplNamedGreen(pub GreenId);
20880impl TypedSyntaxNode for GenericParamImplNamed {
20881    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::GenericParamImplNamed);
20882    type StablePtr = GenericParamImplNamedPtr;
20883    type Green = GenericParamImplNamedGreen;
20884    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
20885        GenericParamImplNamedGreen(
20886            Arc::new(GreenNode {
20887                kind: SyntaxKind::GenericParamImplNamed,
20888                details: GreenNodeDetails::Node {
20889                    children: [
20890                        TerminalImpl::missing(db).0,
20891                        TerminalIdentifier::missing(db).0,
20892                        TerminalColon::missing(db).0,
20893                        ExprPath::missing(db).0,
20894                        OptionAssociatedItemConstraints::missing(db).0,
20895                    ]
20896                    .into(),
20897                    width: TextWidth::default(),
20898                },
20899            })
20900            .intern(db),
20901        )
20902    }
20903    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
20904        let kind = node.kind(db);
20905        assert_eq!(
20906            kind,
20907            SyntaxKind::GenericParamImplNamed,
20908            "Unexpected SyntaxKind {:?}. Expected {:?}.",
20909            kind,
20910            SyntaxKind::GenericParamImplNamed
20911        );
20912        Self { node }
20913    }
20914    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
20915        let kind = node.kind(db);
20916        if kind == SyntaxKind::GenericParamImplNamed {
20917            Some(Self::from_syntax_node(db, node))
20918        } else {
20919            None
20920        }
20921    }
20922    fn as_syntax_node(&self) -> SyntaxNode {
20923        self.node
20924    }
20925    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
20926        GenericParamImplNamedPtr(self.node.stable_ptr(db))
20927    }
20928}
20929#[derive(Clone, Debug, Eq, Hash, PartialEq)]
20930pub struct GenericParamImplAnonymous {
20931    node: SyntaxNode,
20932}
20933impl GenericParamImplAnonymous {
20934    pub const INDEX_PLUS: usize = 0;
20935    pub const INDEX_TRAIT_PATH: usize = 1;
20936    pub const INDEX_TYPE_CONSTRAINS: usize = 2;
20937    pub fn new_green(
20938        db: &dyn SyntaxGroup,
20939        plus: TerminalPlusGreen,
20940        trait_path: ExprPathGreen,
20941        type_constrains: OptionAssociatedItemConstraintsGreen,
20942    ) -> GenericParamImplAnonymousGreen {
20943        let children = [plus.0, trait_path.0, type_constrains.0];
20944        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
20945        GenericParamImplAnonymousGreen(
20946            Arc::new(GreenNode {
20947                kind: SyntaxKind::GenericParamImplAnonymous,
20948                details: GreenNodeDetails::Node { children: children.into(), width },
20949            })
20950            .intern(db),
20951        )
20952    }
20953}
20954impl GenericParamImplAnonymous {
20955    pub fn plus(&self, db: &dyn SyntaxGroup) -> TerminalPlus {
20956        TerminalPlus::from_syntax_node(db, self.node.get_children(db)[0])
20957    }
20958    pub fn trait_path(&self, db: &dyn SyntaxGroup) -> ExprPath {
20959        ExprPath::from_syntax_node(db, self.node.get_children(db)[1])
20960    }
20961    pub fn type_constrains(&self, db: &dyn SyntaxGroup) -> OptionAssociatedItemConstraints {
20962        OptionAssociatedItemConstraints::from_syntax_node(db, self.node.get_children(db)[2])
20963    }
20964}
20965#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
20966pub struct GenericParamImplAnonymousPtr(pub SyntaxStablePtrId);
20967impl GenericParamImplAnonymousPtr {}
20968impl TypedStablePtr for GenericParamImplAnonymousPtr {
20969    type SyntaxNode = GenericParamImplAnonymous;
20970    fn untyped(&self) -> SyntaxStablePtrId {
20971        self.0
20972    }
20973    fn lookup(&self, db: &dyn SyntaxGroup) -> GenericParamImplAnonymous {
20974        GenericParamImplAnonymous::from_syntax_node(db, self.0.lookup(db))
20975    }
20976}
20977impl From<GenericParamImplAnonymousPtr> for SyntaxStablePtrId {
20978    fn from(ptr: GenericParamImplAnonymousPtr) -> Self {
20979        ptr.untyped()
20980    }
20981}
20982#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
20983pub struct GenericParamImplAnonymousGreen(pub GreenId);
20984impl TypedSyntaxNode for GenericParamImplAnonymous {
20985    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::GenericParamImplAnonymous);
20986    type StablePtr = GenericParamImplAnonymousPtr;
20987    type Green = GenericParamImplAnonymousGreen;
20988    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
20989        GenericParamImplAnonymousGreen(
20990            Arc::new(GreenNode {
20991                kind: SyntaxKind::GenericParamImplAnonymous,
20992                details: GreenNodeDetails::Node {
20993                    children: [
20994                        TerminalPlus::missing(db).0,
20995                        ExprPath::missing(db).0,
20996                        OptionAssociatedItemConstraints::missing(db).0,
20997                    ]
20998                    .into(),
20999                    width: TextWidth::default(),
21000                },
21001            })
21002            .intern(db),
21003        )
21004    }
21005    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
21006        let kind = node.kind(db);
21007        assert_eq!(
21008            kind,
21009            SyntaxKind::GenericParamImplAnonymous,
21010            "Unexpected SyntaxKind {:?}. Expected {:?}.",
21011            kind,
21012            SyntaxKind::GenericParamImplAnonymous
21013        );
21014        Self { node }
21015    }
21016    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
21017        let kind = node.kind(db);
21018        if kind == SyntaxKind::GenericParamImplAnonymous {
21019            Some(Self::from_syntax_node(db, node))
21020        } else {
21021            None
21022        }
21023    }
21024    fn as_syntax_node(&self) -> SyntaxNode {
21025        self.node
21026    }
21027    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
21028        GenericParamImplAnonymousPtr(self.node.stable_ptr(db))
21029    }
21030}
21031#[derive(Clone, Debug, Eq, Hash, PartialEq)]
21032pub struct GenericParamNegativeImpl {
21033    node: SyntaxNode,
21034}
21035impl GenericParamNegativeImpl {
21036    pub const INDEX_MINUS: usize = 0;
21037    pub const INDEX_TRAIT_PATH: usize = 1;
21038    pub fn new_green(
21039        db: &dyn SyntaxGroup,
21040        minus: TerminalMinusGreen,
21041        trait_path: ExprPathGreen,
21042    ) -> GenericParamNegativeImplGreen {
21043        let children = [minus.0, trait_path.0];
21044        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
21045        GenericParamNegativeImplGreen(
21046            Arc::new(GreenNode {
21047                kind: SyntaxKind::GenericParamNegativeImpl,
21048                details: GreenNodeDetails::Node { children: children.into(), width },
21049            })
21050            .intern(db),
21051        )
21052    }
21053}
21054impl GenericParamNegativeImpl {
21055    pub fn minus(&self, db: &dyn SyntaxGroup) -> TerminalMinus {
21056        TerminalMinus::from_syntax_node(db, self.node.get_children(db)[0])
21057    }
21058    pub fn trait_path(&self, db: &dyn SyntaxGroup) -> ExprPath {
21059        ExprPath::from_syntax_node(db, self.node.get_children(db)[1])
21060    }
21061}
21062#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
21063pub struct GenericParamNegativeImplPtr(pub SyntaxStablePtrId);
21064impl GenericParamNegativeImplPtr {}
21065impl TypedStablePtr for GenericParamNegativeImplPtr {
21066    type SyntaxNode = GenericParamNegativeImpl;
21067    fn untyped(&self) -> SyntaxStablePtrId {
21068        self.0
21069    }
21070    fn lookup(&self, db: &dyn SyntaxGroup) -> GenericParamNegativeImpl {
21071        GenericParamNegativeImpl::from_syntax_node(db, self.0.lookup(db))
21072    }
21073}
21074impl From<GenericParamNegativeImplPtr> for SyntaxStablePtrId {
21075    fn from(ptr: GenericParamNegativeImplPtr) -> Self {
21076        ptr.untyped()
21077    }
21078}
21079#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
21080pub struct GenericParamNegativeImplGreen(pub GreenId);
21081impl TypedSyntaxNode for GenericParamNegativeImpl {
21082    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::GenericParamNegativeImpl);
21083    type StablePtr = GenericParamNegativeImplPtr;
21084    type Green = GenericParamNegativeImplGreen;
21085    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
21086        GenericParamNegativeImplGreen(
21087            Arc::new(GreenNode {
21088                kind: SyntaxKind::GenericParamNegativeImpl,
21089                details: GreenNodeDetails::Node {
21090                    children: [TerminalMinus::missing(db).0, ExprPath::missing(db).0].into(),
21091                    width: TextWidth::default(),
21092                },
21093            })
21094            .intern(db),
21095        )
21096    }
21097    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
21098        let kind = node.kind(db);
21099        assert_eq!(
21100            kind,
21101            SyntaxKind::GenericParamNegativeImpl,
21102            "Unexpected SyntaxKind {:?}. Expected {:?}.",
21103            kind,
21104            SyntaxKind::GenericParamNegativeImpl
21105        );
21106        Self { node }
21107    }
21108    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
21109        let kind = node.kind(db);
21110        if kind == SyntaxKind::GenericParamNegativeImpl {
21111            Some(Self::from_syntax_node(db, node))
21112        } else {
21113            None
21114        }
21115    }
21116    fn as_syntax_node(&self) -> SyntaxNode {
21117        self.node
21118    }
21119    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
21120        GenericParamNegativeImplPtr(self.node.stable_ptr(db))
21121    }
21122}
21123#[derive(Clone, Debug, Eq, Hash, PartialEq)]
21124pub struct TokenList(ElementList<TokenTree, 1>);
21125impl Deref for TokenList {
21126    type Target = ElementList<TokenTree, 1>;
21127    fn deref(&self) -> &Self::Target {
21128        &self.0
21129    }
21130}
21131impl TokenList {
21132    pub fn new_green(db: &dyn SyntaxGroup, children: &[TokenTreeGreen]) -> TokenListGreen {
21133        let width = children.iter().map(|id| id.0.lookup_intern(db).width()).sum();
21134        TokenListGreen(
21135            Arc::new(GreenNode {
21136                kind: SyntaxKind::TokenList,
21137                details: GreenNodeDetails::Node {
21138                    children: children.iter().map(|x| x.0).collect(),
21139                    width,
21140                },
21141            })
21142            .intern(db),
21143        )
21144    }
21145}
21146#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
21147pub struct TokenListPtr(pub SyntaxStablePtrId);
21148impl TypedStablePtr for TokenListPtr {
21149    type SyntaxNode = TokenList;
21150    fn untyped(&self) -> SyntaxStablePtrId {
21151        self.0
21152    }
21153    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenList {
21154        TokenList::from_syntax_node(db, self.0.lookup(db))
21155    }
21156}
21157impl From<TokenListPtr> for SyntaxStablePtrId {
21158    fn from(ptr: TokenListPtr) -> Self {
21159        ptr.untyped()
21160    }
21161}
21162#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
21163pub struct TokenListGreen(pub GreenId);
21164impl TypedSyntaxNode for TokenList {
21165    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenList);
21166    type StablePtr = TokenListPtr;
21167    type Green = TokenListGreen;
21168    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
21169        TokenListGreen(
21170            Arc::new(GreenNode {
21171                kind: SyntaxKind::TokenList,
21172                details: GreenNodeDetails::Node {
21173                    children: [].into(),
21174                    width: TextWidth::default(),
21175                },
21176            })
21177            .intern(db),
21178        )
21179    }
21180    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
21181        Self(ElementList::new(node))
21182    }
21183    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
21184        if node.kind(db) == SyntaxKind::TokenList {
21185            Some(Self(ElementList::new(node)))
21186        } else {
21187            None
21188        }
21189    }
21190    fn as_syntax_node(&self) -> SyntaxNode {
21191        self.node
21192    }
21193    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
21194        TokenListPtr(self.node.stable_ptr(db))
21195    }
21196}
21197#[derive(Clone, Debug, Eq, Hash, PartialEq)]
21198pub struct TokenTreeLeaf {
21199    node: SyntaxNode,
21200}
21201impl TokenTreeLeaf {
21202    pub const INDEX_LEAF: usize = 0;
21203    pub fn new_green(db: &dyn SyntaxGroup, leaf: TokenNodeGreen) -> TokenTreeLeafGreen {
21204        let children = [leaf.0];
21205        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
21206        TokenTreeLeafGreen(
21207            Arc::new(GreenNode {
21208                kind: SyntaxKind::TokenTreeLeaf,
21209                details: GreenNodeDetails::Node { children: children.into(), width },
21210            })
21211            .intern(db),
21212        )
21213    }
21214}
21215impl TokenTreeLeaf {
21216    pub fn leaf(&self, db: &dyn SyntaxGroup) -> TokenNode {
21217        TokenNode::from_syntax_node(db, self.node.get_children(db)[0])
21218    }
21219}
21220#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
21221pub struct TokenTreeLeafPtr(pub SyntaxStablePtrId);
21222impl TokenTreeLeafPtr {}
21223impl TypedStablePtr for TokenTreeLeafPtr {
21224    type SyntaxNode = TokenTreeLeaf;
21225    fn untyped(&self) -> SyntaxStablePtrId {
21226        self.0
21227    }
21228    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenTreeLeaf {
21229        TokenTreeLeaf::from_syntax_node(db, self.0.lookup(db))
21230    }
21231}
21232impl From<TokenTreeLeafPtr> for SyntaxStablePtrId {
21233    fn from(ptr: TokenTreeLeafPtr) -> Self {
21234        ptr.untyped()
21235    }
21236}
21237#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
21238pub struct TokenTreeLeafGreen(pub GreenId);
21239impl TypedSyntaxNode for TokenTreeLeaf {
21240    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenTreeLeaf);
21241    type StablePtr = TokenTreeLeafPtr;
21242    type Green = TokenTreeLeafGreen;
21243    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
21244        TokenTreeLeafGreen(
21245            Arc::new(GreenNode {
21246                kind: SyntaxKind::TokenTreeLeaf,
21247                details: GreenNodeDetails::Node {
21248                    children: [TokenNode::missing(db).0].into(),
21249                    width: TextWidth::default(),
21250                },
21251            })
21252            .intern(db),
21253        )
21254    }
21255    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
21256        let kind = node.kind(db);
21257        assert_eq!(
21258            kind,
21259            SyntaxKind::TokenTreeLeaf,
21260            "Unexpected SyntaxKind {:?}. Expected {:?}.",
21261            kind,
21262            SyntaxKind::TokenTreeLeaf
21263        );
21264        Self { node }
21265    }
21266    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
21267        let kind = node.kind(db);
21268        if kind == SyntaxKind::TokenTreeLeaf {
21269            Some(Self::from_syntax_node(db, node))
21270        } else {
21271            None
21272        }
21273    }
21274    fn as_syntax_node(&self) -> SyntaxNode {
21275        self.node
21276    }
21277    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
21278        TokenTreeLeafPtr(self.node.stable_ptr(db))
21279    }
21280}
21281#[derive(Clone, Debug, Eq, Hash, PartialEq)]
21282pub struct TokenTreeNode {
21283    node: SyntaxNode,
21284}
21285impl TokenTreeNode {
21286    pub const INDEX_SUBTREE: usize = 0;
21287    pub fn new_green(db: &dyn SyntaxGroup, subtree: WrappedTokenTreeGreen) -> TokenTreeNodeGreen {
21288        let children = [subtree.0];
21289        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
21290        TokenTreeNodeGreen(
21291            Arc::new(GreenNode {
21292                kind: SyntaxKind::TokenTreeNode,
21293                details: GreenNodeDetails::Node { children: children.into(), width },
21294            })
21295            .intern(db),
21296        )
21297    }
21298}
21299impl TokenTreeNode {
21300    pub fn subtree(&self, db: &dyn SyntaxGroup) -> WrappedTokenTree {
21301        WrappedTokenTree::from_syntax_node(db, self.node.get_children(db)[0])
21302    }
21303}
21304#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
21305pub struct TokenTreeNodePtr(pub SyntaxStablePtrId);
21306impl TokenTreeNodePtr {}
21307impl TypedStablePtr for TokenTreeNodePtr {
21308    type SyntaxNode = TokenTreeNode;
21309    fn untyped(&self) -> SyntaxStablePtrId {
21310        self.0
21311    }
21312    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenTreeNode {
21313        TokenTreeNode::from_syntax_node(db, self.0.lookup(db))
21314    }
21315}
21316impl From<TokenTreeNodePtr> for SyntaxStablePtrId {
21317    fn from(ptr: TokenTreeNodePtr) -> Self {
21318        ptr.untyped()
21319    }
21320}
21321#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
21322pub struct TokenTreeNodeGreen(pub GreenId);
21323impl TypedSyntaxNode for TokenTreeNode {
21324    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenTreeNode);
21325    type StablePtr = TokenTreeNodePtr;
21326    type Green = TokenTreeNodeGreen;
21327    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
21328        TokenTreeNodeGreen(
21329            Arc::new(GreenNode {
21330                kind: SyntaxKind::TokenTreeNode,
21331                details: GreenNodeDetails::Node {
21332                    children: [WrappedTokenTree::missing(db).0].into(),
21333                    width: TextWidth::default(),
21334                },
21335            })
21336            .intern(db),
21337        )
21338    }
21339    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
21340        let kind = node.kind(db);
21341        assert_eq!(
21342            kind,
21343            SyntaxKind::TokenTreeNode,
21344            "Unexpected SyntaxKind {:?}. Expected {:?}.",
21345            kind,
21346            SyntaxKind::TokenTreeNode
21347        );
21348        Self { node }
21349    }
21350    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
21351        let kind = node.kind(db);
21352        if kind == SyntaxKind::TokenTreeNode {
21353            Some(Self::from_syntax_node(db, node))
21354        } else {
21355            None
21356        }
21357    }
21358    fn as_syntax_node(&self) -> SyntaxNode {
21359        self.node
21360    }
21361    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
21362        TokenTreeNodePtr(self.node.stable_ptr(db))
21363    }
21364}
21365#[derive(Clone, Debug, Eq, Hash, PartialEq)]
21366pub struct TokenTreeRepetition {
21367    node: SyntaxNode,
21368}
21369impl TokenTreeRepetition {
21370    pub const INDEX_DOLLAR: usize = 0;
21371    pub const INDEX_LPAREN: usize = 1;
21372    pub const INDEX_ELEMENTS: usize = 2;
21373    pub const INDEX_RPAREN: usize = 3;
21374    pub const INDEX_SEPARATOR: usize = 4;
21375    pub const INDEX_OPERATOR: usize = 5;
21376    pub fn new_green(
21377        db: &dyn SyntaxGroup,
21378        dollar: TerminalDollarGreen,
21379        lparen: TerminalLParenGreen,
21380        elements: TokenListGreen,
21381        rparen: TerminalRParenGreen,
21382        separator: OptionTerminalCommaGreen,
21383        operator: MacroRepetitionOperatorGreen,
21384    ) -> TokenTreeRepetitionGreen {
21385        let children = [dollar.0, lparen.0, elements.0, rparen.0, separator.0, operator.0];
21386        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
21387        TokenTreeRepetitionGreen(
21388            Arc::new(GreenNode {
21389                kind: SyntaxKind::TokenTreeRepetition,
21390                details: GreenNodeDetails::Node { children: children.into(), width },
21391            })
21392            .intern(db),
21393        )
21394    }
21395}
21396impl TokenTreeRepetition {
21397    pub fn dollar(&self, db: &dyn SyntaxGroup) -> TerminalDollar {
21398        TerminalDollar::from_syntax_node(db, self.node.get_children(db)[0])
21399    }
21400    pub fn lparen(&self, db: &dyn SyntaxGroup) -> TerminalLParen {
21401        TerminalLParen::from_syntax_node(db, self.node.get_children(db)[1])
21402    }
21403    pub fn elements(&self, db: &dyn SyntaxGroup) -> TokenList {
21404        TokenList::from_syntax_node(db, self.node.get_children(db)[2])
21405    }
21406    pub fn rparen(&self, db: &dyn SyntaxGroup) -> TerminalRParen {
21407        TerminalRParen::from_syntax_node(db, self.node.get_children(db)[3])
21408    }
21409    pub fn separator(&self, db: &dyn SyntaxGroup) -> OptionTerminalComma {
21410        OptionTerminalComma::from_syntax_node(db, self.node.get_children(db)[4])
21411    }
21412    pub fn operator(&self, db: &dyn SyntaxGroup) -> MacroRepetitionOperator {
21413        MacroRepetitionOperator::from_syntax_node(db, self.node.get_children(db)[5])
21414    }
21415}
21416#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
21417pub struct TokenTreeRepetitionPtr(pub SyntaxStablePtrId);
21418impl TokenTreeRepetitionPtr {}
21419impl TypedStablePtr for TokenTreeRepetitionPtr {
21420    type SyntaxNode = TokenTreeRepetition;
21421    fn untyped(&self) -> SyntaxStablePtrId {
21422        self.0
21423    }
21424    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenTreeRepetition {
21425        TokenTreeRepetition::from_syntax_node(db, self.0.lookup(db))
21426    }
21427}
21428impl From<TokenTreeRepetitionPtr> for SyntaxStablePtrId {
21429    fn from(ptr: TokenTreeRepetitionPtr) -> Self {
21430        ptr.untyped()
21431    }
21432}
21433#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
21434pub struct TokenTreeRepetitionGreen(pub GreenId);
21435impl TypedSyntaxNode for TokenTreeRepetition {
21436    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenTreeRepetition);
21437    type StablePtr = TokenTreeRepetitionPtr;
21438    type Green = TokenTreeRepetitionGreen;
21439    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
21440        TokenTreeRepetitionGreen(
21441            Arc::new(GreenNode {
21442                kind: SyntaxKind::TokenTreeRepetition,
21443                details: GreenNodeDetails::Node {
21444                    children: [
21445                        TerminalDollar::missing(db).0,
21446                        TerminalLParen::missing(db).0,
21447                        TokenList::missing(db).0,
21448                        TerminalRParen::missing(db).0,
21449                        OptionTerminalComma::missing(db).0,
21450                        MacroRepetitionOperator::missing(db).0,
21451                    ]
21452                    .into(),
21453                    width: TextWidth::default(),
21454                },
21455            })
21456            .intern(db),
21457        )
21458    }
21459    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
21460        let kind = node.kind(db);
21461        assert_eq!(
21462            kind,
21463            SyntaxKind::TokenTreeRepetition,
21464            "Unexpected SyntaxKind {:?}. Expected {:?}.",
21465            kind,
21466            SyntaxKind::TokenTreeRepetition
21467        );
21468        Self { node }
21469    }
21470    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
21471        let kind = node.kind(db);
21472        if kind == SyntaxKind::TokenTreeRepetition {
21473            Some(Self::from_syntax_node(db, node))
21474        } else {
21475            None
21476        }
21477    }
21478    fn as_syntax_node(&self) -> SyntaxNode {
21479        self.node
21480    }
21481    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
21482        TokenTreeRepetitionPtr(self.node.stable_ptr(db))
21483    }
21484}
21485#[derive(Clone, Debug, Eq, Hash, PartialEq)]
21486pub struct TokenTreeParam {
21487    node: SyntaxNode,
21488}
21489impl TokenTreeParam {
21490    pub const INDEX_DOLLAR: usize = 0;
21491    pub const INDEX_NAME: usize = 1;
21492    pub fn new_green(
21493        db: &dyn SyntaxGroup,
21494        dollar: TerminalDollarGreen,
21495        name: TerminalIdentifierGreen,
21496    ) -> TokenTreeParamGreen {
21497        let children = [dollar.0, name.0];
21498        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
21499        TokenTreeParamGreen(
21500            Arc::new(GreenNode {
21501                kind: SyntaxKind::TokenTreeParam,
21502                details: GreenNodeDetails::Node { children: children.into(), width },
21503            })
21504            .intern(db),
21505        )
21506    }
21507}
21508impl TokenTreeParam {
21509    pub fn dollar(&self, db: &dyn SyntaxGroup) -> TerminalDollar {
21510        TerminalDollar::from_syntax_node(db, self.node.get_children(db)[0])
21511    }
21512    pub fn name(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier {
21513        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[1])
21514    }
21515}
21516#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
21517pub struct TokenTreeParamPtr(pub SyntaxStablePtrId);
21518impl TokenTreeParamPtr {}
21519impl TypedStablePtr for TokenTreeParamPtr {
21520    type SyntaxNode = TokenTreeParam;
21521    fn untyped(&self) -> SyntaxStablePtrId {
21522        self.0
21523    }
21524    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenTreeParam {
21525        TokenTreeParam::from_syntax_node(db, self.0.lookup(db))
21526    }
21527}
21528impl From<TokenTreeParamPtr> for SyntaxStablePtrId {
21529    fn from(ptr: TokenTreeParamPtr) -> Self {
21530        ptr.untyped()
21531    }
21532}
21533#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
21534pub struct TokenTreeParamGreen(pub GreenId);
21535impl TypedSyntaxNode for TokenTreeParam {
21536    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenTreeParam);
21537    type StablePtr = TokenTreeParamPtr;
21538    type Green = TokenTreeParamGreen;
21539    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
21540        TokenTreeParamGreen(
21541            Arc::new(GreenNode {
21542                kind: SyntaxKind::TokenTreeParam,
21543                details: GreenNodeDetails::Node {
21544                    children: [TerminalDollar::missing(db).0, TerminalIdentifier::missing(db).0]
21545                        .into(),
21546                    width: TextWidth::default(),
21547                },
21548            })
21549            .intern(db),
21550        )
21551    }
21552    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
21553        let kind = node.kind(db);
21554        assert_eq!(
21555            kind,
21556            SyntaxKind::TokenTreeParam,
21557            "Unexpected SyntaxKind {:?}. Expected {:?}.",
21558            kind,
21559            SyntaxKind::TokenTreeParam
21560        );
21561        Self { node }
21562    }
21563    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
21564        let kind = node.kind(db);
21565        if kind == SyntaxKind::TokenTreeParam {
21566            Some(Self::from_syntax_node(db, node))
21567        } else {
21568            None
21569        }
21570    }
21571    fn as_syntax_node(&self) -> SyntaxNode {
21572        self.node
21573    }
21574    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
21575        TokenTreeParamPtr(self.node.stable_ptr(db))
21576    }
21577}
21578#[derive(Clone, Debug, Eq, Hash, PartialEq)]
21579pub enum TokenTree {
21580    Token(TokenTreeLeaf),
21581    Subtree(TokenTreeNode),
21582    Repetition(TokenTreeRepetition),
21583    Param(TokenTreeParam),
21584    Missing(TokenTreeMissing),
21585}
21586#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
21587pub struct TokenTreePtr(pub SyntaxStablePtrId);
21588impl TypedStablePtr for TokenTreePtr {
21589    type SyntaxNode = TokenTree;
21590    fn untyped(&self) -> SyntaxStablePtrId {
21591        self.0
21592    }
21593    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenTree {
21594        TokenTree::from_syntax_node(db, self.0.lookup(db))
21595    }
21596}
21597impl From<TokenTreePtr> for SyntaxStablePtrId {
21598    fn from(ptr: TokenTreePtr) -> Self {
21599        ptr.untyped()
21600    }
21601}
21602impl From<TokenTreeLeafPtr> for TokenTreePtr {
21603    fn from(value: TokenTreeLeafPtr) -> Self {
21604        Self(value.0)
21605    }
21606}
21607impl From<TokenTreeNodePtr> for TokenTreePtr {
21608    fn from(value: TokenTreeNodePtr) -> Self {
21609        Self(value.0)
21610    }
21611}
21612impl From<TokenTreeRepetitionPtr> for TokenTreePtr {
21613    fn from(value: TokenTreeRepetitionPtr) -> Self {
21614        Self(value.0)
21615    }
21616}
21617impl From<TokenTreeParamPtr> for TokenTreePtr {
21618    fn from(value: TokenTreeParamPtr) -> Self {
21619        Self(value.0)
21620    }
21621}
21622impl From<TokenTreeMissingPtr> for TokenTreePtr {
21623    fn from(value: TokenTreeMissingPtr) -> Self {
21624        Self(value.0)
21625    }
21626}
21627impl From<TokenTreeLeafGreen> for TokenTreeGreen {
21628    fn from(value: TokenTreeLeafGreen) -> Self {
21629        Self(value.0)
21630    }
21631}
21632impl From<TokenTreeNodeGreen> for TokenTreeGreen {
21633    fn from(value: TokenTreeNodeGreen) -> Self {
21634        Self(value.0)
21635    }
21636}
21637impl From<TokenTreeRepetitionGreen> for TokenTreeGreen {
21638    fn from(value: TokenTreeRepetitionGreen) -> Self {
21639        Self(value.0)
21640    }
21641}
21642impl From<TokenTreeParamGreen> for TokenTreeGreen {
21643    fn from(value: TokenTreeParamGreen) -> Self {
21644        Self(value.0)
21645    }
21646}
21647impl From<TokenTreeMissingGreen> for TokenTreeGreen {
21648    fn from(value: TokenTreeMissingGreen) -> Self {
21649        Self(value.0)
21650    }
21651}
21652#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
21653pub struct TokenTreeGreen(pub GreenId);
21654impl TypedSyntaxNode for TokenTree {
21655    const OPTIONAL_KIND: Option<SyntaxKind> = None;
21656    type StablePtr = TokenTreePtr;
21657    type Green = TokenTreeGreen;
21658    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
21659        TokenTreeGreen(TokenTreeMissing::missing(db).0)
21660    }
21661    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
21662        let kind = node.kind(db);
21663        match kind {
21664            SyntaxKind::TokenTreeLeaf => {
21665                TokenTree::Token(TokenTreeLeaf::from_syntax_node(db, node))
21666            }
21667            SyntaxKind::TokenTreeNode => {
21668                TokenTree::Subtree(TokenTreeNode::from_syntax_node(db, node))
21669            }
21670            SyntaxKind::TokenTreeRepetition => {
21671                TokenTree::Repetition(TokenTreeRepetition::from_syntax_node(db, node))
21672            }
21673            SyntaxKind::TokenTreeParam => {
21674                TokenTree::Param(TokenTreeParam::from_syntax_node(db, node))
21675            }
21676            SyntaxKind::TokenTreeMissing => {
21677                TokenTree::Missing(TokenTreeMissing::from_syntax_node(db, node))
21678            }
21679            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "TokenTree"),
21680        }
21681    }
21682    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
21683        let kind = node.kind(db);
21684        match kind {
21685            SyntaxKind::TokenTreeLeaf => {
21686                Some(TokenTree::Token(TokenTreeLeaf::from_syntax_node(db, node)))
21687            }
21688            SyntaxKind::TokenTreeNode => {
21689                Some(TokenTree::Subtree(TokenTreeNode::from_syntax_node(db, node)))
21690            }
21691            SyntaxKind::TokenTreeRepetition => {
21692                Some(TokenTree::Repetition(TokenTreeRepetition::from_syntax_node(db, node)))
21693            }
21694            SyntaxKind::TokenTreeParam => {
21695                Some(TokenTree::Param(TokenTreeParam::from_syntax_node(db, node)))
21696            }
21697            SyntaxKind::TokenTreeMissing => {
21698                Some(TokenTree::Missing(TokenTreeMissing::from_syntax_node(db, node)))
21699            }
21700            _ => None,
21701        }
21702    }
21703    fn as_syntax_node(&self) -> SyntaxNode {
21704        match self {
21705            TokenTree::Token(x) => x.as_syntax_node(),
21706            TokenTree::Subtree(x) => x.as_syntax_node(),
21707            TokenTree::Repetition(x) => x.as_syntax_node(),
21708            TokenTree::Param(x) => x.as_syntax_node(),
21709            TokenTree::Missing(x) => x.as_syntax_node(),
21710        }
21711    }
21712    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
21713        TokenTreePtr(self.as_syntax_node().lookup_intern(db).stable_ptr)
21714    }
21715}
21716impl TokenTree {
21717    /// Checks if a kind of a variant of [TokenTree].
21718    pub fn is_variant(kind: SyntaxKind) -> bool {
21719        matches!(
21720            kind,
21721            SyntaxKind::TokenTreeLeaf
21722                | SyntaxKind::TokenTreeNode
21723                | SyntaxKind::TokenTreeRepetition
21724                | SyntaxKind::TokenTreeParam
21725                | SyntaxKind::TokenTreeMissing
21726        )
21727    }
21728}
21729#[derive(Clone, Debug, Eq, Hash, PartialEq)]
21730pub struct TokenTreeMissing {
21731    node: SyntaxNode,
21732}
21733impl TokenTreeMissing {
21734    pub fn new_green(db: &dyn SyntaxGroup) -> TokenTreeMissingGreen {
21735        let children = [];
21736        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
21737        TokenTreeMissingGreen(
21738            Arc::new(GreenNode {
21739                kind: SyntaxKind::TokenTreeMissing,
21740                details: GreenNodeDetails::Node { children: children.into(), width },
21741            })
21742            .intern(db),
21743        )
21744    }
21745}
21746impl TokenTreeMissing {}
21747#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
21748pub struct TokenTreeMissingPtr(pub SyntaxStablePtrId);
21749impl TokenTreeMissingPtr {}
21750impl TypedStablePtr for TokenTreeMissingPtr {
21751    type SyntaxNode = TokenTreeMissing;
21752    fn untyped(&self) -> SyntaxStablePtrId {
21753        self.0
21754    }
21755    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenTreeMissing {
21756        TokenTreeMissing::from_syntax_node(db, self.0.lookup(db))
21757    }
21758}
21759impl From<TokenTreeMissingPtr> for SyntaxStablePtrId {
21760    fn from(ptr: TokenTreeMissingPtr) -> Self {
21761        ptr.untyped()
21762    }
21763}
21764#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
21765pub struct TokenTreeMissingGreen(pub GreenId);
21766impl TypedSyntaxNode for TokenTreeMissing {
21767    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenTreeMissing);
21768    type StablePtr = TokenTreeMissingPtr;
21769    type Green = TokenTreeMissingGreen;
21770    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
21771        TokenTreeMissingGreen(
21772            Arc::new(GreenNode {
21773                kind: SyntaxKind::TokenTreeMissing,
21774                details: GreenNodeDetails::Node {
21775                    children: [].into(),
21776                    width: TextWidth::default(),
21777                },
21778            })
21779            .intern(db),
21780        )
21781    }
21782    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
21783        let kind = node.kind(db);
21784        assert_eq!(
21785            kind,
21786            SyntaxKind::TokenTreeMissing,
21787            "Unexpected SyntaxKind {:?}. Expected {:?}.",
21788            kind,
21789            SyntaxKind::TokenTreeMissing
21790        );
21791        Self { node }
21792    }
21793    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
21794        let kind = node.kind(db);
21795        if kind == SyntaxKind::TokenTreeMissing {
21796            Some(Self::from_syntax_node(db, node))
21797        } else {
21798            None
21799        }
21800    }
21801    fn as_syntax_node(&self) -> SyntaxNode {
21802        self.node
21803    }
21804    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
21805        TokenTreeMissingPtr(self.node.stable_ptr(db))
21806    }
21807}
21808#[derive(Clone, Debug, Eq, Hash, PartialEq)]
21809pub enum WrappedTokenTree {
21810    Parenthesized(ParenthesizedTokenTree),
21811    Braced(BracedTokenTree),
21812    Bracketed(BracketedTokenTree),
21813    Missing(WrappedTokenTreeMissing),
21814}
21815#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
21816pub struct WrappedTokenTreePtr(pub SyntaxStablePtrId);
21817impl TypedStablePtr for WrappedTokenTreePtr {
21818    type SyntaxNode = WrappedTokenTree;
21819    fn untyped(&self) -> SyntaxStablePtrId {
21820        self.0
21821    }
21822    fn lookup(&self, db: &dyn SyntaxGroup) -> WrappedTokenTree {
21823        WrappedTokenTree::from_syntax_node(db, self.0.lookup(db))
21824    }
21825}
21826impl From<WrappedTokenTreePtr> for SyntaxStablePtrId {
21827    fn from(ptr: WrappedTokenTreePtr) -> Self {
21828        ptr.untyped()
21829    }
21830}
21831impl From<ParenthesizedTokenTreePtr> for WrappedTokenTreePtr {
21832    fn from(value: ParenthesizedTokenTreePtr) -> Self {
21833        Self(value.0)
21834    }
21835}
21836impl From<BracedTokenTreePtr> for WrappedTokenTreePtr {
21837    fn from(value: BracedTokenTreePtr) -> Self {
21838        Self(value.0)
21839    }
21840}
21841impl From<BracketedTokenTreePtr> for WrappedTokenTreePtr {
21842    fn from(value: BracketedTokenTreePtr) -> Self {
21843        Self(value.0)
21844    }
21845}
21846impl From<WrappedTokenTreeMissingPtr> for WrappedTokenTreePtr {
21847    fn from(value: WrappedTokenTreeMissingPtr) -> Self {
21848        Self(value.0)
21849    }
21850}
21851impl From<ParenthesizedTokenTreeGreen> for WrappedTokenTreeGreen {
21852    fn from(value: ParenthesizedTokenTreeGreen) -> Self {
21853        Self(value.0)
21854    }
21855}
21856impl From<BracedTokenTreeGreen> for WrappedTokenTreeGreen {
21857    fn from(value: BracedTokenTreeGreen) -> Self {
21858        Self(value.0)
21859    }
21860}
21861impl From<BracketedTokenTreeGreen> for WrappedTokenTreeGreen {
21862    fn from(value: BracketedTokenTreeGreen) -> Self {
21863        Self(value.0)
21864    }
21865}
21866impl From<WrappedTokenTreeMissingGreen> for WrappedTokenTreeGreen {
21867    fn from(value: WrappedTokenTreeMissingGreen) -> Self {
21868        Self(value.0)
21869    }
21870}
21871#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
21872pub struct WrappedTokenTreeGreen(pub GreenId);
21873impl TypedSyntaxNode for WrappedTokenTree {
21874    const OPTIONAL_KIND: Option<SyntaxKind> = None;
21875    type StablePtr = WrappedTokenTreePtr;
21876    type Green = WrappedTokenTreeGreen;
21877    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
21878        WrappedTokenTreeGreen(WrappedTokenTreeMissing::missing(db).0)
21879    }
21880    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
21881        let kind = node.kind(db);
21882        match kind {
21883            SyntaxKind::ParenthesizedTokenTree => {
21884                WrappedTokenTree::Parenthesized(ParenthesizedTokenTree::from_syntax_node(db, node))
21885            }
21886            SyntaxKind::BracedTokenTree => {
21887                WrappedTokenTree::Braced(BracedTokenTree::from_syntax_node(db, node))
21888            }
21889            SyntaxKind::BracketedTokenTree => {
21890                WrappedTokenTree::Bracketed(BracketedTokenTree::from_syntax_node(db, node))
21891            }
21892            SyntaxKind::WrappedTokenTreeMissing => {
21893                WrappedTokenTree::Missing(WrappedTokenTreeMissing::from_syntax_node(db, node))
21894            }
21895            _ => panic!(
21896                "Unexpected syntax kind {:?} when constructing {}.",
21897                kind, "WrappedTokenTree"
21898            ),
21899        }
21900    }
21901    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
21902        let kind = node.kind(db);
21903        match kind {
21904            SyntaxKind::ParenthesizedTokenTree => Some(WrappedTokenTree::Parenthesized(
21905                ParenthesizedTokenTree::from_syntax_node(db, node),
21906            )),
21907            SyntaxKind::BracedTokenTree => {
21908                Some(WrappedTokenTree::Braced(BracedTokenTree::from_syntax_node(db, node)))
21909            }
21910            SyntaxKind::BracketedTokenTree => {
21911                Some(WrappedTokenTree::Bracketed(BracketedTokenTree::from_syntax_node(db, node)))
21912            }
21913            SyntaxKind::WrappedTokenTreeMissing => {
21914                Some(WrappedTokenTree::Missing(WrappedTokenTreeMissing::from_syntax_node(db, node)))
21915            }
21916            _ => None,
21917        }
21918    }
21919    fn as_syntax_node(&self) -> SyntaxNode {
21920        match self {
21921            WrappedTokenTree::Parenthesized(x) => x.as_syntax_node(),
21922            WrappedTokenTree::Braced(x) => x.as_syntax_node(),
21923            WrappedTokenTree::Bracketed(x) => x.as_syntax_node(),
21924            WrappedTokenTree::Missing(x) => x.as_syntax_node(),
21925        }
21926    }
21927    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
21928        WrappedTokenTreePtr(self.as_syntax_node().lookup_intern(db).stable_ptr)
21929    }
21930}
21931impl WrappedTokenTree {
21932    /// Checks if a kind of a variant of [WrappedTokenTree].
21933    pub fn is_variant(kind: SyntaxKind) -> bool {
21934        matches!(
21935            kind,
21936            SyntaxKind::ParenthesizedTokenTree
21937                | SyntaxKind::BracedTokenTree
21938                | SyntaxKind::BracketedTokenTree
21939                | SyntaxKind::WrappedTokenTreeMissing
21940        )
21941    }
21942}
21943#[derive(Clone, Debug, Eq, Hash, PartialEq)]
21944pub struct WrappedTokenTreeMissing {
21945    node: SyntaxNode,
21946}
21947impl WrappedTokenTreeMissing {
21948    pub fn new_green(db: &dyn SyntaxGroup) -> WrappedTokenTreeMissingGreen {
21949        let children = [];
21950        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
21951        WrappedTokenTreeMissingGreen(
21952            Arc::new(GreenNode {
21953                kind: SyntaxKind::WrappedTokenTreeMissing,
21954                details: GreenNodeDetails::Node { children: children.into(), width },
21955            })
21956            .intern(db),
21957        )
21958    }
21959}
21960impl WrappedTokenTreeMissing {}
21961#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
21962pub struct WrappedTokenTreeMissingPtr(pub SyntaxStablePtrId);
21963impl WrappedTokenTreeMissingPtr {}
21964impl TypedStablePtr for WrappedTokenTreeMissingPtr {
21965    type SyntaxNode = WrappedTokenTreeMissing;
21966    fn untyped(&self) -> SyntaxStablePtrId {
21967        self.0
21968    }
21969    fn lookup(&self, db: &dyn SyntaxGroup) -> WrappedTokenTreeMissing {
21970        WrappedTokenTreeMissing::from_syntax_node(db, self.0.lookup(db))
21971    }
21972}
21973impl From<WrappedTokenTreeMissingPtr> for SyntaxStablePtrId {
21974    fn from(ptr: WrappedTokenTreeMissingPtr) -> Self {
21975        ptr.untyped()
21976    }
21977}
21978#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
21979pub struct WrappedTokenTreeMissingGreen(pub GreenId);
21980impl TypedSyntaxNode for WrappedTokenTreeMissing {
21981    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::WrappedTokenTreeMissing);
21982    type StablePtr = WrappedTokenTreeMissingPtr;
21983    type Green = WrappedTokenTreeMissingGreen;
21984    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
21985        WrappedTokenTreeMissingGreen(
21986            Arc::new(GreenNode {
21987                kind: SyntaxKind::WrappedTokenTreeMissing,
21988                details: GreenNodeDetails::Node {
21989                    children: [].into(),
21990                    width: TextWidth::default(),
21991                },
21992            })
21993            .intern(db),
21994        )
21995    }
21996    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
21997        let kind = node.kind(db);
21998        assert_eq!(
21999            kind,
22000            SyntaxKind::WrappedTokenTreeMissing,
22001            "Unexpected SyntaxKind {:?}. Expected {:?}.",
22002            kind,
22003            SyntaxKind::WrappedTokenTreeMissing
22004        );
22005        Self { node }
22006    }
22007    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
22008        let kind = node.kind(db);
22009        if kind == SyntaxKind::WrappedTokenTreeMissing {
22010            Some(Self::from_syntax_node(db, node))
22011        } else {
22012            None
22013        }
22014    }
22015    fn as_syntax_node(&self) -> SyntaxNode {
22016        self.node
22017    }
22018    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
22019        WrappedTokenTreeMissingPtr(self.node.stable_ptr(db))
22020    }
22021}
22022#[derive(Clone, Debug, Eq, Hash, PartialEq)]
22023pub struct ParenthesizedTokenTree {
22024    node: SyntaxNode,
22025}
22026impl ParenthesizedTokenTree {
22027    pub const INDEX_LPAREN: usize = 0;
22028    pub const INDEX_TOKENS: usize = 1;
22029    pub const INDEX_RPAREN: usize = 2;
22030    pub fn new_green(
22031        db: &dyn SyntaxGroup,
22032        lparen: TerminalLParenGreen,
22033        tokens: TokenListGreen,
22034        rparen: TerminalRParenGreen,
22035    ) -> ParenthesizedTokenTreeGreen {
22036        let children = [lparen.0, tokens.0, rparen.0];
22037        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
22038        ParenthesizedTokenTreeGreen(
22039            Arc::new(GreenNode {
22040                kind: SyntaxKind::ParenthesizedTokenTree,
22041                details: GreenNodeDetails::Node { children: children.into(), width },
22042            })
22043            .intern(db),
22044        )
22045    }
22046}
22047impl ParenthesizedTokenTree {
22048    pub fn lparen(&self, db: &dyn SyntaxGroup) -> TerminalLParen {
22049        TerminalLParen::from_syntax_node(db, self.node.get_children(db)[0])
22050    }
22051    pub fn tokens(&self, db: &dyn SyntaxGroup) -> TokenList {
22052        TokenList::from_syntax_node(db, self.node.get_children(db)[1])
22053    }
22054    pub fn rparen(&self, db: &dyn SyntaxGroup) -> TerminalRParen {
22055        TerminalRParen::from_syntax_node(db, self.node.get_children(db)[2])
22056    }
22057}
22058#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
22059pub struct ParenthesizedTokenTreePtr(pub SyntaxStablePtrId);
22060impl ParenthesizedTokenTreePtr {}
22061impl TypedStablePtr for ParenthesizedTokenTreePtr {
22062    type SyntaxNode = ParenthesizedTokenTree;
22063    fn untyped(&self) -> SyntaxStablePtrId {
22064        self.0
22065    }
22066    fn lookup(&self, db: &dyn SyntaxGroup) -> ParenthesizedTokenTree {
22067        ParenthesizedTokenTree::from_syntax_node(db, self.0.lookup(db))
22068    }
22069}
22070impl From<ParenthesizedTokenTreePtr> for SyntaxStablePtrId {
22071    fn from(ptr: ParenthesizedTokenTreePtr) -> Self {
22072        ptr.untyped()
22073    }
22074}
22075#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
22076pub struct ParenthesizedTokenTreeGreen(pub GreenId);
22077impl TypedSyntaxNode for ParenthesizedTokenTree {
22078    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ParenthesizedTokenTree);
22079    type StablePtr = ParenthesizedTokenTreePtr;
22080    type Green = ParenthesizedTokenTreeGreen;
22081    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
22082        ParenthesizedTokenTreeGreen(
22083            Arc::new(GreenNode {
22084                kind: SyntaxKind::ParenthesizedTokenTree,
22085                details: GreenNodeDetails::Node {
22086                    children: [
22087                        TerminalLParen::missing(db).0,
22088                        TokenList::missing(db).0,
22089                        TerminalRParen::missing(db).0,
22090                    ]
22091                    .into(),
22092                    width: TextWidth::default(),
22093                },
22094            })
22095            .intern(db),
22096        )
22097    }
22098    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
22099        let kind = node.kind(db);
22100        assert_eq!(
22101            kind,
22102            SyntaxKind::ParenthesizedTokenTree,
22103            "Unexpected SyntaxKind {:?}. Expected {:?}.",
22104            kind,
22105            SyntaxKind::ParenthesizedTokenTree
22106        );
22107        Self { node }
22108    }
22109    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
22110        let kind = node.kind(db);
22111        if kind == SyntaxKind::ParenthesizedTokenTree {
22112            Some(Self::from_syntax_node(db, node))
22113        } else {
22114            None
22115        }
22116    }
22117    fn as_syntax_node(&self) -> SyntaxNode {
22118        self.node
22119    }
22120    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
22121        ParenthesizedTokenTreePtr(self.node.stable_ptr(db))
22122    }
22123}
22124#[derive(Clone, Debug, Eq, Hash, PartialEq)]
22125pub struct BracedTokenTree {
22126    node: SyntaxNode,
22127}
22128impl BracedTokenTree {
22129    pub const INDEX_LBRACE: usize = 0;
22130    pub const INDEX_TOKENS: usize = 1;
22131    pub const INDEX_RBRACE: usize = 2;
22132    pub fn new_green(
22133        db: &dyn SyntaxGroup,
22134        lbrace: TerminalLBraceGreen,
22135        tokens: TokenListGreen,
22136        rbrace: TerminalRBraceGreen,
22137    ) -> BracedTokenTreeGreen {
22138        let children = [lbrace.0, tokens.0, rbrace.0];
22139        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
22140        BracedTokenTreeGreen(
22141            Arc::new(GreenNode {
22142                kind: SyntaxKind::BracedTokenTree,
22143                details: GreenNodeDetails::Node { children: children.into(), width },
22144            })
22145            .intern(db),
22146        )
22147    }
22148}
22149impl BracedTokenTree {
22150    pub fn lbrace(&self, db: &dyn SyntaxGroup) -> TerminalLBrace {
22151        TerminalLBrace::from_syntax_node(db, self.node.get_children(db)[0])
22152    }
22153    pub fn tokens(&self, db: &dyn SyntaxGroup) -> TokenList {
22154        TokenList::from_syntax_node(db, self.node.get_children(db)[1])
22155    }
22156    pub fn rbrace(&self, db: &dyn SyntaxGroup) -> TerminalRBrace {
22157        TerminalRBrace::from_syntax_node(db, self.node.get_children(db)[2])
22158    }
22159}
22160#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
22161pub struct BracedTokenTreePtr(pub SyntaxStablePtrId);
22162impl BracedTokenTreePtr {}
22163impl TypedStablePtr for BracedTokenTreePtr {
22164    type SyntaxNode = BracedTokenTree;
22165    fn untyped(&self) -> SyntaxStablePtrId {
22166        self.0
22167    }
22168    fn lookup(&self, db: &dyn SyntaxGroup) -> BracedTokenTree {
22169        BracedTokenTree::from_syntax_node(db, self.0.lookup(db))
22170    }
22171}
22172impl From<BracedTokenTreePtr> for SyntaxStablePtrId {
22173    fn from(ptr: BracedTokenTreePtr) -> Self {
22174        ptr.untyped()
22175    }
22176}
22177#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
22178pub struct BracedTokenTreeGreen(pub GreenId);
22179impl TypedSyntaxNode for BracedTokenTree {
22180    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::BracedTokenTree);
22181    type StablePtr = BracedTokenTreePtr;
22182    type Green = BracedTokenTreeGreen;
22183    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
22184        BracedTokenTreeGreen(
22185            Arc::new(GreenNode {
22186                kind: SyntaxKind::BracedTokenTree,
22187                details: GreenNodeDetails::Node {
22188                    children: [
22189                        TerminalLBrace::missing(db).0,
22190                        TokenList::missing(db).0,
22191                        TerminalRBrace::missing(db).0,
22192                    ]
22193                    .into(),
22194                    width: TextWidth::default(),
22195                },
22196            })
22197            .intern(db),
22198        )
22199    }
22200    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
22201        let kind = node.kind(db);
22202        assert_eq!(
22203            kind,
22204            SyntaxKind::BracedTokenTree,
22205            "Unexpected SyntaxKind {:?}. Expected {:?}.",
22206            kind,
22207            SyntaxKind::BracedTokenTree
22208        );
22209        Self { node }
22210    }
22211    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
22212        let kind = node.kind(db);
22213        if kind == SyntaxKind::BracedTokenTree {
22214            Some(Self::from_syntax_node(db, node))
22215        } else {
22216            None
22217        }
22218    }
22219    fn as_syntax_node(&self) -> SyntaxNode {
22220        self.node
22221    }
22222    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
22223        BracedTokenTreePtr(self.node.stable_ptr(db))
22224    }
22225}
22226#[derive(Clone, Debug, Eq, Hash, PartialEq)]
22227pub struct BracketedTokenTree {
22228    node: SyntaxNode,
22229}
22230impl BracketedTokenTree {
22231    pub const INDEX_LBRACK: usize = 0;
22232    pub const INDEX_TOKENS: usize = 1;
22233    pub const INDEX_RBRACK: usize = 2;
22234    pub fn new_green(
22235        db: &dyn SyntaxGroup,
22236        lbrack: TerminalLBrackGreen,
22237        tokens: TokenListGreen,
22238        rbrack: TerminalRBrackGreen,
22239    ) -> BracketedTokenTreeGreen {
22240        let children = [lbrack.0, tokens.0, rbrack.0];
22241        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
22242        BracketedTokenTreeGreen(
22243            Arc::new(GreenNode {
22244                kind: SyntaxKind::BracketedTokenTree,
22245                details: GreenNodeDetails::Node { children: children.into(), width },
22246            })
22247            .intern(db),
22248        )
22249    }
22250}
22251impl BracketedTokenTree {
22252    pub fn lbrack(&self, db: &dyn SyntaxGroup) -> TerminalLBrack {
22253        TerminalLBrack::from_syntax_node(db, self.node.get_children(db)[0])
22254    }
22255    pub fn tokens(&self, db: &dyn SyntaxGroup) -> TokenList {
22256        TokenList::from_syntax_node(db, self.node.get_children(db)[1])
22257    }
22258    pub fn rbrack(&self, db: &dyn SyntaxGroup) -> TerminalRBrack {
22259        TerminalRBrack::from_syntax_node(db, self.node.get_children(db)[2])
22260    }
22261}
22262#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
22263pub struct BracketedTokenTreePtr(pub SyntaxStablePtrId);
22264impl BracketedTokenTreePtr {}
22265impl TypedStablePtr for BracketedTokenTreePtr {
22266    type SyntaxNode = BracketedTokenTree;
22267    fn untyped(&self) -> SyntaxStablePtrId {
22268        self.0
22269    }
22270    fn lookup(&self, db: &dyn SyntaxGroup) -> BracketedTokenTree {
22271        BracketedTokenTree::from_syntax_node(db, self.0.lookup(db))
22272    }
22273}
22274impl From<BracketedTokenTreePtr> for SyntaxStablePtrId {
22275    fn from(ptr: BracketedTokenTreePtr) -> Self {
22276        ptr.untyped()
22277    }
22278}
22279#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
22280pub struct BracketedTokenTreeGreen(pub GreenId);
22281impl TypedSyntaxNode for BracketedTokenTree {
22282    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::BracketedTokenTree);
22283    type StablePtr = BracketedTokenTreePtr;
22284    type Green = BracketedTokenTreeGreen;
22285    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
22286        BracketedTokenTreeGreen(
22287            Arc::new(GreenNode {
22288                kind: SyntaxKind::BracketedTokenTree,
22289                details: GreenNodeDetails::Node {
22290                    children: [
22291                        TerminalLBrack::missing(db).0,
22292                        TokenList::missing(db).0,
22293                        TerminalRBrack::missing(db).0,
22294                    ]
22295                    .into(),
22296                    width: TextWidth::default(),
22297                },
22298            })
22299            .intern(db),
22300        )
22301    }
22302    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
22303        let kind = node.kind(db);
22304        assert_eq!(
22305            kind,
22306            SyntaxKind::BracketedTokenTree,
22307            "Unexpected SyntaxKind {:?}. Expected {:?}.",
22308            kind,
22309            SyntaxKind::BracketedTokenTree
22310        );
22311        Self { node }
22312    }
22313    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
22314        let kind = node.kind(db);
22315        if kind == SyntaxKind::BracketedTokenTree {
22316            Some(Self::from_syntax_node(db, node))
22317        } else {
22318            None
22319        }
22320    }
22321    fn as_syntax_node(&self) -> SyntaxNode {
22322        self.node
22323    }
22324    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
22325        BracketedTokenTreePtr(self.node.stable_ptr(db))
22326    }
22327}
22328#[derive(Clone, Debug, Eq, Hash, PartialEq)]
22329pub struct ExprInlineMacro {
22330    node: SyntaxNode,
22331}
22332impl ExprInlineMacro {
22333    pub const INDEX_PATH: usize = 0;
22334    pub const INDEX_BANG: usize = 1;
22335    pub const INDEX_ARGUMENTS: usize = 2;
22336    pub fn new_green(
22337        db: &dyn SyntaxGroup,
22338        path: ExprPathGreen,
22339        bang: TerminalNotGreen,
22340        arguments: TokenTreeNodeGreen,
22341    ) -> ExprInlineMacroGreen {
22342        let children = [path.0, bang.0, arguments.0];
22343        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
22344        ExprInlineMacroGreen(
22345            Arc::new(GreenNode {
22346                kind: SyntaxKind::ExprInlineMacro,
22347                details: GreenNodeDetails::Node { children: children.into(), width },
22348            })
22349            .intern(db),
22350        )
22351    }
22352}
22353impl ExprInlineMacro {
22354    pub fn path(&self, db: &dyn SyntaxGroup) -> ExprPath {
22355        ExprPath::from_syntax_node(db, self.node.get_children(db)[0])
22356    }
22357    pub fn bang(&self, db: &dyn SyntaxGroup) -> TerminalNot {
22358        TerminalNot::from_syntax_node(db, self.node.get_children(db)[1])
22359    }
22360    pub fn arguments(&self, db: &dyn SyntaxGroup) -> TokenTreeNode {
22361        TokenTreeNode::from_syntax_node(db, self.node.get_children(db)[2])
22362    }
22363}
22364#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
22365pub struct ExprInlineMacroPtr(pub SyntaxStablePtrId);
22366impl ExprInlineMacroPtr {}
22367impl TypedStablePtr for ExprInlineMacroPtr {
22368    type SyntaxNode = ExprInlineMacro;
22369    fn untyped(&self) -> SyntaxStablePtrId {
22370        self.0
22371    }
22372    fn lookup(&self, db: &dyn SyntaxGroup) -> ExprInlineMacro {
22373        ExprInlineMacro::from_syntax_node(db, self.0.lookup(db))
22374    }
22375}
22376impl From<ExprInlineMacroPtr> for SyntaxStablePtrId {
22377    fn from(ptr: ExprInlineMacroPtr) -> Self {
22378        ptr.untyped()
22379    }
22380}
22381#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
22382pub struct ExprInlineMacroGreen(pub GreenId);
22383impl TypedSyntaxNode for ExprInlineMacro {
22384    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprInlineMacro);
22385    type StablePtr = ExprInlineMacroPtr;
22386    type Green = ExprInlineMacroGreen;
22387    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
22388        ExprInlineMacroGreen(
22389            Arc::new(GreenNode {
22390                kind: SyntaxKind::ExprInlineMacro,
22391                details: GreenNodeDetails::Node {
22392                    children: [
22393                        ExprPath::missing(db).0,
22394                        TerminalNot::missing(db).0,
22395                        TokenTreeNode::missing(db).0,
22396                    ]
22397                    .into(),
22398                    width: TextWidth::default(),
22399                },
22400            })
22401            .intern(db),
22402        )
22403    }
22404    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
22405        let kind = node.kind(db);
22406        assert_eq!(
22407            kind,
22408            SyntaxKind::ExprInlineMacro,
22409            "Unexpected SyntaxKind {:?}. Expected {:?}.",
22410            kind,
22411            SyntaxKind::ExprInlineMacro
22412        );
22413        Self { node }
22414    }
22415    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
22416        let kind = node.kind(db);
22417        if kind == SyntaxKind::ExprInlineMacro {
22418            Some(Self::from_syntax_node(db, node))
22419        } else {
22420            None
22421        }
22422    }
22423    fn as_syntax_node(&self) -> SyntaxNode {
22424        self.node
22425    }
22426    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
22427        ExprInlineMacroPtr(self.node.stable_ptr(db))
22428    }
22429}
22430#[derive(Clone, Debug, Eq, Hash, PartialEq)]
22431pub struct ItemInlineMacro {
22432    node: SyntaxNode,
22433}
22434impl ItemInlineMacro {
22435    pub const INDEX_ATTRIBUTES: usize = 0;
22436    pub const INDEX_PATH: usize = 1;
22437    pub const INDEX_BANG: usize = 2;
22438    pub const INDEX_ARGUMENTS: usize = 3;
22439    pub const INDEX_SEMICOLON: usize = 4;
22440    pub fn new_green(
22441        db: &dyn SyntaxGroup,
22442        attributes: AttributeListGreen,
22443        path: ExprPathGreen,
22444        bang: TerminalNotGreen,
22445        arguments: TokenTreeNodeGreen,
22446        semicolon: TerminalSemicolonGreen,
22447    ) -> ItemInlineMacroGreen {
22448        let children = [attributes.0, path.0, bang.0, arguments.0, semicolon.0];
22449        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
22450        ItemInlineMacroGreen(
22451            Arc::new(GreenNode {
22452                kind: SyntaxKind::ItemInlineMacro,
22453                details: GreenNodeDetails::Node { children: children.into(), width },
22454            })
22455            .intern(db),
22456        )
22457    }
22458}
22459impl ItemInlineMacro {
22460    pub fn attributes(&self, db: &dyn SyntaxGroup) -> AttributeList {
22461        AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
22462    }
22463    pub fn path(&self, db: &dyn SyntaxGroup) -> ExprPath {
22464        ExprPath::from_syntax_node(db, self.node.get_children(db)[1])
22465    }
22466    pub fn bang(&self, db: &dyn SyntaxGroup) -> TerminalNot {
22467        TerminalNot::from_syntax_node(db, self.node.get_children(db)[2])
22468    }
22469    pub fn arguments(&self, db: &dyn SyntaxGroup) -> TokenTreeNode {
22470        TokenTreeNode::from_syntax_node(db, self.node.get_children(db)[3])
22471    }
22472    pub fn semicolon(&self, db: &dyn SyntaxGroup) -> TerminalSemicolon {
22473        TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[4])
22474    }
22475}
22476#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
22477pub struct ItemInlineMacroPtr(pub SyntaxStablePtrId);
22478impl ItemInlineMacroPtr {}
22479impl TypedStablePtr for ItemInlineMacroPtr {
22480    type SyntaxNode = ItemInlineMacro;
22481    fn untyped(&self) -> SyntaxStablePtrId {
22482        self.0
22483    }
22484    fn lookup(&self, db: &dyn SyntaxGroup) -> ItemInlineMacro {
22485        ItemInlineMacro::from_syntax_node(db, self.0.lookup(db))
22486    }
22487}
22488impl From<ItemInlineMacroPtr> for SyntaxStablePtrId {
22489    fn from(ptr: ItemInlineMacroPtr) -> Self {
22490        ptr.untyped()
22491    }
22492}
22493#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
22494pub struct ItemInlineMacroGreen(pub GreenId);
22495impl TypedSyntaxNode for ItemInlineMacro {
22496    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemInlineMacro);
22497    type StablePtr = ItemInlineMacroPtr;
22498    type Green = ItemInlineMacroGreen;
22499    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
22500        ItemInlineMacroGreen(
22501            Arc::new(GreenNode {
22502                kind: SyntaxKind::ItemInlineMacro,
22503                details: GreenNodeDetails::Node {
22504                    children: [
22505                        AttributeList::missing(db).0,
22506                        ExprPath::missing(db).0,
22507                        TerminalNot::missing(db).0,
22508                        TokenTreeNode::missing(db).0,
22509                        TerminalSemicolon::missing(db).0,
22510                    ]
22511                    .into(),
22512                    width: TextWidth::default(),
22513                },
22514            })
22515            .intern(db),
22516        )
22517    }
22518    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
22519        let kind = node.kind(db);
22520        assert_eq!(
22521            kind,
22522            SyntaxKind::ItemInlineMacro,
22523            "Unexpected SyntaxKind {:?}. Expected {:?}.",
22524            kind,
22525            SyntaxKind::ItemInlineMacro
22526        );
22527        Self { node }
22528    }
22529    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
22530        let kind = node.kind(db);
22531        if kind == SyntaxKind::ItemInlineMacro {
22532            Some(Self::from_syntax_node(db, node))
22533        } else {
22534            None
22535        }
22536    }
22537    fn as_syntax_node(&self) -> SyntaxNode {
22538        self.node
22539    }
22540    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
22541        ItemInlineMacroPtr(self.node.stable_ptr(db))
22542    }
22543}
22544#[derive(Clone, Debug, Eq, Hash, PartialEq)]
22545pub struct ItemMacroDeclaration {
22546    node: SyntaxNode,
22547}
22548impl ItemMacroDeclaration {
22549    pub const INDEX_ATTRIBUTES: usize = 0;
22550    pub const INDEX_VISIBILITY: usize = 1;
22551    pub const INDEX_MACRO_KW: usize = 2;
22552    pub const INDEX_NAME: usize = 3;
22553    pub const INDEX_LBRACE: usize = 4;
22554    pub const INDEX_RULES: usize = 5;
22555    pub const INDEX_RBRACE: usize = 6;
22556    pub fn new_green(
22557        db: &dyn SyntaxGroup,
22558        attributes: AttributeListGreen,
22559        visibility: VisibilityGreen,
22560        macro_kw: TerminalMacroGreen,
22561        name: TerminalIdentifierGreen,
22562        lbrace: TerminalLBraceGreen,
22563        rules: MacroRulesListGreen,
22564        rbrace: TerminalRBraceGreen,
22565    ) -> ItemMacroDeclarationGreen {
22566        let children =
22567            [attributes.0, visibility.0, macro_kw.0, name.0, lbrace.0, rules.0, rbrace.0];
22568        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
22569        ItemMacroDeclarationGreen(
22570            Arc::new(GreenNode {
22571                kind: SyntaxKind::ItemMacroDeclaration,
22572                details: GreenNodeDetails::Node { children: children.into(), width },
22573            })
22574            .intern(db),
22575        )
22576    }
22577}
22578impl ItemMacroDeclaration {
22579    pub fn attributes(&self, db: &dyn SyntaxGroup) -> AttributeList {
22580        AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
22581    }
22582    pub fn visibility(&self, db: &dyn SyntaxGroup) -> Visibility {
22583        Visibility::from_syntax_node(db, self.node.get_children(db)[1])
22584    }
22585    pub fn macro_kw(&self, db: &dyn SyntaxGroup) -> TerminalMacro {
22586        TerminalMacro::from_syntax_node(db, self.node.get_children(db)[2])
22587    }
22588    pub fn name(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier {
22589        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[3])
22590    }
22591    pub fn lbrace(&self, db: &dyn SyntaxGroup) -> TerminalLBrace {
22592        TerminalLBrace::from_syntax_node(db, self.node.get_children(db)[4])
22593    }
22594    pub fn rules(&self, db: &dyn SyntaxGroup) -> MacroRulesList {
22595        MacroRulesList::from_syntax_node(db, self.node.get_children(db)[5])
22596    }
22597    pub fn rbrace(&self, db: &dyn SyntaxGroup) -> TerminalRBrace {
22598        TerminalRBrace::from_syntax_node(db, self.node.get_children(db)[6])
22599    }
22600}
22601#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
22602pub struct ItemMacroDeclarationPtr(pub SyntaxStablePtrId);
22603impl ItemMacroDeclarationPtr {
22604    pub fn name_green(self, db: &dyn SyntaxGroup) -> TerminalIdentifierGreen {
22605        let ptr = self.0.lookup_intern(db);
22606        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
22607            TerminalIdentifierGreen(key_fields[0])
22608        } else {
22609            panic!("Unexpected key field query on root.");
22610        }
22611    }
22612}
22613impl TypedStablePtr for ItemMacroDeclarationPtr {
22614    type SyntaxNode = ItemMacroDeclaration;
22615    fn untyped(&self) -> SyntaxStablePtrId {
22616        self.0
22617    }
22618    fn lookup(&self, db: &dyn SyntaxGroup) -> ItemMacroDeclaration {
22619        ItemMacroDeclaration::from_syntax_node(db, self.0.lookup(db))
22620    }
22621}
22622impl From<ItemMacroDeclarationPtr> for SyntaxStablePtrId {
22623    fn from(ptr: ItemMacroDeclarationPtr) -> Self {
22624        ptr.untyped()
22625    }
22626}
22627#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
22628pub struct ItemMacroDeclarationGreen(pub GreenId);
22629impl TypedSyntaxNode for ItemMacroDeclaration {
22630    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemMacroDeclaration);
22631    type StablePtr = ItemMacroDeclarationPtr;
22632    type Green = ItemMacroDeclarationGreen;
22633    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
22634        ItemMacroDeclarationGreen(
22635            Arc::new(GreenNode {
22636                kind: SyntaxKind::ItemMacroDeclaration,
22637                details: GreenNodeDetails::Node {
22638                    children: [
22639                        AttributeList::missing(db).0,
22640                        Visibility::missing(db).0,
22641                        TerminalMacro::missing(db).0,
22642                        TerminalIdentifier::missing(db).0,
22643                        TerminalLBrace::missing(db).0,
22644                        MacroRulesList::missing(db).0,
22645                        TerminalRBrace::missing(db).0,
22646                    ]
22647                    .into(),
22648                    width: TextWidth::default(),
22649                },
22650            })
22651            .intern(db),
22652        )
22653    }
22654    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
22655        let kind = node.kind(db);
22656        assert_eq!(
22657            kind,
22658            SyntaxKind::ItemMacroDeclaration,
22659            "Unexpected SyntaxKind {:?}. Expected {:?}.",
22660            kind,
22661            SyntaxKind::ItemMacroDeclaration
22662        );
22663        Self { node }
22664    }
22665    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
22666        let kind = node.kind(db);
22667        if kind == SyntaxKind::ItemMacroDeclaration {
22668            Some(Self::from_syntax_node(db, node))
22669        } else {
22670            None
22671        }
22672    }
22673    fn as_syntax_node(&self) -> SyntaxNode {
22674        self.node
22675    }
22676    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
22677        ItemMacroDeclarationPtr(self.node.stable_ptr(db))
22678    }
22679}
22680#[derive(Clone, Debug, Eq, Hash, PartialEq)]
22681pub struct MacroRulesList(ElementList<MacroRule, 1>);
22682impl Deref for MacroRulesList {
22683    type Target = ElementList<MacroRule, 1>;
22684    fn deref(&self) -> &Self::Target {
22685        &self.0
22686    }
22687}
22688impl MacroRulesList {
22689    pub fn new_green(db: &dyn SyntaxGroup, children: &[MacroRuleGreen]) -> MacroRulesListGreen {
22690        let width = children.iter().map(|id| id.0.lookup_intern(db).width()).sum();
22691        MacroRulesListGreen(
22692            Arc::new(GreenNode {
22693                kind: SyntaxKind::MacroRulesList,
22694                details: GreenNodeDetails::Node {
22695                    children: children.iter().map(|x| x.0).collect(),
22696                    width,
22697                },
22698            })
22699            .intern(db),
22700        )
22701    }
22702}
22703#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
22704pub struct MacroRulesListPtr(pub SyntaxStablePtrId);
22705impl TypedStablePtr for MacroRulesListPtr {
22706    type SyntaxNode = MacroRulesList;
22707    fn untyped(&self) -> SyntaxStablePtrId {
22708        self.0
22709    }
22710    fn lookup(&self, db: &dyn SyntaxGroup) -> MacroRulesList {
22711        MacroRulesList::from_syntax_node(db, self.0.lookup(db))
22712    }
22713}
22714impl From<MacroRulesListPtr> for SyntaxStablePtrId {
22715    fn from(ptr: MacroRulesListPtr) -> Self {
22716        ptr.untyped()
22717    }
22718}
22719#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
22720pub struct MacroRulesListGreen(pub GreenId);
22721impl TypedSyntaxNode for MacroRulesList {
22722    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::MacroRulesList);
22723    type StablePtr = MacroRulesListPtr;
22724    type Green = MacroRulesListGreen;
22725    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
22726        MacroRulesListGreen(
22727            Arc::new(GreenNode {
22728                kind: SyntaxKind::MacroRulesList,
22729                details: GreenNodeDetails::Node {
22730                    children: [].into(),
22731                    width: TextWidth::default(),
22732                },
22733            })
22734            .intern(db),
22735        )
22736    }
22737    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
22738        Self(ElementList::new(node))
22739    }
22740    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
22741        if node.kind(db) == SyntaxKind::MacroRulesList {
22742            Some(Self(ElementList::new(node)))
22743        } else {
22744            None
22745        }
22746    }
22747    fn as_syntax_node(&self) -> SyntaxNode {
22748        self.node
22749    }
22750    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
22751        MacroRulesListPtr(self.node.stable_ptr(db))
22752    }
22753}
22754#[derive(Clone, Debug, Eq, Hash, PartialEq)]
22755pub struct MacroRule {
22756    node: SyntaxNode,
22757}
22758impl MacroRule {
22759    pub const INDEX_LHS: usize = 0;
22760    pub const INDEX_FAT_ARROW: usize = 1;
22761    pub const INDEX_RHS: usize = 2;
22762    pub const INDEX_SEMICOLON: usize = 3;
22763    pub fn new_green(
22764        db: &dyn SyntaxGroup,
22765        lhs: WrappedMacroGreen,
22766        fat_arrow: TerminalMatchArrowGreen,
22767        rhs: BracedMacroGreen,
22768        semicolon: TerminalSemicolonGreen,
22769    ) -> MacroRuleGreen {
22770        let children = [lhs.0, fat_arrow.0, rhs.0, semicolon.0];
22771        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
22772        MacroRuleGreen(
22773            Arc::new(GreenNode {
22774                kind: SyntaxKind::MacroRule,
22775                details: GreenNodeDetails::Node { children: children.into(), width },
22776            })
22777            .intern(db),
22778        )
22779    }
22780}
22781impl MacroRule {
22782    pub fn lhs(&self, db: &dyn SyntaxGroup) -> WrappedMacro {
22783        WrappedMacro::from_syntax_node(db, self.node.get_children(db)[0])
22784    }
22785    pub fn fat_arrow(&self, db: &dyn SyntaxGroup) -> TerminalMatchArrow {
22786        TerminalMatchArrow::from_syntax_node(db, self.node.get_children(db)[1])
22787    }
22788    pub fn rhs(&self, db: &dyn SyntaxGroup) -> BracedMacro {
22789        BracedMacro::from_syntax_node(db, self.node.get_children(db)[2])
22790    }
22791    pub fn semicolon(&self, db: &dyn SyntaxGroup) -> TerminalSemicolon {
22792        TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[3])
22793    }
22794}
22795#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
22796pub struct MacroRulePtr(pub SyntaxStablePtrId);
22797impl MacroRulePtr {}
22798impl TypedStablePtr for MacroRulePtr {
22799    type SyntaxNode = MacroRule;
22800    fn untyped(&self) -> SyntaxStablePtrId {
22801        self.0
22802    }
22803    fn lookup(&self, db: &dyn SyntaxGroup) -> MacroRule {
22804        MacroRule::from_syntax_node(db, self.0.lookup(db))
22805    }
22806}
22807impl From<MacroRulePtr> for SyntaxStablePtrId {
22808    fn from(ptr: MacroRulePtr) -> Self {
22809        ptr.untyped()
22810    }
22811}
22812#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
22813pub struct MacroRuleGreen(pub GreenId);
22814impl TypedSyntaxNode for MacroRule {
22815    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::MacroRule);
22816    type StablePtr = MacroRulePtr;
22817    type Green = MacroRuleGreen;
22818    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
22819        MacroRuleGreen(
22820            Arc::new(GreenNode {
22821                kind: SyntaxKind::MacroRule,
22822                details: GreenNodeDetails::Node {
22823                    children: [
22824                        WrappedMacro::missing(db).0,
22825                        TerminalMatchArrow::missing(db).0,
22826                        BracedMacro::missing(db).0,
22827                        TerminalSemicolon::missing(db).0,
22828                    ]
22829                    .into(),
22830                    width: TextWidth::default(),
22831                },
22832            })
22833            .intern(db),
22834        )
22835    }
22836    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
22837        let kind = node.kind(db);
22838        assert_eq!(
22839            kind,
22840            SyntaxKind::MacroRule,
22841            "Unexpected SyntaxKind {:?}. Expected {:?}.",
22842            kind,
22843            SyntaxKind::MacroRule
22844        );
22845        Self { node }
22846    }
22847    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
22848        let kind = node.kind(db);
22849        if kind == SyntaxKind::MacroRule { Some(Self::from_syntax_node(db, node)) } else { None }
22850    }
22851    fn as_syntax_node(&self) -> SyntaxNode {
22852        self.node
22853    }
22854    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
22855        MacroRulePtr(self.node.stable_ptr(db))
22856    }
22857}
22858#[derive(Clone, Debug, Eq, Hash, PartialEq)]
22859pub struct ParamKind {
22860    node: SyntaxNode,
22861}
22862impl ParamKind {
22863    pub const INDEX_COLON: usize = 0;
22864    pub const INDEX_KIND: usize = 1;
22865    pub fn new_green(
22866        db: &dyn SyntaxGroup,
22867        colon: TerminalColonGreen,
22868        kind: MacroParamKindGreen,
22869    ) -> ParamKindGreen {
22870        let children = [colon.0, kind.0];
22871        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
22872        ParamKindGreen(
22873            Arc::new(GreenNode {
22874                kind: SyntaxKind::ParamKind,
22875                details: GreenNodeDetails::Node { children: children.into(), width },
22876            })
22877            .intern(db),
22878        )
22879    }
22880}
22881impl ParamKind {
22882    pub fn colon(&self, db: &dyn SyntaxGroup) -> TerminalColon {
22883        TerminalColon::from_syntax_node(db, self.node.get_children(db)[0])
22884    }
22885    pub fn kind(&self, db: &dyn SyntaxGroup) -> MacroParamKind {
22886        MacroParamKind::from_syntax_node(db, self.node.get_children(db)[1])
22887    }
22888}
22889#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
22890pub struct ParamKindPtr(pub SyntaxStablePtrId);
22891impl ParamKindPtr {}
22892impl TypedStablePtr for ParamKindPtr {
22893    type SyntaxNode = ParamKind;
22894    fn untyped(&self) -> SyntaxStablePtrId {
22895        self.0
22896    }
22897    fn lookup(&self, db: &dyn SyntaxGroup) -> ParamKind {
22898        ParamKind::from_syntax_node(db, self.0.lookup(db))
22899    }
22900}
22901impl From<ParamKindPtr> for SyntaxStablePtrId {
22902    fn from(ptr: ParamKindPtr) -> Self {
22903        ptr.untyped()
22904    }
22905}
22906#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
22907pub struct ParamKindGreen(pub GreenId);
22908impl TypedSyntaxNode for ParamKind {
22909    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ParamKind);
22910    type StablePtr = ParamKindPtr;
22911    type Green = ParamKindGreen;
22912    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
22913        ParamKindGreen(
22914            Arc::new(GreenNode {
22915                kind: SyntaxKind::ParamKind,
22916                details: GreenNodeDetails::Node {
22917                    children: [TerminalColon::missing(db).0, MacroParamKind::missing(db).0].into(),
22918                    width: TextWidth::default(),
22919                },
22920            })
22921            .intern(db),
22922        )
22923    }
22924    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
22925        let kind = node.kind(db);
22926        assert_eq!(
22927            kind,
22928            SyntaxKind::ParamKind,
22929            "Unexpected SyntaxKind {:?}. Expected {:?}.",
22930            kind,
22931            SyntaxKind::ParamKind
22932        );
22933        Self { node }
22934    }
22935    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
22936        let kind = node.kind(db);
22937        if kind == SyntaxKind::ParamKind { Some(Self::from_syntax_node(db, node)) } else { None }
22938    }
22939    fn as_syntax_node(&self) -> SyntaxNode {
22940        self.node
22941    }
22942    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
22943        ParamKindPtr(self.node.stable_ptr(db))
22944    }
22945}
22946#[derive(Clone, Debug, Eq, Hash, PartialEq)]
22947pub enum OptionParamKind {
22948    Empty(OptionParamKindEmpty),
22949    ParamKind(ParamKind),
22950}
22951#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
22952pub struct OptionParamKindPtr(pub SyntaxStablePtrId);
22953impl TypedStablePtr for OptionParamKindPtr {
22954    type SyntaxNode = OptionParamKind;
22955    fn untyped(&self) -> SyntaxStablePtrId {
22956        self.0
22957    }
22958    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionParamKind {
22959        OptionParamKind::from_syntax_node(db, self.0.lookup(db))
22960    }
22961}
22962impl From<OptionParamKindPtr> for SyntaxStablePtrId {
22963    fn from(ptr: OptionParamKindPtr) -> Self {
22964        ptr.untyped()
22965    }
22966}
22967impl From<OptionParamKindEmptyPtr> for OptionParamKindPtr {
22968    fn from(value: OptionParamKindEmptyPtr) -> Self {
22969        Self(value.0)
22970    }
22971}
22972impl From<ParamKindPtr> for OptionParamKindPtr {
22973    fn from(value: ParamKindPtr) -> Self {
22974        Self(value.0)
22975    }
22976}
22977impl From<OptionParamKindEmptyGreen> for OptionParamKindGreen {
22978    fn from(value: OptionParamKindEmptyGreen) -> Self {
22979        Self(value.0)
22980    }
22981}
22982impl From<ParamKindGreen> for OptionParamKindGreen {
22983    fn from(value: ParamKindGreen) -> Self {
22984        Self(value.0)
22985    }
22986}
22987#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
22988pub struct OptionParamKindGreen(pub GreenId);
22989impl TypedSyntaxNode for OptionParamKind {
22990    const OPTIONAL_KIND: Option<SyntaxKind> = None;
22991    type StablePtr = OptionParamKindPtr;
22992    type Green = OptionParamKindGreen;
22993    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
22994        panic!("No missing variant.");
22995    }
22996    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
22997        let kind = node.kind(db);
22998        match kind {
22999            SyntaxKind::OptionParamKindEmpty => {
23000                OptionParamKind::Empty(OptionParamKindEmpty::from_syntax_node(db, node))
23001            }
23002            SyntaxKind::ParamKind => {
23003                OptionParamKind::ParamKind(ParamKind::from_syntax_node(db, node))
23004            }
23005            _ => {
23006                panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "OptionParamKind")
23007            }
23008        }
23009    }
23010    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
23011        let kind = node.kind(db);
23012        match kind {
23013            SyntaxKind::OptionParamKindEmpty => {
23014                Some(OptionParamKind::Empty(OptionParamKindEmpty::from_syntax_node(db, node)))
23015            }
23016            SyntaxKind::ParamKind => {
23017                Some(OptionParamKind::ParamKind(ParamKind::from_syntax_node(db, node)))
23018            }
23019            _ => None,
23020        }
23021    }
23022    fn as_syntax_node(&self) -> SyntaxNode {
23023        match self {
23024            OptionParamKind::Empty(x) => x.as_syntax_node(),
23025            OptionParamKind::ParamKind(x) => x.as_syntax_node(),
23026        }
23027    }
23028    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
23029        OptionParamKindPtr(self.as_syntax_node().lookup_intern(db).stable_ptr)
23030    }
23031}
23032impl OptionParamKind {
23033    /// Checks if a kind of a variant of [OptionParamKind].
23034    pub fn is_variant(kind: SyntaxKind) -> bool {
23035        matches!(kind, SyntaxKind::OptionParamKindEmpty | SyntaxKind::ParamKind)
23036    }
23037}
23038#[derive(Clone, Debug, Eq, Hash, PartialEq)]
23039pub struct OptionParamKindEmpty {
23040    node: SyntaxNode,
23041}
23042impl OptionParamKindEmpty {
23043    pub fn new_green(db: &dyn SyntaxGroup) -> OptionParamKindEmptyGreen {
23044        let children = [];
23045        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
23046        OptionParamKindEmptyGreen(
23047            Arc::new(GreenNode {
23048                kind: SyntaxKind::OptionParamKindEmpty,
23049                details: GreenNodeDetails::Node { children: children.into(), width },
23050            })
23051            .intern(db),
23052        )
23053    }
23054}
23055impl OptionParamKindEmpty {}
23056#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
23057pub struct OptionParamKindEmptyPtr(pub SyntaxStablePtrId);
23058impl OptionParamKindEmptyPtr {}
23059impl TypedStablePtr for OptionParamKindEmptyPtr {
23060    type SyntaxNode = OptionParamKindEmpty;
23061    fn untyped(&self) -> SyntaxStablePtrId {
23062        self.0
23063    }
23064    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionParamKindEmpty {
23065        OptionParamKindEmpty::from_syntax_node(db, self.0.lookup(db))
23066    }
23067}
23068impl From<OptionParamKindEmptyPtr> for SyntaxStablePtrId {
23069    fn from(ptr: OptionParamKindEmptyPtr) -> Self {
23070        ptr.untyped()
23071    }
23072}
23073#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
23074pub struct OptionParamKindEmptyGreen(pub GreenId);
23075impl TypedSyntaxNode for OptionParamKindEmpty {
23076    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionParamKindEmpty);
23077    type StablePtr = OptionParamKindEmptyPtr;
23078    type Green = OptionParamKindEmptyGreen;
23079    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
23080        OptionParamKindEmptyGreen(
23081            Arc::new(GreenNode {
23082                kind: SyntaxKind::OptionParamKindEmpty,
23083                details: GreenNodeDetails::Node {
23084                    children: [].into(),
23085                    width: TextWidth::default(),
23086                },
23087            })
23088            .intern(db),
23089        )
23090    }
23091    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
23092        let kind = node.kind(db);
23093        assert_eq!(
23094            kind,
23095            SyntaxKind::OptionParamKindEmpty,
23096            "Unexpected SyntaxKind {:?}. Expected {:?}.",
23097            kind,
23098            SyntaxKind::OptionParamKindEmpty
23099        );
23100        Self { node }
23101    }
23102    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
23103        let kind = node.kind(db);
23104        if kind == SyntaxKind::OptionParamKindEmpty {
23105            Some(Self::from_syntax_node(db, node))
23106        } else {
23107            None
23108        }
23109    }
23110    fn as_syntax_node(&self) -> SyntaxNode {
23111        self.node
23112    }
23113    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
23114        OptionParamKindEmptyPtr(self.node.stable_ptr(db))
23115    }
23116}
23117#[derive(Clone, Debug, Eq, Hash, PartialEq)]
23118pub struct MacroParam {
23119    node: SyntaxNode,
23120}
23121impl MacroParam {
23122    pub const INDEX_DOLLAR: usize = 0;
23123    pub const INDEX_NAME: usize = 1;
23124    pub const INDEX_KIND: usize = 2;
23125    pub fn new_green(
23126        db: &dyn SyntaxGroup,
23127        dollar: TerminalDollarGreen,
23128        name: TerminalIdentifierGreen,
23129        kind: OptionParamKindGreen,
23130    ) -> MacroParamGreen {
23131        let children = [dollar.0, name.0, kind.0];
23132        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
23133        MacroParamGreen(
23134            Arc::new(GreenNode {
23135                kind: SyntaxKind::MacroParam,
23136                details: GreenNodeDetails::Node { children: children.into(), width },
23137            })
23138            .intern(db),
23139        )
23140    }
23141}
23142impl MacroParam {
23143    pub fn dollar(&self, db: &dyn SyntaxGroup) -> TerminalDollar {
23144        TerminalDollar::from_syntax_node(db, self.node.get_children(db)[0])
23145    }
23146    pub fn name(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier {
23147        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[1])
23148    }
23149    pub fn kind(&self, db: &dyn SyntaxGroup) -> OptionParamKind {
23150        OptionParamKind::from_syntax_node(db, self.node.get_children(db)[2])
23151    }
23152}
23153#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
23154pub struct MacroParamPtr(pub SyntaxStablePtrId);
23155impl MacroParamPtr {}
23156impl TypedStablePtr for MacroParamPtr {
23157    type SyntaxNode = MacroParam;
23158    fn untyped(&self) -> SyntaxStablePtrId {
23159        self.0
23160    }
23161    fn lookup(&self, db: &dyn SyntaxGroup) -> MacroParam {
23162        MacroParam::from_syntax_node(db, self.0.lookup(db))
23163    }
23164}
23165impl From<MacroParamPtr> for SyntaxStablePtrId {
23166    fn from(ptr: MacroParamPtr) -> Self {
23167        ptr.untyped()
23168    }
23169}
23170#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
23171pub struct MacroParamGreen(pub GreenId);
23172impl TypedSyntaxNode for MacroParam {
23173    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::MacroParam);
23174    type StablePtr = MacroParamPtr;
23175    type Green = MacroParamGreen;
23176    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
23177        MacroParamGreen(
23178            Arc::new(GreenNode {
23179                kind: SyntaxKind::MacroParam,
23180                details: GreenNodeDetails::Node {
23181                    children: [
23182                        TerminalDollar::missing(db).0,
23183                        TerminalIdentifier::missing(db).0,
23184                        OptionParamKind::missing(db).0,
23185                    ]
23186                    .into(),
23187                    width: TextWidth::default(),
23188                },
23189            })
23190            .intern(db),
23191        )
23192    }
23193    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
23194        let kind = node.kind(db);
23195        assert_eq!(
23196            kind,
23197            SyntaxKind::MacroParam,
23198            "Unexpected SyntaxKind {:?}. Expected {:?}.",
23199            kind,
23200            SyntaxKind::MacroParam
23201        );
23202        Self { node }
23203    }
23204    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
23205        let kind = node.kind(db);
23206        if kind == SyntaxKind::MacroParam { Some(Self::from_syntax_node(db, node)) } else { None }
23207    }
23208    fn as_syntax_node(&self) -> SyntaxNode {
23209        self.node
23210    }
23211    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
23212        MacroParamPtr(self.node.stable_ptr(db))
23213    }
23214}
23215#[derive(Clone, Debug, Eq, Hash, PartialEq)]
23216pub struct MacroRepetition {
23217    node: SyntaxNode,
23218}
23219impl MacroRepetition {
23220    pub const INDEX_DOLLAR: usize = 0;
23221    pub const INDEX_LPAREN: usize = 1;
23222    pub const INDEX_ELEMENTS: usize = 2;
23223    pub const INDEX_RPAREN: usize = 3;
23224    pub const INDEX_SEPARATOR: usize = 4;
23225    pub const INDEX_OPERATOR: usize = 5;
23226    pub fn new_green(
23227        db: &dyn SyntaxGroup,
23228        dollar: TerminalDollarGreen,
23229        lparen: TerminalLParenGreen,
23230        elements: MacroElementsGreen,
23231        rparen: TerminalRParenGreen,
23232        separator: OptionTerminalCommaGreen,
23233        operator: MacroRepetitionOperatorGreen,
23234    ) -> MacroRepetitionGreen {
23235        let children = [dollar.0, lparen.0, elements.0, rparen.0, separator.0, operator.0];
23236        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
23237        MacroRepetitionGreen(
23238            Arc::new(GreenNode {
23239                kind: SyntaxKind::MacroRepetition,
23240                details: GreenNodeDetails::Node { children: children.into(), width },
23241            })
23242            .intern(db),
23243        )
23244    }
23245}
23246impl MacroRepetition {
23247    pub fn dollar(&self, db: &dyn SyntaxGroup) -> TerminalDollar {
23248        TerminalDollar::from_syntax_node(db, self.node.get_children(db)[0])
23249    }
23250    pub fn lparen(&self, db: &dyn SyntaxGroup) -> TerminalLParen {
23251        TerminalLParen::from_syntax_node(db, self.node.get_children(db)[1])
23252    }
23253    pub fn elements(&self, db: &dyn SyntaxGroup) -> MacroElements {
23254        MacroElements::from_syntax_node(db, self.node.get_children(db)[2])
23255    }
23256    pub fn rparen(&self, db: &dyn SyntaxGroup) -> TerminalRParen {
23257        TerminalRParen::from_syntax_node(db, self.node.get_children(db)[3])
23258    }
23259    pub fn separator(&self, db: &dyn SyntaxGroup) -> OptionTerminalComma {
23260        OptionTerminalComma::from_syntax_node(db, self.node.get_children(db)[4])
23261    }
23262    pub fn operator(&self, db: &dyn SyntaxGroup) -> MacroRepetitionOperator {
23263        MacroRepetitionOperator::from_syntax_node(db, self.node.get_children(db)[5])
23264    }
23265}
23266#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
23267pub struct MacroRepetitionPtr(pub SyntaxStablePtrId);
23268impl MacroRepetitionPtr {}
23269impl TypedStablePtr for MacroRepetitionPtr {
23270    type SyntaxNode = MacroRepetition;
23271    fn untyped(&self) -> SyntaxStablePtrId {
23272        self.0
23273    }
23274    fn lookup(&self, db: &dyn SyntaxGroup) -> MacroRepetition {
23275        MacroRepetition::from_syntax_node(db, self.0.lookup(db))
23276    }
23277}
23278impl From<MacroRepetitionPtr> for SyntaxStablePtrId {
23279    fn from(ptr: MacroRepetitionPtr) -> Self {
23280        ptr.untyped()
23281    }
23282}
23283#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
23284pub struct MacroRepetitionGreen(pub GreenId);
23285impl TypedSyntaxNode for MacroRepetition {
23286    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::MacroRepetition);
23287    type StablePtr = MacroRepetitionPtr;
23288    type Green = MacroRepetitionGreen;
23289    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
23290        MacroRepetitionGreen(
23291            Arc::new(GreenNode {
23292                kind: SyntaxKind::MacroRepetition,
23293                details: GreenNodeDetails::Node {
23294                    children: [
23295                        TerminalDollar::missing(db).0,
23296                        TerminalLParen::missing(db).0,
23297                        MacroElements::missing(db).0,
23298                        TerminalRParen::missing(db).0,
23299                        OptionTerminalComma::missing(db).0,
23300                        MacroRepetitionOperator::missing(db).0,
23301                    ]
23302                    .into(),
23303                    width: TextWidth::default(),
23304                },
23305            })
23306            .intern(db),
23307        )
23308    }
23309    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
23310        let kind = node.kind(db);
23311        assert_eq!(
23312            kind,
23313            SyntaxKind::MacroRepetition,
23314            "Unexpected SyntaxKind {:?}. Expected {:?}.",
23315            kind,
23316            SyntaxKind::MacroRepetition
23317        );
23318        Self { node }
23319    }
23320    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
23321        let kind = node.kind(db);
23322        if kind == SyntaxKind::MacroRepetition {
23323            Some(Self::from_syntax_node(db, node))
23324        } else {
23325            None
23326        }
23327    }
23328    fn as_syntax_node(&self) -> SyntaxNode {
23329        self.node
23330    }
23331    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
23332        MacroRepetitionPtr(self.node.stable_ptr(db))
23333    }
23334}
23335#[derive(Clone, Debug, Eq, Hash, PartialEq)]
23336pub enum OptionTerminalComma {
23337    Empty(OptionTerminalCommaEmpty),
23338    TerminalComma(TerminalComma),
23339}
23340#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
23341pub struct OptionTerminalCommaPtr(pub SyntaxStablePtrId);
23342impl TypedStablePtr for OptionTerminalCommaPtr {
23343    type SyntaxNode = OptionTerminalComma;
23344    fn untyped(&self) -> SyntaxStablePtrId {
23345        self.0
23346    }
23347    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionTerminalComma {
23348        OptionTerminalComma::from_syntax_node(db, self.0.lookup(db))
23349    }
23350}
23351impl From<OptionTerminalCommaPtr> for SyntaxStablePtrId {
23352    fn from(ptr: OptionTerminalCommaPtr) -> Self {
23353        ptr.untyped()
23354    }
23355}
23356impl From<OptionTerminalCommaEmptyPtr> for OptionTerminalCommaPtr {
23357    fn from(value: OptionTerminalCommaEmptyPtr) -> Self {
23358        Self(value.0)
23359    }
23360}
23361impl From<TerminalCommaPtr> for OptionTerminalCommaPtr {
23362    fn from(value: TerminalCommaPtr) -> Self {
23363        Self(value.0)
23364    }
23365}
23366impl From<OptionTerminalCommaEmptyGreen> for OptionTerminalCommaGreen {
23367    fn from(value: OptionTerminalCommaEmptyGreen) -> Self {
23368        Self(value.0)
23369    }
23370}
23371impl From<TerminalCommaGreen> for OptionTerminalCommaGreen {
23372    fn from(value: TerminalCommaGreen) -> Self {
23373        Self(value.0)
23374    }
23375}
23376#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
23377pub struct OptionTerminalCommaGreen(pub GreenId);
23378impl TypedSyntaxNode for OptionTerminalComma {
23379    const OPTIONAL_KIND: Option<SyntaxKind> = None;
23380    type StablePtr = OptionTerminalCommaPtr;
23381    type Green = OptionTerminalCommaGreen;
23382    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
23383        panic!("No missing variant.");
23384    }
23385    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
23386        let kind = node.kind(db);
23387        match kind {
23388            SyntaxKind::OptionTerminalCommaEmpty => {
23389                OptionTerminalComma::Empty(OptionTerminalCommaEmpty::from_syntax_node(db, node))
23390            }
23391            SyntaxKind::TerminalComma => {
23392                OptionTerminalComma::TerminalComma(TerminalComma::from_syntax_node(db, node))
23393            }
23394            _ => panic!(
23395                "Unexpected syntax kind {:?} when constructing {}.",
23396                kind, "OptionTerminalComma"
23397            ),
23398        }
23399    }
23400    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
23401        let kind = node.kind(db);
23402        match kind {
23403            SyntaxKind::OptionTerminalCommaEmpty => Some(OptionTerminalComma::Empty(
23404                OptionTerminalCommaEmpty::from_syntax_node(db, node),
23405            )),
23406            SyntaxKind::TerminalComma => {
23407                Some(OptionTerminalComma::TerminalComma(TerminalComma::from_syntax_node(db, node)))
23408            }
23409            _ => None,
23410        }
23411    }
23412    fn as_syntax_node(&self) -> SyntaxNode {
23413        match self {
23414            OptionTerminalComma::Empty(x) => x.as_syntax_node(),
23415            OptionTerminalComma::TerminalComma(x) => x.as_syntax_node(),
23416        }
23417    }
23418    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
23419        OptionTerminalCommaPtr(self.as_syntax_node().lookup_intern(db).stable_ptr)
23420    }
23421}
23422impl OptionTerminalComma {
23423    /// Checks if a kind of a variant of [OptionTerminalComma].
23424    pub fn is_variant(kind: SyntaxKind) -> bool {
23425        matches!(kind, SyntaxKind::OptionTerminalCommaEmpty | SyntaxKind::TerminalComma)
23426    }
23427}
23428#[derive(Clone, Debug, Eq, Hash, PartialEq)]
23429pub struct OptionTerminalCommaEmpty {
23430    node: SyntaxNode,
23431}
23432impl OptionTerminalCommaEmpty {
23433    pub fn new_green(db: &dyn SyntaxGroup) -> OptionTerminalCommaEmptyGreen {
23434        let children = [];
23435        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
23436        OptionTerminalCommaEmptyGreen(
23437            Arc::new(GreenNode {
23438                kind: SyntaxKind::OptionTerminalCommaEmpty,
23439                details: GreenNodeDetails::Node { children: children.into(), width },
23440            })
23441            .intern(db),
23442        )
23443    }
23444}
23445impl OptionTerminalCommaEmpty {}
23446#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
23447pub struct OptionTerminalCommaEmptyPtr(pub SyntaxStablePtrId);
23448impl OptionTerminalCommaEmptyPtr {}
23449impl TypedStablePtr for OptionTerminalCommaEmptyPtr {
23450    type SyntaxNode = OptionTerminalCommaEmpty;
23451    fn untyped(&self) -> SyntaxStablePtrId {
23452        self.0
23453    }
23454    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionTerminalCommaEmpty {
23455        OptionTerminalCommaEmpty::from_syntax_node(db, self.0.lookup(db))
23456    }
23457}
23458impl From<OptionTerminalCommaEmptyPtr> for SyntaxStablePtrId {
23459    fn from(ptr: OptionTerminalCommaEmptyPtr) -> Self {
23460        ptr.untyped()
23461    }
23462}
23463#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
23464pub struct OptionTerminalCommaEmptyGreen(pub GreenId);
23465impl TypedSyntaxNode for OptionTerminalCommaEmpty {
23466    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionTerminalCommaEmpty);
23467    type StablePtr = OptionTerminalCommaEmptyPtr;
23468    type Green = OptionTerminalCommaEmptyGreen;
23469    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
23470        OptionTerminalCommaEmptyGreen(
23471            Arc::new(GreenNode {
23472                kind: SyntaxKind::OptionTerminalCommaEmpty,
23473                details: GreenNodeDetails::Node {
23474                    children: [].into(),
23475                    width: TextWidth::default(),
23476                },
23477            })
23478            .intern(db),
23479        )
23480    }
23481    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
23482        let kind = node.kind(db);
23483        assert_eq!(
23484            kind,
23485            SyntaxKind::OptionTerminalCommaEmpty,
23486            "Unexpected SyntaxKind {:?}. Expected {:?}.",
23487            kind,
23488            SyntaxKind::OptionTerminalCommaEmpty
23489        );
23490        Self { node }
23491    }
23492    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
23493        let kind = node.kind(db);
23494        if kind == SyntaxKind::OptionTerminalCommaEmpty {
23495            Some(Self::from_syntax_node(db, node))
23496        } else {
23497            None
23498        }
23499    }
23500    fn as_syntax_node(&self) -> SyntaxNode {
23501        self.node
23502    }
23503    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
23504        OptionTerminalCommaEmptyPtr(self.node.stable_ptr(db))
23505    }
23506}
23507#[derive(Clone, Debug, Eq, Hash, PartialEq)]
23508pub enum MacroRepetitionOperator {
23509    ZeroOrOne(TerminalQuestionMark),
23510    OneOrMore(TerminalPlus),
23511    ZeroOrMore(TerminalMul),
23512    Missing(MacroRepetitionOperatorMissing),
23513}
23514#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
23515pub struct MacroRepetitionOperatorPtr(pub SyntaxStablePtrId);
23516impl TypedStablePtr for MacroRepetitionOperatorPtr {
23517    type SyntaxNode = MacroRepetitionOperator;
23518    fn untyped(&self) -> SyntaxStablePtrId {
23519        self.0
23520    }
23521    fn lookup(&self, db: &dyn SyntaxGroup) -> MacroRepetitionOperator {
23522        MacroRepetitionOperator::from_syntax_node(db, self.0.lookup(db))
23523    }
23524}
23525impl From<MacroRepetitionOperatorPtr> for SyntaxStablePtrId {
23526    fn from(ptr: MacroRepetitionOperatorPtr) -> Self {
23527        ptr.untyped()
23528    }
23529}
23530impl From<TerminalQuestionMarkPtr> for MacroRepetitionOperatorPtr {
23531    fn from(value: TerminalQuestionMarkPtr) -> Self {
23532        Self(value.0)
23533    }
23534}
23535impl From<TerminalPlusPtr> for MacroRepetitionOperatorPtr {
23536    fn from(value: TerminalPlusPtr) -> Self {
23537        Self(value.0)
23538    }
23539}
23540impl From<TerminalMulPtr> for MacroRepetitionOperatorPtr {
23541    fn from(value: TerminalMulPtr) -> Self {
23542        Self(value.0)
23543    }
23544}
23545impl From<MacroRepetitionOperatorMissingPtr> for MacroRepetitionOperatorPtr {
23546    fn from(value: MacroRepetitionOperatorMissingPtr) -> Self {
23547        Self(value.0)
23548    }
23549}
23550impl From<TerminalQuestionMarkGreen> for MacroRepetitionOperatorGreen {
23551    fn from(value: TerminalQuestionMarkGreen) -> Self {
23552        Self(value.0)
23553    }
23554}
23555impl From<TerminalPlusGreen> for MacroRepetitionOperatorGreen {
23556    fn from(value: TerminalPlusGreen) -> Self {
23557        Self(value.0)
23558    }
23559}
23560impl From<TerminalMulGreen> for MacroRepetitionOperatorGreen {
23561    fn from(value: TerminalMulGreen) -> Self {
23562        Self(value.0)
23563    }
23564}
23565impl From<MacroRepetitionOperatorMissingGreen> for MacroRepetitionOperatorGreen {
23566    fn from(value: MacroRepetitionOperatorMissingGreen) -> Self {
23567        Self(value.0)
23568    }
23569}
23570#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
23571pub struct MacroRepetitionOperatorGreen(pub GreenId);
23572impl TypedSyntaxNode for MacroRepetitionOperator {
23573    const OPTIONAL_KIND: Option<SyntaxKind> = None;
23574    type StablePtr = MacroRepetitionOperatorPtr;
23575    type Green = MacroRepetitionOperatorGreen;
23576    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
23577        MacroRepetitionOperatorGreen(MacroRepetitionOperatorMissing::missing(db).0)
23578    }
23579    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
23580        let kind = node.kind(db);
23581        match kind {
23582            SyntaxKind::TerminalQuestionMark => {
23583                MacroRepetitionOperator::ZeroOrOne(TerminalQuestionMark::from_syntax_node(db, node))
23584            }
23585            SyntaxKind::TerminalPlus => {
23586                MacroRepetitionOperator::OneOrMore(TerminalPlus::from_syntax_node(db, node))
23587            }
23588            SyntaxKind::TerminalMul => {
23589                MacroRepetitionOperator::ZeroOrMore(TerminalMul::from_syntax_node(db, node))
23590            }
23591            SyntaxKind::MacroRepetitionOperatorMissing => MacroRepetitionOperator::Missing(
23592                MacroRepetitionOperatorMissing::from_syntax_node(db, node),
23593            ),
23594            _ => panic!(
23595                "Unexpected syntax kind {:?} when constructing {}.",
23596                kind, "MacroRepetitionOperator"
23597            ),
23598        }
23599    }
23600    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
23601        let kind = node.kind(db);
23602        match kind {
23603            SyntaxKind::TerminalQuestionMark => Some(MacroRepetitionOperator::ZeroOrOne(
23604                TerminalQuestionMark::from_syntax_node(db, node),
23605            )),
23606            SyntaxKind::TerminalPlus => {
23607                Some(MacroRepetitionOperator::OneOrMore(TerminalPlus::from_syntax_node(db, node)))
23608            }
23609            SyntaxKind::TerminalMul => {
23610                Some(MacroRepetitionOperator::ZeroOrMore(TerminalMul::from_syntax_node(db, node)))
23611            }
23612            SyntaxKind::MacroRepetitionOperatorMissing => Some(MacroRepetitionOperator::Missing(
23613                MacroRepetitionOperatorMissing::from_syntax_node(db, node),
23614            )),
23615            _ => None,
23616        }
23617    }
23618    fn as_syntax_node(&self) -> SyntaxNode {
23619        match self {
23620            MacroRepetitionOperator::ZeroOrOne(x) => x.as_syntax_node(),
23621            MacroRepetitionOperator::OneOrMore(x) => x.as_syntax_node(),
23622            MacroRepetitionOperator::ZeroOrMore(x) => x.as_syntax_node(),
23623            MacroRepetitionOperator::Missing(x) => x.as_syntax_node(),
23624        }
23625    }
23626    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
23627        MacroRepetitionOperatorPtr(self.as_syntax_node().lookup_intern(db).stable_ptr)
23628    }
23629}
23630impl MacroRepetitionOperator {
23631    /// Checks if a kind of a variant of [MacroRepetitionOperator].
23632    pub fn is_variant(kind: SyntaxKind) -> bool {
23633        matches!(
23634            kind,
23635            SyntaxKind::TerminalQuestionMark
23636                | SyntaxKind::TerminalPlus
23637                | SyntaxKind::TerminalMul
23638                | SyntaxKind::MacroRepetitionOperatorMissing
23639        )
23640    }
23641}
23642#[derive(Clone, Debug, Eq, Hash, PartialEq)]
23643pub struct MacroRepetitionOperatorMissing {
23644    node: SyntaxNode,
23645}
23646impl MacroRepetitionOperatorMissing {
23647    pub fn new_green(db: &dyn SyntaxGroup) -> MacroRepetitionOperatorMissingGreen {
23648        let children = [];
23649        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
23650        MacroRepetitionOperatorMissingGreen(
23651            Arc::new(GreenNode {
23652                kind: SyntaxKind::MacroRepetitionOperatorMissing,
23653                details: GreenNodeDetails::Node { children: children.into(), width },
23654            })
23655            .intern(db),
23656        )
23657    }
23658}
23659impl MacroRepetitionOperatorMissing {}
23660#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
23661pub struct MacroRepetitionOperatorMissingPtr(pub SyntaxStablePtrId);
23662impl MacroRepetitionOperatorMissingPtr {}
23663impl TypedStablePtr for MacroRepetitionOperatorMissingPtr {
23664    type SyntaxNode = MacroRepetitionOperatorMissing;
23665    fn untyped(&self) -> SyntaxStablePtrId {
23666        self.0
23667    }
23668    fn lookup(&self, db: &dyn SyntaxGroup) -> MacroRepetitionOperatorMissing {
23669        MacroRepetitionOperatorMissing::from_syntax_node(db, self.0.lookup(db))
23670    }
23671}
23672impl From<MacroRepetitionOperatorMissingPtr> for SyntaxStablePtrId {
23673    fn from(ptr: MacroRepetitionOperatorMissingPtr) -> Self {
23674        ptr.untyped()
23675    }
23676}
23677#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
23678pub struct MacroRepetitionOperatorMissingGreen(pub GreenId);
23679impl TypedSyntaxNode for MacroRepetitionOperatorMissing {
23680    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::MacroRepetitionOperatorMissing);
23681    type StablePtr = MacroRepetitionOperatorMissingPtr;
23682    type Green = MacroRepetitionOperatorMissingGreen;
23683    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
23684        MacroRepetitionOperatorMissingGreen(
23685            Arc::new(GreenNode {
23686                kind: SyntaxKind::MacroRepetitionOperatorMissing,
23687                details: GreenNodeDetails::Node {
23688                    children: [].into(),
23689                    width: TextWidth::default(),
23690                },
23691            })
23692            .intern(db),
23693        )
23694    }
23695    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
23696        let kind = node.kind(db);
23697        assert_eq!(
23698            kind,
23699            SyntaxKind::MacroRepetitionOperatorMissing,
23700            "Unexpected SyntaxKind {:?}. Expected {:?}.",
23701            kind,
23702            SyntaxKind::MacroRepetitionOperatorMissing
23703        );
23704        Self { node }
23705    }
23706    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
23707        let kind = node.kind(db);
23708        if kind == SyntaxKind::MacroRepetitionOperatorMissing {
23709            Some(Self::from_syntax_node(db, node))
23710        } else {
23711            None
23712        }
23713    }
23714    fn as_syntax_node(&self) -> SyntaxNode {
23715        self.node
23716    }
23717    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
23718        MacroRepetitionOperatorMissingPtr(self.node.stable_ptr(db))
23719    }
23720}
23721#[derive(Clone, Debug, Eq, Hash, PartialEq)]
23722pub struct ParamIdent {
23723    node: SyntaxNode,
23724}
23725impl ParamIdent {
23726    pub const INDEX_IDENT: usize = 0;
23727    pub fn new_green(db: &dyn SyntaxGroup, ident: TerminalIdentifierGreen) -> ParamIdentGreen {
23728        let children = [ident.0];
23729        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
23730        ParamIdentGreen(
23731            Arc::new(GreenNode {
23732                kind: SyntaxKind::ParamIdent,
23733                details: GreenNodeDetails::Node { children: children.into(), width },
23734            })
23735            .intern(db),
23736        )
23737    }
23738}
23739impl ParamIdent {
23740    pub fn ident(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier {
23741        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[0])
23742    }
23743}
23744#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
23745pub struct ParamIdentPtr(pub SyntaxStablePtrId);
23746impl ParamIdentPtr {}
23747impl TypedStablePtr for ParamIdentPtr {
23748    type SyntaxNode = ParamIdent;
23749    fn untyped(&self) -> SyntaxStablePtrId {
23750        self.0
23751    }
23752    fn lookup(&self, db: &dyn SyntaxGroup) -> ParamIdent {
23753        ParamIdent::from_syntax_node(db, self.0.lookup(db))
23754    }
23755}
23756impl From<ParamIdentPtr> for SyntaxStablePtrId {
23757    fn from(ptr: ParamIdentPtr) -> Self {
23758        ptr.untyped()
23759    }
23760}
23761#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
23762pub struct ParamIdentGreen(pub GreenId);
23763impl TypedSyntaxNode for ParamIdent {
23764    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ParamIdent);
23765    type StablePtr = ParamIdentPtr;
23766    type Green = ParamIdentGreen;
23767    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
23768        ParamIdentGreen(
23769            Arc::new(GreenNode {
23770                kind: SyntaxKind::ParamIdent,
23771                details: GreenNodeDetails::Node {
23772                    children: [TerminalIdentifier::missing(db).0].into(),
23773                    width: TextWidth::default(),
23774                },
23775            })
23776            .intern(db),
23777        )
23778    }
23779    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
23780        let kind = node.kind(db);
23781        assert_eq!(
23782            kind,
23783            SyntaxKind::ParamIdent,
23784            "Unexpected SyntaxKind {:?}. Expected {:?}.",
23785            kind,
23786            SyntaxKind::ParamIdent
23787        );
23788        Self { node }
23789    }
23790    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
23791        let kind = node.kind(db);
23792        if kind == SyntaxKind::ParamIdent { Some(Self::from_syntax_node(db, node)) } else { None }
23793    }
23794    fn as_syntax_node(&self) -> SyntaxNode {
23795        self.node
23796    }
23797    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
23798        ParamIdentPtr(self.node.stable_ptr(db))
23799    }
23800}
23801#[derive(Clone, Debug, Eq, Hash, PartialEq)]
23802pub struct ParamExpr {
23803    node: SyntaxNode,
23804}
23805impl ParamExpr {
23806    pub const INDEX_EXPR: usize = 0;
23807    pub fn new_green(db: &dyn SyntaxGroup, expr: TerminalIdentifierGreen) -> ParamExprGreen {
23808        let children = [expr.0];
23809        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
23810        ParamExprGreen(
23811            Arc::new(GreenNode {
23812                kind: SyntaxKind::ParamExpr,
23813                details: GreenNodeDetails::Node { children: children.into(), width },
23814            })
23815            .intern(db),
23816        )
23817    }
23818}
23819impl ParamExpr {
23820    pub fn expr(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier {
23821        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[0])
23822    }
23823}
23824#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
23825pub struct ParamExprPtr(pub SyntaxStablePtrId);
23826impl ParamExprPtr {}
23827impl TypedStablePtr for ParamExprPtr {
23828    type SyntaxNode = ParamExpr;
23829    fn untyped(&self) -> SyntaxStablePtrId {
23830        self.0
23831    }
23832    fn lookup(&self, db: &dyn SyntaxGroup) -> ParamExpr {
23833        ParamExpr::from_syntax_node(db, self.0.lookup(db))
23834    }
23835}
23836impl From<ParamExprPtr> for SyntaxStablePtrId {
23837    fn from(ptr: ParamExprPtr) -> Self {
23838        ptr.untyped()
23839    }
23840}
23841#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
23842pub struct ParamExprGreen(pub GreenId);
23843impl TypedSyntaxNode for ParamExpr {
23844    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ParamExpr);
23845    type StablePtr = ParamExprPtr;
23846    type Green = ParamExprGreen;
23847    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
23848        ParamExprGreen(
23849            Arc::new(GreenNode {
23850                kind: SyntaxKind::ParamExpr,
23851                details: GreenNodeDetails::Node {
23852                    children: [TerminalIdentifier::missing(db).0].into(),
23853                    width: TextWidth::default(),
23854                },
23855            })
23856            .intern(db),
23857        )
23858    }
23859    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
23860        let kind = node.kind(db);
23861        assert_eq!(
23862            kind,
23863            SyntaxKind::ParamExpr,
23864            "Unexpected SyntaxKind {:?}. Expected {:?}.",
23865            kind,
23866            SyntaxKind::ParamExpr
23867        );
23868        Self { node }
23869    }
23870    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
23871        let kind = node.kind(db);
23872        if kind == SyntaxKind::ParamExpr { Some(Self::from_syntax_node(db, node)) } else { None }
23873    }
23874    fn as_syntax_node(&self) -> SyntaxNode {
23875        self.node
23876    }
23877    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
23878        ParamExprPtr(self.node.stable_ptr(db))
23879    }
23880}
23881#[derive(Clone, Debug, Eq, Hash, PartialEq)]
23882pub enum MacroParamKind {
23883    Identifier(ParamIdent),
23884    Expr(ParamExpr),
23885    Missing(MacroParamKindMissing),
23886}
23887#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
23888pub struct MacroParamKindPtr(pub SyntaxStablePtrId);
23889impl TypedStablePtr for MacroParamKindPtr {
23890    type SyntaxNode = MacroParamKind;
23891    fn untyped(&self) -> SyntaxStablePtrId {
23892        self.0
23893    }
23894    fn lookup(&self, db: &dyn SyntaxGroup) -> MacroParamKind {
23895        MacroParamKind::from_syntax_node(db, self.0.lookup(db))
23896    }
23897}
23898impl From<MacroParamKindPtr> for SyntaxStablePtrId {
23899    fn from(ptr: MacroParamKindPtr) -> Self {
23900        ptr.untyped()
23901    }
23902}
23903impl From<ParamIdentPtr> for MacroParamKindPtr {
23904    fn from(value: ParamIdentPtr) -> Self {
23905        Self(value.0)
23906    }
23907}
23908impl From<ParamExprPtr> for MacroParamKindPtr {
23909    fn from(value: ParamExprPtr) -> Self {
23910        Self(value.0)
23911    }
23912}
23913impl From<MacroParamKindMissingPtr> for MacroParamKindPtr {
23914    fn from(value: MacroParamKindMissingPtr) -> Self {
23915        Self(value.0)
23916    }
23917}
23918impl From<ParamIdentGreen> for MacroParamKindGreen {
23919    fn from(value: ParamIdentGreen) -> Self {
23920        Self(value.0)
23921    }
23922}
23923impl From<ParamExprGreen> for MacroParamKindGreen {
23924    fn from(value: ParamExprGreen) -> Self {
23925        Self(value.0)
23926    }
23927}
23928impl From<MacroParamKindMissingGreen> for MacroParamKindGreen {
23929    fn from(value: MacroParamKindMissingGreen) -> Self {
23930        Self(value.0)
23931    }
23932}
23933#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
23934pub struct MacroParamKindGreen(pub GreenId);
23935impl TypedSyntaxNode for MacroParamKind {
23936    const OPTIONAL_KIND: Option<SyntaxKind> = None;
23937    type StablePtr = MacroParamKindPtr;
23938    type Green = MacroParamKindGreen;
23939    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
23940        MacroParamKindGreen(MacroParamKindMissing::missing(db).0)
23941    }
23942    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
23943        let kind = node.kind(db);
23944        match kind {
23945            SyntaxKind::ParamIdent => {
23946                MacroParamKind::Identifier(ParamIdent::from_syntax_node(db, node))
23947            }
23948            SyntaxKind::ParamExpr => MacroParamKind::Expr(ParamExpr::from_syntax_node(db, node)),
23949            SyntaxKind::MacroParamKindMissing => {
23950                MacroParamKind::Missing(MacroParamKindMissing::from_syntax_node(db, node))
23951            }
23952            _ => {
23953                panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "MacroParamKind")
23954            }
23955        }
23956    }
23957    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
23958        let kind = node.kind(db);
23959        match kind {
23960            SyntaxKind::ParamIdent => {
23961                Some(MacroParamKind::Identifier(ParamIdent::from_syntax_node(db, node)))
23962            }
23963            SyntaxKind::ParamExpr => {
23964                Some(MacroParamKind::Expr(ParamExpr::from_syntax_node(db, node)))
23965            }
23966            SyntaxKind::MacroParamKindMissing => {
23967                Some(MacroParamKind::Missing(MacroParamKindMissing::from_syntax_node(db, node)))
23968            }
23969            _ => None,
23970        }
23971    }
23972    fn as_syntax_node(&self) -> SyntaxNode {
23973        match self {
23974            MacroParamKind::Identifier(x) => x.as_syntax_node(),
23975            MacroParamKind::Expr(x) => x.as_syntax_node(),
23976            MacroParamKind::Missing(x) => x.as_syntax_node(),
23977        }
23978    }
23979    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
23980        MacroParamKindPtr(self.as_syntax_node().lookup_intern(db).stable_ptr)
23981    }
23982}
23983impl MacroParamKind {
23984    /// Checks if a kind of a variant of [MacroParamKind].
23985    pub fn is_variant(kind: SyntaxKind) -> bool {
23986        matches!(
23987            kind,
23988            SyntaxKind::ParamIdent | SyntaxKind::ParamExpr | SyntaxKind::MacroParamKindMissing
23989        )
23990    }
23991}
23992#[derive(Clone, Debug, Eq, Hash, PartialEq)]
23993pub struct MacroParamKindMissing {
23994    node: SyntaxNode,
23995}
23996impl MacroParamKindMissing {
23997    pub fn new_green(db: &dyn SyntaxGroup) -> MacroParamKindMissingGreen {
23998        let children = [];
23999        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
24000        MacroParamKindMissingGreen(
24001            Arc::new(GreenNode {
24002                kind: SyntaxKind::MacroParamKindMissing,
24003                details: GreenNodeDetails::Node { children: children.into(), width },
24004            })
24005            .intern(db),
24006        )
24007    }
24008}
24009impl MacroParamKindMissing {}
24010#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
24011pub struct MacroParamKindMissingPtr(pub SyntaxStablePtrId);
24012impl MacroParamKindMissingPtr {}
24013impl TypedStablePtr for MacroParamKindMissingPtr {
24014    type SyntaxNode = MacroParamKindMissing;
24015    fn untyped(&self) -> SyntaxStablePtrId {
24016        self.0
24017    }
24018    fn lookup(&self, db: &dyn SyntaxGroup) -> MacroParamKindMissing {
24019        MacroParamKindMissing::from_syntax_node(db, self.0.lookup(db))
24020    }
24021}
24022impl From<MacroParamKindMissingPtr> for SyntaxStablePtrId {
24023    fn from(ptr: MacroParamKindMissingPtr) -> Self {
24024        ptr.untyped()
24025    }
24026}
24027#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
24028pub struct MacroParamKindMissingGreen(pub GreenId);
24029impl TypedSyntaxNode for MacroParamKindMissing {
24030    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::MacroParamKindMissing);
24031    type StablePtr = MacroParamKindMissingPtr;
24032    type Green = MacroParamKindMissingGreen;
24033    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
24034        MacroParamKindMissingGreen(
24035            Arc::new(GreenNode {
24036                kind: SyntaxKind::MacroParamKindMissing,
24037                details: GreenNodeDetails::Node {
24038                    children: [].into(),
24039                    width: TextWidth::default(),
24040                },
24041            })
24042            .intern(db),
24043        )
24044    }
24045    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
24046        let kind = node.kind(db);
24047        assert_eq!(
24048            kind,
24049            SyntaxKind::MacroParamKindMissing,
24050            "Unexpected SyntaxKind {:?}. Expected {:?}.",
24051            kind,
24052            SyntaxKind::MacroParamKindMissing
24053        );
24054        Self { node }
24055    }
24056    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
24057        let kind = node.kind(db);
24058        if kind == SyntaxKind::MacroParamKindMissing {
24059            Some(Self::from_syntax_node(db, node))
24060        } else {
24061            None
24062        }
24063    }
24064    fn as_syntax_node(&self) -> SyntaxNode {
24065        self.node
24066    }
24067    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
24068        MacroParamKindMissingPtr(self.node.stable_ptr(db))
24069    }
24070}
24071#[derive(Clone, Debug, Eq, Hash, PartialEq)]
24072pub enum MacroElement {
24073    Token(TokenTreeLeaf),
24074    Param(MacroParam),
24075    Subtree(MacroWrapper),
24076    Repetition(MacroRepetition),
24077}
24078#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
24079pub struct MacroElementPtr(pub SyntaxStablePtrId);
24080impl TypedStablePtr for MacroElementPtr {
24081    type SyntaxNode = MacroElement;
24082    fn untyped(&self) -> SyntaxStablePtrId {
24083        self.0
24084    }
24085    fn lookup(&self, db: &dyn SyntaxGroup) -> MacroElement {
24086        MacroElement::from_syntax_node(db, self.0.lookup(db))
24087    }
24088}
24089impl From<MacroElementPtr> for SyntaxStablePtrId {
24090    fn from(ptr: MacroElementPtr) -> Self {
24091        ptr.untyped()
24092    }
24093}
24094impl From<TokenTreeLeafPtr> for MacroElementPtr {
24095    fn from(value: TokenTreeLeafPtr) -> Self {
24096        Self(value.0)
24097    }
24098}
24099impl From<MacroParamPtr> for MacroElementPtr {
24100    fn from(value: MacroParamPtr) -> Self {
24101        Self(value.0)
24102    }
24103}
24104impl From<MacroWrapperPtr> for MacroElementPtr {
24105    fn from(value: MacroWrapperPtr) -> Self {
24106        Self(value.0)
24107    }
24108}
24109impl From<MacroRepetitionPtr> for MacroElementPtr {
24110    fn from(value: MacroRepetitionPtr) -> Self {
24111        Self(value.0)
24112    }
24113}
24114impl From<TokenTreeLeafGreen> for MacroElementGreen {
24115    fn from(value: TokenTreeLeafGreen) -> Self {
24116        Self(value.0)
24117    }
24118}
24119impl From<MacroParamGreen> for MacroElementGreen {
24120    fn from(value: MacroParamGreen) -> Self {
24121        Self(value.0)
24122    }
24123}
24124impl From<MacroWrapperGreen> for MacroElementGreen {
24125    fn from(value: MacroWrapperGreen) -> Self {
24126        Self(value.0)
24127    }
24128}
24129impl From<MacroRepetitionGreen> for MacroElementGreen {
24130    fn from(value: MacroRepetitionGreen) -> Self {
24131        Self(value.0)
24132    }
24133}
24134#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
24135pub struct MacroElementGreen(pub GreenId);
24136impl TypedSyntaxNode for MacroElement {
24137    const OPTIONAL_KIND: Option<SyntaxKind> = None;
24138    type StablePtr = MacroElementPtr;
24139    type Green = MacroElementGreen;
24140    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
24141        panic!("No missing variant.");
24142    }
24143    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
24144        let kind = node.kind(db);
24145        match kind {
24146            SyntaxKind::TokenTreeLeaf => {
24147                MacroElement::Token(TokenTreeLeaf::from_syntax_node(db, node))
24148            }
24149            SyntaxKind::MacroParam => MacroElement::Param(MacroParam::from_syntax_node(db, node)),
24150            SyntaxKind::MacroWrapper => {
24151                MacroElement::Subtree(MacroWrapper::from_syntax_node(db, node))
24152            }
24153            SyntaxKind::MacroRepetition => {
24154                MacroElement::Repetition(MacroRepetition::from_syntax_node(db, node))
24155            }
24156            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "MacroElement"),
24157        }
24158    }
24159    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
24160        let kind = node.kind(db);
24161        match kind {
24162            SyntaxKind::TokenTreeLeaf => {
24163                Some(MacroElement::Token(TokenTreeLeaf::from_syntax_node(db, node)))
24164            }
24165            SyntaxKind::MacroParam => {
24166                Some(MacroElement::Param(MacroParam::from_syntax_node(db, node)))
24167            }
24168            SyntaxKind::MacroWrapper => {
24169                Some(MacroElement::Subtree(MacroWrapper::from_syntax_node(db, node)))
24170            }
24171            SyntaxKind::MacroRepetition => {
24172                Some(MacroElement::Repetition(MacroRepetition::from_syntax_node(db, node)))
24173            }
24174            _ => None,
24175        }
24176    }
24177    fn as_syntax_node(&self) -> SyntaxNode {
24178        match self {
24179            MacroElement::Token(x) => x.as_syntax_node(),
24180            MacroElement::Param(x) => x.as_syntax_node(),
24181            MacroElement::Subtree(x) => x.as_syntax_node(),
24182            MacroElement::Repetition(x) => x.as_syntax_node(),
24183        }
24184    }
24185    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
24186        MacroElementPtr(self.as_syntax_node().lookup_intern(db).stable_ptr)
24187    }
24188}
24189impl MacroElement {
24190    /// Checks if a kind of a variant of [MacroElement].
24191    pub fn is_variant(kind: SyntaxKind) -> bool {
24192        matches!(
24193            kind,
24194            SyntaxKind::TokenTreeLeaf
24195                | SyntaxKind::MacroParam
24196                | SyntaxKind::MacroWrapper
24197                | SyntaxKind::MacroRepetition
24198        )
24199    }
24200}
24201#[derive(Clone, Debug, Eq, Hash, PartialEq)]
24202pub struct MacroElements(ElementList<MacroElement, 1>);
24203impl Deref for MacroElements {
24204    type Target = ElementList<MacroElement, 1>;
24205    fn deref(&self) -> &Self::Target {
24206        &self.0
24207    }
24208}
24209impl MacroElements {
24210    pub fn new_green(db: &dyn SyntaxGroup, children: &[MacroElementGreen]) -> MacroElementsGreen {
24211        let width = children.iter().map(|id| id.0.lookup_intern(db).width()).sum();
24212        MacroElementsGreen(
24213            Arc::new(GreenNode {
24214                kind: SyntaxKind::MacroElements,
24215                details: GreenNodeDetails::Node {
24216                    children: children.iter().map(|x| x.0).collect(),
24217                    width,
24218                },
24219            })
24220            .intern(db),
24221        )
24222    }
24223}
24224#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
24225pub struct MacroElementsPtr(pub SyntaxStablePtrId);
24226impl TypedStablePtr for MacroElementsPtr {
24227    type SyntaxNode = MacroElements;
24228    fn untyped(&self) -> SyntaxStablePtrId {
24229        self.0
24230    }
24231    fn lookup(&self, db: &dyn SyntaxGroup) -> MacroElements {
24232        MacroElements::from_syntax_node(db, self.0.lookup(db))
24233    }
24234}
24235impl From<MacroElementsPtr> for SyntaxStablePtrId {
24236    fn from(ptr: MacroElementsPtr) -> Self {
24237        ptr.untyped()
24238    }
24239}
24240#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
24241pub struct MacroElementsGreen(pub GreenId);
24242impl TypedSyntaxNode for MacroElements {
24243    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::MacroElements);
24244    type StablePtr = MacroElementsPtr;
24245    type Green = MacroElementsGreen;
24246    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
24247        MacroElementsGreen(
24248            Arc::new(GreenNode {
24249                kind: SyntaxKind::MacroElements,
24250                details: GreenNodeDetails::Node {
24251                    children: [].into(),
24252                    width: TextWidth::default(),
24253                },
24254            })
24255            .intern(db),
24256        )
24257    }
24258    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
24259        Self(ElementList::new(node))
24260    }
24261    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
24262        if node.kind(db) == SyntaxKind::MacroElements {
24263            Some(Self(ElementList::new(node)))
24264        } else {
24265            None
24266        }
24267    }
24268    fn as_syntax_node(&self) -> SyntaxNode {
24269        self.node
24270    }
24271    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
24272        MacroElementsPtr(self.node.stable_ptr(db))
24273    }
24274}
24275#[derive(Clone, Debug, Eq, Hash, PartialEq)]
24276pub struct MacroWrapper {
24277    node: SyntaxNode,
24278}
24279impl MacroWrapper {
24280    pub const INDEX_SUBTREE: usize = 0;
24281    pub fn new_green(db: &dyn SyntaxGroup, subtree: WrappedMacroGreen) -> MacroWrapperGreen {
24282        let children = [subtree.0];
24283        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
24284        MacroWrapperGreen(
24285            Arc::new(GreenNode {
24286                kind: SyntaxKind::MacroWrapper,
24287                details: GreenNodeDetails::Node { children: children.into(), width },
24288            })
24289            .intern(db),
24290        )
24291    }
24292}
24293impl MacroWrapper {
24294    pub fn subtree(&self, db: &dyn SyntaxGroup) -> WrappedMacro {
24295        WrappedMacro::from_syntax_node(db, self.node.get_children(db)[0])
24296    }
24297}
24298#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
24299pub struct MacroWrapperPtr(pub SyntaxStablePtrId);
24300impl MacroWrapperPtr {}
24301impl TypedStablePtr for MacroWrapperPtr {
24302    type SyntaxNode = MacroWrapper;
24303    fn untyped(&self) -> SyntaxStablePtrId {
24304        self.0
24305    }
24306    fn lookup(&self, db: &dyn SyntaxGroup) -> MacroWrapper {
24307        MacroWrapper::from_syntax_node(db, self.0.lookup(db))
24308    }
24309}
24310impl From<MacroWrapperPtr> for SyntaxStablePtrId {
24311    fn from(ptr: MacroWrapperPtr) -> Self {
24312        ptr.untyped()
24313    }
24314}
24315#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
24316pub struct MacroWrapperGreen(pub GreenId);
24317impl TypedSyntaxNode for MacroWrapper {
24318    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::MacroWrapper);
24319    type StablePtr = MacroWrapperPtr;
24320    type Green = MacroWrapperGreen;
24321    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
24322        MacroWrapperGreen(
24323            Arc::new(GreenNode {
24324                kind: SyntaxKind::MacroWrapper,
24325                details: GreenNodeDetails::Node {
24326                    children: [WrappedMacro::missing(db).0].into(),
24327                    width: TextWidth::default(),
24328                },
24329            })
24330            .intern(db),
24331        )
24332    }
24333    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
24334        let kind = node.kind(db);
24335        assert_eq!(
24336            kind,
24337            SyntaxKind::MacroWrapper,
24338            "Unexpected SyntaxKind {:?}. Expected {:?}.",
24339            kind,
24340            SyntaxKind::MacroWrapper
24341        );
24342        Self { node }
24343    }
24344    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
24345        let kind = node.kind(db);
24346        if kind == SyntaxKind::MacroWrapper { Some(Self::from_syntax_node(db, node)) } else { None }
24347    }
24348    fn as_syntax_node(&self) -> SyntaxNode {
24349        self.node
24350    }
24351    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
24352        MacroWrapperPtr(self.node.stable_ptr(db))
24353    }
24354}
24355#[derive(Clone, Debug, Eq, Hash, PartialEq)]
24356pub enum WrappedMacro {
24357    Parenthesized(ParenthesizedMacro),
24358    Braced(BracedMacro),
24359    Bracketed(BracketedMacro),
24360}
24361#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
24362pub struct WrappedMacroPtr(pub SyntaxStablePtrId);
24363impl TypedStablePtr for WrappedMacroPtr {
24364    type SyntaxNode = WrappedMacro;
24365    fn untyped(&self) -> SyntaxStablePtrId {
24366        self.0
24367    }
24368    fn lookup(&self, db: &dyn SyntaxGroup) -> WrappedMacro {
24369        WrappedMacro::from_syntax_node(db, self.0.lookup(db))
24370    }
24371}
24372impl From<WrappedMacroPtr> for SyntaxStablePtrId {
24373    fn from(ptr: WrappedMacroPtr) -> Self {
24374        ptr.untyped()
24375    }
24376}
24377impl From<ParenthesizedMacroPtr> for WrappedMacroPtr {
24378    fn from(value: ParenthesizedMacroPtr) -> Self {
24379        Self(value.0)
24380    }
24381}
24382impl From<BracedMacroPtr> for WrappedMacroPtr {
24383    fn from(value: BracedMacroPtr) -> Self {
24384        Self(value.0)
24385    }
24386}
24387impl From<BracketedMacroPtr> for WrappedMacroPtr {
24388    fn from(value: BracketedMacroPtr) -> Self {
24389        Self(value.0)
24390    }
24391}
24392impl From<ParenthesizedMacroGreen> for WrappedMacroGreen {
24393    fn from(value: ParenthesizedMacroGreen) -> Self {
24394        Self(value.0)
24395    }
24396}
24397impl From<BracedMacroGreen> for WrappedMacroGreen {
24398    fn from(value: BracedMacroGreen) -> Self {
24399        Self(value.0)
24400    }
24401}
24402impl From<BracketedMacroGreen> for WrappedMacroGreen {
24403    fn from(value: BracketedMacroGreen) -> Self {
24404        Self(value.0)
24405    }
24406}
24407#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
24408pub struct WrappedMacroGreen(pub GreenId);
24409impl TypedSyntaxNode for WrappedMacro {
24410    const OPTIONAL_KIND: Option<SyntaxKind> = None;
24411    type StablePtr = WrappedMacroPtr;
24412    type Green = WrappedMacroGreen;
24413    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
24414        panic!("No missing variant.");
24415    }
24416    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
24417        let kind = node.kind(db);
24418        match kind {
24419            SyntaxKind::ParenthesizedMacro => {
24420                WrappedMacro::Parenthesized(ParenthesizedMacro::from_syntax_node(db, node))
24421            }
24422            SyntaxKind::BracedMacro => {
24423                WrappedMacro::Braced(BracedMacro::from_syntax_node(db, node))
24424            }
24425            SyntaxKind::BracketedMacro => {
24426                WrappedMacro::Bracketed(BracketedMacro::from_syntax_node(db, node))
24427            }
24428            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "WrappedMacro"),
24429        }
24430    }
24431    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
24432        let kind = node.kind(db);
24433        match kind {
24434            SyntaxKind::ParenthesizedMacro => {
24435                Some(WrappedMacro::Parenthesized(ParenthesizedMacro::from_syntax_node(db, node)))
24436            }
24437            SyntaxKind::BracedMacro => {
24438                Some(WrappedMacro::Braced(BracedMacro::from_syntax_node(db, node)))
24439            }
24440            SyntaxKind::BracketedMacro => {
24441                Some(WrappedMacro::Bracketed(BracketedMacro::from_syntax_node(db, node)))
24442            }
24443            _ => None,
24444        }
24445    }
24446    fn as_syntax_node(&self) -> SyntaxNode {
24447        match self {
24448            WrappedMacro::Parenthesized(x) => x.as_syntax_node(),
24449            WrappedMacro::Braced(x) => x.as_syntax_node(),
24450            WrappedMacro::Bracketed(x) => x.as_syntax_node(),
24451        }
24452    }
24453    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
24454        WrappedMacroPtr(self.as_syntax_node().lookup_intern(db).stable_ptr)
24455    }
24456}
24457impl WrappedMacro {
24458    /// Checks if a kind of a variant of [WrappedMacro].
24459    pub fn is_variant(kind: SyntaxKind) -> bool {
24460        matches!(
24461            kind,
24462            SyntaxKind::ParenthesizedMacro | SyntaxKind::BracedMacro | SyntaxKind::BracketedMacro
24463        )
24464    }
24465}
24466#[derive(Clone, Debug, Eq, Hash, PartialEq)]
24467pub struct ParenthesizedMacro {
24468    node: SyntaxNode,
24469}
24470impl ParenthesizedMacro {
24471    pub const INDEX_LPAREN: usize = 0;
24472    pub const INDEX_ELEMENTS: usize = 1;
24473    pub const INDEX_RPAREN: usize = 2;
24474    pub fn new_green(
24475        db: &dyn SyntaxGroup,
24476        lparen: TerminalLParenGreen,
24477        elements: MacroElementsGreen,
24478        rparen: TerminalRParenGreen,
24479    ) -> ParenthesizedMacroGreen {
24480        let children = [lparen.0, elements.0, rparen.0];
24481        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
24482        ParenthesizedMacroGreen(
24483            Arc::new(GreenNode {
24484                kind: SyntaxKind::ParenthesizedMacro,
24485                details: GreenNodeDetails::Node { children: children.into(), width },
24486            })
24487            .intern(db),
24488        )
24489    }
24490}
24491impl ParenthesizedMacro {
24492    pub fn lparen(&self, db: &dyn SyntaxGroup) -> TerminalLParen {
24493        TerminalLParen::from_syntax_node(db, self.node.get_children(db)[0])
24494    }
24495    pub fn elements(&self, db: &dyn SyntaxGroup) -> MacroElements {
24496        MacroElements::from_syntax_node(db, self.node.get_children(db)[1])
24497    }
24498    pub fn rparen(&self, db: &dyn SyntaxGroup) -> TerminalRParen {
24499        TerminalRParen::from_syntax_node(db, self.node.get_children(db)[2])
24500    }
24501}
24502#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
24503pub struct ParenthesizedMacroPtr(pub SyntaxStablePtrId);
24504impl ParenthesizedMacroPtr {}
24505impl TypedStablePtr for ParenthesizedMacroPtr {
24506    type SyntaxNode = ParenthesizedMacro;
24507    fn untyped(&self) -> SyntaxStablePtrId {
24508        self.0
24509    }
24510    fn lookup(&self, db: &dyn SyntaxGroup) -> ParenthesizedMacro {
24511        ParenthesizedMacro::from_syntax_node(db, self.0.lookup(db))
24512    }
24513}
24514impl From<ParenthesizedMacroPtr> for SyntaxStablePtrId {
24515    fn from(ptr: ParenthesizedMacroPtr) -> Self {
24516        ptr.untyped()
24517    }
24518}
24519#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
24520pub struct ParenthesizedMacroGreen(pub GreenId);
24521impl TypedSyntaxNode for ParenthesizedMacro {
24522    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ParenthesizedMacro);
24523    type StablePtr = ParenthesizedMacroPtr;
24524    type Green = ParenthesizedMacroGreen;
24525    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
24526        ParenthesizedMacroGreen(
24527            Arc::new(GreenNode {
24528                kind: SyntaxKind::ParenthesizedMacro,
24529                details: GreenNodeDetails::Node {
24530                    children: [
24531                        TerminalLParen::missing(db).0,
24532                        MacroElements::missing(db).0,
24533                        TerminalRParen::missing(db).0,
24534                    ]
24535                    .into(),
24536                    width: TextWidth::default(),
24537                },
24538            })
24539            .intern(db),
24540        )
24541    }
24542    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
24543        let kind = node.kind(db);
24544        assert_eq!(
24545            kind,
24546            SyntaxKind::ParenthesizedMacro,
24547            "Unexpected SyntaxKind {:?}. Expected {:?}.",
24548            kind,
24549            SyntaxKind::ParenthesizedMacro
24550        );
24551        Self { node }
24552    }
24553    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
24554        let kind = node.kind(db);
24555        if kind == SyntaxKind::ParenthesizedMacro {
24556            Some(Self::from_syntax_node(db, node))
24557        } else {
24558            None
24559        }
24560    }
24561    fn as_syntax_node(&self) -> SyntaxNode {
24562        self.node
24563    }
24564    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
24565        ParenthesizedMacroPtr(self.node.stable_ptr(db))
24566    }
24567}
24568#[derive(Clone, Debug, Eq, Hash, PartialEq)]
24569pub struct BracedMacro {
24570    node: SyntaxNode,
24571}
24572impl BracedMacro {
24573    pub const INDEX_LBRACE: usize = 0;
24574    pub const INDEX_ELEMENTS: usize = 1;
24575    pub const INDEX_RBRACE: usize = 2;
24576    pub fn new_green(
24577        db: &dyn SyntaxGroup,
24578        lbrace: TerminalLBraceGreen,
24579        elements: MacroElementsGreen,
24580        rbrace: TerminalRBraceGreen,
24581    ) -> BracedMacroGreen {
24582        let children = [lbrace.0, elements.0, rbrace.0];
24583        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
24584        BracedMacroGreen(
24585            Arc::new(GreenNode {
24586                kind: SyntaxKind::BracedMacro,
24587                details: GreenNodeDetails::Node { children: children.into(), width },
24588            })
24589            .intern(db),
24590        )
24591    }
24592}
24593impl BracedMacro {
24594    pub fn lbrace(&self, db: &dyn SyntaxGroup) -> TerminalLBrace {
24595        TerminalLBrace::from_syntax_node(db, self.node.get_children(db)[0])
24596    }
24597    pub fn elements(&self, db: &dyn SyntaxGroup) -> MacroElements {
24598        MacroElements::from_syntax_node(db, self.node.get_children(db)[1])
24599    }
24600    pub fn rbrace(&self, db: &dyn SyntaxGroup) -> TerminalRBrace {
24601        TerminalRBrace::from_syntax_node(db, self.node.get_children(db)[2])
24602    }
24603}
24604#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
24605pub struct BracedMacroPtr(pub SyntaxStablePtrId);
24606impl BracedMacroPtr {}
24607impl TypedStablePtr for BracedMacroPtr {
24608    type SyntaxNode = BracedMacro;
24609    fn untyped(&self) -> SyntaxStablePtrId {
24610        self.0
24611    }
24612    fn lookup(&self, db: &dyn SyntaxGroup) -> BracedMacro {
24613        BracedMacro::from_syntax_node(db, self.0.lookup(db))
24614    }
24615}
24616impl From<BracedMacroPtr> for SyntaxStablePtrId {
24617    fn from(ptr: BracedMacroPtr) -> Self {
24618        ptr.untyped()
24619    }
24620}
24621#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
24622pub struct BracedMacroGreen(pub GreenId);
24623impl TypedSyntaxNode for BracedMacro {
24624    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::BracedMacro);
24625    type StablePtr = BracedMacroPtr;
24626    type Green = BracedMacroGreen;
24627    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
24628        BracedMacroGreen(
24629            Arc::new(GreenNode {
24630                kind: SyntaxKind::BracedMacro,
24631                details: GreenNodeDetails::Node {
24632                    children: [
24633                        TerminalLBrace::missing(db).0,
24634                        MacroElements::missing(db).0,
24635                        TerminalRBrace::missing(db).0,
24636                    ]
24637                    .into(),
24638                    width: TextWidth::default(),
24639                },
24640            })
24641            .intern(db),
24642        )
24643    }
24644    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
24645        let kind = node.kind(db);
24646        assert_eq!(
24647            kind,
24648            SyntaxKind::BracedMacro,
24649            "Unexpected SyntaxKind {:?}. Expected {:?}.",
24650            kind,
24651            SyntaxKind::BracedMacro
24652        );
24653        Self { node }
24654    }
24655    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
24656        let kind = node.kind(db);
24657        if kind == SyntaxKind::BracedMacro { Some(Self::from_syntax_node(db, node)) } else { None }
24658    }
24659    fn as_syntax_node(&self) -> SyntaxNode {
24660        self.node
24661    }
24662    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
24663        BracedMacroPtr(self.node.stable_ptr(db))
24664    }
24665}
24666#[derive(Clone, Debug, Eq, Hash, PartialEq)]
24667pub struct BracketedMacro {
24668    node: SyntaxNode,
24669}
24670impl BracketedMacro {
24671    pub const INDEX_LBRACK: usize = 0;
24672    pub const INDEX_ELEMENTS: usize = 1;
24673    pub const INDEX_RBRACK: usize = 2;
24674    pub fn new_green(
24675        db: &dyn SyntaxGroup,
24676        lbrack: TerminalLBrackGreen,
24677        elements: MacroElementsGreen,
24678        rbrack: TerminalRBrackGreen,
24679    ) -> BracketedMacroGreen {
24680        let children = [lbrack.0, elements.0, rbrack.0];
24681        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
24682        BracketedMacroGreen(
24683            Arc::new(GreenNode {
24684                kind: SyntaxKind::BracketedMacro,
24685                details: GreenNodeDetails::Node { children: children.into(), width },
24686            })
24687            .intern(db),
24688        )
24689    }
24690}
24691impl BracketedMacro {
24692    pub fn lbrack(&self, db: &dyn SyntaxGroup) -> TerminalLBrack {
24693        TerminalLBrack::from_syntax_node(db, self.node.get_children(db)[0])
24694    }
24695    pub fn elements(&self, db: &dyn SyntaxGroup) -> MacroElements {
24696        MacroElements::from_syntax_node(db, self.node.get_children(db)[1])
24697    }
24698    pub fn rbrack(&self, db: &dyn SyntaxGroup) -> TerminalRBrack {
24699        TerminalRBrack::from_syntax_node(db, self.node.get_children(db)[2])
24700    }
24701}
24702#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
24703pub struct BracketedMacroPtr(pub SyntaxStablePtrId);
24704impl BracketedMacroPtr {}
24705impl TypedStablePtr for BracketedMacroPtr {
24706    type SyntaxNode = BracketedMacro;
24707    fn untyped(&self) -> SyntaxStablePtrId {
24708        self.0
24709    }
24710    fn lookup(&self, db: &dyn SyntaxGroup) -> BracketedMacro {
24711        BracketedMacro::from_syntax_node(db, self.0.lookup(db))
24712    }
24713}
24714impl From<BracketedMacroPtr> for SyntaxStablePtrId {
24715    fn from(ptr: BracketedMacroPtr) -> Self {
24716        ptr.untyped()
24717    }
24718}
24719#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
24720pub struct BracketedMacroGreen(pub GreenId);
24721impl TypedSyntaxNode for BracketedMacro {
24722    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::BracketedMacro);
24723    type StablePtr = BracketedMacroPtr;
24724    type Green = BracketedMacroGreen;
24725    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
24726        BracketedMacroGreen(
24727            Arc::new(GreenNode {
24728                kind: SyntaxKind::BracketedMacro,
24729                details: GreenNodeDetails::Node {
24730                    children: [
24731                        TerminalLBrack::missing(db).0,
24732                        MacroElements::missing(db).0,
24733                        TerminalRBrack::missing(db).0,
24734                    ]
24735                    .into(),
24736                    width: TextWidth::default(),
24737                },
24738            })
24739            .intern(db),
24740        )
24741    }
24742    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
24743        let kind = node.kind(db);
24744        assert_eq!(
24745            kind,
24746            SyntaxKind::BracketedMacro,
24747            "Unexpected SyntaxKind {:?}. Expected {:?}.",
24748            kind,
24749            SyntaxKind::BracketedMacro
24750        );
24751        Self { node }
24752    }
24753    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
24754        let kind = node.kind(db);
24755        if kind == SyntaxKind::BracketedMacro {
24756            Some(Self::from_syntax_node(db, node))
24757        } else {
24758            None
24759        }
24760    }
24761    fn as_syntax_node(&self) -> SyntaxNode {
24762        self.node
24763    }
24764    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
24765        BracketedMacroPtr(self.node.stable_ptr(db))
24766    }
24767}
24768#[derive(Clone, Debug, Eq, Hash, PartialEq)]
24769pub struct LegacyExprInlineMacro {
24770    node: SyntaxNode,
24771}
24772impl LegacyExprInlineMacro {
24773    pub const INDEX_PATH: usize = 0;
24774    pub const INDEX_BANG: usize = 1;
24775    pub const INDEX_ARGUMENTS: usize = 2;
24776    pub fn new_green(
24777        db: &dyn SyntaxGroup,
24778        path: ExprPathGreen,
24779        bang: TerminalNotGreen,
24780        arguments: WrappedArgListGreen,
24781    ) -> LegacyExprInlineMacroGreen {
24782        let children = [path.0, bang.0, arguments.0];
24783        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
24784        LegacyExprInlineMacroGreen(
24785            Arc::new(GreenNode {
24786                kind: SyntaxKind::LegacyExprInlineMacro,
24787                details: GreenNodeDetails::Node { children: children.into(), width },
24788            })
24789            .intern(db),
24790        )
24791    }
24792}
24793impl LegacyExprInlineMacro {
24794    pub fn path(&self, db: &dyn SyntaxGroup) -> ExprPath {
24795        ExprPath::from_syntax_node(db, self.node.get_children(db)[0])
24796    }
24797    pub fn bang(&self, db: &dyn SyntaxGroup) -> TerminalNot {
24798        TerminalNot::from_syntax_node(db, self.node.get_children(db)[1])
24799    }
24800    pub fn arguments(&self, db: &dyn SyntaxGroup) -> WrappedArgList {
24801        WrappedArgList::from_syntax_node(db, self.node.get_children(db)[2])
24802    }
24803}
24804#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
24805pub struct LegacyExprInlineMacroPtr(pub SyntaxStablePtrId);
24806impl LegacyExprInlineMacroPtr {}
24807impl TypedStablePtr for LegacyExprInlineMacroPtr {
24808    type SyntaxNode = LegacyExprInlineMacro;
24809    fn untyped(&self) -> SyntaxStablePtrId {
24810        self.0
24811    }
24812    fn lookup(&self, db: &dyn SyntaxGroup) -> LegacyExprInlineMacro {
24813        LegacyExprInlineMacro::from_syntax_node(db, self.0.lookup(db))
24814    }
24815}
24816impl From<LegacyExprInlineMacroPtr> for SyntaxStablePtrId {
24817    fn from(ptr: LegacyExprInlineMacroPtr) -> Self {
24818        ptr.untyped()
24819    }
24820}
24821#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
24822pub struct LegacyExprInlineMacroGreen(pub GreenId);
24823impl TypedSyntaxNode for LegacyExprInlineMacro {
24824    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::LegacyExprInlineMacro);
24825    type StablePtr = LegacyExprInlineMacroPtr;
24826    type Green = LegacyExprInlineMacroGreen;
24827    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
24828        LegacyExprInlineMacroGreen(
24829            Arc::new(GreenNode {
24830                kind: SyntaxKind::LegacyExprInlineMacro,
24831                details: GreenNodeDetails::Node {
24832                    children: [
24833                        ExprPath::missing(db).0,
24834                        TerminalNot::missing(db).0,
24835                        WrappedArgList::missing(db).0,
24836                    ]
24837                    .into(),
24838                    width: TextWidth::default(),
24839                },
24840            })
24841            .intern(db),
24842        )
24843    }
24844    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
24845        let kind = node.kind(db);
24846        assert_eq!(
24847            kind,
24848            SyntaxKind::LegacyExprInlineMacro,
24849            "Unexpected SyntaxKind {:?}. Expected {:?}.",
24850            kind,
24851            SyntaxKind::LegacyExprInlineMacro
24852        );
24853        Self { node }
24854    }
24855    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
24856        let kind = node.kind(db);
24857        if kind == SyntaxKind::LegacyExprInlineMacro {
24858            Some(Self::from_syntax_node(db, node))
24859        } else {
24860            None
24861        }
24862    }
24863    fn as_syntax_node(&self) -> SyntaxNode {
24864        self.node
24865    }
24866    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
24867        LegacyExprInlineMacroPtr(self.node.stable_ptr(db))
24868    }
24869}
24870#[derive(Clone, Debug, Eq, Hash, PartialEq)]
24871pub struct LegacyItemInlineMacro {
24872    node: SyntaxNode,
24873}
24874impl LegacyItemInlineMacro {
24875    pub const INDEX_ATTRIBUTES: usize = 0;
24876    pub const INDEX_PATH: usize = 1;
24877    pub const INDEX_BANG: usize = 2;
24878    pub const INDEX_ARGUMENTS: usize = 3;
24879    pub const INDEX_SEMICOLON: usize = 4;
24880    pub fn new_green(
24881        db: &dyn SyntaxGroup,
24882        attributes: AttributeListGreen,
24883        path: ExprPathGreen,
24884        bang: TerminalNotGreen,
24885        arguments: WrappedArgListGreen,
24886        semicolon: TerminalSemicolonGreen,
24887    ) -> LegacyItemInlineMacroGreen {
24888        let children = [attributes.0, path.0, bang.0, arguments.0, semicolon.0];
24889        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
24890        LegacyItemInlineMacroGreen(
24891            Arc::new(GreenNode {
24892                kind: SyntaxKind::LegacyItemInlineMacro,
24893                details: GreenNodeDetails::Node { children: children.into(), width },
24894            })
24895            .intern(db),
24896        )
24897    }
24898}
24899impl LegacyItemInlineMacro {
24900    pub fn attributes(&self, db: &dyn SyntaxGroup) -> AttributeList {
24901        AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
24902    }
24903    pub fn path(&self, db: &dyn SyntaxGroup) -> ExprPath {
24904        ExprPath::from_syntax_node(db, self.node.get_children(db)[1])
24905    }
24906    pub fn bang(&self, db: &dyn SyntaxGroup) -> TerminalNot {
24907        TerminalNot::from_syntax_node(db, self.node.get_children(db)[2])
24908    }
24909    pub fn arguments(&self, db: &dyn SyntaxGroup) -> WrappedArgList {
24910        WrappedArgList::from_syntax_node(db, self.node.get_children(db)[3])
24911    }
24912    pub fn semicolon(&self, db: &dyn SyntaxGroup) -> TerminalSemicolon {
24913        TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[4])
24914    }
24915}
24916#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
24917pub struct LegacyItemInlineMacroPtr(pub SyntaxStablePtrId);
24918impl LegacyItemInlineMacroPtr {}
24919impl TypedStablePtr for LegacyItemInlineMacroPtr {
24920    type SyntaxNode = LegacyItemInlineMacro;
24921    fn untyped(&self) -> SyntaxStablePtrId {
24922        self.0
24923    }
24924    fn lookup(&self, db: &dyn SyntaxGroup) -> LegacyItemInlineMacro {
24925        LegacyItemInlineMacro::from_syntax_node(db, self.0.lookup(db))
24926    }
24927}
24928impl From<LegacyItemInlineMacroPtr> for SyntaxStablePtrId {
24929    fn from(ptr: LegacyItemInlineMacroPtr) -> Self {
24930        ptr.untyped()
24931    }
24932}
24933#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
24934pub struct LegacyItemInlineMacroGreen(pub GreenId);
24935impl TypedSyntaxNode for LegacyItemInlineMacro {
24936    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::LegacyItemInlineMacro);
24937    type StablePtr = LegacyItemInlineMacroPtr;
24938    type Green = LegacyItemInlineMacroGreen;
24939    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
24940        LegacyItemInlineMacroGreen(
24941            Arc::new(GreenNode {
24942                kind: SyntaxKind::LegacyItemInlineMacro,
24943                details: GreenNodeDetails::Node {
24944                    children: [
24945                        AttributeList::missing(db).0,
24946                        ExprPath::missing(db).0,
24947                        TerminalNot::missing(db).0,
24948                        WrappedArgList::missing(db).0,
24949                        TerminalSemicolon::missing(db).0,
24950                    ]
24951                    .into(),
24952                    width: TextWidth::default(),
24953                },
24954            })
24955            .intern(db),
24956        )
24957    }
24958    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
24959        let kind = node.kind(db);
24960        assert_eq!(
24961            kind,
24962            SyntaxKind::LegacyItemInlineMacro,
24963            "Unexpected SyntaxKind {:?}. Expected {:?}.",
24964            kind,
24965            SyntaxKind::LegacyItemInlineMacro
24966        );
24967        Self { node }
24968    }
24969    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
24970        let kind = node.kind(db);
24971        if kind == SyntaxKind::LegacyItemInlineMacro {
24972            Some(Self::from_syntax_node(db, node))
24973        } else {
24974            None
24975        }
24976    }
24977    fn as_syntax_node(&self) -> SyntaxNode {
24978        self.node
24979    }
24980    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
24981        LegacyItemInlineMacroPtr(self.node.stable_ptr(db))
24982    }
24983}
24984#[derive(Clone, Debug, Eq, Hash, PartialEq)]
24985pub struct TriviumSkippedNode {
24986    node: SyntaxNode,
24987}
24988impl TriviumSkippedNode {
24989    pub const INDEX_NODE: usize = 0;
24990    pub fn new_green(db: &dyn SyntaxGroup, node: SkippedNodeGreen) -> TriviumSkippedNodeGreen {
24991        let children = [node.0];
24992        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
24993        TriviumSkippedNodeGreen(
24994            Arc::new(GreenNode {
24995                kind: SyntaxKind::TriviumSkippedNode,
24996                details: GreenNodeDetails::Node { children: children.into(), width },
24997            })
24998            .intern(db),
24999        )
25000    }
25001}
25002impl TriviumSkippedNode {
25003    pub fn node(&self, db: &dyn SyntaxGroup) -> SkippedNode {
25004        SkippedNode::from_syntax_node(db, self.node.get_children(db)[0])
25005    }
25006}
25007#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
25008pub struct TriviumSkippedNodePtr(pub SyntaxStablePtrId);
25009impl TriviumSkippedNodePtr {}
25010impl TypedStablePtr for TriviumSkippedNodePtr {
25011    type SyntaxNode = TriviumSkippedNode;
25012    fn untyped(&self) -> SyntaxStablePtrId {
25013        self.0
25014    }
25015    fn lookup(&self, db: &dyn SyntaxGroup) -> TriviumSkippedNode {
25016        TriviumSkippedNode::from_syntax_node(db, self.0.lookup(db))
25017    }
25018}
25019impl From<TriviumSkippedNodePtr> for SyntaxStablePtrId {
25020    fn from(ptr: TriviumSkippedNodePtr) -> Self {
25021        ptr.untyped()
25022    }
25023}
25024#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
25025pub struct TriviumSkippedNodeGreen(pub GreenId);
25026impl TypedSyntaxNode for TriviumSkippedNode {
25027    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TriviumSkippedNode);
25028    type StablePtr = TriviumSkippedNodePtr;
25029    type Green = TriviumSkippedNodeGreen;
25030    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
25031        TriviumSkippedNodeGreen(
25032            Arc::new(GreenNode {
25033                kind: SyntaxKind::TriviumSkippedNode,
25034                details: GreenNodeDetails::Node {
25035                    children: [SkippedNode::missing(db).0].into(),
25036                    width: TextWidth::default(),
25037                },
25038            })
25039            .intern(db),
25040        )
25041    }
25042    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
25043        let kind = node.kind(db);
25044        assert_eq!(
25045            kind,
25046            SyntaxKind::TriviumSkippedNode,
25047            "Unexpected SyntaxKind {:?}. Expected {:?}.",
25048            kind,
25049            SyntaxKind::TriviumSkippedNode
25050        );
25051        Self { node }
25052    }
25053    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
25054        let kind = node.kind(db);
25055        if kind == SyntaxKind::TriviumSkippedNode {
25056            Some(Self::from_syntax_node(db, node))
25057        } else {
25058            None
25059        }
25060    }
25061    fn as_syntax_node(&self) -> SyntaxNode {
25062        self.node
25063    }
25064    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
25065        TriviumSkippedNodePtr(self.node.stable_ptr(db))
25066    }
25067}
25068#[derive(Clone, Debug, Eq, Hash, PartialEq)]
25069pub enum SkippedNode {
25070    AttributeList(AttributeList),
25071    VisibilityPub(VisibilityPub),
25072    ExprPath(ExprPath),
25073}
25074#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
25075pub struct SkippedNodePtr(pub SyntaxStablePtrId);
25076impl TypedStablePtr for SkippedNodePtr {
25077    type SyntaxNode = SkippedNode;
25078    fn untyped(&self) -> SyntaxStablePtrId {
25079        self.0
25080    }
25081    fn lookup(&self, db: &dyn SyntaxGroup) -> SkippedNode {
25082        SkippedNode::from_syntax_node(db, self.0.lookup(db))
25083    }
25084}
25085impl From<SkippedNodePtr> for SyntaxStablePtrId {
25086    fn from(ptr: SkippedNodePtr) -> Self {
25087        ptr.untyped()
25088    }
25089}
25090impl From<AttributeListPtr> for SkippedNodePtr {
25091    fn from(value: AttributeListPtr) -> Self {
25092        Self(value.0)
25093    }
25094}
25095impl From<VisibilityPubPtr> for SkippedNodePtr {
25096    fn from(value: VisibilityPubPtr) -> Self {
25097        Self(value.0)
25098    }
25099}
25100impl From<ExprPathPtr> for SkippedNodePtr {
25101    fn from(value: ExprPathPtr) -> Self {
25102        Self(value.0)
25103    }
25104}
25105impl From<AttributeListGreen> for SkippedNodeGreen {
25106    fn from(value: AttributeListGreen) -> Self {
25107        Self(value.0)
25108    }
25109}
25110impl From<VisibilityPubGreen> for SkippedNodeGreen {
25111    fn from(value: VisibilityPubGreen) -> Self {
25112        Self(value.0)
25113    }
25114}
25115impl From<ExprPathGreen> for SkippedNodeGreen {
25116    fn from(value: ExprPathGreen) -> Self {
25117        Self(value.0)
25118    }
25119}
25120#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
25121pub struct SkippedNodeGreen(pub GreenId);
25122impl TypedSyntaxNode for SkippedNode {
25123    const OPTIONAL_KIND: Option<SyntaxKind> = None;
25124    type StablePtr = SkippedNodePtr;
25125    type Green = SkippedNodeGreen;
25126    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
25127        panic!("No missing variant.");
25128    }
25129    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
25130        let kind = node.kind(db);
25131        match kind {
25132            SyntaxKind::AttributeList => {
25133                SkippedNode::AttributeList(AttributeList::from_syntax_node(db, node))
25134            }
25135            SyntaxKind::VisibilityPub => {
25136                SkippedNode::VisibilityPub(VisibilityPub::from_syntax_node(db, node))
25137            }
25138            SyntaxKind::ExprPath => SkippedNode::ExprPath(ExprPath::from_syntax_node(db, node)),
25139            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "SkippedNode"),
25140        }
25141    }
25142    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
25143        let kind = node.kind(db);
25144        match kind {
25145            SyntaxKind::AttributeList => {
25146                Some(SkippedNode::AttributeList(AttributeList::from_syntax_node(db, node)))
25147            }
25148            SyntaxKind::VisibilityPub => {
25149                Some(SkippedNode::VisibilityPub(VisibilityPub::from_syntax_node(db, node)))
25150            }
25151            SyntaxKind::ExprPath => {
25152                Some(SkippedNode::ExprPath(ExprPath::from_syntax_node(db, node)))
25153            }
25154            _ => None,
25155        }
25156    }
25157    fn as_syntax_node(&self) -> SyntaxNode {
25158        match self {
25159            SkippedNode::AttributeList(x) => x.as_syntax_node(),
25160            SkippedNode::VisibilityPub(x) => x.as_syntax_node(),
25161            SkippedNode::ExprPath(x) => x.as_syntax_node(),
25162        }
25163    }
25164    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
25165        SkippedNodePtr(self.as_syntax_node().lookup_intern(db).stable_ptr)
25166    }
25167}
25168impl SkippedNode {
25169    /// Checks if a kind of a variant of [SkippedNode].
25170    pub fn is_variant(kind: SyntaxKind) -> bool {
25171        matches!(kind, SyntaxKind::AttributeList | SyntaxKind::VisibilityPub | SyntaxKind::ExprPath)
25172    }
25173}
25174#[derive(Clone, Debug, Eq, Hash, PartialEq)]
25175pub struct TokenIdentifier {
25176    node: SyntaxNode,
25177}
25178impl Token for TokenIdentifier {
25179    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
25180        TokenIdentifierGreen(
25181            Arc::new(GreenNode {
25182                kind: SyntaxKind::TokenIdentifier,
25183                details: GreenNodeDetails::Token(text),
25184            })
25185            .intern(db),
25186        )
25187    }
25188    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
25189        extract_matches!(
25190            &self.node.lookup_intern(db).green.lookup_intern(db).details,
25191            GreenNodeDetails::Token
25192        )
25193        .clone()
25194    }
25195}
25196#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
25197pub struct TokenIdentifierPtr(pub SyntaxStablePtrId);
25198impl TypedStablePtr for TokenIdentifierPtr {
25199    type SyntaxNode = TokenIdentifier;
25200    fn untyped(&self) -> SyntaxStablePtrId {
25201        self.0
25202    }
25203    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenIdentifier {
25204        TokenIdentifier::from_syntax_node(db, self.0.lookup(db))
25205    }
25206}
25207impl From<TokenIdentifierPtr> for SyntaxStablePtrId {
25208    fn from(ptr: TokenIdentifierPtr) -> Self {
25209        ptr.untyped()
25210    }
25211}
25212#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
25213pub struct TokenIdentifierGreen(pub GreenId);
25214impl TokenIdentifierGreen {
25215    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
25216        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
25217    }
25218}
25219impl TypedSyntaxNode for TokenIdentifier {
25220    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenIdentifier);
25221    type StablePtr = TokenIdentifierPtr;
25222    type Green = TokenIdentifierGreen;
25223    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
25224        TokenIdentifierGreen(
25225            Arc::new(GreenNode {
25226                kind: SyntaxKind::TokenMissing,
25227                details: GreenNodeDetails::Token("".into()),
25228            })
25229            .intern(db),
25230        )
25231    }
25232    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
25233        match node.lookup_intern(db).green.lookup_intern(db).details {
25234            GreenNodeDetails::Token(_) => Self { node },
25235            GreenNodeDetails::Node { .. } => {
25236                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenIdentifier)
25237            }
25238        }
25239    }
25240    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
25241        match node.lookup_intern(db).green.lookup_intern(db).details {
25242            GreenNodeDetails::Token(_) => Some(Self { node }),
25243            GreenNodeDetails::Node { .. } => None,
25244        }
25245    }
25246    fn as_syntax_node(&self) -> SyntaxNode {
25247        self.node
25248    }
25249    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
25250        TokenIdentifierPtr(self.node.stable_ptr(db))
25251    }
25252}
25253#[derive(Clone, Debug, Eq, Hash, PartialEq)]
25254pub struct TerminalIdentifier {
25255    node: SyntaxNode,
25256}
25257impl Terminal for TerminalIdentifier {
25258    const KIND: SyntaxKind = SyntaxKind::TerminalIdentifier;
25259    type TokenType = TokenIdentifier;
25260    fn new_green(
25261        db: &dyn SyntaxGroup,
25262        leading_trivia: TriviaGreen,
25263        token: <<TerminalIdentifier as Terminal>::TokenType as TypedSyntaxNode>::Green,
25264        trailing_trivia: TriviaGreen,
25265    ) -> Self::Green {
25266        let children = [leading_trivia.0, token.0, trailing_trivia.0];
25267        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
25268        TerminalIdentifierGreen(
25269            Arc::new(GreenNode {
25270                kind: SyntaxKind::TerminalIdentifier,
25271                details: GreenNodeDetails::Node { children: children.into(), width },
25272            })
25273            .intern(db),
25274        )
25275    }
25276    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
25277        let GreenNodeDetails::Node { children, .. } =
25278            &self.node.lookup_intern(db).green.lookup_intern(db).details
25279        else {
25280            unreachable!("Expected a node, not a token");
25281        };
25282        extract_matches!(&children[1].lookup_intern(db).details, GreenNodeDetails::Token).clone()
25283    }
25284}
25285impl TerminalIdentifier {
25286    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
25287        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
25288    }
25289    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenIdentifier {
25290        TokenIdentifier::from_syntax_node(db, self.node.get_children(db)[1])
25291    }
25292    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
25293        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
25294    }
25295}
25296#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
25297pub struct TerminalIdentifierPtr(pub SyntaxStablePtrId);
25298impl TerminalIdentifierPtr {}
25299impl TypedStablePtr for TerminalIdentifierPtr {
25300    type SyntaxNode = TerminalIdentifier;
25301    fn untyped(&self) -> SyntaxStablePtrId {
25302        self.0
25303    }
25304    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier {
25305        TerminalIdentifier::from_syntax_node(db, self.0.lookup(db))
25306    }
25307}
25308impl From<TerminalIdentifierPtr> for SyntaxStablePtrId {
25309    fn from(ptr: TerminalIdentifierPtr) -> Self {
25310        ptr.untyped()
25311    }
25312}
25313#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
25314pub struct TerminalIdentifierGreen(pub GreenId);
25315impl TypedSyntaxNode for TerminalIdentifier {
25316    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalIdentifier);
25317    type StablePtr = TerminalIdentifierPtr;
25318    type Green = TerminalIdentifierGreen;
25319    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
25320        TerminalIdentifierGreen(
25321            Arc::new(GreenNode {
25322                kind: SyntaxKind::TerminalIdentifier,
25323                details: GreenNodeDetails::Node {
25324                    children: [
25325                        Trivia::missing(db).0,
25326                        TokenIdentifier::missing(db).0,
25327                        Trivia::missing(db).0,
25328                    ]
25329                    .into(),
25330                    width: TextWidth::default(),
25331                },
25332            })
25333            .intern(db),
25334        )
25335    }
25336    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
25337        let kind = node.kind(db);
25338        assert_eq!(
25339            kind,
25340            SyntaxKind::TerminalIdentifier,
25341            "Unexpected SyntaxKind {:?}. Expected {:?}.",
25342            kind,
25343            SyntaxKind::TerminalIdentifier
25344        );
25345        Self { node }
25346    }
25347    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
25348        let kind = node.kind(db);
25349        if kind == SyntaxKind::TerminalIdentifier {
25350            Some(Self::from_syntax_node(db, node))
25351        } else {
25352            None
25353        }
25354    }
25355    fn as_syntax_node(&self) -> SyntaxNode {
25356        self.node
25357    }
25358    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
25359        TerminalIdentifierPtr(self.node.stable_ptr(db))
25360    }
25361}
25362#[derive(Clone, Debug, Eq, Hash, PartialEq)]
25363pub struct TokenLiteralNumber {
25364    node: SyntaxNode,
25365}
25366impl Token for TokenLiteralNumber {
25367    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
25368        TokenLiteralNumberGreen(
25369            Arc::new(GreenNode {
25370                kind: SyntaxKind::TokenLiteralNumber,
25371                details: GreenNodeDetails::Token(text),
25372            })
25373            .intern(db),
25374        )
25375    }
25376    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
25377        extract_matches!(
25378            &self.node.lookup_intern(db).green.lookup_intern(db).details,
25379            GreenNodeDetails::Token
25380        )
25381        .clone()
25382    }
25383}
25384#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
25385pub struct TokenLiteralNumberPtr(pub SyntaxStablePtrId);
25386impl TypedStablePtr for TokenLiteralNumberPtr {
25387    type SyntaxNode = TokenLiteralNumber;
25388    fn untyped(&self) -> SyntaxStablePtrId {
25389        self.0
25390    }
25391    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenLiteralNumber {
25392        TokenLiteralNumber::from_syntax_node(db, self.0.lookup(db))
25393    }
25394}
25395impl From<TokenLiteralNumberPtr> for SyntaxStablePtrId {
25396    fn from(ptr: TokenLiteralNumberPtr) -> Self {
25397        ptr.untyped()
25398    }
25399}
25400#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
25401pub struct TokenLiteralNumberGreen(pub GreenId);
25402impl TokenLiteralNumberGreen {
25403    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
25404        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
25405    }
25406}
25407impl TypedSyntaxNode for TokenLiteralNumber {
25408    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenLiteralNumber);
25409    type StablePtr = TokenLiteralNumberPtr;
25410    type Green = TokenLiteralNumberGreen;
25411    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
25412        TokenLiteralNumberGreen(
25413            Arc::new(GreenNode {
25414                kind: SyntaxKind::TokenMissing,
25415                details: GreenNodeDetails::Token("".into()),
25416            })
25417            .intern(db),
25418        )
25419    }
25420    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
25421        match node.lookup_intern(db).green.lookup_intern(db).details {
25422            GreenNodeDetails::Token(_) => Self { node },
25423            GreenNodeDetails::Node { .. } => panic!(
25424                "Expected a token {:?}, not an internal node",
25425                SyntaxKind::TokenLiteralNumber
25426            ),
25427        }
25428    }
25429    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
25430        match node.lookup_intern(db).green.lookup_intern(db).details {
25431            GreenNodeDetails::Token(_) => Some(Self { node }),
25432            GreenNodeDetails::Node { .. } => None,
25433        }
25434    }
25435    fn as_syntax_node(&self) -> SyntaxNode {
25436        self.node
25437    }
25438    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
25439        TokenLiteralNumberPtr(self.node.stable_ptr(db))
25440    }
25441}
25442#[derive(Clone, Debug, Eq, Hash, PartialEq)]
25443pub struct TerminalLiteralNumber {
25444    node: SyntaxNode,
25445}
25446impl Terminal for TerminalLiteralNumber {
25447    const KIND: SyntaxKind = SyntaxKind::TerminalLiteralNumber;
25448    type TokenType = TokenLiteralNumber;
25449    fn new_green(
25450        db: &dyn SyntaxGroup,
25451        leading_trivia: TriviaGreen,
25452        token: <<TerminalLiteralNumber as Terminal>::TokenType as TypedSyntaxNode>::Green,
25453        trailing_trivia: TriviaGreen,
25454    ) -> Self::Green {
25455        let children = [leading_trivia.0, token.0, trailing_trivia.0];
25456        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
25457        TerminalLiteralNumberGreen(
25458            Arc::new(GreenNode {
25459                kind: SyntaxKind::TerminalLiteralNumber,
25460                details: GreenNodeDetails::Node { children: children.into(), width },
25461            })
25462            .intern(db),
25463        )
25464    }
25465    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
25466        let GreenNodeDetails::Node { children, .. } =
25467            &self.node.lookup_intern(db).green.lookup_intern(db).details
25468        else {
25469            unreachable!("Expected a node, not a token");
25470        };
25471        extract_matches!(&children[1].lookup_intern(db).details, GreenNodeDetails::Token).clone()
25472    }
25473}
25474impl TerminalLiteralNumber {
25475    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
25476        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
25477    }
25478    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenLiteralNumber {
25479        TokenLiteralNumber::from_syntax_node(db, self.node.get_children(db)[1])
25480    }
25481    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
25482        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
25483    }
25484}
25485#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
25486pub struct TerminalLiteralNumberPtr(pub SyntaxStablePtrId);
25487impl TerminalLiteralNumberPtr {}
25488impl TypedStablePtr for TerminalLiteralNumberPtr {
25489    type SyntaxNode = TerminalLiteralNumber;
25490    fn untyped(&self) -> SyntaxStablePtrId {
25491        self.0
25492    }
25493    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalLiteralNumber {
25494        TerminalLiteralNumber::from_syntax_node(db, self.0.lookup(db))
25495    }
25496}
25497impl From<TerminalLiteralNumberPtr> for SyntaxStablePtrId {
25498    fn from(ptr: TerminalLiteralNumberPtr) -> Self {
25499        ptr.untyped()
25500    }
25501}
25502#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
25503pub struct TerminalLiteralNumberGreen(pub GreenId);
25504impl TypedSyntaxNode for TerminalLiteralNumber {
25505    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalLiteralNumber);
25506    type StablePtr = TerminalLiteralNumberPtr;
25507    type Green = TerminalLiteralNumberGreen;
25508    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
25509        TerminalLiteralNumberGreen(
25510            Arc::new(GreenNode {
25511                kind: SyntaxKind::TerminalLiteralNumber,
25512                details: GreenNodeDetails::Node {
25513                    children: [
25514                        Trivia::missing(db).0,
25515                        TokenLiteralNumber::missing(db).0,
25516                        Trivia::missing(db).0,
25517                    ]
25518                    .into(),
25519                    width: TextWidth::default(),
25520                },
25521            })
25522            .intern(db),
25523        )
25524    }
25525    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
25526        let kind = node.kind(db);
25527        assert_eq!(
25528            kind,
25529            SyntaxKind::TerminalLiteralNumber,
25530            "Unexpected SyntaxKind {:?}. Expected {:?}.",
25531            kind,
25532            SyntaxKind::TerminalLiteralNumber
25533        );
25534        Self { node }
25535    }
25536    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
25537        let kind = node.kind(db);
25538        if kind == SyntaxKind::TerminalLiteralNumber {
25539            Some(Self::from_syntax_node(db, node))
25540        } else {
25541            None
25542        }
25543    }
25544    fn as_syntax_node(&self) -> SyntaxNode {
25545        self.node
25546    }
25547    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
25548        TerminalLiteralNumberPtr(self.node.stable_ptr(db))
25549    }
25550}
25551#[derive(Clone, Debug, Eq, Hash, PartialEq)]
25552pub struct TokenShortString {
25553    node: SyntaxNode,
25554}
25555impl Token for TokenShortString {
25556    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
25557        TokenShortStringGreen(
25558            Arc::new(GreenNode {
25559                kind: SyntaxKind::TokenShortString,
25560                details: GreenNodeDetails::Token(text),
25561            })
25562            .intern(db),
25563        )
25564    }
25565    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
25566        extract_matches!(
25567            &self.node.lookup_intern(db).green.lookup_intern(db).details,
25568            GreenNodeDetails::Token
25569        )
25570        .clone()
25571    }
25572}
25573#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
25574pub struct TokenShortStringPtr(pub SyntaxStablePtrId);
25575impl TypedStablePtr for TokenShortStringPtr {
25576    type SyntaxNode = TokenShortString;
25577    fn untyped(&self) -> SyntaxStablePtrId {
25578        self.0
25579    }
25580    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenShortString {
25581        TokenShortString::from_syntax_node(db, self.0.lookup(db))
25582    }
25583}
25584impl From<TokenShortStringPtr> for SyntaxStablePtrId {
25585    fn from(ptr: TokenShortStringPtr) -> Self {
25586        ptr.untyped()
25587    }
25588}
25589#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
25590pub struct TokenShortStringGreen(pub GreenId);
25591impl TokenShortStringGreen {
25592    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
25593        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
25594    }
25595}
25596impl TypedSyntaxNode for TokenShortString {
25597    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenShortString);
25598    type StablePtr = TokenShortStringPtr;
25599    type Green = TokenShortStringGreen;
25600    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
25601        TokenShortStringGreen(
25602            Arc::new(GreenNode {
25603                kind: SyntaxKind::TokenMissing,
25604                details: GreenNodeDetails::Token("".into()),
25605            })
25606            .intern(db),
25607        )
25608    }
25609    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
25610        match node.lookup_intern(db).green.lookup_intern(db).details {
25611            GreenNodeDetails::Token(_) => Self { node },
25612            GreenNodeDetails::Node { .. } => {
25613                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenShortString)
25614            }
25615        }
25616    }
25617    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
25618        match node.lookup_intern(db).green.lookup_intern(db).details {
25619            GreenNodeDetails::Token(_) => Some(Self { node }),
25620            GreenNodeDetails::Node { .. } => None,
25621        }
25622    }
25623    fn as_syntax_node(&self) -> SyntaxNode {
25624        self.node
25625    }
25626    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
25627        TokenShortStringPtr(self.node.stable_ptr(db))
25628    }
25629}
25630#[derive(Clone, Debug, Eq, Hash, PartialEq)]
25631pub struct TerminalShortString {
25632    node: SyntaxNode,
25633}
25634impl Terminal for TerminalShortString {
25635    const KIND: SyntaxKind = SyntaxKind::TerminalShortString;
25636    type TokenType = TokenShortString;
25637    fn new_green(
25638        db: &dyn SyntaxGroup,
25639        leading_trivia: TriviaGreen,
25640        token: <<TerminalShortString as Terminal>::TokenType as TypedSyntaxNode>::Green,
25641        trailing_trivia: TriviaGreen,
25642    ) -> Self::Green {
25643        let children = [leading_trivia.0, token.0, trailing_trivia.0];
25644        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
25645        TerminalShortStringGreen(
25646            Arc::new(GreenNode {
25647                kind: SyntaxKind::TerminalShortString,
25648                details: GreenNodeDetails::Node { children: children.into(), width },
25649            })
25650            .intern(db),
25651        )
25652    }
25653    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
25654        let GreenNodeDetails::Node { children, .. } =
25655            &self.node.lookup_intern(db).green.lookup_intern(db).details
25656        else {
25657            unreachable!("Expected a node, not a token");
25658        };
25659        extract_matches!(&children[1].lookup_intern(db).details, GreenNodeDetails::Token).clone()
25660    }
25661}
25662impl TerminalShortString {
25663    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
25664        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
25665    }
25666    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenShortString {
25667        TokenShortString::from_syntax_node(db, self.node.get_children(db)[1])
25668    }
25669    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
25670        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
25671    }
25672}
25673#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
25674pub struct TerminalShortStringPtr(pub SyntaxStablePtrId);
25675impl TerminalShortStringPtr {}
25676impl TypedStablePtr for TerminalShortStringPtr {
25677    type SyntaxNode = TerminalShortString;
25678    fn untyped(&self) -> SyntaxStablePtrId {
25679        self.0
25680    }
25681    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalShortString {
25682        TerminalShortString::from_syntax_node(db, self.0.lookup(db))
25683    }
25684}
25685impl From<TerminalShortStringPtr> for SyntaxStablePtrId {
25686    fn from(ptr: TerminalShortStringPtr) -> Self {
25687        ptr.untyped()
25688    }
25689}
25690#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
25691pub struct TerminalShortStringGreen(pub GreenId);
25692impl TypedSyntaxNode for TerminalShortString {
25693    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalShortString);
25694    type StablePtr = TerminalShortStringPtr;
25695    type Green = TerminalShortStringGreen;
25696    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
25697        TerminalShortStringGreen(
25698            Arc::new(GreenNode {
25699                kind: SyntaxKind::TerminalShortString,
25700                details: GreenNodeDetails::Node {
25701                    children: [
25702                        Trivia::missing(db).0,
25703                        TokenShortString::missing(db).0,
25704                        Trivia::missing(db).0,
25705                    ]
25706                    .into(),
25707                    width: TextWidth::default(),
25708                },
25709            })
25710            .intern(db),
25711        )
25712    }
25713    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
25714        let kind = node.kind(db);
25715        assert_eq!(
25716            kind,
25717            SyntaxKind::TerminalShortString,
25718            "Unexpected SyntaxKind {:?}. Expected {:?}.",
25719            kind,
25720            SyntaxKind::TerminalShortString
25721        );
25722        Self { node }
25723    }
25724    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
25725        let kind = node.kind(db);
25726        if kind == SyntaxKind::TerminalShortString {
25727            Some(Self::from_syntax_node(db, node))
25728        } else {
25729            None
25730        }
25731    }
25732    fn as_syntax_node(&self) -> SyntaxNode {
25733        self.node
25734    }
25735    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
25736        TerminalShortStringPtr(self.node.stable_ptr(db))
25737    }
25738}
25739#[derive(Clone, Debug, Eq, Hash, PartialEq)]
25740pub struct TokenString {
25741    node: SyntaxNode,
25742}
25743impl Token for TokenString {
25744    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
25745        TokenStringGreen(
25746            Arc::new(GreenNode {
25747                kind: SyntaxKind::TokenString,
25748                details: GreenNodeDetails::Token(text),
25749            })
25750            .intern(db),
25751        )
25752    }
25753    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
25754        extract_matches!(
25755            &self.node.lookup_intern(db).green.lookup_intern(db).details,
25756            GreenNodeDetails::Token
25757        )
25758        .clone()
25759    }
25760}
25761#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
25762pub struct TokenStringPtr(pub SyntaxStablePtrId);
25763impl TypedStablePtr for TokenStringPtr {
25764    type SyntaxNode = TokenString;
25765    fn untyped(&self) -> SyntaxStablePtrId {
25766        self.0
25767    }
25768    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenString {
25769        TokenString::from_syntax_node(db, self.0.lookup(db))
25770    }
25771}
25772impl From<TokenStringPtr> for SyntaxStablePtrId {
25773    fn from(ptr: TokenStringPtr) -> Self {
25774        ptr.untyped()
25775    }
25776}
25777#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
25778pub struct TokenStringGreen(pub GreenId);
25779impl TokenStringGreen {
25780    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
25781        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
25782    }
25783}
25784impl TypedSyntaxNode for TokenString {
25785    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenString);
25786    type StablePtr = TokenStringPtr;
25787    type Green = TokenStringGreen;
25788    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
25789        TokenStringGreen(
25790            Arc::new(GreenNode {
25791                kind: SyntaxKind::TokenMissing,
25792                details: GreenNodeDetails::Token("".into()),
25793            })
25794            .intern(db),
25795        )
25796    }
25797    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
25798        match node.lookup_intern(db).green.lookup_intern(db).details {
25799            GreenNodeDetails::Token(_) => Self { node },
25800            GreenNodeDetails::Node { .. } => {
25801                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenString)
25802            }
25803        }
25804    }
25805    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
25806        match node.lookup_intern(db).green.lookup_intern(db).details {
25807            GreenNodeDetails::Token(_) => Some(Self { node }),
25808            GreenNodeDetails::Node { .. } => None,
25809        }
25810    }
25811    fn as_syntax_node(&self) -> SyntaxNode {
25812        self.node
25813    }
25814    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
25815        TokenStringPtr(self.node.stable_ptr(db))
25816    }
25817}
25818#[derive(Clone, Debug, Eq, Hash, PartialEq)]
25819pub struct TerminalString {
25820    node: SyntaxNode,
25821}
25822impl Terminal for TerminalString {
25823    const KIND: SyntaxKind = SyntaxKind::TerminalString;
25824    type TokenType = TokenString;
25825    fn new_green(
25826        db: &dyn SyntaxGroup,
25827        leading_trivia: TriviaGreen,
25828        token: <<TerminalString as Terminal>::TokenType as TypedSyntaxNode>::Green,
25829        trailing_trivia: TriviaGreen,
25830    ) -> Self::Green {
25831        let children = [leading_trivia.0, token.0, trailing_trivia.0];
25832        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
25833        TerminalStringGreen(
25834            Arc::new(GreenNode {
25835                kind: SyntaxKind::TerminalString,
25836                details: GreenNodeDetails::Node { children: children.into(), width },
25837            })
25838            .intern(db),
25839        )
25840    }
25841    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
25842        let GreenNodeDetails::Node { children, .. } =
25843            &self.node.lookup_intern(db).green.lookup_intern(db).details
25844        else {
25845            unreachable!("Expected a node, not a token");
25846        };
25847        extract_matches!(&children[1].lookup_intern(db).details, GreenNodeDetails::Token).clone()
25848    }
25849}
25850impl TerminalString {
25851    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
25852        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
25853    }
25854    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenString {
25855        TokenString::from_syntax_node(db, self.node.get_children(db)[1])
25856    }
25857    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
25858        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
25859    }
25860}
25861#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
25862pub struct TerminalStringPtr(pub SyntaxStablePtrId);
25863impl TerminalStringPtr {}
25864impl TypedStablePtr for TerminalStringPtr {
25865    type SyntaxNode = TerminalString;
25866    fn untyped(&self) -> SyntaxStablePtrId {
25867        self.0
25868    }
25869    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalString {
25870        TerminalString::from_syntax_node(db, self.0.lookup(db))
25871    }
25872}
25873impl From<TerminalStringPtr> for SyntaxStablePtrId {
25874    fn from(ptr: TerminalStringPtr) -> Self {
25875        ptr.untyped()
25876    }
25877}
25878#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
25879pub struct TerminalStringGreen(pub GreenId);
25880impl TypedSyntaxNode for TerminalString {
25881    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalString);
25882    type StablePtr = TerminalStringPtr;
25883    type Green = TerminalStringGreen;
25884    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
25885        TerminalStringGreen(
25886            Arc::new(GreenNode {
25887                kind: SyntaxKind::TerminalString,
25888                details: GreenNodeDetails::Node {
25889                    children: [
25890                        Trivia::missing(db).0,
25891                        TokenString::missing(db).0,
25892                        Trivia::missing(db).0,
25893                    ]
25894                    .into(),
25895                    width: TextWidth::default(),
25896                },
25897            })
25898            .intern(db),
25899        )
25900    }
25901    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
25902        let kind = node.kind(db);
25903        assert_eq!(
25904            kind,
25905            SyntaxKind::TerminalString,
25906            "Unexpected SyntaxKind {:?}. Expected {:?}.",
25907            kind,
25908            SyntaxKind::TerminalString
25909        );
25910        Self { node }
25911    }
25912    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
25913        let kind = node.kind(db);
25914        if kind == SyntaxKind::TerminalString {
25915            Some(Self::from_syntax_node(db, node))
25916        } else {
25917            None
25918        }
25919    }
25920    fn as_syntax_node(&self) -> SyntaxNode {
25921        self.node
25922    }
25923    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
25924        TerminalStringPtr(self.node.stable_ptr(db))
25925    }
25926}
25927#[derive(Clone, Debug, Eq, Hash, PartialEq)]
25928pub struct TokenAs {
25929    node: SyntaxNode,
25930}
25931impl Token for TokenAs {
25932    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
25933        TokenAsGreen(
25934            Arc::new(GreenNode {
25935                kind: SyntaxKind::TokenAs,
25936                details: GreenNodeDetails::Token(text),
25937            })
25938            .intern(db),
25939        )
25940    }
25941    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
25942        extract_matches!(
25943            &self.node.lookup_intern(db).green.lookup_intern(db).details,
25944            GreenNodeDetails::Token
25945        )
25946        .clone()
25947    }
25948}
25949#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
25950pub struct TokenAsPtr(pub SyntaxStablePtrId);
25951impl TypedStablePtr for TokenAsPtr {
25952    type SyntaxNode = TokenAs;
25953    fn untyped(&self) -> SyntaxStablePtrId {
25954        self.0
25955    }
25956    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenAs {
25957        TokenAs::from_syntax_node(db, self.0.lookup(db))
25958    }
25959}
25960impl From<TokenAsPtr> for SyntaxStablePtrId {
25961    fn from(ptr: TokenAsPtr) -> Self {
25962        ptr.untyped()
25963    }
25964}
25965#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
25966pub struct TokenAsGreen(pub GreenId);
25967impl TokenAsGreen {
25968    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
25969        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
25970    }
25971}
25972impl TypedSyntaxNode for TokenAs {
25973    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenAs);
25974    type StablePtr = TokenAsPtr;
25975    type Green = TokenAsGreen;
25976    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
25977        TokenAsGreen(
25978            Arc::new(GreenNode {
25979                kind: SyntaxKind::TokenMissing,
25980                details: GreenNodeDetails::Token("".into()),
25981            })
25982            .intern(db),
25983        )
25984    }
25985    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
25986        match node.lookup_intern(db).green.lookup_intern(db).details {
25987            GreenNodeDetails::Token(_) => Self { node },
25988            GreenNodeDetails::Node { .. } => {
25989                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenAs)
25990            }
25991        }
25992    }
25993    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
25994        match node.lookup_intern(db).green.lookup_intern(db).details {
25995            GreenNodeDetails::Token(_) => Some(Self { node }),
25996            GreenNodeDetails::Node { .. } => None,
25997        }
25998    }
25999    fn as_syntax_node(&self) -> SyntaxNode {
26000        self.node
26001    }
26002    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
26003        TokenAsPtr(self.node.stable_ptr(db))
26004    }
26005}
26006#[derive(Clone, Debug, Eq, Hash, PartialEq)]
26007pub struct TerminalAs {
26008    node: SyntaxNode,
26009}
26010impl Terminal for TerminalAs {
26011    const KIND: SyntaxKind = SyntaxKind::TerminalAs;
26012    type TokenType = TokenAs;
26013    fn new_green(
26014        db: &dyn SyntaxGroup,
26015        leading_trivia: TriviaGreen,
26016        token: <<TerminalAs as Terminal>::TokenType as TypedSyntaxNode>::Green,
26017        trailing_trivia: TriviaGreen,
26018    ) -> Self::Green {
26019        let children = [leading_trivia.0, token.0, trailing_trivia.0];
26020        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
26021        TerminalAsGreen(
26022            Arc::new(GreenNode {
26023                kind: SyntaxKind::TerminalAs,
26024                details: GreenNodeDetails::Node { children: children.into(), width },
26025            })
26026            .intern(db),
26027        )
26028    }
26029    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
26030        let GreenNodeDetails::Node { children, .. } =
26031            &self.node.lookup_intern(db).green.lookup_intern(db).details
26032        else {
26033            unreachable!("Expected a node, not a token");
26034        };
26035        extract_matches!(&children[1].lookup_intern(db).details, GreenNodeDetails::Token).clone()
26036    }
26037}
26038impl TerminalAs {
26039    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
26040        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
26041    }
26042    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenAs {
26043        TokenAs::from_syntax_node(db, self.node.get_children(db)[1])
26044    }
26045    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
26046        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
26047    }
26048}
26049#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
26050pub struct TerminalAsPtr(pub SyntaxStablePtrId);
26051impl TerminalAsPtr {}
26052impl TypedStablePtr for TerminalAsPtr {
26053    type SyntaxNode = TerminalAs;
26054    fn untyped(&self) -> SyntaxStablePtrId {
26055        self.0
26056    }
26057    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalAs {
26058        TerminalAs::from_syntax_node(db, self.0.lookup(db))
26059    }
26060}
26061impl From<TerminalAsPtr> for SyntaxStablePtrId {
26062    fn from(ptr: TerminalAsPtr) -> Self {
26063        ptr.untyped()
26064    }
26065}
26066#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
26067pub struct TerminalAsGreen(pub GreenId);
26068impl TypedSyntaxNode for TerminalAs {
26069    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalAs);
26070    type StablePtr = TerminalAsPtr;
26071    type Green = TerminalAsGreen;
26072    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
26073        TerminalAsGreen(
26074            Arc::new(GreenNode {
26075                kind: SyntaxKind::TerminalAs,
26076                details: GreenNodeDetails::Node {
26077                    children: [
26078                        Trivia::missing(db).0,
26079                        TokenAs::missing(db).0,
26080                        Trivia::missing(db).0,
26081                    ]
26082                    .into(),
26083                    width: TextWidth::default(),
26084                },
26085            })
26086            .intern(db),
26087        )
26088    }
26089    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
26090        let kind = node.kind(db);
26091        assert_eq!(
26092            kind,
26093            SyntaxKind::TerminalAs,
26094            "Unexpected SyntaxKind {:?}. Expected {:?}.",
26095            kind,
26096            SyntaxKind::TerminalAs
26097        );
26098        Self { node }
26099    }
26100    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
26101        let kind = node.kind(db);
26102        if kind == SyntaxKind::TerminalAs { Some(Self::from_syntax_node(db, node)) } else { None }
26103    }
26104    fn as_syntax_node(&self) -> SyntaxNode {
26105        self.node
26106    }
26107    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
26108        TerminalAsPtr(self.node.stable_ptr(db))
26109    }
26110}
26111#[derive(Clone, Debug, Eq, Hash, PartialEq)]
26112pub struct TokenConst {
26113    node: SyntaxNode,
26114}
26115impl Token for TokenConst {
26116    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
26117        TokenConstGreen(
26118            Arc::new(GreenNode {
26119                kind: SyntaxKind::TokenConst,
26120                details: GreenNodeDetails::Token(text),
26121            })
26122            .intern(db),
26123        )
26124    }
26125    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
26126        extract_matches!(
26127            &self.node.lookup_intern(db).green.lookup_intern(db).details,
26128            GreenNodeDetails::Token
26129        )
26130        .clone()
26131    }
26132}
26133#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
26134pub struct TokenConstPtr(pub SyntaxStablePtrId);
26135impl TypedStablePtr for TokenConstPtr {
26136    type SyntaxNode = TokenConst;
26137    fn untyped(&self) -> SyntaxStablePtrId {
26138        self.0
26139    }
26140    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenConst {
26141        TokenConst::from_syntax_node(db, self.0.lookup(db))
26142    }
26143}
26144impl From<TokenConstPtr> for SyntaxStablePtrId {
26145    fn from(ptr: TokenConstPtr) -> Self {
26146        ptr.untyped()
26147    }
26148}
26149#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
26150pub struct TokenConstGreen(pub GreenId);
26151impl TokenConstGreen {
26152    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
26153        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
26154    }
26155}
26156impl TypedSyntaxNode for TokenConst {
26157    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenConst);
26158    type StablePtr = TokenConstPtr;
26159    type Green = TokenConstGreen;
26160    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
26161        TokenConstGreen(
26162            Arc::new(GreenNode {
26163                kind: SyntaxKind::TokenMissing,
26164                details: GreenNodeDetails::Token("".into()),
26165            })
26166            .intern(db),
26167        )
26168    }
26169    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
26170        match node.lookup_intern(db).green.lookup_intern(db).details {
26171            GreenNodeDetails::Token(_) => Self { node },
26172            GreenNodeDetails::Node { .. } => {
26173                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenConst)
26174            }
26175        }
26176    }
26177    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
26178        match node.lookup_intern(db).green.lookup_intern(db).details {
26179            GreenNodeDetails::Token(_) => Some(Self { node }),
26180            GreenNodeDetails::Node { .. } => None,
26181        }
26182    }
26183    fn as_syntax_node(&self) -> SyntaxNode {
26184        self.node
26185    }
26186    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
26187        TokenConstPtr(self.node.stable_ptr(db))
26188    }
26189}
26190#[derive(Clone, Debug, Eq, Hash, PartialEq)]
26191pub struct TerminalConst {
26192    node: SyntaxNode,
26193}
26194impl Terminal for TerminalConst {
26195    const KIND: SyntaxKind = SyntaxKind::TerminalConst;
26196    type TokenType = TokenConst;
26197    fn new_green(
26198        db: &dyn SyntaxGroup,
26199        leading_trivia: TriviaGreen,
26200        token: <<TerminalConst as Terminal>::TokenType as TypedSyntaxNode>::Green,
26201        trailing_trivia: TriviaGreen,
26202    ) -> Self::Green {
26203        let children = [leading_trivia.0, token.0, trailing_trivia.0];
26204        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
26205        TerminalConstGreen(
26206            Arc::new(GreenNode {
26207                kind: SyntaxKind::TerminalConst,
26208                details: GreenNodeDetails::Node { children: children.into(), width },
26209            })
26210            .intern(db),
26211        )
26212    }
26213    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
26214        let GreenNodeDetails::Node { children, .. } =
26215            &self.node.lookup_intern(db).green.lookup_intern(db).details
26216        else {
26217            unreachable!("Expected a node, not a token");
26218        };
26219        extract_matches!(&children[1].lookup_intern(db).details, GreenNodeDetails::Token).clone()
26220    }
26221}
26222impl TerminalConst {
26223    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
26224        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
26225    }
26226    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenConst {
26227        TokenConst::from_syntax_node(db, self.node.get_children(db)[1])
26228    }
26229    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
26230        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
26231    }
26232}
26233#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
26234pub struct TerminalConstPtr(pub SyntaxStablePtrId);
26235impl TerminalConstPtr {}
26236impl TypedStablePtr for TerminalConstPtr {
26237    type SyntaxNode = TerminalConst;
26238    fn untyped(&self) -> SyntaxStablePtrId {
26239        self.0
26240    }
26241    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalConst {
26242        TerminalConst::from_syntax_node(db, self.0.lookup(db))
26243    }
26244}
26245impl From<TerminalConstPtr> for SyntaxStablePtrId {
26246    fn from(ptr: TerminalConstPtr) -> Self {
26247        ptr.untyped()
26248    }
26249}
26250#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
26251pub struct TerminalConstGreen(pub GreenId);
26252impl TypedSyntaxNode for TerminalConst {
26253    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalConst);
26254    type StablePtr = TerminalConstPtr;
26255    type Green = TerminalConstGreen;
26256    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
26257        TerminalConstGreen(
26258            Arc::new(GreenNode {
26259                kind: SyntaxKind::TerminalConst,
26260                details: GreenNodeDetails::Node {
26261                    children: [
26262                        Trivia::missing(db).0,
26263                        TokenConst::missing(db).0,
26264                        Trivia::missing(db).0,
26265                    ]
26266                    .into(),
26267                    width: TextWidth::default(),
26268                },
26269            })
26270            .intern(db),
26271        )
26272    }
26273    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
26274        let kind = node.kind(db);
26275        assert_eq!(
26276            kind,
26277            SyntaxKind::TerminalConst,
26278            "Unexpected SyntaxKind {:?}. Expected {:?}.",
26279            kind,
26280            SyntaxKind::TerminalConst
26281        );
26282        Self { node }
26283    }
26284    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
26285        let kind = node.kind(db);
26286        if kind == SyntaxKind::TerminalConst {
26287            Some(Self::from_syntax_node(db, node))
26288        } else {
26289            None
26290        }
26291    }
26292    fn as_syntax_node(&self) -> SyntaxNode {
26293        self.node
26294    }
26295    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
26296        TerminalConstPtr(self.node.stable_ptr(db))
26297    }
26298}
26299#[derive(Clone, Debug, Eq, Hash, PartialEq)]
26300pub struct TokenElse {
26301    node: SyntaxNode,
26302}
26303impl Token for TokenElse {
26304    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
26305        TokenElseGreen(
26306            Arc::new(GreenNode {
26307                kind: SyntaxKind::TokenElse,
26308                details: GreenNodeDetails::Token(text),
26309            })
26310            .intern(db),
26311        )
26312    }
26313    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
26314        extract_matches!(
26315            &self.node.lookup_intern(db).green.lookup_intern(db).details,
26316            GreenNodeDetails::Token
26317        )
26318        .clone()
26319    }
26320}
26321#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
26322pub struct TokenElsePtr(pub SyntaxStablePtrId);
26323impl TypedStablePtr for TokenElsePtr {
26324    type SyntaxNode = TokenElse;
26325    fn untyped(&self) -> SyntaxStablePtrId {
26326        self.0
26327    }
26328    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenElse {
26329        TokenElse::from_syntax_node(db, self.0.lookup(db))
26330    }
26331}
26332impl From<TokenElsePtr> for SyntaxStablePtrId {
26333    fn from(ptr: TokenElsePtr) -> Self {
26334        ptr.untyped()
26335    }
26336}
26337#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
26338pub struct TokenElseGreen(pub GreenId);
26339impl TokenElseGreen {
26340    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
26341        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
26342    }
26343}
26344impl TypedSyntaxNode for TokenElse {
26345    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenElse);
26346    type StablePtr = TokenElsePtr;
26347    type Green = TokenElseGreen;
26348    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
26349        TokenElseGreen(
26350            Arc::new(GreenNode {
26351                kind: SyntaxKind::TokenMissing,
26352                details: GreenNodeDetails::Token("".into()),
26353            })
26354            .intern(db),
26355        )
26356    }
26357    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
26358        match node.lookup_intern(db).green.lookup_intern(db).details {
26359            GreenNodeDetails::Token(_) => Self { node },
26360            GreenNodeDetails::Node { .. } => {
26361                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenElse)
26362            }
26363        }
26364    }
26365    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
26366        match node.lookup_intern(db).green.lookup_intern(db).details {
26367            GreenNodeDetails::Token(_) => Some(Self { node }),
26368            GreenNodeDetails::Node { .. } => None,
26369        }
26370    }
26371    fn as_syntax_node(&self) -> SyntaxNode {
26372        self.node
26373    }
26374    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
26375        TokenElsePtr(self.node.stable_ptr(db))
26376    }
26377}
26378#[derive(Clone, Debug, Eq, Hash, PartialEq)]
26379pub struct TerminalElse {
26380    node: SyntaxNode,
26381}
26382impl Terminal for TerminalElse {
26383    const KIND: SyntaxKind = SyntaxKind::TerminalElse;
26384    type TokenType = TokenElse;
26385    fn new_green(
26386        db: &dyn SyntaxGroup,
26387        leading_trivia: TriviaGreen,
26388        token: <<TerminalElse as Terminal>::TokenType as TypedSyntaxNode>::Green,
26389        trailing_trivia: TriviaGreen,
26390    ) -> Self::Green {
26391        let children = [leading_trivia.0, token.0, trailing_trivia.0];
26392        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
26393        TerminalElseGreen(
26394            Arc::new(GreenNode {
26395                kind: SyntaxKind::TerminalElse,
26396                details: GreenNodeDetails::Node { children: children.into(), width },
26397            })
26398            .intern(db),
26399        )
26400    }
26401    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
26402        let GreenNodeDetails::Node { children, .. } =
26403            &self.node.lookup_intern(db).green.lookup_intern(db).details
26404        else {
26405            unreachable!("Expected a node, not a token");
26406        };
26407        extract_matches!(&children[1].lookup_intern(db).details, GreenNodeDetails::Token).clone()
26408    }
26409}
26410impl TerminalElse {
26411    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
26412        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
26413    }
26414    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenElse {
26415        TokenElse::from_syntax_node(db, self.node.get_children(db)[1])
26416    }
26417    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
26418        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
26419    }
26420}
26421#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
26422pub struct TerminalElsePtr(pub SyntaxStablePtrId);
26423impl TerminalElsePtr {}
26424impl TypedStablePtr for TerminalElsePtr {
26425    type SyntaxNode = TerminalElse;
26426    fn untyped(&self) -> SyntaxStablePtrId {
26427        self.0
26428    }
26429    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalElse {
26430        TerminalElse::from_syntax_node(db, self.0.lookup(db))
26431    }
26432}
26433impl From<TerminalElsePtr> for SyntaxStablePtrId {
26434    fn from(ptr: TerminalElsePtr) -> Self {
26435        ptr.untyped()
26436    }
26437}
26438#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
26439pub struct TerminalElseGreen(pub GreenId);
26440impl TypedSyntaxNode for TerminalElse {
26441    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalElse);
26442    type StablePtr = TerminalElsePtr;
26443    type Green = TerminalElseGreen;
26444    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
26445        TerminalElseGreen(
26446            Arc::new(GreenNode {
26447                kind: SyntaxKind::TerminalElse,
26448                details: GreenNodeDetails::Node {
26449                    children: [
26450                        Trivia::missing(db).0,
26451                        TokenElse::missing(db).0,
26452                        Trivia::missing(db).0,
26453                    ]
26454                    .into(),
26455                    width: TextWidth::default(),
26456                },
26457            })
26458            .intern(db),
26459        )
26460    }
26461    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
26462        let kind = node.kind(db);
26463        assert_eq!(
26464            kind,
26465            SyntaxKind::TerminalElse,
26466            "Unexpected SyntaxKind {:?}. Expected {:?}.",
26467            kind,
26468            SyntaxKind::TerminalElse
26469        );
26470        Self { node }
26471    }
26472    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
26473        let kind = node.kind(db);
26474        if kind == SyntaxKind::TerminalElse { Some(Self::from_syntax_node(db, node)) } else { None }
26475    }
26476    fn as_syntax_node(&self) -> SyntaxNode {
26477        self.node
26478    }
26479    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
26480        TerminalElsePtr(self.node.stable_ptr(db))
26481    }
26482}
26483#[derive(Clone, Debug, Eq, Hash, PartialEq)]
26484pub struct TokenEnum {
26485    node: SyntaxNode,
26486}
26487impl Token for TokenEnum {
26488    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
26489        TokenEnumGreen(
26490            Arc::new(GreenNode {
26491                kind: SyntaxKind::TokenEnum,
26492                details: GreenNodeDetails::Token(text),
26493            })
26494            .intern(db),
26495        )
26496    }
26497    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
26498        extract_matches!(
26499            &self.node.lookup_intern(db).green.lookup_intern(db).details,
26500            GreenNodeDetails::Token
26501        )
26502        .clone()
26503    }
26504}
26505#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
26506pub struct TokenEnumPtr(pub SyntaxStablePtrId);
26507impl TypedStablePtr for TokenEnumPtr {
26508    type SyntaxNode = TokenEnum;
26509    fn untyped(&self) -> SyntaxStablePtrId {
26510        self.0
26511    }
26512    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenEnum {
26513        TokenEnum::from_syntax_node(db, self.0.lookup(db))
26514    }
26515}
26516impl From<TokenEnumPtr> for SyntaxStablePtrId {
26517    fn from(ptr: TokenEnumPtr) -> Self {
26518        ptr.untyped()
26519    }
26520}
26521#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
26522pub struct TokenEnumGreen(pub GreenId);
26523impl TokenEnumGreen {
26524    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
26525        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
26526    }
26527}
26528impl TypedSyntaxNode for TokenEnum {
26529    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenEnum);
26530    type StablePtr = TokenEnumPtr;
26531    type Green = TokenEnumGreen;
26532    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
26533        TokenEnumGreen(
26534            Arc::new(GreenNode {
26535                kind: SyntaxKind::TokenMissing,
26536                details: GreenNodeDetails::Token("".into()),
26537            })
26538            .intern(db),
26539        )
26540    }
26541    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
26542        match node.lookup_intern(db).green.lookup_intern(db).details {
26543            GreenNodeDetails::Token(_) => Self { node },
26544            GreenNodeDetails::Node { .. } => {
26545                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenEnum)
26546            }
26547        }
26548    }
26549    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
26550        match node.lookup_intern(db).green.lookup_intern(db).details {
26551            GreenNodeDetails::Token(_) => Some(Self { node }),
26552            GreenNodeDetails::Node { .. } => None,
26553        }
26554    }
26555    fn as_syntax_node(&self) -> SyntaxNode {
26556        self.node
26557    }
26558    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
26559        TokenEnumPtr(self.node.stable_ptr(db))
26560    }
26561}
26562#[derive(Clone, Debug, Eq, Hash, PartialEq)]
26563pub struct TerminalEnum {
26564    node: SyntaxNode,
26565}
26566impl Terminal for TerminalEnum {
26567    const KIND: SyntaxKind = SyntaxKind::TerminalEnum;
26568    type TokenType = TokenEnum;
26569    fn new_green(
26570        db: &dyn SyntaxGroup,
26571        leading_trivia: TriviaGreen,
26572        token: <<TerminalEnum as Terminal>::TokenType as TypedSyntaxNode>::Green,
26573        trailing_trivia: TriviaGreen,
26574    ) -> Self::Green {
26575        let children = [leading_trivia.0, token.0, trailing_trivia.0];
26576        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
26577        TerminalEnumGreen(
26578            Arc::new(GreenNode {
26579                kind: SyntaxKind::TerminalEnum,
26580                details: GreenNodeDetails::Node { children: children.into(), width },
26581            })
26582            .intern(db),
26583        )
26584    }
26585    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
26586        let GreenNodeDetails::Node { children, .. } =
26587            &self.node.lookup_intern(db).green.lookup_intern(db).details
26588        else {
26589            unreachable!("Expected a node, not a token");
26590        };
26591        extract_matches!(&children[1].lookup_intern(db).details, GreenNodeDetails::Token).clone()
26592    }
26593}
26594impl TerminalEnum {
26595    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
26596        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
26597    }
26598    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenEnum {
26599        TokenEnum::from_syntax_node(db, self.node.get_children(db)[1])
26600    }
26601    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
26602        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
26603    }
26604}
26605#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
26606pub struct TerminalEnumPtr(pub SyntaxStablePtrId);
26607impl TerminalEnumPtr {}
26608impl TypedStablePtr for TerminalEnumPtr {
26609    type SyntaxNode = TerminalEnum;
26610    fn untyped(&self) -> SyntaxStablePtrId {
26611        self.0
26612    }
26613    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalEnum {
26614        TerminalEnum::from_syntax_node(db, self.0.lookup(db))
26615    }
26616}
26617impl From<TerminalEnumPtr> for SyntaxStablePtrId {
26618    fn from(ptr: TerminalEnumPtr) -> Self {
26619        ptr.untyped()
26620    }
26621}
26622#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
26623pub struct TerminalEnumGreen(pub GreenId);
26624impl TypedSyntaxNode for TerminalEnum {
26625    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalEnum);
26626    type StablePtr = TerminalEnumPtr;
26627    type Green = TerminalEnumGreen;
26628    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
26629        TerminalEnumGreen(
26630            Arc::new(GreenNode {
26631                kind: SyntaxKind::TerminalEnum,
26632                details: GreenNodeDetails::Node {
26633                    children: [
26634                        Trivia::missing(db).0,
26635                        TokenEnum::missing(db).0,
26636                        Trivia::missing(db).0,
26637                    ]
26638                    .into(),
26639                    width: TextWidth::default(),
26640                },
26641            })
26642            .intern(db),
26643        )
26644    }
26645    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
26646        let kind = node.kind(db);
26647        assert_eq!(
26648            kind,
26649            SyntaxKind::TerminalEnum,
26650            "Unexpected SyntaxKind {:?}. Expected {:?}.",
26651            kind,
26652            SyntaxKind::TerminalEnum
26653        );
26654        Self { node }
26655    }
26656    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
26657        let kind = node.kind(db);
26658        if kind == SyntaxKind::TerminalEnum { Some(Self::from_syntax_node(db, node)) } else { None }
26659    }
26660    fn as_syntax_node(&self) -> SyntaxNode {
26661        self.node
26662    }
26663    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
26664        TerminalEnumPtr(self.node.stable_ptr(db))
26665    }
26666}
26667#[derive(Clone, Debug, Eq, Hash, PartialEq)]
26668pub struct TokenExtern {
26669    node: SyntaxNode,
26670}
26671impl Token for TokenExtern {
26672    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
26673        TokenExternGreen(
26674            Arc::new(GreenNode {
26675                kind: SyntaxKind::TokenExtern,
26676                details: GreenNodeDetails::Token(text),
26677            })
26678            .intern(db),
26679        )
26680    }
26681    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
26682        extract_matches!(
26683            &self.node.lookup_intern(db).green.lookup_intern(db).details,
26684            GreenNodeDetails::Token
26685        )
26686        .clone()
26687    }
26688}
26689#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
26690pub struct TokenExternPtr(pub SyntaxStablePtrId);
26691impl TypedStablePtr for TokenExternPtr {
26692    type SyntaxNode = TokenExtern;
26693    fn untyped(&self) -> SyntaxStablePtrId {
26694        self.0
26695    }
26696    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenExtern {
26697        TokenExtern::from_syntax_node(db, self.0.lookup(db))
26698    }
26699}
26700impl From<TokenExternPtr> for SyntaxStablePtrId {
26701    fn from(ptr: TokenExternPtr) -> Self {
26702        ptr.untyped()
26703    }
26704}
26705#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
26706pub struct TokenExternGreen(pub GreenId);
26707impl TokenExternGreen {
26708    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
26709        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
26710    }
26711}
26712impl TypedSyntaxNode for TokenExtern {
26713    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenExtern);
26714    type StablePtr = TokenExternPtr;
26715    type Green = TokenExternGreen;
26716    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
26717        TokenExternGreen(
26718            Arc::new(GreenNode {
26719                kind: SyntaxKind::TokenMissing,
26720                details: GreenNodeDetails::Token("".into()),
26721            })
26722            .intern(db),
26723        )
26724    }
26725    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
26726        match node.lookup_intern(db).green.lookup_intern(db).details {
26727            GreenNodeDetails::Token(_) => Self { node },
26728            GreenNodeDetails::Node { .. } => {
26729                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenExtern)
26730            }
26731        }
26732    }
26733    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
26734        match node.lookup_intern(db).green.lookup_intern(db).details {
26735            GreenNodeDetails::Token(_) => Some(Self { node }),
26736            GreenNodeDetails::Node { .. } => None,
26737        }
26738    }
26739    fn as_syntax_node(&self) -> SyntaxNode {
26740        self.node
26741    }
26742    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
26743        TokenExternPtr(self.node.stable_ptr(db))
26744    }
26745}
26746#[derive(Clone, Debug, Eq, Hash, PartialEq)]
26747pub struct TerminalExtern {
26748    node: SyntaxNode,
26749}
26750impl Terminal for TerminalExtern {
26751    const KIND: SyntaxKind = SyntaxKind::TerminalExtern;
26752    type TokenType = TokenExtern;
26753    fn new_green(
26754        db: &dyn SyntaxGroup,
26755        leading_trivia: TriviaGreen,
26756        token: <<TerminalExtern as Terminal>::TokenType as TypedSyntaxNode>::Green,
26757        trailing_trivia: TriviaGreen,
26758    ) -> Self::Green {
26759        let children = [leading_trivia.0, token.0, trailing_trivia.0];
26760        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
26761        TerminalExternGreen(
26762            Arc::new(GreenNode {
26763                kind: SyntaxKind::TerminalExtern,
26764                details: GreenNodeDetails::Node { children: children.into(), width },
26765            })
26766            .intern(db),
26767        )
26768    }
26769    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
26770        let GreenNodeDetails::Node { children, .. } =
26771            &self.node.lookup_intern(db).green.lookup_intern(db).details
26772        else {
26773            unreachable!("Expected a node, not a token");
26774        };
26775        extract_matches!(&children[1].lookup_intern(db).details, GreenNodeDetails::Token).clone()
26776    }
26777}
26778impl TerminalExtern {
26779    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
26780        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
26781    }
26782    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenExtern {
26783        TokenExtern::from_syntax_node(db, self.node.get_children(db)[1])
26784    }
26785    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
26786        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
26787    }
26788}
26789#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
26790pub struct TerminalExternPtr(pub SyntaxStablePtrId);
26791impl TerminalExternPtr {}
26792impl TypedStablePtr for TerminalExternPtr {
26793    type SyntaxNode = TerminalExtern;
26794    fn untyped(&self) -> SyntaxStablePtrId {
26795        self.0
26796    }
26797    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalExtern {
26798        TerminalExtern::from_syntax_node(db, self.0.lookup(db))
26799    }
26800}
26801impl From<TerminalExternPtr> for SyntaxStablePtrId {
26802    fn from(ptr: TerminalExternPtr) -> Self {
26803        ptr.untyped()
26804    }
26805}
26806#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
26807pub struct TerminalExternGreen(pub GreenId);
26808impl TypedSyntaxNode for TerminalExtern {
26809    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalExtern);
26810    type StablePtr = TerminalExternPtr;
26811    type Green = TerminalExternGreen;
26812    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
26813        TerminalExternGreen(
26814            Arc::new(GreenNode {
26815                kind: SyntaxKind::TerminalExtern,
26816                details: GreenNodeDetails::Node {
26817                    children: [
26818                        Trivia::missing(db).0,
26819                        TokenExtern::missing(db).0,
26820                        Trivia::missing(db).0,
26821                    ]
26822                    .into(),
26823                    width: TextWidth::default(),
26824                },
26825            })
26826            .intern(db),
26827        )
26828    }
26829    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
26830        let kind = node.kind(db);
26831        assert_eq!(
26832            kind,
26833            SyntaxKind::TerminalExtern,
26834            "Unexpected SyntaxKind {:?}. Expected {:?}.",
26835            kind,
26836            SyntaxKind::TerminalExtern
26837        );
26838        Self { node }
26839    }
26840    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
26841        let kind = node.kind(db);
26842        if kind == SyntaxKind::TerminalExtern {
26843            Some(Self::from_syntax_node(db, node))
26844        } else {
26845            None
26846        }
26847    }
26848    fn as_syntax_node(&self) -> SyntaxNode {
26849        self.node
26850    }
26851    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
26852        TerminalExternPtr(self.node.stable_ptr(db))
26853    }
26854}
26855#[derive(Clone, Debug, Eq, Hash, PartialEq)]
26856pub struct TokenFalse {
26857    node: SyntaxNode,
26858}
26859impl Token for TokenFalse {
26860    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
26861        TokenFalseGreen(
26862            Arc::new(GreenNode {
26863                kind: SyntaxKind::TokenFalse,
26864                details: GreenNodeDetails::Token(text),
26865            })
26866            .intern(db),
26867        )
26868    }
26869    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
26870        extract_matches!(
26871            &self.node.lookup_intern(db).green.lookup_intern(db).details,
26872            GreenNodeDetails::Token
26873        )
26874        .clone()
26875    }
26876}
26877#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
26878pub struct TokenFalsePtr(pub SyntaxStablePtrId);
26879impl TypedStablePtr for TokenFalsePtr {
26880    type SyntaxNode = TokenFalse;
26881    fn untyped(&self) -> SyntaxStablePtrId {
26882        self.0
26883    }
26884    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenFalse {
26885        TokenFalse::from_syntax_node(db, self.0.lookup(db))
26886    }
26887}
26888impl From<TokenFalsePtr> for SyntaxStablePtrId {
26889    fn from(ptr: TokenFalsePtr) -> Self {
26890        ptr.untyped()
26891    }
26892}
26893#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
26894pub struct TokenFalseGreen(pub GreenId);
26895impl TokenFalseGreen {
26896    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
26897        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
26898    }
26899}
26900impl TypedSyntaxNode for TokenFalse {
26901    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenFalse);
26902    type StablePtr = TokenFalsePtr;
26903    type Green = TokenFalseGreen;
26904    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
26905        TokenFalseGreen(
26906            Arc::new(GreenNode {
26907                kind: SyntaxKind::TokenMissing,
26908                details: GreenNodeDetails::Token("".into()),
26909            })
26910            .intern(db),
26911        )
26912    }
26913    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
26914        match node.lookup_intern(db).green.lookup_intern(db).details {
26915            GreenNodeDetails::Token(_) => Self { node },
26916            GreenNodeDetails::Node { .. } => {
26917                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenFalse)
26918            }
26919        }
26920    }
26921    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
26922        match node.lookup_intern(db).green.lookup_intern(db).details {
26923            GreenNodeDetails::Token(_) => Some(Self { node }),
26924            GreenNodeDetails::Node { .. } => None,
26925        }
26926    }
26927    fn as_syntax_node(&self) -> SyntaxNode {
26928        self.node
26929    }
26930    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
26931        TokenFalsePtr(self.node.stable_ptr(db))
26932    }
26933}
26934#[derive(Clone, Debug, Eq, Hash, PartialEq)]
26935pub struct TerminalFalse {
26936    node: SyntaxNode,
26937}
26938impl Terminal for TerminalFalse {
26939    const KIND: SyntaxKind = SyntaxKind::TerminalFalse;
26940    type TokenType = TokenFalse;
26941    fn new_green(
26942        db: &dyn SyntaxGroup,
26943        leading_trivia: TriviaGreen,
26944        token: <<TerminalFalse as Terminal>::TokenType as TypedSyntaxNode>::Green,
26945        trailing_trivia: TriviaGreen,
26946    ) -> Self::Green {
26947        let children = [leading_trivia.0, token.0, trailing_trivia.0];
26948        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
26949        TerminalFalseGreen(
26950            Arc::new(GreenNode {
26951                kind: SyntaxKind::TerminalFalse,
26952                details: GreenNodeDetails::Node { children: children.into(), width },
26953            })
26954            .intern(db),
26955        )
26956    }
26957    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
26958        let GreenNodeDetails::Node { children, .. } =
26959            &self.node.lookup_intern(db).green.lookup_intern(db).details
26960        else {
26961            unreachable!("Expected a node, not a token");
26962        };
26963        extract_matches!(&children[1].lookup_intern(db).details, GreenNodeDetails::Token).clone()
26964    }
26965}
26966impl TerminalFalse {
26967    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
26968        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
26969    }
26970    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenFalse {
26971        TokenFalse::from_syntax_node(db, self.node.get_children(db)[1])
26972    }
26973    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
26974        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
26975    }
26976}
26977#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
26978pub struct TerminalFalsePtr(pub SyntaxStablePtrId);
26979impl TerminalFalsePtr {}
26980impl TypedStablePtr for TerminalFalsePtr {
26981    type SyntaxNode = TerminalFalse;
26982    fn untyped(&self) -> SyntaxStablePtrId {
26983        self.0
26984    }
26985    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalFalse {
26986        TerminalFalse::from_syntax_node(db, self.0.lookup(db))
26987    }
26988}
26989impl From<TerminalFalsePtr> for SyntaxStablePtrId {
26990    fn from(ptr: TerminalFalsePtr) -> Self {
26991        ptr.untyped()
26992    }
26993}
26994#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
26995pub struct TerminalFalseGreen(pub GreenId);
26996impl TypedSyntaxNode for TerminalFalse {
26997    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalFalse);
26998    type StablePtr = TerminalFalsePtr;
26999    type Green = TerminalFalseGreen;
27000    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
27001        TerminalFalseGreen(
27002            Arc::new(GreenNode {
27003                kind: SyntaxKind::TerminalFalse,
27004                details: GreenNodeDetails::Node {
27005                    children: [
27006                        Trivia::missing(db).0,
27007                        TokenFalse::missing(db).0,
27008                        Trivia::missing(db).0,
27009                    ]
27010                    .into(),
27011                    width: TextWidth::default(),
27012                },
27013            })
27014            .intern(db),
27015        )
27016    }
27017    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
27018        let kind = node.kind(db);
27019        assert_eq!(
27020            kind,
27021            SyntaxKind::TerminalFalse,
27022            "Unexpected SyntaxKind {:?}. Expected {:?}.",
27023            kind,
27024            SyntaxKind::TerminalFalse
27025        );
27026        Self { node }
27027    }
27028    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
27029        let kind = node.kind(db);
27030        if kind == SyntaxKind::TerminalFalse {
27031            Some(Self::from_syntax_node(db, node))
27032        } else {
27033            None
27034        }
27035    }
27036    fn as_syntax_node(&self) -> SyntaxNode {
27037        self.node
27038    }
27039    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
27040        TerminalFalsePtr(self.node.stable_ptr(db))
27041    }
27042}
27043#[derive(Clone, Debug, Eq, Hash, PartialEq)]
27044pub struct TokenFunction {
27045    node: SyntaxNode,
27046}
27047impl Token for TokenFunction {
27048    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
27049        TokenFunctionGreen(
27050            Arc::new(GreenNode {
27051                kind: SyntaxKind::TokenFunction,
27052                details: GreenNodeDetails::Token(text),
27053            })
27054            .intern(db),
27055        )
27056    }
27057    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
27058        extract_matches!(
27059            &self.node.lookup_intern(db).green.lookup_intern(db).details,
27060            GreenNodeDetails::Token
27061        )
27062        .clone()
27063    }
27064}
27065#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
27066pub struct TokenFunctionPtr(pub SyntaxStablePtrId);
27067impl TypedStablePtr for TokenFunctionPtr {
27068    type SyntaxNode = TokenFunction;
27069    fn untyped(&self) -> SyntaxStablePtrId {
27070        self.0
27071    }
27072    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenFunction {
27073        TokenFunction::from_syntax_node(db, self.0.lookup(db))
27074    }
27075}
27076impl From<TokenFunctionPtr> for SyntaxStablePtrId {
27077    fn from(ptr: TokenFunctionPtr) -> Self {
27078        ptr.untyped()
27079    }
27080}
27081#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
27082pub struct TokenFunctionGreen(pub GreenId);
27083impl TokenFunctionGreen {
27084    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
27085        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
27086    }
27087}
27088impl TypedSyntaxNode for TokenFunction {
27089    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenFunction);
27090    type StablePtr = TokenFunctionPtr;
27091    type Green = TokenFunctionGreen;
27092    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
27093        TokenFunctionGreen(
27094            Arc::new(GreenNode {
27095                kind: SyntaxKind::TokenMissing,
27096                details: GreenNodeDetails::Token("".into()),
27097            })
27098            .intern(db),
27099        )
27100    }
27101    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
27102        match node.lookup_intern(db).green.lookup_intern(db).details {
27103            GreenNodeDetails::Token(_) => Self { node },
27104            GreenNodeDetails::Node { .. } => {
27105                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenFunction)
27106            }
27107        }
27108    }
27109    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
27110        match node.lookup_intern(db).green.lookup_intern(db).details {
27111            GreenNodeDetails::Token(_) => Some(Self { node }),
27112            GreenNodeDetails::Node { .. } => None,
27113        }
27114    }
27115    fn as_syntax_node(&self) -> SyntaxNode {
27116        self.node
27117    }
27118    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
27119        TokenFunctionPtr(self.node.stable_ptr(db))
27120    }
27121}
27122#[derive(Clone, Debug, Eq, Hash, PartialEq)]
27123pub struct TerminalFunction {
27124    node: SyntaxNode,
27125}
27126impl Terminal for TerminalFunction {
27127    const KIND: SyntaxKind = SyntaxKind::TerminalFunction;
27128    type TokenType = TokenFunction;
27129    fn new_green(
27130        db: &dyn SyntaxGroup,
27131        leading_trivia: TriviaGreen,
27132        token: <<TerminalFunction as Terminal>::TokenType as TypedSyntaxNode>::Green,
27133        trailing_trivia: TriviaGreen,
27134    ) -> Self::Green {
27135        let children = [leading_trivia.0, token.0, trailing_trivia.0];
27136        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
27137        TerminalFunctionGreen(
27138            Arc::new(GreenNode {
27139                kind: SyntaxKind::TerminalFunction,
27140                details: GreenNodeDetails::Node { children: children.into(), width },
27141            })
27142            .intern(db),
27143        )
27144    }
27145    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
27146        let GreenNodeDetails::Node { children, .. } =
27147            &self.node.lookup_intern(db).green.lookup_intern(db).details
27148        else {
27149            unreachable!("Expected a node, not a token");
27150        };
27151        extract_matches!(&children[1].lookup_intern(db).details, GreenNodeDetails::Token).clone()
27152    }
27153}
27154impl TerminalFunction {
27155    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
27156        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
27157    }
27158    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenFunction {
27159        TokenFunction::from_syntax_node(db, self.node.get_children(db)[1])
27160    }
27161    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
27162        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
27163    }
27164}
27165#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
27166pub struct TerminalFunctionPtr(pub SyntaxStablePtrId);
27167impl TerminalFunctionPtr {}
27168impl TypedStablePtr for TerminalFunctionPtr {
27169    type SyntaxNode = TerminalFunction;
27170    fn untyped(&self) -> SyntaxStablePtrId {
27171        self.0
27172    }
27173    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalFunction {
27174        TerminalFunction::from_syntax_node(db, self.0.lookup(db))
27175    }
27176}
27177impl From<TerminalFunctionPtr> for SyntaxStablePtrId {
27178    fn from(ptr: TerminalFunctionPtr) -> Self {
27179        ptr.untyped()
27180    }
27181}
27182#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
27183pub struct TerminalFunctionGreen(pub GreenId);
27184impl TypedSyntaxNode for TerminalFunction {
27185    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalFunction);
27186    type StablePtr = TerminalFunctionPtr;
27187    type Green = TerminalFunctionGreen;
27188    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
27189        TerminalFunctionGreen(
27190            Arc::new(GreenNode {
27191                kind: SyntaxKind::TerminalFunction,
27192                details: GreenNodeDetails::Node {
27193                    children: [
27194                        Trivia::missing(db).0,
27195                        TokenFunction::missing(db).0,
27196                        Trivia::missing(db).0,
27197                    ]
27198                    .into(),
27199                    width: TextWidth::default(),
27200                },
27201            })
27202            .intern(db),
27203        )
27204    }
27205    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
27206        let kind = node.kind(db);
27207        assert_eq!(
27208            kind,
27209            SyntaxKind::TerminalFunction,
27210            "Unexpected SyntaxKind {:?}. Expected {:?}.",
27211            kind,
27212            SyntaxKind::TerminalFunction
27213        );
27214        Self { node }
27215    }
27216    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
27217        let kind = node.kind(db);
27218        if kind == SyntaxKind::TerminalFunction {
27219            Some(Self::from_syntax_node(db, node))
27220        } else {
27221            None
27222        }
27223    }
27224    fn as_syntax_node(&self) -> SyntaxNode {
27225        self.node
27226    }
27227    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
27228        TerminalFunctionPtr(self.node.stable_ptr(db))
27229    }
27230}
27231#[derive(Clone, Debug, Eq, Hash, PartialEq)]
27232pub struct TokenIf {
27233    node: SyntaxNode,
27234}
27235impl Token for TokenIf {
27236    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
27237        TokenIfGreen(
27238            Arc::new(GreenNode {
27239                kind: SyntaxKind::TokenIf,
27240                details: GreenNodeDetails::Token(text),
27241            })
27242            .intern(db),
27243        )
27244    }
27245    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
27246        extract_matches!(
27247            &self.node.lookup_intern(db).green.lookup_intern(db).details,
27248            GreenNodeDetails::Token
27249        )
27250        .clone()
27251    }
27252}
27253#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
27254pub struct TokenIfPtr(pub SyntaxStablePtrId);
27255impl TypedStablePtr for TokenIfPtr {
27256    type SyntaxNode = TokenIf;
27257    fn untyped(&self) -> SyntaxStablePtrId {
27258        self.0
27259    }
27260    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenIf {
27261        TokenIf::from_syntax_node(db, self.0.lookup(db))
27262    }
27263}
27264impl From<TokenIfPtr> for SyntaxStablePtrId {
27265    fn from(ptr: TokenIfPtr) -> Self {
27266        ptr.untyped()
27267    }
27268}
27269#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
27270pub struct TokenIfGreen(pub GreenId);
27271impl TokenIfGreen {
27272    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
27273        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
27274    }
27275}
27276impl TypedSyntaxNode for TokenIf {
27277    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenIf);
27278    type StablePtr = TokenIfPtr;
27279    type Green = TokenIfGreen;
27280    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
27281        TokenIfGreen(
27282            Arc::new(GreenNode {
27283                kind: SyntaxKind::TokenMissing,
27284                details: GreenNodeDetails::Token("".into()),
27285            })
27286            .intern(db),
27287        )
27288    }
27289    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
27290        match node.lookup_intern(db).green.lookup_intern(db).details {
27291            GreenNodeDetails::Token(_) => Self { node },
27292            GreenNodeDetails::Node { .. } => {
27293                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenIf)
27294            }
27295        }
27296    }
27297    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
27298        match node.lookup_intern(db).green.lookup_intern(db).details {
27299            GreenNodeDetails::Token(_) => Some(Self { node }),
27300            GreenNodeDetails::Node { .. } => None,
27301        }
27302    }
27303    fn as_syntax_node(&self) -> SyntaxNode {
27304        self.node
27305    }
27306    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
27307        TokenIfPtr(self.node.stable_ptr(db))
27308    }
27309}
27310#[derive(Clone, Debug, Eq, Hash, PartialEq)]
27311pub struct TerminalIf {
27312    node: SyntaxNode,
27313}
27314impl Terminal for TerminalIf {
27315    const KIND: SyntaxKind = SyntaxKind::TerminalIf;
27316    type TokenType = TokenIf;
27317    fn new_green(
27318        db: &dyn SyntaxGroup,
27319        leading_trivia: TriviaGreen,
27320        token: <<TerminalIf as Terminal>::TokenType as TypedSyntaxNode>::Green,
27321        trailing_trivia: TriviaGreen,
27322    ) -> Self::Green {
27323        let children = [leading_trivia.0, token.0, trailing_trivia.0];
27324        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
27325        TerminalIfGreen(
27326            Arc::new(GreenNode {
27327                kind: SyntaxKind::TerminalIf,
27328                details: GreenNodeDetails::Node { children: children.into(), width },
27329            })
27330            .intern(db),
27331        )
27332    }
27333    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
27334        let GreenNodeDetails::Node { children, .. } =
27335            &self.node.lookup_intern(db).green.lookup_intern(db).details
27336        else {
27337            unreachable!("Expected a node, not a token");
27338        };
27339        extract_matches!(&children[1].lookup_intern(db).details, GreenNodeDetails::Token).clone()
27340    }
27341}
27342impl TerminalIf {
27343    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
27344        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
27345    }
27346    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenIf {
27347        TokenIf::from_syntax_node(db, self.node.get_children(db)[1])
27348    }
27349    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
27350        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
27351    }
27352}
27353#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
27354pub struct TerminalIfPtr(pub SyntaxStablePtrId);
27355impl TerminalIfPtr {}
27356impl TypedStablePtr for TerminalIfPtr {
27357    type SyntaxNode = TerminalIf;
27358    fn untyped(&self) -> SyntaxStablePtrId {
27359        self.0
27360    }
27361    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalIf {
27362        TerminalIf::from_syntax_node(db, self.0.lookup(db))
27363    }
27364}
27365impl From<TerminalIfPtr> for SyntaxStablePtrId {
27366    fn from(ptr: TerminalIfPtr) -> Self {
27367        ptr.untyped()
27368    }
27369}
27370#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
27371pub struct TerminalIfGreen(pub GreenId);
27372impl TypedSyntaxNode for TerminalIf {
27373    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalIf);
27374    type StablePtr = TerminalIfPtr;
27375    type Green = TerminalIfGreen;
27376    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
27377        TerminalIfGreen(
27378            Arc::new(GreenNode {
27379                kind: SyntaxKind::TerminalIf,
27380                details: GreenNodeDetails::Node {
27381                    children: [
27382                        Trivia::missing(db).0,
27383                        TokenIf::missing(db).0,
27384                        Trivia::missing(db).0,
27385                    ]
27386                    .into(),
27387                    width: TextWidth::default(),
27388                },
27389            })
27390            .intern(db),
27391        )
27392    }
27393    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
27394        let kind = node.kind(db);
27395        assert_eq!(
27396            kind,
27397            SyntaxKind::TerminalIf,
27398            "Unexpected SyntaxKind {:?}. Expected {:?}.",
27399            kind,
27400            SyntaxKind::TerminalIf
27401        );
27402        Self { node }
27403    }
27404    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
27405        let kind = node.kind(db);
27406        if kind == SyntaxKind::TerminalIf { Some(Self::from_syntax_node(db, node)) } else { None }
27407    }
27408    fn as_syntax_node(&self) -> SyntaxNode {
27409        self.node
27410    }
27411    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
27412        TerminalIfPtr(self.node.stable_ptr(db))
27413    }
27414}
27415#[derive(Clone, Debug, Eq, Hash, PartialEq)]
27416pub struct TokenWhile {
27417    node: SyntaxNode,
27418}
27419impl Token for TokenWhile {
27420    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
27421        TokenWhileGreen(
27422            Arc::new(GreenNode {
27423                kind: SyntaxKind::TokenWhile,
27424                details: GreenNodeDetails::Token(text),
27425            })
27426            .intern(db),
27427        )
27428    }
27429    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
27430        extract_matches!(
27431            &self.node.lookup_intern(db).green.lookup_intern(db).details,
27432            GreenNodeDetails::Token
27433        )
27434        .clone()
27435    }
27436}
27437#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
27438pub struct TokenWhilePtr(pub SyntaxStablePtrId);
27439impl TypedStablePtr for TokenWhilePtr {
27440    type SyntaxNode = TokenWhile;
27441    fn untyped(&self) -> SyntaxStablePtrId {
27442        self.0
27443    }
27444    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenWhile {
27445        TokenWhile::from_syntax_node(db, self.0.lookup(db))
27446    }
27447}
27448impl From<TokenWhilePtr> for SyntaxStablePtrId {
27449    fn from(ptr: TokenWhilePtr) -> Self {
27450        ptr.untyped()
27451    }
27452}
27453#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
27454pub struct TokenWhileGreen(pub GreenId);
27455impl TokenWhileGreen {
27456    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
27457        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
27458    }
27459}
27460impl TypedSyntaxNode for TokenWhile {
27461    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenWhile);
27462    type StablePtr = TokenWhilePtr;
27463    type Green = TokenWhileGreen;
27464    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
27465        TokenWhileGreen(
27466            Arc::new(GreenNode {
27467                kind: SyntaxKind::TokenMissing,
27468                details: GreenNodeDetails::Token("".into()),
27469            })
27470            .intern(db),
27471        )
27472    }
27473    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
27474        match node.lookup_intern(db).green.lookup_intern(db).details {
27475            GreenNodeDetails::Token(_) => Self { node },
27476            GreenNodeDetails::Node { .. } => {
27477                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenWhile)
27478            }
27479        }
27480    }
27481    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
27482        match node.lookup_intern(db).green.lookup_intern(db).details {
27483            GreenNodeDetails::Token(_) => Some(Self { node }),
27484            GreenNodeDetails::Node { .. } => None,
27485        }
27486    }
27487    fn as_syntax_node(&self) -> SyntaxNode {
27488        self.node
27489    }
27490    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
27491        TokenWhilePtr(self.node.stable_ptr(db))
27492    }
27493}
27494#[derive(Clone, Debug, Eq, Hash, PartialEq)]
27495pub struct TerminalWhile {
27496    node: SyntaxNode,
27497}
27498impl Terminal for TerminalWhile {
27499    const KIND: SyntaxKind = SyntaxKind::TerminalWhile;
27500    type TokenType = TokenWhile;
27501    fn new_green(
27502        db: &dyn SyntaxGroup,
27503        leading_trivia: TriviaGreen,
27504        token: <<TerminalWhile as Terminal>::TokenType as TypedSyntaxNode>::Green,
27505        trailing_trivia: TriviaGreen,
27506    ) -> Self::Green {
27507        let children = [leading_trivia.0, token.0, trailing_trivia.0];
27508        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
27509        TerminalWhileGreen(
27510            Arc::new(GreenNode {
27511                kind: SyntaxKind::TerminalWhile,
27512                details: GreenNodeDetails::Node { children: children.into(), width },
27513            })
27514            .intern(db),
27515        )
27516    }
27517    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
27518        let GreenNodeDetails::Node { children, .. } =
27519            &self.node.lookup_intern(db).green.lookup_intern(db).details
27520        else {
27521            unreachable!("Expected a node, not a token");
27522        };
27523        extract_matches!(&children[1].lookup_intern(db).details, GreenNodeDetails::Token).clone()
27524    }
27525}
27526impl TerminalWhile {
27527    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
27528        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
27529    }
27530    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenWhile {
27531        TokenWhile::from_syntax_node(db, self.node.get_children(db)[1])
27532    }
27533    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
27534        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
27535    }
27536}
27537#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
27538pub struct TerminalWhilePtr(pub SyntaxStablePtrId);
27539impl TerminalWhilePtr {}
27540impl TypedStablePtr for TerminalWhilePtr {
27541    type SyntaxNode = TerminalWhile;
27542    fn untyped(&self) -> SyntaxStablePtrId {
27543        self.0
27544    }
27545    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalWhile {
27546        TerminalWhile::from_syntax_node(db, self.0.lookup(db))
27547    }
27548}
27549impl From<TerminalWhilePtr> for SyntaxStablePtrId {
27550    fn from(ptr: TerminalWhilePtr) -> Self {
27551        ptr.untyped()
27552    }
27553}
27554#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
27555pub struct TerminalWhileGreen(pub GreenId);
27556impl TypedSyntaxNode for TerminalWhile {
27557    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalWhile);
27558    type StablePtr = TerminalWhilePtr;
27559    type Green = TerminalWhileGreen;
27560    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
27561        TerminalWhileGreen(
27562            Arc::new(GreenNode {
27563                kind: SyntaxKind::TerminalWhile,
27564                details: GreenNodeDetails::Node {
27565                    children: [
27566                        Trivia::missing(db).0,
27567                        TokenWhile::missing(db).0,
27568                        Trivia::missing(db).0,
27569                    ]
27570                    .into(),
27571                    width: TextWidth::default(),
27572                },
27573            })
27574            .intern(db),
27575        )
27576    }
27577    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
27578        let kind = node.kind(db);
27579        assert_eq!(
27580            kind,
27581            SyntaxKind::TerminalWhile,
27582            "Unexpected SyntaxKind {:?}. Expected {:?}.",
27583            kind,
27584            SyntaxKind::TerminalWhile
27585        );
27586        Self { node }
27587    }
27588    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
27589        let kind = node.kind(db);
27590        if kind == SyntaxKind::TerminalWhile {
27591            Some(Self::from_syntax_node(db, node))
27592        } else {
27593            None
27594        }
27595    }
27596    fn as_syntax_node(&self) -> SyntaxNode {
27597        self.node
27598    }
27599    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
27600        TerminalWhilePtr(self.node.stable_ptr(db))
27601    }
27602}
27603#[derive(Clone, Debug, Eq, Hash, PartialEq)]
27604pub struct TokenFor {
27605    node: SyntaxNode,
27606}
27607impl Token for TokenFor {
27608    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
27609        TokenForGreen(
27610            Arc::new(GreenNode {
27611                kind: SyntaxKind::TokenFor,
27612                details: GreenNodeDetails::Token(text),
27613            })
27614            .intern(db),
27615        )
27616    }
27617    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
27618        extract_matches!(
27619            &self.node.lookup_intern(db).green.lookup_intern(db).details,
27620            GreenNodeDetails::Token
27621        )
27622        .clone()
27623    }
27624}
27625#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
27626pub struct TokenForPtr(pub SyntaxStablePtrId);
27627impl TypedStablePtr for TokenForPtr {
27628    type SyntaxNode = TokenFor;
27629    fn untyped(&self) -> SyntaxStablePtrId {
27630        self.0
27631    }
27632    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenFor {
27633        TokenFor::from_syntax_node(db, self.0.lookup(db))
27634    }
27635}
27636impl From<TokenForPtr> for SyntaxStablePtrId {
27637    fn from(ptr: TokenForPtr) -> Self {
27638        ptr.untyped()
27639    }
27640}
27641#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
27642pub struct TokenForGreen(pub GreenId);
27643impl TokenForGreen {
27644    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
27645        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
27646    }
27647}
27648impl TypedSyntaxNode for TokenFor {
27649    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenFor);
27650    type StablePtr = TokenForPtr;
27651    type Green = TokenForGreen;
27652    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
27653        TokenForGreen(
27654            Arc::new(GreenNode {
27655                kind: SyntaxKind::TokenMissing,
27656                details: GreenNodeDetails::Token("".into()),
27657            })
27658            .intern(db),
27659        )
27660    }
27661    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
27662        match node.lookup_intern(db).green.lookup_intern(db).details {
27663            GreenNodeDetails::Token(_) => Self { node },
27664            GreenNodeDetails::Node { .. } => {
27665                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenFor)
27666            }
27667        }
27668    }
27669    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
27670        match node.lookup_intern(db).green.lookup_intern(db).details {
27671            GreenNodeDetails::Token(_) => Some(Self { node }),
27672            GreenNodeDetails::Node { .. } => None,
27673        }
27674    }
27675    fn as_syntax_node(&self) -> SyntaxNode {
27676        self.node
27677    }
27678    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
27679        TokenForPtr(self.node.stable_ptr(db))
27680    }
27681}
27682#[derive(Clone, Debug, Eq, Hash, PartialEq)]
27683pub struct TerminalFor {
27684    node: SyntaxNode,
27685}
27686impl Terminal for TerminalFor {
27687    const KIND: SyntaxKind = SyntaxKind::TerminalFor;
27688    type TokenType = TokenFor;
27689    fn new_green(
27690        db: &dyn SyntaxGroup,
27691        leading_trivia: TriviaGreen,
27692        token: <<TerminalFor as Terminal>::TokenType as TypedSyntaxNode>::Green,
27693        trailing_trivia: TriviaGreen,
27694    ) -> Self::Green {
27695        let children = [leading_trivia.0, token.0, trailing_trivia.0];
27696        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
27697        TerminalForGreen(
27698            Arc::new(GreenNode {
27699                kind: SyntaxKind::TerminalFor,
27700                details: GreenNodeDetails::Node { children: children.into(), width },
27701            })
27702            .intern(db),
27703        )
27704    }
27705    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
27706        let GreenNodeDetails::Node { children, .. } =
27707            &self.node.lookup_intern(db).green.lookup_intern(db).details
27708        else {
27709            unreachable!("Expected a node, not a token");
27710        };
27711        extract_matches!(&children[1].lookup_intern(db).details, GreenNodeDetails::Token).clone()
27712    }
27713}
27714impl TerminalFor {
27715    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
27716        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
27717    }
27718    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenFor {
27719        TokenFor::from_syntax_node(db, self.node.get_children(db)[1])
27720    }
27721    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
27722        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
27723    }
27724}
27725#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
27726pub struct TerminalForPtr(pub SyntaxStablePtrId);
27727impl TerminalForPtr {}
27728impl TypedStablePtr for TerminalForPtr {
27729    type SyntaxNode = TerminalFor;
27730    fn untyped(&self) -> SyntaxStablePtrId {
27731        self.0
27732    }
27733    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalFor {
27734        TerminalFor::from_syntax_node(db, self.0.lookup(db))
27735    }
27736}
27737impl From<TerminalForPtr> for SyntaxStablePtrId {
27738    fn from(ptr: TerminalForPtr) -> Self {
27739        ptr.untyped()
27740    }
27741}
27742#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
27743pub struct TerminalForGreen(pub GreenId);
27744impl TypedSyntaxNode for TerminalFor {
27745    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalFor);
27746    type StablePtr = TerminalForPtr;
27747    type Green = TerminalForGreen;
27748    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
27749        TerminalForGreen(
27750            Arc::new(GreenNode {
27751                kind: SyntaxKind::TerminalFor,
27752                details: GreenNodeDetails::Node {
27753                    children: [
27754                        Trivia::missing(db).0,
27755                        TokenFor::missing(db).0,
27756                        Trivia::missing(db).0,
27757                    ]
27758                    .into(),
27759                    width: TextWidth::default(),
27760                },
27761            })
27762            .intern(db),
27763        )
27764    }
27765    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
27766        let kind = node.kind(db);
27767        assert_eq!(
27768            kind,
27769            SyntaxKind::TerminalFor,
27770            "Unexpected SyntaxKind {:?}. Expected {:?}.",
27771            kind,
27772            SyntaxKind::TerminalFor
27773        );
27774        Self { node }
27775    }
27776    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
27777        let kind = node.kind(db);
27778        if kind == SyntaxKind::TerminalFor { Some(Self::from_syntax_node(db, node)) } else { None }
27779    }
27780    fn as_syntax_node(&self) -> SyntaxNode {
27781        self.node
27782    }
27783    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
27784        TerminalForPtr(self.node.stable_ptr(db))
27785    }
27786}
27787#[derive(Clone, Debug, Eq, Hash, PartialEq)]
27788pub struct TokenLoop {
27789    node: SyntaxNode,
27790}
27791impl Token for TokenLoop {
27792    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
27793        TokenLoopGreen(
27794            Arc::new(GreenNode {
27795                kind: SyntaxKind::TokenLoop,
27796                details: GreenNodeDetails::Token(text),
27797            })
27798            .intern(db),
27799        )
27800    }
27801    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
27802        extract_matches!(
27803            &self.node.lookup_intern(db).green.lookup_intern(db).details,
27804            GreenNodeDetails::Token
27805        )
27806        .clone()
27807    }
27808}
27809#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
27810pub struct TokenLoopPtr(pub SyntaxStablePtrId);
27811impl TypedStablePtr for TokenLoopPtr {
27812    type SyntaxNode = TokenLoop;
27813    fn untyped(&self) -> SyntaxStablePtrId {
27814        self.0
27815    }
27816    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenLoop {
27817        TokenLoop::from_syntax_node(db, self.0.lookup(db))
27818    }
27819}
27820impl From<TokenLoopPtr> for SyntaxStablePtrId {
27821    fn from(ptr: TokenLoopPtr) -> Self {
27822        ptr.untyped()
27823    }
27824}
27825#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
27826pub struct TokenLoopGreen(pub GreenId);
27827impl TokenLoopGreen {
27828    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
27829        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
27830    }
27831}
27832impl TypedSyntaxNode for TokenLoop {
27833    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenLoop);
27834    type StablePtr = TokenLoopPtr;
27835    type Green = TokenLoopGreen;
27836    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
27837        TokenLoopGreen(
27838            Arc::new(GreenNode {
27839                kind: SyntaxKind::TokenMissing,
27840                details: GreenNodeDetails::Token("".into()),
27841            })
27842            .intern(db),
27843        )
27844    }
27845    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
27846        match node.lookup_intern(db).green.lookup_intern(db).details {
27847            GreenNodeDetails::Token(_) => Self { node },
27848            GreenNodeDetails::Node { .. } => {
27849                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenLoop)
27850            }
27851        }
27852    }
27853    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
27854        match node.lookup_intern(db).green.lookup_intern(db).details {
27855            GreenNodeDetails::Token(_) => Some(Self { node }),
27856            GreenNodeDetails::Node { .. } => None,
27857        }
27858    }
27859    fn as_syntax_node(&self) -> SyntaxNode {
27860        self.node
27861    }
27862    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
27863        TokenLoopPtr(self.node.stable_ptr(db))
27864    }
27865}
27866#[derive(Clone, Debug, Eq, Hash, PartialEq)]
27867pub struct TerminalLoop {
27868    node: SyntaxNode,
27869}
27870impl Terminal for TerminalLoop {
27871    const KIND: SyntaxKind = SyntaxKind::TerminalLoop;
27872    type TokenType = TokenLoop;
27873    fn new_green(
27874        db: &dyn SyntaxGroup,
27875        leading_trivia: TriviaGreen,
27876        token: <<TerminalLoop as Terminal>::TokenType as TypedSyntaxNode>::Green,
27877        trailing_trivia: TriviaGreen,
27878    ) -> Self::Green {
27879        let children = [leading_trivia.0, token.0, trailing_trivia.0];
27880        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
27881        TerminalLoopGreen(
27882            Arc::new(GreenNode {
27883                kind: SyntaxKind::TerminalLoop,
27884                details: GreenNodeDetails::Node { children: children.into(), width },
27885            })
27886            .intern(db),
27887        )
27888    }
27889    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
27890        let GreenNodeDetails::Node { children, .. } =
27891            &self.node.lookup_intern(db).green.lookup_intern(db).details
27892        else {
27893            unreachable!("Expected a node, not a token");
27894        };
27895        extract_matches!(&children[1].lookup_intern(db).details, GreenNodeDetails::Token).clone()
27896    }
27897}
27898impl TerminalLoop {
27899    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
27900        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
27901    }
27902    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenLoop {
27903        TokenLoop::from_syntax_node(db, self.node.get_children(db)[1])
27904    }
27905    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
27906        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
27907    }
27908}
27909#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
27910pub struct TerminalLoopPtr(pub SyntaxStablePtrId);
27911impl TerminalLoopPtr {}
27912impl TypedStablePtr for TerminalLoopPtr {
27913    type SyntaxNode = TerminalLoop;
27914    fn untyped(&self) -> SyntaxStablePtrId {
27915        self.0
27916    }
27917    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalLoop {
27918        TerminalLoop::from_syntax_node(db, self.0.lookup(db))
27919    }
27920}
27921impl From<TerminalLoopPtr> for SyntaxStablePtrId {
27922    fn from(ptr: TerminalLoopPtr) -> Self {
27923        ptr.untyped()
27924    }
27925}
27926#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
27927pub struct TerminalLoopGreen(pub GreenId);
27928impl TypedSyntaxNode for TerminalLoop {
27929    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalLoop);
27930    type StablePtr = TerminalLoopPtr;
27931    type Green = TerminalLoopGreen;
27932    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
27933        TerminalLoopGreen(
27934            Arc::new(GreenNode {
27935                kind: SyntaxKind::TerminalLoop,
27936                details: GreenNodeDetails::Node {
27937                    children: [
27938                        Trivia::missing(db).0,
27939                        TokenLoop::missing(db).0,
27940                        Trivia::missing(db).0,
27941                    ]
27942                    .into(),
27943                    width: TextWidth::default(),
27944                },
27945            })
27946            .intern(db),
27947        )
27948    }
27949    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
27950        let kind = node.kind(db);
27951        assert_eq!(
27952            kind,
27953            SyntaxKind::TerminalLoop,
27954            "Unexpected SyntaxKind {:?}. Expected {:?}.",
27955            kind,
27956            SyntaxKind::TerminalLoop
27957        );
27958        Self { node }
27959    }
27960    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
27961        let kind = node.kind(db);
27962        if kind == SyntaxKind::TerminalLoop { Some(Self::from_syntax_node(db, node)) } else { None }
27963    }
27964    fn as_syntax_node(&self) -> SyntaxNode {
27965        self.node
27966    }
27967    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
27968        TerminalLoopPtr(self.node.stable_ptr(db))
27969    }
27970}
27971#[derive(Clone, Debug, Eq, Hash, PartialEq)]
27972pub struct TokenImpl {
27973    node: SyntaxNode,
27974}
27975impl Token for TokenImpl {
27976    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
27977        TokenImplGreen(
27978            Arc::new(GreenNode {
27979                kind: SyntaxKind::TokenImpl,
27980                details: GreenNodeDetails::Token(text),
27981            })
27982            .intern(db),
27983        )
27984    }
27985    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
27986        extract_matches!(
27987            &self.node.lookup_intern(db).green.lookup_intern(db).details,
27988            GreenNodeDetails::Token
27989        )
27990        .clone()
27991    }
27992}
27993#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
27994pub struct TokenImplPtr(pub SyntaxStablePtrId);
27995impl TypedStablePtr for TokenImplPtr {
27996    type SyntaxNode = TokenImpl;
27997    fn untyped(&self) -> SyntaxStablePtrId {
27998        self.0
27999    }
28000    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenImpl {
28001        TokenImpl::from_syntax_node(db, self.0.lookup(db))
28002    }
28003}
28004impl From<TokenImplPtr> for SyntaxStablePtrId {
28005    fn from(ptr: TokenImplPtr) -> Self {
28006        ptr.untyped()
28007    }
28008}
28009#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
28010pub struct TokenImplGreen(pub GreenId);
28011impl TokenImplGreen {
28012    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
28013        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
28014    }
28015}
28016impl TypedSyntaxNode for TokenImpl {
28017    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenImpl);
28018    type StablePtr = TokenImplPtr;
28019    type Green = TokenImplGreen;
28020    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
28021        TokenImplGreen(
28022            Arc::new(GreenNode {
28023                kind: SyntaxKind::TokenMissing,
28024                details: GreenNodeDetails::Token("".into()),
28025            })
28026            .intern(db),
28027        )
28028    }
28029    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
28030        match node.lookup_intern(db).green.lookup_intern(db).details {
28031            GreenNodeDetails::Token(_) => Self { node },
28032            GreenNodeDetails::Node { .. } => {
28033                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenImpl)
28034            }
28035        }
28036    }
28037    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
28038        match node.lookup_intern(db).green.lookup_intern(db).details {
28039            GreenNodeDetails::Token(_) => Some(Self { node }),
28040            GreenNodeDetails::Node { .. } => None,
28041        }
28042    }
28043    fn as_syntax_node(&self) -> SyntaxNode {
28044        self.node
28045    }
28046    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
28047        TokenImplPtr(self.node.stable_ptr(db))
28048    }
28049}
28050#[derive(Clone, Debug, Eq, Hash, PartialEq)]
28051pub struct TerminalImpl {
28052    node: SyntaxNode,
28053}
28054impl Terminal for TerminalImpl {
28055    const KIND: SyntaxKind = SyntaxKind::TerminalImpl;
28056    type TokenType = TokenImpl;
28057    fn new_green(
28058        db: &dyn SyntaxGroup,
28059        leading_trivia: TriviaGreen,
28060        token: <<TerminalImpl as Terminal>::TokenType as TypedSyntaxNode>::Green,
28061        trailing_trivia: TriviaGreen,
28062    ) -> Self::Green {
28063        let children = [leading_trivia.0, token.0, trailing_trivia.0];
28064        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
28065        TerminalImplGreen(
28066            Arc::new(GreenNode {
28067                kind: SyntaxKind::TerminalImpl,
28068                details: GreenNodeDetails::Node { children: children.into(), width },
28069            })
28070            .intern(db),
28071        )
28072    }
28073    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
28074        let GreenNodeDetails::Node { children, .. } =
28075            &self.node.lookup_intern(db).green.lookup_intern(db).details
28076        else {
28077            unreachable!("Expected a node, not a token");
28078        };
28079        extract_matches!(&children[1].lookup_intern(db).details, GreenNodeDetails::Token).clone()
28080    }
28081}
28082impl TerminalImpl {
28083    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
28084        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
28085    }
28086    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenImpl {
28087        TokenImpl::from_syntax_node(db, self.node.get_children(db)[1])
28088    }
28089    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
28090        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
28091    }
28092}
28093#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
28094pub struct TerminalImplPtr(pub SyntaxStablePtrId);
28095impl TerminalImplPtr {}
28096impl TypedStablePtr for TerminalImplPtr {
28097    type SyntaxNode = TerminalImpl;
28098    fn untyped(&self) -> SyntaxStablePtrId {
28099        self.0
28100    }
28101    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalImpl {
28102        TerminalImpl::from_syntax_node(db, self.0.lookup(db))
28103    }
28104}
28105impl From<TerminalImplPtr> for SyntaxStablePtrId {
28106    fn from(ptr: TerminalImplPtr) -> Self {
28107        ptr.untyped()
28108    }
28109}
28110#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
28111pub struct TerminalImplGreen(pub GreenId);
28112impl TypedSyntaxNode for TerminalImpl {
28113    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalImpl);
28114    type StablePtr = TerminalImplPtr;
28115    type Green = TerminalImplGreen;
28116    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
28117        TerminalImplGreen(
28118            Arc::new(GreenNode {
28119                kind: SyntaxKind::TerminalImpl,
28120                details: GreenNodeDetails::Node {
28121                    children: [
28122                        Trivia::missing(db).0,
28123                        TokenImpl::missing(db).0,
28124                        Trivia::missing(db).0,
28125                    ]
28126                    .into(),
28127                    width: TextWidth::default(),
28128                },
28129            })
28130            .intern(db),
28131        )
28132    }
28133    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
28134        let kind = node.kind(db);
28135        assert_eq!(
28136            kind,
28137            SyntaxKind::TerminalImpl,
28138            "Unexpected SyntaxKind {:?}. Expected {:?}.",
28139            kind,
28140            SyntaxKind::TerminalImpl
28141        );
28142        Self { node }
28143    }
28144    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
28145        let kind = node.kind(db);
28146        if kind == SyntaxKind::TerminalImpl { Some(Self::from_syntax_node(db, node)) } else { None }
28147    }
28148    fn as_syntax_node(&self) -> SyntaxNode {
28149        self.node
28150    }
28151    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
28152        TerminalImplPtr(self.node.stable_ptr(db))
28153    }
28154}
28155#[derive(Clone, Debug, Eq, Hash, PartialEq)]
28156pub struct TokenImplicits {
28157    node: SyntaxNode,
28158}
28159impl Token for TokenImplicits {
28160    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
28161        TokenImplicitsGreen(
28162            Arc::new(GreenNode {
28163                kind: SyntaxKind::TokenImplicits,
28164                details: GreenNodeDetails::Token(text),
28165            })
28166            .intern(db),
28167        )
28168    }
28169    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
28170        extract_matches!(
28171            &self.node.lookup_intern(db).green.lookup_intern(db).details,
28172            GreenNodeDetails::Token
28173        )
28174        .clone()
28175    }
28176}
28177#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
28178pub struct TokenImplicitsPtr(pub SyntaxStablePtrId);
28179impl TypedStablePtr for TokenImplicitsPtr {
28180    type SyntaxNode = TokenImplicits;
28181    fn untyped(&self) -> SyntaxStablePtrId {
28182        self.0
28183    }
28184    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenImplicits {
28185        TokenImplicits::from_syntax_node(db, self.0.lookup(db))
28186    }
28187}
28188impl From<TokenImplicitsPtr> for SyntaxStablePtrId {
28189    fn from(ptr: TokenImplicitsPtr) -> Self {
28190        ptr.untyped()
28191    }
28192}
28193#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
28194pub struct TokenImplicitsGreen(pub GreenId);
28195impl TokenImplicitsGreen {
28196    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
28197        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
28198    }
28199}
28200impl TypedSyntaxNode for TokenImplicits {
28201    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenImplicits);
28202    type StablePtr = TokenImplicitsPtr;
28203    type Green = TokenImplicitsGreen;
28204    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
28205        TokenImplicitsGreen(
28206            Arc::new(GreenNode {
28207                kind: SyntaxKind::TokenMissing,
28208                details: GreenNodeDetails::Token("".into()),
28209            })
28210            .intern(db),
28211        )
28212    }
28213    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
28214        match node.lookup_intern(db).green.lookup_intern(db).details {
28215            GreenNodeDetails::Token(_) => Self { node },
28216            GreenNodeDetails::Node { .. } => {
28217                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenImplicits)
28218            }
28219        }
28220    }
28221    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
28222        match node.lookup_intern(db).green.lookup_intern(db).details {
28223            GreenNodeDetails::Token(_) => Some(Self { node }),
28224            GreenNodeDetails::Node { .. } => None,
28225        }
28226    }
28227    fn as_syntax_node(&self) -> SyntaxNode {
28228        self.node
28229    }
28230    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
28231        TokenImplicitsPtr(self.node.stable_ptr(db))
28232    }
28233}
28234#[derive(Clone, Debug, Eq, Hash, PartialEq)]
28235pub struct TerminalImplicits {
28236    node: SyntaxNode,
28237}
28238impl Terminal for TerminalImplicits {
28239    const KIND: SyntaxKind = SyntaxKind::TerminalImplicits;
28240    type TokenType = TokenImplicits;
28241    fn new_green(
28242        db: &dyn SyntaxGroup,
28243        leading_trivia: TriviaGreen,
28244        token: <<TerminalImplicits as Terminal>::TokenType as TypedSyntaxNode>::Green,
28245        trailing_trivia: TriviaGreen,
28246    ) -> Self::Green {
28247        let children = [leading_trivia.0, token.0, trailing_trivia.0];
28248        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
28249        TerminalImplicitsGreen(
28250            Arc::new(GreenNode {
28251                kind: SyntaxKind::TerminalImplicits,
28252                details: GreenNodeDetails::Node { children: children.into(), width },
28253            })
28254            .intern(db),
28255        )
28256    }
28257    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
28258        let GreenNodeDetails::Node { children, .. } =
28259            &self.node.lookup_intern(db).green.lookup_intern(db).details
28260        else {
28261            unreachable!("Expected a node, not a token");
28262        };
28263        extract_matches!(&children[1].lookup_intern(db).details, GreenNodeDetails::Token).clone()
28264    }
28265}
28266impl TerminalImplicits {
28267    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
28268        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
28269    }
28270    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenImplicits {
28271        TokenImplicits::from_syntax_node(db, self.node.get_children(db)[1])
28272    }
28273    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
28274        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
28275    }
28276}
28277#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
28278pub struct TerminalImplicitsPtr(pub SyntaxStablePtrId);
28279impl TerminalImplicitsPtr {}
28280impl TypedStablePtr for TerminalImplicitsPtr {
28281    type SyntaxNode = TerminalImplicits;
28282    fn untyped(&self) -> SyntaxStablePtrId {
28283        self.0
28284    }
28285    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalImplicits {
28286        TerminalImplicits::from_syntax_node(db, self.0.lookup(db))
28287    }
28288}
28289impl From<TerminalImplicitsPtr> for SyntaxStablePtrId {
28290    fn from(ptr: TerminalImplicitsPtr) -> Self {
28291        ptr.untyped()
28292    }
28293}
28294#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
28295pub struct TerminalImplicitsGreen(pub GreenId);
28296impl TypedSyntaxNode for TerminalImplicits {
28297    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalImplicits);
28298    type StablePtr = TerminalImplicitsPtr;
28299    type Green = TerminalImplicitsGreen;
28300    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
28301        TerminalImplicitsGreen(
28302            Arc::new(GreenNode {
28303                kind: SyntaxKind::TerminalImplicits,
28304                details: GreenNodeDetails::Node {
28305                    children: [
28306                        Trivia::missing(db).0,
28307                        TokenImplicits::missing(db).0,
28308                        Trivia::missing(db).0,
28309                    ]
28310                    .into(),
28311                    width: TextWidth::default(),
28312                },
28313            })
28314            .intern(db),
28315        )
28316    }
28317    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
28318        let kind = node.kind(db);
28319        assert_eq!(
28320            kind,
28321            SyntaxKind::TerminalImplicits,
28322            "Unexpected SyntaxKind {:?}. Expected {:?}.",
28323            kind,
28324            SyntaxKind::TerminalImplicits
28325        );
28326        Self { node }
28327    }
28328    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
28329        let kind = node.kind(db);
28330        if kind == SyntaxKind::TerminalImplicits {
28331            Some(Self::from_syntax_node(db, node))
28332        } else {
28333            None
28334        }
28335    }
28336    fn as_syntax_node(&self) -> SyntaxNode {
28337        self.node
28338    }
28339    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
28340        TerminalImplicitsPtr(self.node.stable_ptr(db))
28341    }
28342}
28343#[derive(Clone, Debug, Eq, Hash, PartialEq)]
28344pub struct TokenLet {
28345    node: SyntaxNode,
28346}
28347impl Token for TokenLet {
28348    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
28349        TokenLetGreen(
28350            Arc::new(GreenNode {
28351                kind: SyntaxKind::TokenLet,
28352                details: GreenNodeDetails::Token(text),
28353            })
28354            .intern(db),
28355        )
28356    }
28357    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
28358        extract_matches!(
28359            &self.node.lookup_intern(db).green.lookup_intern(db).details,
28360            GreenNodeDetails::Token
28361        )
28362        .clone()
28363    }
28364}
28365#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
28366pub struct TokenLetPtr(pub SyntaxStablePtrId);
28367impl TypedStablePtr for TokenLetPtr {
28368    type SyntaxNode = TokenLet;
28369    fn untyped(&self) -> SyntaxStablePtrId {
28370        self.0
28371    }
28372    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenLet {
28373        TokenLet::from_syntax_node(db, self.0.lookup(db))
28374    }
28375}
28376impl From<TokenLetPtr> for SyntaxStablePtrId {
28377    fn from(ptr: TokenLetPtr) -> Self {
28378        ptr.untyped()
28379    }
28380}
28381#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
28382pub struct TokenLetGreen(pub GreenId);
28383impl TokenLetGreen {
28384    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
28385        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
28386    }
28387}
28388impl TypedSyntaxNode for TokenLet {
28389    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenLet);
28390    type StablePtr = TokenLetPtr;
28391    type Green = TokenLetGreen;
28392    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
28393        TokenLetGreen(
28394            Arc::new(GreenNode {
28395                kind: SyntaxKind::TokenMissing,
28396                details: GreenNodeDetails::Token("".into()),
28397            })
28398            .intern(db),
28399        )
28400    }
28401    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
28402        match node.lookup_intern(db).green.lookup_intern(db).details {
28403            GreenNodeDetails::Token(_) => Self { node },
28404            GreenNodeDetails::Node { .. } => {
28405                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenLet)
28406            }
28407        }
28408    }
28409    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
28410        match node.lookup_intern(db).green.lookup_intern(db).details {
28411            GreenNodeDetails::Token(_) => Some(Self { node }),
28412            GreenNodeDetails::Node { .. } => None,
28413        }
28414    }
28415    fn as_syntax_node(&self) -> SyntaxNode {
28416        self.node
28417    }
28418    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
28419        TokenLetPtr(self.node.stable_ptr(db))
28420    }
28421}
28422#[derive(Clone, Debug, Eq, Hash, PartialEq)]
28423pub struct TerminalLet {
28424    node: SyntaxNode,
28425}
28426impl Terminal for TerminalLet {
28427    const KIND: SyntaxKind = SyntaxKind::TerminalLet;
28428    type TokenType = TokenLet;
28429    fn new_green(
28430        db: &dyn SyntaxGroup,
28431        leading_trivia: TriviaGreen,
28432        token: <<TerminalLet as Terminal>::TokenType as TypedSyntaxNode>::Green,
28433        trailing_trivia: TriviaGreen,
28434    ) -> Self::Green {
28435        let children = [leading_trivia.0, token.0, trailing_trivia.0];
28436        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
28437        TerminalLetGreen(
28438            Arc::new(GreenNode {
28439                kind: SyntaxKind::TerminalLet,
28440                details: GreenNodeDetails::Node { children: children.into(), width },
28441            })
28442            .intern(db),
28443        )
28444    }
28445    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
28446        let GreenNodeDetails::Node { children, .. } =
28447            &self.node.lookup_intern(db).green.lookup_intern(db).details
28448        else {
28449            unreachable!("Expected a node, not a token");
28450        };
28451        extract_matches!(&children[1].lookup_intern(db).details, GreenNodeDetails::Token).clone()
28452    }
28453}
28454impl TerminalLet {
28455    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
28456        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
28457    }
28458    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenLet {
28459        TokenLet::from_syntax_node(db, self.node.get_children(db)[1])
28460    }
28461    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
28462        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
28463    }
28464}
28465#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
28466pub struct TerminalLetPtr(pub SyntaxStablePtrId);
28467impl TerminalLetPtr {}
28468impl TypedStablePtr for TerminalLetPtr {
28469    type SyntaxNode = TerminalLet;
28470    fn untyped(&self) -> SyntaxStablePtrId {
28471        self.0
28472    }
28473    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalLet {
28474        TerminalLet::from_syntax_node(db, self.0.lookup(db))
28475    }
28476}
28477impl From<TerminalLetPtr> for SyntaxStablePtrId {
28478    fn from(ptr: TerminalLetPtr) -> Self {
28479        ptr.untyped()
28480    }
28481}
28482#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
28483pub struct TerminalLetGreen(pub GreenId);
28484impl TypedSyntaxNode for TerminalLet {
28485    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalLet);
28486    type StablePtr = TerminalLetPtr;
28487    type Green = TerminalLetGreen;
28488    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
28489        TerminalLetGreen(
28490            Arc::new(GreenNode {
28491                kind: SyntaxKind::TerminalLet,
28492                details: GreenNodeDetails::Node {
28493                    children: [
28494                        Trivia::missing(db).0,
28495                        TokenLet::missing(db).0,
28496                        Trivia::missing(db).0,
28497                    ]
28498                    .into(),
28499                    width: TextWidth::default(),
28500                },
28501            })
28502            .intern(db),
28503        )
28504    }
28505    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
28506        let kind = node.kind(db);
28507        assert_eq!(
28508            kind,
28509            SyntaxKind::TerminalLet,
28510            "Unexpected SyntaxKind {:?}. Expected {:?}.",
28511            kind,
28512            SyntaxKind::TerminalLet
28513        );
28514        Self { node }
28515    }
28516    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
28517        let kind = node.kind(db);
28518        if kind == SyntaxKind::TerminalLet { Some(Self::from_syntax_node(db, node)) } else { None }
28519    }
28520    fn as_syntax_node(&self) -> SyntaxNode {
28521        self.node
28522    }
28523    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
28524        TerminalLetPtr(self.node.stable_ptr(db))
28525    }
28526}
28527#[derive(Clone, Debug, Eq, Hash, PartialEq)]
28528pub struct TokenMacro {
28529    node: SyntaxNode,
28530}
28531impl Token for TokenMacro {
28532    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
28533        TokenMacroGreen(
28534            Arc::new(GreenNode {
28535                kind: SyntaxKind::TokenMacro,
28536                details: GreenNodeDetails::Token(text),
28537            })
28538            .intern(db),
28539        )
28540    }
28541    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
28542        extract_matches!(
28543            &self.node.lookup_intern(db).green.lookup_intern(db).details,
28544            GreenNodeDetails::Token
28545        )
28546        .clone()
28547    }
28548}
28549#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
28550pub struct TokenMacroPtr(pub SyntaxStablePtrId);
28551impl TypedStablePtr for TokenMacroPtr {
28552    type SyntaxNode = TokenMacro;
28553    fn untyped(&self) -> SyntaxStablePtrId {
28554        self.0
28555    }
28556    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenMacro {
28557        TokenMacro::from_syntax_node(db, self.0.lookup(db))
28558    }
28559}
28560impl From<TokenMacroPtr> for SyntaxStablePtrId {
28561    fn from(ptr: TokenMacroPtr) -> Self {
28562        ptr.untyped()
28563    }
28564}
28565#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
28566pub struct TokenMacroGreen(pub GreenId);
28567impl TokenMacroGreen {
28568    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
28569        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
28570    }
28571}
28572impl TypedSyntaxNode for TokenMacro {
28573    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenMacro);
28574    type StablePtr = TokenMacroPtr;
28575    type Green = TokenMacroGreen;
28576    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
28577        TokenMacroGreen(
28578            Arc::new(GreenNode {
28579                kind: SyntaxKind::TokenMissing,
28580                details: GreenNodeDetails::Token("".into()),
28581            })
28582            .intern(db),
28583        )
28584    }
28585    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
28586        match node.lookup_intern(db).green.lookup_intern(db).details {
28587            GreenNodeDetails::Token(_) => Self { node },
28588            GreenNodeDetails::Node { .. } => {
28589                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenMacro)
28590            }
28591        }
28592    }
28593    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
28594        match node.lookup_intern(db).green.lookup_intern(db).details {
28595            GreenNodeDetails::Token(_) => Some(Self { node }),
28596            GreenNodeDetails::Node { .. } => None,
28597        }
28598    }
28599    fn as_syntax_node(&self) -> SyntaxNode {
28600        self.node
28601    }
28602    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
28603        TokenMacroPtr(self.node.stable_ptr(db))
28604    }
28605}
28606#[derive(Clone, Debug, Eq, Hash, PartialEq)]
28607pub struct TerminalMacro {
28608    node: SyntaxNode,
28609}
28610impl Terminal for TerminalMacro {
28611    const KIND: SyntaxKind = SyntaxKind::TerminalMacro;
28612    type TokenType = TokenMacro;
28613    fn new_green(
28614        db: &dyn SyntaxGroup,
28615        leading_trivia: TriviaGreen,
28616        token: <<TerminalMacro as Terminal>::TokenType as TypedSyntaxNode>::Green,
28617        trailing_trivia: TriviaGreen,
28618    ) -> Self::Green {
28619        let children = [leading_trivia.0, token.0, trailing_trivia.0];
28620        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
28621        TerminalMacroGreen(
28622            Arc::new(GreenNode {
28623                kind: SyntaxKind::TerminalMacro,
28624                details: GreenNodeDetails::Node { children: children.into(), width },
28625            })
28626            .intern(db),
28627        )
28628    }
28629    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
28630        let GreenNodeDetails::Node { children, .. } =
28631            &self.node.lookup_intern(db).green.lookup_intern(db).details
28632        else {
28633            unreachable!("Expected a node, not a token");
28634        };
28635        extract_matches!(&children[1].lookup_intern(db).details, GreenNodeDetails::Token).clone()
28636    }
28637}
28638impl TerminalMacro {
28639    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
28640        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
28641    }
28642    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenMacro {
28643        TokenMacro::from_syntax_node(db, self.node.get_children(db)[1])
28644    }
28645    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
28646        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
28647    }
28648}
28649#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
28650pub struct TerminalMacroPtr(pub SyntaxStablePtrId);
28651impl TerminalMacroPtr {}
28652impl TypedStablePtr for TerminalMacroPtr {
28653    type SyntaxNode = TerminalMacro;
28654    fn untyped(&self) -> SyntaxStablePtrId {
28655        self.0
28656    }
28657    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalMacro {
28658        TerminalMacro::from_syntax_node(db, self.0.lookup(db))
28659    }
28660}
28661impl From<TerminalMacroPtr> for SyntaxStablePtrId {
28662    fn from(ptr: TerminalMacroPtr) -> Self {
28663        ptr.untyped()
28664    }
28665}
28666#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
28667pub struct TerminalMacroGreen(pub GreenId);
28668impl TypedSyntaxNode for TerminalMacro {
28669    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalMacro);
28670    type StablePtr = TerminalMacroPtr;
28671    type Green = TerminalMacroGreen;
28672    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
28673        TerminalMacroGreen(
28674            Arc::new(GreenNode {
28675                kind: SyntaxKind::TerminalMacro,
28676                details: GreenNodeDetails::Node {
28677                    children: [
28678                        Trivia::missing(db).0,
28679                        TokenMacro::missing(db).0,
28680                        Trivia::missing(db).0,
28681                    ]
28682                    .into(),
28683                    width: TextWidth::default(),
28684                },
28685            })
28686            .intern(db),
28687        )
28688    }
28689    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
28690        let kind = node.kind(db);
28691        assert_eq!(
28692            kind,
28693            SyntaxKind::TerminalMacro,
28694            "Unexpected SyntaxKind {:?}. Expected {:?}.",
28695            kind,
28696            SyntaxKind::TerminalMacro
28697        );
28698        Self { node }
28699    }
28700    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
28701        let kind = node.kind(db);
28702        if kind == SyntaxKind::TerminalMacro {
28703            Some(Self::from_syntax_node(db, node))
28704        } else {
28705            None
28706        }
28707    }
28708    fn as_syntax_node(&self) -> SyntaxNode {
28709        self.node
28710    }
28711    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
28712        TerminalMacroPtr(self.node.stable_ptr(db))
28713    }
28714}
28715#[derive(Clone, Debug, Eq, Hash, PartialEq)]
28716pub struct TokenMatch {
28717    node: SyntaxNode,
28718}
28719impl Token for TokenMatch {
28720    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
28721        TokenMatchGreen(
28722            Arc::new(GreenNode {
28723                kind: SyntaxKind::TokenMatch,
28724                details: GreenNodeDetails::Token(text),
28725            })
28726            .intern(db),
28727        )
28728    }
28729    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
28730        extract_matches!(
28731            &self.node.lookup_intern(db).green.lookup_intern(db).details,
28732            GreenNodeDetails::Token
28733        )
28734        .clone()
28735    }
28736}
28737#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
28738pub struct TokenMatchPtr(pub SyntaxStablePtrId);
28739impl TypedStablePtr for TokenMatchPtr {
28740    type SyntaxNode = TokenMatch;
28741    fn untyped(&self) -> SyntaxStablePtrId {
28742        self.0
28743    }
28744    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenMatch {
28745        TokenMatch::from_syntax_node(db, self.0.lookup(db))
28746    }
28747}
28748impl From<TokenMatchPtr> for SyntaxStablePtrId {
28749    fn from(ptr: TokenMatchPtr) -> Self {
28750        ptr.untyped()
28751    }
28752}
28753#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
28754pub struct TokenMatchGreen(pub GreenId);
28755impl TokenMatchGreen {
28756    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
28757        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
28758    }
28759}
28760impl TypedSyntaxNode for TokenMatch {
28761    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenMatch);
28762    type StablePtr = TokenMatchPtr;
28763    type Green = TokenMatchGreen;
28764    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
28765        TokenMatchGreen(
28766            Arc::new(GreenNode {
28767                kind: SyntaxKind::TokenMissing,
28768                details: GreenNodeDetails::Token("".into()),
28769            })
28770            .intern(db),
28771        )
28772    }
28773    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
28774        match node.lookup_intern(db).green.lookup_intern(db).details {
28775            GreenNodeDetails::Token(_) => Self { node },
28776            GreenNodeDetails::Node { .. } => {
28777                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenMatch)
28778            }
28779        }
28780    }
28781    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
28782        match node.lookup_intern(db).green.lookup_intern(db).details {
28783            GreenNodeDetails::Token(_) => Some(Self { node }),
28784            GreenNodeDetails::Node { .. } => None,
28785        }
28786    }
28787    fn as_syntax_node(&self) -> SyntaxNode {
28788        self.node
28789    }
28790    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
28791        TokenMatchPtr(self.node.stable_ptr(db))
28792    }
28793}
28794#[derive(Clone, Debug, Eq, Hash, PartialEq)]
28795pub struct TerminalMatch {
28796    node: SyntaxNode,
28797}
28798impl Terminal for TerminalMatch {
28799    const KIND: SyntaxKind = SyntaxKind::TerminalMatch;
28800    type TokenType = TokenMatch;
28801    fn new_green(
28802        db: &dyn SyntaxGroup,
28803        leading_trivia: TriviaGreen,
28804        token: <<TerminalMatch as Terminal>::TokenType as TypedSyntaxNode>::Green,
28805        trailing_trivia: TriviaGreen,
28806    ) -> Self::Green {
28807        let children = [leading_trivia.0, token.0, trailing_trivia.0];
28808        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
28809        TerminalMatchGreen(
28810            Arc::new(GreenNode {
28811                kind: SyntaxKind::TerminalMatch,
28812                details: GreenNodeDetails::Node { children: children.into(), width },
28813            })
28814            .intern(db),
28815        )
28816    }
28817    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
28818        let GreenNodeDetails::Node { children, .. } =
28819            &self.node.lookup_intern(db).green.lookup_intern(db).details
28820        else {
28821            unreachable!("Expected a node, not a token");
28822        };
28823        extract_matches!(&children[1].lookup_intern(db).details, GreenNodeDetails::Token).clone()
28824    }
28825}
28826impl TerminalMatch {
28827    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
28828        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
28829    }
28830    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenMatch {
28831        TokenMatch::from_syntax_node(db, self.node.get_children(db)[1])
28832    }
28833    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
28834        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
28835    }
28836}
28837#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
28838pub struct TerminalMatchPtr(pub SyntaxStablePtrId);
28839impl TerminalMatchPtr {}
28840impl TypedStablePtr for TerminalMatchPtr {
28841    type SyntaxNode = TerminalMatch;
28842    fn untyped(&self) -> SyntaxStablePtrId {
28843        self.0
28844    }
28845    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalMatch {
28846        TerminalMatch::from_syntax_node(db, self.0.lookup(db))
28847    }
28848}
28849impl From<TerminalMatchPtr> for SyntaxStablePtrId {
28850    fn from(ptr: TerminalMatchPtr) -> Self {
28851        ptr.untyped()
28852    }
28853}
28854#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
28855pub struct TerminalMatchGreen(pub GreenId);
28856impl TypedSyntaxNode for TerminalMatch {
28857    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalMatch);
28858    type StablePtr = TerminalMatchPtr;
28859    type Green = TerminalMatchGreen;
28860    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
28861        TerminalMatchGreen(
28862            Arc::new(GreenNode {
28863                kind: SyntaxKind::TerminalMatch,
28864                details: GreenNodeDetails::Node {
28865                    children: [
28866                        Trivia::missing(db).0,
28867                        TokenMatch::missing(db).0,
28868                        Trivia::missing(db).0,
28869                    ]
28870                    .into(),
28871                    width: TextWidth::default(),
28872                },
28873            })
28874            .intern(db),
28875        )
28876    }
28877    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
28878        let kind = node.kind(db);
28879        assert_eq!(
28880            kind,
28881            SyntaxKind::TerminalMatch,
28882            "Unexpected SyntaxKind {:?}. Expected {:?}.",
28883            kind,
28884            SyntaxKind::TerminalMatch
28885        );
28886        Self { node }
28887    }
28888    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
28889        let kind = node.kind(db);
28890        if kind == SyntaxKind::TerminalMatch {
28891            Some(Self::from_syntax_node(db, node))
28892        } else {
28893            None
28894        }
28895    }
28896    fn as_syntax_node(&self) -> SyntaxNode {
28897        self.node
28898    }
28899    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
28900        TerminalMatchPtr(self.node.stable_ptr(db))
28901    }
28902}
28903#[derive(Clone, Debug, Eq, Hash, PartialEq)]
28904pub struct TokenModule {
28905    node: SyntaxNode,
28906}
28907impl Token for TokenModule {
28908    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
28909        TokenModuleGreen(
28910            Arc::new(GreenNode {
28911                kind: SyntaxKind::TokenModule,
28912                details: GreenNodeDetails::Token(text),
28913            })
28914            .intern(db),
28915        )
28916    }
28917    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
28918        extract_matches!(
28919            &self.node.lookup_intern(db).green.lookup_intern(db).details,
28920            GreenNodeDetails::Token
28921        )
28922        .clone()
28923    }
28924}
28925#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
28926pub struct TokenModulePtr(pub SyntaxStablePtrId);
28927impl TypedStablePtr for TokenModulePtr {
28928    type SyntaxNode = TokenModule;
28929    fn untyped(&self) -> SyntaxStablePtrId {
28930        self.0
28931    }
28932    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenModule {
28933        TokenModule::from_syntax_node(db, self.0.lookup(db))
28934    }
28935}
28936impl From<TokenModulePtr> for SyntaxStablePtrId {
28937    fn from(ptr: TokenModulePtr) -> Self {
28938        ptr.untyped()
28939    }
28940}
28941#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
28942pub struct TokenModuleGreen(pub GreenId);
28943impl TokenModuleGreen {
28944    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
28945        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
28946    }
28947}
28948impl TypedSyntaxNode for TokenModule {
28949    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenModule);
28950    type StablePtr = TokenModulePtr;
28951    type Green = TokenModuleGreen;
28952    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
28953        TokenModuleGreen(
28954            Arc::new(GreenNode {
28955                kind: SyntaxKind::TokenMissing,
28956                details: GreenNodeDetails::Token("".into()),
28957            })
28958            .intern(db),
28959        )
28960    }
28961    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
28962        match node.lookup_intern(db).green.lookup_intern(db).details {
28963            GreenNodeDetails::Token(_) => Self { node },
28964            GreenNodeDetails::Node { .. } => {
28965                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenModule)
28966            }
28967        }
28968    }
28969    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
28970        match node.lookup_intern(db).green.lookup_intern(db).details {
28971            GreenNodeDetails::Token(_) => Some(Self { node }),
28972            GreenNodeDetails::Node { .. } => None,
28973        }
28974    }
28975    fn as_syntax_node(&self) -> SyntaxNode {
28976        self.node
28977    }
28978    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
28979        TokenModulePtr(self.node.stable_ptr(db))
28980    }
28981}
28982#[derive(Clone, Debug, Eq, Hash, PartialEq)]
28983pub struct TerminalModule {
28984    node: SyntaxNode,
28985}
28986impl Terminal for TerminalModule {
28987    const KIND: SyntaxKind = SyntaxKind::TerminalModule;
28988    type TokenType = TokenModule;
28989    fn new_green(
28990        db: &dyn SyntaxGroup,
28991        leading_trivia: TriviaGreen,
28992        token: <<TerminalModule as Terminal>::TokenType as TypedSyntaxNode>::Green,
28993        trailing_trivia: TriviaGreen,
28994    ) -> Self::Green {
28995        let children = [leading_trivia.0, token.0, trailing_trivia.0];
28996        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
28997        TerminalModuleGreen(
28998            Arc::new(GreenNode {
28999                kind: SyntaxKind::TerminalModule,
29000                details: GreenNodeDetails::Node { children: children.into(), width },
29001            })
29002            .intern(db),
29003        )
29004    }
29005    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
29006        let GreenNodeDetails::Node { children, .. } =
29007            &self.node.lookup_intern(db).green.lookup_intern(db).details
29008        else {
29009            unreachable!("Expected a node, not a token");
29010        };
29011        extract_matches!(&children[1].lookup_intern(db).details, GreenNodeDetails::Token).clone()
29012    }
29013}
29014impl TerminalModule {
29015    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
29016        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
29017    }
29018    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenModule {
29019        TokenModule::from_syntax_node(db, self.node.get_children(db)[1])
29020    }
29021    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
29022        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
29023    }
29024}
29025#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
29026pub struct TerminalModulePtr(pub SyntaxStablePtrId);
29027impl TerminalModulePtr {}
29028impl TypedStablePtr for TerminalModulePtr {
29029    type SyntaxNode = TerminalModule;
29030    fn untyped(&self) -> SyntaxStablePtrId {
29031        self.0
29032    }
29033    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalModule {
29034        TerminalModule::from_syntax_node(db, self.0.lookup(db))
29035    }
29036}
29037impl From<TerminalModulePtr> for SyntaxStablePtrId {
29038    fn from(ptr: TerminalModulePtr) -> Self {
29039        ptr.untyped()
29040    }
29041}
29042#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
29043pub struct TerminalModuleGreen(pub GreenId);
29044impl TypedSyntaxNode for TerminalModule {
29045    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalModule);
29046    type StablePtr = TerminalModulePtr;
29047    type Green = TerminalModuleGreen;
29048    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
29049        TerminalModuleGreen(
29050            Arc::new(GreenNode {
29051                kind: SyntaxKind::TerminalModule,
29052                details: GreenNodeDetails::Node {
29053                    children: [
29054                        Trivia::missing(db).0,
29055                        TokenModule::missing(db).0,
29056                        Trivia::missing(db).0,
29057                    ]
29058                    .into(),
29059                    width: TextWidth::default(),
29060                },
29061            })
29062            .intern(db),
29063        )
29064    }
29065    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
29066        let kind = node.kind(db);
29067        assert_eq!(
29068            kind,
29069            SyntaxKind::TerminalModule,
29070            "Unexpected SyntaxKind {:?}. Expected {:?}.",
29071            kind,
29072            SyntaxKind::TerminalModule
29073        );
29074        Self { node }
29075    }
29076    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
29077        let kind = node.kind(db);
29078        if kind == SyntaxKind::TerminalModule {
29079            Some(Self::from_syntax_node(db, node))
29080        } else {
29081            None
29082        }
29083    }
29084    fn as_syntax_node(&self) -> SyntaxNode {
29085        self.node
29086    }
29087    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
29088        TerminalModulePtr(self.node.stable_ptr(db))
29089    }
29090}
29091#[derive(Clone, Debug, Eq, Hash, PartialEq)]
29092pub struct TokenMut {
29093    node: SyntaxNode,
29094}
29095impl Token for TokenMut {
29096    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
29097        TokenMutGreen(
29098            Arc::new(GreenNode {
29099                kind: SyntaxKind::TokenMut,
29100                details: GreenNodeDetails::Token(text),
29101            })
29102            .intern(db),
29103        )
29104    }
29105    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
29106        extract_matches!(
29107            &self.node.lookup_intern(db).green.lookup_intern(db).details,
29108            GreenNodeDetails::Token
29109        )
29110        .clone()
29111    }
29112}
29113#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
29114pub struct TokenMutPtr(pub SyntaxStablePtrId);
29115impl TypedStablePtr for TokenMutPtr {
29116    type SyntaxNode = TokenMut;
29117    fn untyped(&self) -> SyntaxStablePtrId {
29118        self.0
29119    }
29120    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenMut {
29121        TokenMut::from_syntax_node(db, self.0.lookup(db))
29122    }
29123}
29124impl From<TokenMutPtr> for SyntaxStablePtrId {
29125    fn from(ptr: TokenMutPtr) -> Self {
29126        ptr.untyped()
29127    }
29128}
29129#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
29130pub struct TokenMutGreen(pub GreenId);
29131impl TokenMutGreen {
29132    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
29133        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
29134    }
29135}
29136impl TypedSyntaxNode for TokenMut {
29137    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenMut);
29138    type StablePtr = TokenMutPtr;
29139    type Green = TokenMutGreen;
29140    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
29141        TokenMutGreen(
29142            Arc::new(GreenNode {
29143                kind: SyntaxKind::TokenMissing,
29144                details: GreenNodeDetails::Token("".into()),
29145            })
29146            .intern(db),
29147        )
29148    }
29149    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
29150        match node.lookup_intern(db).green.lookup_intern(db).details {
29151            GreenNodeDetails::Token(_) => Self { node },
29152            GreenNodeDetails::Node { .. } => {
29153                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenMut)
29154            }
29155        }
29156    }
29157    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
29158        match node.lookup_intern(db).green.lookup_intern(db).details {
29159            GreenNodeDetails::Token(_) => Some(Self { node }),
29160            GreenNodeDetails::Node { .. } => None,
29161        }
29162    }
29163    fn as_syntax_node(&self) -> SyntaxNode {
29164        self.node
29165    }
29166    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
29167        TokenMutPtr(self.node.stable_ptr(db))
29168    }
29169}
29170#[derive(Clone, Debug, Eq, Hash, PartialEq)]
29171pub struct TerminalMut {
29172    node: SyntaxNode,
29173}
29174impl Terminal for TerminalMut {
29175    const KIND: SyntaxKind = SyntaxKind::TerminalMut;
29176    type TokenType = TokenMut;
29177    fn new_green(
29178        db: &dyn SyntaxGroup,
29179        leading_trivia: TriviaGreen,
29180        token: <<TerminalMut as Terminal>::TokenType as TypedSyntaxNode>::Green,
29181        trailing_trivia: TriviaGreen,
29182    ) -> Self::Green {
29183        let children = [leading_trivia.0, token.0, trailing_trivia.0];
29184        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
29185        TerminalMutGreen(
29186            Arc::new(GreenNode {
29187                kind: SyntaxKind::TerminalMut,
29188                details: GreenNodeDetails::Node { children: children.into(), width },
29189            })
29190            .intern(db),
29191        )
29192    }
29193    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
29194        let GreenNodeDetails::Node { children, .. } =
29195            &self.node.lookup_intern(db).green.lookup_intern(db).details
29196        else {
29197            unreachable!("Expected a node, not a token");
29198        };
29199        extract_matches!(&children[1].lookup_intern(db).details, GreenNodeDetails::Token).clone()
29200    }
29201}
29202impl TerminalMut {
29203    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
29204        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
29205    }
29206    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenMut {
29207        TokenMut::from_syntax_node(db, self.node.get_children(db)[1])
29208    }
29209    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
29210        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
29211    }
29212}
29213#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
29214pub struct TerminalMutPtr(pub SyntaxStablePtrId);
29215impl TerminalMutPtr {}
29216impl TypedStablePtr for TerminalMutPtr {
29217    type SyntaxNode = TerminalMut;
29218    fn untyped(&self) -> SyntaxStablePtrId {
29219        self.0
29220    }
29221    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalMut {
29222        TerminalMut::from_syntax_node(db, self.0.lookup(db))
29223    }
29224}
29225impl From<TerminalMutPtr> for SyntaxStablePtrId {
29226    fn from(ptr: TerminalMutPtr) -> Self {
29227        ptr.untyped()
29228    }
29229}
29230#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
29231pub struct TerminalMutGreen(pub GreenId);
29232impl TypedSyntaxNode for TerminalMut {
29233    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalMut);
29234    type StablePtr = TerminalMutPtr;
29235    type Green = TerminalMutGreen;
29236    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
29237        TerminalMutGreen(
29238            Arc::new(GreenNode {
29239                kind: SyntaxKind::TerminalMut,
29240                details: GreenNodeDetails::Node {
29241                    children: [
29242                        Trivia::missing(db).0,
29243                        TokenMut::missing(db).0,
29244                        Trivia::missing(db).0,
29245                    ]
29246                    .into(),
29247                    width: TextWidth::default(),
29248                },
29249            })
29250            .intern(db),
29251        )
29252    }
29253    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
29254        let kind = node.kind(db);
29255        assert_eq!(
29256            kind,
29257            SyntaxKind::TerminalMut,
29258            "Unexpected SyntaxKind {:?}. Expected {:?}.",
29259            kind,
29260            SyntaxKind::TerminalMut
29261        );
29262        Self { node }
29263    }
29264    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
29265        let kind = node.kind(db);
29266        if kind == SyntaxKind::TerminalMut { Some(Self::from_syntax_node(db, node)) } else { None }
29267    }
29268    fn as_syntax_node(&self) -> SyntaxNode {
29269        self.node
29270    }
29271    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
29272        TerminalMutPtr(self.node.stable_ptr(db))
29273    }
29274}
29275#[derive(Clone, Debug, Eq, Hash, PartialEq)]
29276pub struct TokenNoPanic {
29277    node: SyntaxNode,
29278}
29279impl Token for TokenNoPanic {
29280    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
29281        TokenNoPanicGreen(
29282            Arc::new(GreenNode {
29283                kind: SyntaxKind::TokenNoPanic,
29284                details: GreenNodeDetails::Token(text),
29285            })
29286            .intern(db),
29287        )
29288    }
29289    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
29290        extract_matches!(
29291            &self.node.lookup_intern(db).green.lookup_intern(db).details,
29292            GreenNodeDetails::Token
29293        )
29294        .clone()
29295    }
29296}
29297#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
29298pub struct TokenNoPanicPtr(pub SyntaxStablePtrId);
29299impl TypedStablePtr for TokenNoPanicPtr {
29300    type SyntaxNode = TokenNoPanic;
29301    fn untyped(&self) -> SyntaxStablePtrId {
29302        self.0
29303    }
29304    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenNoPanic {
29305        TokenNoPanic::from_syntax_node(db, self.0.lookup(db))
29306    }
29307}
29308impl From<TokenNoPanicPtr> for SyntaxStablePtrId {
29309    fn from(ptr: TokenNoPanicPtr) -> Self {
29310        ptr.untyped()
29311    }
29312}
29313#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
29314pub struct TokenNoPanicGreen(pub GreenId);
29315impl TokenNoPanicGreen {
29316    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
29317        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
29318    }
29319}
29320impl TypedSyntaxNode for TokenNoPanic {
29321    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenNoPanic);
29322    type StablePtr = TokenNoPanicPtr;
29323    type Green = TokenNoPanicGreen;
29324    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
29325        TokenNoPanicGreen(
29326            Arc::new(GreenNode {
29327                kind: SyntaxKind::TokenMissing,
29328                details: GreenNodeDetails::Token("".into()),
29329            })
29330            .intern(db),
29331        )
29332    }
29333    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
29334        match node.lookup_intern(db).green.lookup_intern(db).details {
29335            GreenNodeDetails::Token(_) => Self { node },
29336            GreenNodeDetails::Node { .. } => {
29337                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenNoPanic)
29338            }
29339        }
29340    }
29341    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
29342        match node.lookup_intern(db).green.lookup_intern(db).details {
29343            GreenNodeDetails::Token(_) => Some(Self { node }),
29344            GreenNodeDetails::Node { .. } => None,
29345        }
29346    }
29347    fn as_syntax_node(&self) -> SyntaxNode {
29348        self.node
29349    }
29350    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
29351        TokenNoPanicPtr(self.node.stable_ptr(db))
29352    }
29353}
29354#[derive(Clone, Debug, Eq, Hash, PartialEq)]
29355pub struct TerminalNoPanic {
29356    node: SyntaxNode,
29357}
29358impl Terminal for TerminalNoPanic {
29359    const KIND: SyntaxKind = SyntaxKind::TerminalNoPanic;
29360    type TokenType = TokenNoPanic;
29361    fn new_green(
29362        db: &dyn SyntaxGroup,
29363        leading_trivia: TriviaGreen,
29364        token: <<TerminalNoPanic as Terminal>::TokenType as TypedSyntaxNode>::Green,
29365        trailing_trivia: TriviaGreen,
29366    ) -> Self::Green {
29367        let children = [leading_trivia.0, token.0, trailing_trivia.0];
29368        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
29369        TerminalNoPanicGreen(
29370            Arc::new(GreenNode {
29371                kind: SyntaxKind::TerminalNoPanic,
29372                details: GreenNodeDetails::Node { children: children.into(), width },
29373            })
29374            .intern(db),
29375        )
29376    }
29377    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
29378        let GreenNodeDetails::Node { children, .. } =
29379            &self.node.lookup_intern(db).green.lookup_intern(db).details
29380        else {
29381            unreachable!("Expected a node, not a token");
29382        };
29383        extract_matches!(&children[1].lookup_intern(db).details, GreenNodeDetails::Token).clone()
29384    }
29385}
29386impl TerminalNoPanic {
29387    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
29388        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
29389    }
29390    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenNoPanic {
29391        TokenNoPanic::from_syntax_node(db, self.node.get_children(db)[1])
29392    }
29393    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
29394        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
29395    }
29396}
29397#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
29398pub struct TerminalNoPanicPtr(pub SyntaxStablePtrId);
29399impl TerminalNoPanicPtr {}
29400impl TypedStablePtr for TerminalNoPanicPtr {
29401    type SyntaxNode = TerminalNoPanic;
29402    fn untyped(&self) -> SyntaxStablePtrId {
29403        self.0
29404    }
29405    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalNoPanic {
29406        TerminalNoPanic::from_syntax_node(db, self.0.lookup(db))
29407    }
29408}
29409impl From<TerminalNoPanicPtr> for SyntaxStablePtrId {
29410    fn from(ptr: TerminalNoPanicPtr) -> Self {
29411        ptr.untyped()
29412    }
29413}
29414#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
29415pub struct TerminalNoPanicGreen(pub GreenId);
29416impl TypedSyntaxNode for TerminalNoPanic {
29417    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalNoPanic);
29418    type StablePtr = TerminalNoPanicPtr;
29419    type Green = TerminalNoPanicGreen;
29420    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
29421        TerminalNoPanicGreen(
29422            Arc::new(GreenNode {
29423                kind: SyntaxKind::TerminalNoPanic,
29424                details: GreenNodeDetails::Node {
29425                    children: [
29426                        Trivia::missing(db).0,
29427                        TokenNoPanic::missing(db).0,
29428                        Trivia::missing(db).0,
29429                    ]
29430                    .into(),
29431                    width: TextWidth::default(),
29432                },
29433            })
29434            .intern(db),
29435        )
29436    }
29437    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
29438        let kind = node.kind(db);
29439        assert_eq!(
29440            kind,
29441            SyntaxKind::TerminalNoPanic,
29442            "Unexpected SyntaxKind {:?}. Expected {:?}.",
29443            kind,
29444            SyntaxKind::TerminalNoPanic
29445        );
29446        Self { node }
29447    }
29448    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
29449        let kind = node.kind(db);
29450        if kind == SyntaxKind::TerminalNoPanic {
29451            Some(Self::from_syntax_node(db, node))
29452        } else {
29453            None
29454        }
29455    }
29456    fn as_syntax_node(&self) -> SyntaxNode {
29457        self.node
29458    }
29459    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
29460        TerminalNoPanicPtr(self.node.stable_ptr(db))
29461    }
29462}
29463#[derive(Clone, Debug, Eq, Hash, PartialEq)]
29464pub struct TokenOf {
29465    node: SyntaxNode,
29466}
29467impl Token for TokenOf {
29468    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
29469        TokenOfGreen(
29470            Arc::new(GreenNode {
29471                kind: SyntaxKind::TokenOf,
29472                details: GreenNodeDetails::Token(text),
29473            })
29474            .intern(db),
29475        )
29476    }
29477    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
29478        extract_matches!(
29479            &self.node.lookup_intern(db).green.lookup_intern(db).details,
29480            GreenNodeDetails::Token
29481        )
29482        .clone()
29483    }
29484}
29485#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
29486pub struct TokenOfPtr(pub SyntaxStablePtrId);
29487impl TypedStablePtr for TokenOfPtr {
29488    type SyntaxNode = TokenOf;
29489    fn untyped(&self) -> SyntaxStablePtrId {
29490        self.0
29491    }
29492    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenOf {
29493        TokenOf::from_syntax_node(db, self.0.lookup(db))
29494    }
29495}
29496impl From<TokenOfPtr> for SyntaxStablePtrId {
29497    fn from(ptr: TokenOfPtr) -> Self {
29498        ptr.untyped()
29499    }
29500}
29501#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
29502pub struct TokenOfGreen(pub GreenId);
29503impl TokenOfGreen {
29504    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
29505        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
29506    }
29507}
29508impl TypedSyntaxNode for TokenOf {
29509    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenOf);
29510    type StablePtr = TokenOfPtr;
29511    type Green = TokenOfGreen;
29512    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
29513        TokenOfGreen(
29514            Arc::new(GreenNode {
29515                kind: SyntaxKind::TokenMissing,
29516                details: GreenNodeDetails::Token("".into()),
29517            })
29518            .intern(db),
29519        )
29520    }
29521    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
29522        match node.lookup_intern(db).green.lookup_intern(db).details {
29523            GreenNodeDetails::Token(_) => Self { node },
29524            GreenNodeDetails::Node { .. } => {
29525                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenOf)
29526            }
29527        }
29528    }
29529    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
29530        match node.lookup_intern(db).green.lookup_intern(db).details {
29531            GreenNodeDetails::Token(_) => Some(Self { node }),
29532            GreenNodeDetails::Node { .. } => None,
29533        }
29534    }
29535    fn as_syntax_node(&self) -> SyntaxNode {
29536        self.node
29537    }
29538    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
29539        TokenOfPtr(self.node.stable_ptr(db))
29540    }
29541}
29542#[derive(Clone, Debug, Eq, Hash, PartialEq)]
29543pub struct TerminalOf {
29544    node: SyntaxNode,
29545}
29546impl Terminal for TerminalOf {
29547    const KIND: SyntaxKind = SyntaxKind::TerminalOf;
29548    type TokenType = TokenOf;
29549    fn new_green(
29550        db: &dyn SyntaxGroup,
29551        leading_trivia: TriviaGreen,
29552        token: <<TerminalOf as Terminal>::TokenType as TypedSyntaxNode>::Green,
29553        trailing_trivia: TriviaGreen,
29554    ) -> Self::Green {
29555        let children = [leading_trivia.0, token.0, trailing_trivia.0];
29556        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
29557        TerminalOfGreen(
29558            Arc::new(GreenNode {
29559                kind: SyntaxKind::TerminalOf,
29560                details: GreenNodeDetails::Node { children: children.into(), width },
29561            })
29562            .intern(db),
29563        )
29564    }
29565    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
29566        let GreenNodeDetails::Node { children, .. } =
29567            &self.node.lookup_intern(db).green.lookup_intern(db).details
29568        else {
29569            unreachable!("Expected a node, not a token");
29570        };
29571        extract_matches!(&children[1].lookup_intern(db).details, GreenNodeDetails::Token).clone()
29572    }
29573}
29574impl TerminalOf {
29575    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
29576        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
29577    }
29578    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenOf {
29579        TokenOf::from_syntax_node(db, self.node.get_children(db)[1])
29580    }
29581    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
29582        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
29583    }
29584}
29585#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
29586pub struct TerminalOfPtr(pub SyntaxStablePtrId);
29587impl TerminalOfPtr {}
29588impl TypedStablePtr for TerminalOfPtr {
29589    type SyntaxNode = TerminalOf;
29590    fn untyped(&self) -> SyntaxStablePtrId {
29591        self.0
29592    }
29593    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalOf {
29594        TerminalOf::from_syntax_node(db, self.0.lookup(db))
29595    }
29596}
29597impl From<TerminalOfPtr> for SyntaxStablePtrId {
29598    fn from(ptr: TerminalOfPtr) -> Self {
29599        ptr.untyped()
29600    }
29601}
29602#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
29603pub struct TerminalOfGreen(pub GreenId);
29604impl TypedSyntaxNode for TerminalOf {
29605    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalOf);
29606    type StablePtr = TerminalOfPtr;
29607    type Green = TerminalOfGreen;
29608    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
29609        TerminalOfGreen(
29610            Arc::new(GreenNode {
29611                kind: SyntaxKind::TerminalOf,
29612                details: GreenNodeDetails::Node {
29613                    children: [
29614                        Trivia::missing(db).0,
29615                        TokenOf::missing(db).0,
29616                        Trivia::missing(db).0,
29617                    ]
29618                    .into(),
29619                    width: TextWidth::default(),
29620                },
29621            })
29622            .intern(db),
29623        )
29624    }
29625    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
29626        let kind = node.kind(db);
29627        assert_eq!(
29628            kind,
29629            SyntaxKind::TerminalOf,
29630            "Unexpected SyntaxKind {:?}. Expected {:?}.",
29631            kind,
29632            SyntaxKind::TerminalOf
29633        );
29634        Self { node }
29635    }
29636    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
29637        let kind = node.kind(db);
29638        if kind == SyntaxKind::TerminalOf { Some(Self::from_syntax_node(db, node)) } else { None }
29639    }
29640    fn as_syntax_node(&self) -> SyntaxNode {
29641        self.node
29642    }
29643    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
29644        TerminalOfPtr(self.node.stable_ptr(db))
29645    }
29646}
29647#[derive(Clone, Debug, Eq, Hash, PartialEq)]
29648pub struct TokenRef {
29649    node: SyntaxNode,
29650}
29651impl Token for TokenRef {
29652    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
29653        TokenRefGreen(
29654            Arc::new(GreenNode {
29655                kind: SyntaxKind::TokenRef,
29656                details: GreenNodeDetails::Token(text),
29657            })
29658            .intern(db),
29659        )
29660    }
29661    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
29662        extract_matches!(
29663            &self.node.lookup_intern(db).green.lookup_intern(db).details,
29664            GreenNodeDetails::Token
29665        )
29666        .clone()
29667    }
29668}
29669#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
29670pub struct TokenRefPtr(pub SyntaxStablePtrId);
29671impl TypedStablePtr for TokenRefPtr {
29672    type SyntaxNode = TokenRef;
29673    fn untyped(&self) -> SyntaxStablePtrId {
29674        self.0
29675    }
29676    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenRef {
29677        TokenRef::from_syntax_node(db, self.0.lookup(db))
29678    }
29679}
29680impl From<TokenRefPtr> for SyntaxStablePtrId {
29681    fn from(ptr: TokenRefPtr) -> Self {
29682        ptr.untyped()
29683    }
29684}
29685#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
29686pub struct TokenRefGreen(pub GreenId);
29687impl TokenRefGreen {
29688    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
29689        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
29690    }
29691}
29692impl TypedSyntaxNode for TokenRef {
29693    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenRef);
29694    type StablePtr = TokenRefPtr;
29695    type Green = TokenRefGreen;
29696    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
29697        TokenRefGreen(
29698            Arc::new(GreenNode {
29699                kind: SyntaxKind::TokenMissing,
29700                details: GreenNodeDetails::Token("".into()),
29701            })
29702            .intern(db),
29703        )
29704    }
29705    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
29706        match node.lookup_intern(db).green.lookup_intern(db).details {
29707            GreenNodeDetails::Token(_) => Self { node },
29708            GreenNodeDetails::Node { .. } => {
29709                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenRef)
29710            }
29711        }
29712    }
29713    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
29714        match node.lookup_intern(db).green.lookup_intern(db).details {
29715            GreenNodeDetails::Token(_) => Some(Self { node }),
29716            GreenNodeDetails::Node { .. } => None,
29717        }
29718    }
29719    fn as_syntax_node(&self) -> SyntaxNode {
29720        self.node
29721    }
29722    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
29723        TokenRefPtr(self.node.stable_ptr(db))
29724    }
29725}
29726#[derive(Clone, Debug, Eq, Hash, PartialEq)]
29727pub struct TerminalRef {
29728    node: SyntaxNode,
29729}
29730impl Terminal for TerminalRef {
29731    const KIND: SyntaxKind = SyntaxKind::TerminalRef;
29732    type TokenType = TokenRef;
29733    fn new_green(
29734        db: &dyn SyntaxGroup,
29735        leading_trivia: TriviaGreen,
29736        token: <<TerminalRef as Terminal>::TokenType as TypedSyntaxNode>::Green,
29737        trailing_trivia: TriviaGreen,
29738    ) -> Self::Green {
29739        let children = [leading_trivia.0, token.0, trailing_trivia.0];
29740        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
29741        TerminalRefGreen(
29742            Arc::new(GreenNode {
29743                kind: SyntaxKind::TerminalRef,
29744                details: GreenNodeDetails::Node { children: children.into(), width },
29745            })
29746            .intern(db),
29747        )
29748    }
29749    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
29750        let GreenNodeDetails::Node { children, .. } =
29751            &self.node.lookup_intern(db).green.lookup_intern(db).details
29752        else {
29753            unreachable!("Expected a node, not a token");
29754        };
29755        extract_matches!(&children[1].lookup_intern(db).details, GreenNodeDetails::Token).clone()
29756    }
29757}
29758impl TerminalRef {
29759    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
29760        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
29761    }
29762    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenRef {
29763        TokenRef::from_syntax_node(db, self.node.get_children(db)[1])
29764    }
29765    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
29766        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
29767    }
29768}
29769#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
29770pub struct TerminalRefPtr(pub SyntaxStablePtrId);
29771impl TerminalRefPtr {}
29772impl TypedStablePtr for TerminalRefPtr {
29773    type SyntaxNode = TerminalRef;
29774    fn untyped(&self) -> SyntaxStablePtrId {
29775        self.0
29776    }
29777    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalRef {
29778        TerminalRef::from_syntax_node(db, self.0.lookup(db))
29779    }
29780}
29781impl From<TerminalRefPtr> for SyntaxStablePtrId {
29782    fn from(ptr: TerminalRefPtr) -> Self {
29783        ptr.untyped()
29784    }
29785}
29786#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
29787pub struct TerminalRefGreen(pub GreenId);
29788impl TypedSyntaxNode for TerminalRef {
29789    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalRef);
29790    type StablePtr = TerminalRefPtr;
29791    type Green = TerminalRefGreen;
29792    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
29793        TerminalRefGreen(
29794            Arc::new(GreenNode {
29795                kind: SyntaxKind::TerminalRef,
29796                details: GreenNodeDetails::Node {
29797                    children: [
29798                        Trivia::missing(db).0,
29799                        TokenRef::missing(db).0,
29800                        Trivia::missing(db).0,
29801                    ]
29802                    .into(),
29803                    width: TextWidth::default(),
29804                },
29805            })
29806            .intern(db),
29807        )
29808    }
29809    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
29810        let kind = node.kind(db);
29811        assert_eq!(
29812            kind,
29813            SyntaxKind::TerminalRef,
29814            "Unexpected SyntaxKind {:?}. Expected {:?}.",
29815            kind,
29816            SyntaxKind::TerminalRef
29817        );
29818        Self { node }
29819    }
29820    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
29821        let kind = node.kind(db);
29822        if kind == SyntaxKind::TerminalRef { Some(Self::from_syntax_node(db, node)) } else { None }
29823    }
29824    fn as_syntax_node(&self) -> SyntaxNode {
29825        self.node
29826    }
29827    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
29828        TerminalRefPtr(self.node.stable_ptr(db))
29829    }
29830}
29831#[derive(Clone, Debug, Eq, Hash, PartialEq)]
29832pub struct TokenContinue {
29833    node: SyntaxNode,
29834}
29835impl Token for TokenContinue {
29836    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
29837        TokenContinueGreen(
29838            Arc::new(GreenNode {
29839                kind: SyntaxKind::TokenContinue,
29840                details: GreenNodeDetails::Token(text),
29841            })
29842            .intern(db),
29843        )
29844    }
29845    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
29846        extract_matches!(
29847            &self.node.lookup_intern(db).green.lookup_intern(db).details,
29848            GreenNodeDetails::Token
29849        )
29850        .clone()
29851    }
29852}
29853#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
29854pub struct TokenContinuePtr(pub SyntaxStablePtrId);
29855impl TypedStablePtr for TokenContinuePtr {
29856    type SyntaxNode = TokenContinue;
29857    fn untyped(&self) -> SyntaxStablePtrId {
29858        self.0
29859    }
29860    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenContinue {
29861        TokenContinue::from_syntax_node(db, self.0.lookup(db))
29862    }
29863}
29864impl From<TokenContinuePtr> for SyntaxStablePtrId {
29865    fn from(ptr: TokenContinuePtr) -> Self {
29866        ptr.untyped()
29867    }
29868}
29869#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
29870pub struct TokenContinueGreen(pub GreenId);
29871impl TokenContinueGreen {
29872    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
29873        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
29874    }
29875}
29876impl TypedSyntaxNode for TokenContinue {
29877    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenContinue);
29878    type StablePtr = TokenContinuePtr;
29879    type Green = TokenContinueGreen;
29880    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
29881        TokenContinueGreen(
29882            Arc::new(GreenNode {
29883                kind: SyntaxKind::TokenMissing,
29884                details: GreenNodeDetails::Token("".into()),
29885            })
29886            .intern(db),
29887        )
29888    }
29889    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
29890        match node.lookup_intern(db).green.lookup_intern(db).details {
29891            GreenNodeDetails::Token(_) => Self { node },
29892            GreenNodeDetails::Node { .. } => {
29893                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenContinue)
29894            }
29895        }
29896    }
29897    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
29898        match node.lookup_intern(db).green.lookup_intern(db).details {
29899            GreenNodeDetails::Token(_) => Some(Self { node }),
29900            GreenNodeDetails::Node { .. } => None,
29901        }
29902    }
29903    fn as_syntax_node(&self) -> SyntaxNode {
29904        self.node
29905    }
29906    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
29907        TokenContinuePtr(self.node.stable_ptr(db))
29908    }
29909}
29910#[derive(Clone, Debug, Eq, Hash, PartialEq)]
29911pub struct TerminalContinue {
29912    node: SyntaxNode,
29913}
29914impl Terminal for TerminalContinue {
29915    const KIND: SyntaxKind = SyntaxKind::TerminalContinue;
29916    type TokenType = TokenContinue;
29917    fn new_green(
29918        db: &dyn SyntaxGroup,
29919        leading_trivia: TriviaGreen,
29920        token: <<TerminalContinue as Terminal>::TokenType as TypedSyntaxNode>::Green,
29921        trailing_trivia: TriviaGreen,
29922    ) -> Self::Green {
29923        let children = [leading_trivia.0, token.0, trailing_trivia.0];
29924        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
29925        TerminalContinueGreen(
29926            Arc::new(GreenNode {
29927                kind: SyntaxKind::TerminalContinue,
29928                details: GreenNodeDetails::Node { children: children.into(), width },
29929            })
29930            .intern(db),
29931        )
29932    }
29933    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
29934        let GreenNodeDetails::Node { children, .. } =
29935            &self.node.lookup_intern(db).green.lookup_intern(db).details
29936        else {
29937            unreachable!("Expected a node, not a token");
29938        };
29939        extract_matches!(&children[1].lookup_intern(db).details, GreenNodeDetails::Token).clone()
29940    }
29941}
29942impl TerminalContinue {
29943    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
29944        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
29945    }
29946    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenContinue {
29947        TokenContinue::from_syntax_node(db, self.node.get_children(db)[1])
29948    }
29949    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
29950        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
29951    }
29952}
29953#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
29954pub struct TerminalContinuePtr(pub SyntaxStablePtrId);
29955impl TerminalContinuePtr {}
29956impl TypedStablePtr for TerminalContinuePtr {
29957    type SyntaxNode = TerminalContinue;
29958    fn untyped(&self) -> SyntaxStablePtrId {
29959        self.0
29960    }
29961    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalContinue {
29962        TerminalContinue::from_syntax_node(db, self.0.lookup(db))
29963    }
29964}
29965impl From<TerminalContinuePtr> for SyntaxStablePtrId {
29966    fn from(ptr: TerminalContinuePtr) -> Self {
29967        ptr.untyped()
29968    }
29969}
29970#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
29971pub struct TerminalContinueGreen(pub GreenId);
29972impl TypedSyntaxNode for TerminalContinue {
29973    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalContinue);
29974    type StablePtr = TerminalContinuePtr;
29975    type Green = TerminalContinueGreen;
29976    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
29977        TerminalContinueGreen(
29978            Arc::new(GreenNode {
29979                kind: SyntaxKind::TerminalContinue,
29980                details: GreenNodeDetails::Node {
29981                    children: [
29982                        Trivia::missing(db).0,
29983                        TokenContinue::missing(db).0,
29984                        Trivia::missing(db).0,
29985                    ]
29986                    .into(),
29987                    width: TextWidth::default(),
29988                },
29989            })
29990            .intern(db),
29991        )
29992    }
29993    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
29994        let kind = node.kind(db);
29995        assert_eq!(
29996            kind,
29997            SyntaxKind::TerminalContinue,
29998            "Unexpected SyntaxKind {:?}. Expected {:?}.",
29999            kind,
30000            SyntaxKind::TerminalContinue
30001        );
30002        Self { node }
30003    }
30004    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
30005        let kind = node.kind(db);
30006        if kind == SyntaxKind::TerminalContinue {
30007            Some(Self::from_syntax_node(db, node))
30008        } else {
30009            None
30010        }
30011    }
30012    fn as_syntax_node(&self) -> SyntaxNode {
30013        self.node
30014    }
30015    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
30016        TerminalContinuePtr(self.node.stable_ptr(db))
30017    }
30018}
30019#[derive(Clone, Debug, Eq, Hash, PartialEq)]
30020pub struct TokenReturn {
30021    node: SyntaxNode,
30022}
30023impl Token for TokenReturn {
30024    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
30025        TokenReturnGreen(
30026            Arc::new(GreenNode {
30027                kind: SyntaxKind::TokenReturn,
30028                details: GreenNodeDetails::Token(text),
30029            })
30030            .intern(db),
30031        )
30032    }
30033    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
30034        extract_matches!(
30035            &self.node.lookup_intern(db).green.lookup_intern(db).details,
30036            GreenNodeDetails::Token
30037        )
30038        .clone()
30039    }
30040}
30041#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
30042pub struct TokenReturnPtr(pub SyntaxStablePtrId);
30043impl TypedStablePtr for TokenReturnPtr {
30044    type SyntaxNode = TokenReturn;
30045    fn untyped(&self) -> SyntaxStablePtrId {
30046        self.0
30047    }
30048    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenReturn {
30049        TokenReturn::from_syntax_node(db, self.0.lookup(db))
30050    }
30051}
30052impl From<TokenReturnPtr> for SyntaxStablePtrId {
30053    fn from(ptr: TokenReturnPtr) -> Self {
30054        ptr.untyped()
30055    }
30056}
30057#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
30058pub struct TokenReturnGreen(pub GreenId);
30059impl TokenReturnGreen {
30060    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
30061        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
30062    }
30063}
30064impl TypedSyntaxNode for TokenReturn {
30065    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenReturn);
30066    type StablePtr = TokenReturnPtr;
30067    type Green = TokenReturnGreen;
30068    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
30069        TokenReturnGreen(
30070            Arc::new(GreenNode {
30071                kind: SyntaxKind::TokenMissing,
30072                details: GreenNodeDetails::Token("".into()),
30073            })
30074            .intern(db),
30075        )
30076    }
30077    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
30078        match node.lookup_intern(db).green.lookup_intern(db).details {
30079            GreenNodeDetails::Token(_) => Self { node },
30080            GreenNodeDetails::Node { .. } => {
30081                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenReturn)
30082            }
30083        }
30084    }
30085    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
30086        match node.lookup_intern(db).green.lookup_intern(db).details {
30087            GreenNodeDetails::Token(_) => Some(Self { node }),
30088            GreenNodeDetails::Node { .. } => None,
30089        }
30090    }
30091    fn as_syntax_node(&self) -> SyntaxNode {
30092        self.node
30093    }
30094    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
30095        TokenReturnPtr(self.node.stable_ptr(db))
30096    }
30097}
30098#[derive(Clone, Debug, Eq, Hash, PartialEq)]
30099pub struct TerminalReturn {
30100    node: SyntaxNode,
30101}
30102impl Terminal for TerminalReturn {
30103    const KIND: SyntaxKind = SyntaxKind::TerminalReturn;
30104    type TokenType = TokenReturn;
30105    fn new_green(
30106        db: &dyn SyntaxGroup,
30107        leading_trivia: TriviaGreen,
30108        token: <<TerminalReturn as Terminal>::TokenType as TypedSyntaxNode>::Green,
30109        trailing_trivia: TriviaGreen,
30110    ) -> Self::Green {
30111        let children = [leading_trivia.0, token.0, trailing_trivia.0];
30112        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
30113        TerminalReturnGreen(
30114            Arc::new(GreenNode {
30115                kind: SyntaxKind::TerminalReturn,
30116                details: GreenNodeDetails::Node { children: children.into(), width },
30117            })
30118            .intern(db),
30119        )
30120    }
30121    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
30122        let GreenNodeDetails::Node { children, .. } =
30123            &self.node.lookup_intern(db).green.lookup_intern(db).details
30124        else {
30125            unreachable!("Expected a node, not a token");
30126        };
30127        extract_matches!(&children[1].lookup_intern(db).details, GreenNodeDetails::Token).clone()
30128    }
30129}
30130impl TerminalReturn {
30131    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
30132        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
30133    }
30134    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenReturn {
30135        TokenReturn::from_syntax_node(db, self.node.get_children(db)[1])
30136    }
30137    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
30138        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
30139    }
30140}
30141#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
30142pub struct TerminalReturnPtr(pub SyntaxStablePtrId);
30143impl TerminalReturnPtr {}
30144impl TypedStablePtr for TerminalReturnPtr {
30145    type SyntaxNode = TerminalReturn;
30146    fn untyped(&self) -> SyntaxStablePtrId {
30147        self.0
30148    }
30149    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalReturn {
30150        TerminalReturn::from_syntax_node(db, self.0.lookup(db))
30151    }
30152}
30153impl From<TerminalReturnPtr> for SyntaxStablePtrId {
30154    fn from(ptr: TerminalReturnPtr) -> Self {
30155        ptr.untyped()
30156    }
30157}
30158#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
30159pub struct TerminalReturnGreen(pub GreenId);
30160impl TypedSyntaxNode for TerminalReturn {
30161    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalReturn);
30162    type StablePtr = TerminalReturnPtr;
30163    type Green = TerminalReturnGreen;
30164    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
30165        TerminalReturnGreen(
30166            Arc::new(GreenNode {
30167                kind: SyntaxKind::TerminalReturn,
30168                details: GreenNodeDetails::Node {
30169                    children: [
30170                        Trivia::missing(db).0,
30171                        TokenReturn::missing(db).0,
30172                        Trivia::missing(db).0,
30173                    ]
30174                    .into(),
30175                    width: TextWidth::default(),
30176                },
30177            })
30178            .intern(db),
30179        )
30180    }
30181    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
30182        let kind = node.kind(db);
30183        assert_eq!(
30184            kind,
30185            SyntaxKind::TerminalReturn,
30186            "Unexpected SyntaxKind {:?}. Expected {:?}.",
30187            kind,
30188            SyntaxKind::TerminalReturn
30189        );
30190        Self { node }
30191    }
30192    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
30193        let kind = node.kind(db);
30194        if kind == SyntaxKind::TerminalReturn {
30195            Some(Self::from_syntax_node(db, node))
30196        } else {
30197            None
30198        }
30199    }
30200    fn as_syntax_node(&self) -> SyntaxNode {
30201        self.node
30202    }
30203    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
30204        TerminalReturnPtr(self.node.stable_ptr(db))
30205    }
30206}
30207#[derive(Clone, Debug, Eq, Hash, PartialEq)]
30208pub struct TokenBreak {
30209    node: SyntaxNode,
30210}
30211impl Token for TokenBreak {
30212    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
30213        TokenBreakGreen(
30214            Arc::new(GreenNode {
30215                kind: SyntaxKind::TokenBreak,
30216                details: GreenNodeDetails::Token(text),
30217            })
30218            .intern(db),
30219        )
30220    }
30221    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
30222        extract_matches!(
30223            &self.node.lookup_intern(db).green.lookup_intern(db).details,
30224            GreenNodeDetails::Token
30225        )
30226        .clone()
30227    }
30228}
30229#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
30230pub struct TokenBreakPtr(pub SyntaxStablePtrId);
30231impl TypedStablePtr for TokenBreakPtr {
30232    type SyntaxNode = TokenBreak;
30233    fn untyped(&self) -> SyntaxStablePtrId {
30234        self.0
30235    }
30236    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenBreak {
30237        TokenBreak::from_syntax_node(db, self.0.lookup(db))
30238    }
30239}
30240impl From<TokenBreakPtr> for SyntaxStablePtrId {
30241    fn from(ptr: TokenBreakPtr) -> Self {
30242        ptr.untyped()
30243    }
30244}
30245#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
30246pub struct TokenBreakGreen(pub GreenId);
30247impl TokenBreakGreen {
30248    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
30249        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
30250    }
30251}
30252impl TypedSyntaxNode for TokenBreak {
30253    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenBreak);
30254    type StablePtr = TokenBreakPtr;
30255    type Green = TokenBreakGreen;
30256    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
30257        TokenBreakGreen(
30258            Arc::new(GreenNode {
30259                kind: SyntaxKind::TokenMissing,
30260                details: GreenNodeDetails::Token("".into()),
30261            })
30262            .intern(db),
30263        )
30264    }
30265    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
30266        match node.lookup_intern(db).green.lookup_intern(db).details {
30267            GreenNodeDetails::Token(_) => Self { node },
30268            GreenNodeDetails::Node { .. } => {
30269                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenBreak)
30270            }
30271        }
30272    }
30273    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
30274        match node.lookup_intern(db).green.lookup_intern(db).details {
30275            GreenNodeDetails::Token(_) => Some(Self { node }),
30276            GreenNodeDetails::Node { .. } => None,
30277        }
30278    }
30279    fn as_syntax_node(&self) -> SyntaxNode {
30280        self.node
30281    }
30282    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
30283        TokenBreakPtr(self.node.stable_ptr(db))
30284    }
30285}
30286#[derive(Clone, Debug, Eq, Hash, PartialEq)]
30287pub struct TerminalBreak {
30288    node: SyntaxNode,
30289}
30290impl Terminal for TerminalBreak {
30291    const KIND: SyntaxKind = SyntaxKind::TerminalBreak;
30292    type TokenType = TokenBreak;
30293    fn new_green(
30294        db: &dyn SyntaxGroup,
30295        leading_trivia: TriviaGreen,
30296        token: <<TerminalBreak as Terminal>::TokenType as TypedSyntaxNode>::Green,
30297        trailing_trivia: TriviaGreen,
30298    ) -> Self::Green {
30299        let children = [leading_trivia.0, token.0, trailing_trivia.0];
30300        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
30301        TerminalBreakGreen(
30302            Arc::new(GreenNode {
30303                kind: SyntaxKind::TerminalBreak,
30304                details: GreenNodeDetails::Node { children: children.into(), width },
30305            })
30306            .intern(db),
30307        )
30308    }
30309    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
30310        let GreenNodeDetails::Node { children, .. } =
30311            &self.node.lookup_intern(db).green.lookup_intern(db).details
30312        else {
30313            unreachable!("Expected a node, not a token");
30314        };
30315        extract_matches!(&children[1].lookup_intern(db).details, GreenNodeDetails::Token).clone()
30316    }
30317}
30318impl TerminalBreak {
30319    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
30320        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
30321    }
30322    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenBreak {
30323        TokenBreak::from_syntax_node(db, self.node.get_children(db)[1])
30324    }
30325    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
30326        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
30327    }
30328}
30329#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
30330pub struct TerminalBreakPtr(pub SyntaxStablePtrId);
30331impl TerminalBreakPtr {}
30332impl TypedStablePtr for TerminalBreakPtr {
30333    type SyntaxNode = TerminalBreak;
30334    fn untyped(&self) -> SyntaxStablePtrId {
30335        self.0
30336    }
30337    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalBreak {
30338        TerminalBreak::from_syntax_node(db, self.0.lookup(db))
30339    }
30340}
30341impl From<TerminalBreakPtr> for SyntaxStablePtrId {
30342    fn from(ptr: TerminalBreakPtr) -> Self {
30343        ptr.untyped()
30344    }
30345}
30346#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
30347pub struct TerminalBreakGreen(pub GreenId);
30348impl TypedSyntaxNode for TerminalBreak {
30349    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalBreak);
30350    type StablePtr = TerminalBreakPtr;
30351    type Green = TerminalBreakGreen;
30352    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
30353        TerminalBreakGreen(
30354            Arc::new(GreenNode {
30355                kind: SyntaxKind::TerminalBreak,
30356                details: GreenNodeDetails::Node {
30357                    children: [
30358                        Trivia::missing(db).0,
30359                        TokenBreak::missing(db).0,
30360                        Trivia::missing(db).0,
30361                    ]
30362                    .into(),
30363                    width: TextWidth::default(),
30364                },
30365            })
30366            .intern(db),
30367        )
30368    }
30369    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
30370        let kind = node.kind(db);
30371        assert_eq!(
30372            kind,
30373            SyntaxKind::TerminalBreak,
30374            "Unexpected SyntaxKind {:?}. Expected {:?}.",
30375            kind,
30376            SyntaxKind::TerminalBreak
30377        );
30378        Self { node }
30379    }
30380    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
30381        let kind = node.kind(db);
30382        if kind == SyntaxKind::TerminalBreak {
30383            Some(Self::from_syntax_node(db, node))
30384        } else {
30385            None
30386        }
30387    }
30388    fn as_syntax_node(&self) -> SyntaxNode {
30389        self.node
30390    }
30391    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
30392        TerminalBreakPtr(self.node.stable_ptr(db))
30393    }
30394}
30395#[derive(Clone, Debug, Eq, Hash, PartialEq)]
30396pub struct TokenStruct {
30397    node: SyntaxNode,
30398}
30399impl Token for TokenStruct {
30400    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
30401        TokenStructGreen(
30402            Arc::new(GreenNode {
30403                kind: SyntaxKind::TokenStruct,
30404                details: GreenNodeDetails::Token(text),
30405            })
30406            .intern(db),
30407        )
30408    }
30409    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
30410        extract_matches!(
30411            &self.node.lookup_intern(db).green.lookup_intern(db).details,
30412            GreenNodeDetails::Token
30413        )
30414        .clone()
30415    }
30416}
30417#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
30418pub struct TokenStructPtr(pub SyntaxStablePtrId);
30419impl TypedStablePtr for TokenStructPtr {
30420    type SyntaxNode = TokenStruct;
30421    fn untyped(&self) -> SyntaxStablePtrId {
30422        self.0
30423    }
30424    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenStruct {
30425        TokenStruct::from_syntax_node(db, self.0.lookup(db))
30426    }
30427}
30428impl From<TokenStructPtr> for SyntaxStablePtrId {
30429    fn from(ptr: TokenStructPtr) -> Self {
30430        ptr.untyped()
30431    }
30432}
30433#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
30434pub struct TokenStructGreen(pub GreenId);
30435impl TokenStructGreen {
30436    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
30437        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
30438    }
30439}
30440impl TypedSyntaxNode for TokenStruct {
30441    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenStruct);
30442    type StablePtr = TokenStructPtr;
30443    type Green = TokenStructGreen;
30444    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
30445        TokenStructGreen(
30446            Arc::new(GreenNode {
30447                kind: SyntaxKind::TokenMissing,
30448                details: GreenNodeDetails::Token("".into()),
30449            })
30450            .intern(db),
30451        )
30452    }
30453    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
30454        match node.lookup_intern(db).green.lookup_intern(db).details {
30455            GreenNodeDetails::Token(_) => Self { node },
30456            GreenNodeDetails::Node { .. } => {
30457                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenStruct)
30458            }
30459        }
30460    }
30461    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
30462        match node.lookup_intern(db).green.lookup_intern(db).details {
30463            GreenNodeDetails::Token(_) => Some(Self { node }),
30464            GreenNodeDetails::Node { .. } => None,
30465        }
30466    }
30467    fn as_syntax_node(&self) -> SyntaxNode {
30468        self.node
30469    }
30470    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
30471        TokenStructPtr(self.node.stable_ptr(db))
30472    }
30473}
30474#[derive(Clone, Debug, Eq, Hash, PartialEq)]
30475pub struct TerminalStruct {
30476    node: SyntaxNode,
30477}
30478impl Terminal for TerminalStruct {
30479    const KIND: SyntaxKind = SyntaxKind::TerminalStruct;
30480    type TokenType = TokenStruct;
30481    fn new_green(
30482        db: &dyn SyntaxGroup,
30483        leading_trivia: TriviaGreen,
30484        token: <<TerminalStruct as Terminal>::TokenType as TypedSyntaxNode>::Green,
30485        trailing_trivia: TriviaGreen,
30486    ) -> Self::Green {
30487        let children = [leading_trivia.0, token.0, trailing_trivia.0];
30488        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
30489        TerminalStructGreen(
30490            Arc::new(GreenNode {
30491                kind: SyntaxKind::TerminalStruct,
30492                details: GreenNodeDetails::Node { children: children.into(), width },
30493            })
30494            .intern(db),
30495        )
30496    }
30497    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
30498        let GreenNodeDetails::Node { children, .. } =
30499            &self.node.lookup_intern(db).green.lookup_intern(db).details
30500        else {
30501            unreachable!("Expected a node, not a token");
30502        };
30503        extract_matches!(&children[1].lookup_intern(db).details, GreenNodeDetails::Token).clone()
30504    }
30505}
30506impl TerminalStruct {
30507    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
30508        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
30509    }
30510    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenStruct {
30511        TokenStruct::from_syntax_node(db, self.node.get_children(db)[1])
30512    }
30513    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
30514        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
30515    }
30516}
30517#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
30518pub struct TerminalStructPtr(pub SyntaxStablePtrId);
30519impl TerminalStructPtr {}
30520impl TypedStablePtr for TerminalStructPtr {
30521    type SyntaxNode = TerminalStruct;
30522    fn untyped(&self) -> SyntaxStablePtrId {
30523        self.0
30524    }
30525    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalStruct {
30526        TerminalStruct::from_syntax_node(db, self.0.lookup(db))
30527    }
30528}
30529impl From<TerminalStructPtr> for SyntaxStablePtrId {
30530    fn from(ptr: TerminalStructPtr) -> Self {
30531        ptr.untyped()
30532    }
30533}
30534#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
30535pub struct TerminalStructGreen(pub GreenId);
30536impl TypedSyntaxNode for TerminalStruct {
30537    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalStruct);
30538    type StablePtr = TerminalStructPtr;
30539    type Green = TerminalStructGreen;
30540    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
30541        TerminalStructGreen(
30542            Arc::new(GreenNode {
30543                kind: SyntaxKind::TerminalStruct,
30544                details: GreenNodeDetails::Node {
30545                    children: [
30546                        Trivia::missing(db).0,
30547                        TokenStruct::missing(db).0,
30548                        Trivia::missing(db).0,
30549                    ]
30550                    .into(),
30551                    width: TextWidth::default(),
30552                },
30553            })
30554            .intern(db),
30555        )
30556    }
30557    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
30558        let kind = node.kind(db);
30559        assert_eq!(
30560            kind,
30561            SyntaxKind::TerminalStruct,
30562            "Unexpected SyntaxKind {:?}. Expected {:?}.",
30563            kind,
30564            SyntaxKind::TerminalStruct
30565        );
30566        Self { node }
30567    }
30568    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
30569        let kind = node.kind(db);
30570        if kind == SyntaxKind::TerminalStruct {
30571            Some(Self::from_syntax_node(db, node))
30572        } else {
30573            None
30574        }
30575    }
30576    fn as_syntax_node(&self) -> SyntaxNode {
30577        self.node
30578    }
30579    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
30580        TerminalStructPtr(self.node.stable_ptr(db))
30581    }
30582}
30583#[derive(Clone, Debug, Eq, Hash, PartialEq)]
30584pub struct TokenTrait {
30585    node: SyntaxNode,
30586}
30587impl Token for TokenTrait {
30588    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
30589        TokenTraitGreen(
30590            Arc::new(GreenNode {
30591                kind: SyntaxKind::TokenTrait,
30592                details: GreenNodeDetails::Token(text),
30593            })
30594            .intern(db),
30595        )
30596    }
30597    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
30598        extract_matches!(
30599            &self.node.lookup_intern(db).green.lookup_intern(db).details,
30600            GreenNodeDetails::Token
30601        )
30602        .clone()
30603    }
30604}
30605#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
30606pub struct TokenTraitPtr(pub SyntaxStablePtrId);
30607impl TypedStablePtr for TokenTraitPtr {
30608    type SyntaxNode = TokenTrait;
30609    fn untyped(&self) -> SyntaxStablePtrId {
30610        self.0
30611    }
30612    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenTrait {
30613        TokenTrait::from_syntax_node(db, self.0.lookup(db))
30614    }
30615}
30616impl From<TokenTraitPtr> for SyntaxStablePtrId {
30617    fn from(ptr: TokenTraitPtr) -> Self {
30618        ptr.untyped()
30619    }
30620}
30621#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
30622pub struct TokenTraitGreen(pub GreenId);
30623impl TokenTraitGreen {
30624    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
30625        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
30626    }
30627}
30628impl TypedSyntaxNode for TokenTrait {
30629    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenTrait);
30630    type StablePtr = TokenTraitPtr;
30631    type Green = TokenTraitGreen;
30632    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
30633        TokenTraitGreen(
30634            Arc::new(GreenNode {
30635                kind: SyntaxKind::TokenMissing,
30636                details: GreenNodeDetails::Token("".into()),
30637            })
30638            .intern(db),
30639        )
30640    }
30641    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
30642        match node.lookup_intern(db).green.lookup_intern(db).details {
30643            GreenNodeDetails::Token(_) => Self { node },
30644            GreenNodeDetails::Node { .. } => {
30645                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenTrait)
30646            }
30647        }
30648    }
30649    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
30650        match node.lookup_intern(db).green.lookup_intern(db).details {
30651            GreenNodeDetails::Token(_) => Some(Self { node }),
30652            GreenNodeDetails::Node { .. } => None,
30653        }
30654    }
30655    fn as_syntax_node(&self) -> SyntaxNode {
30656        self.node
30657    }
30658    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
30659        TokenTraitPtr(self.node.stable_ptr(db))
30660    }
30661}
30662#[derive(Clone, Debug, Eq, Hash, PartialEq)]
30663pub struct TerminalTrait {
30664    node: SyntaxNode,
30665}
30666impl Terminal for TerminalTrait {
30667    const KIND: SyntaxKind = SyntaxKind::TerminalTrait;
30668    type TokenType = TokenTrait;
30669    fn new_green(
30670        db: &dyn SyntaxGroup,
30671        leading_trivia: TriviaGreen,
30672        token: <<TerminalTrait as Terminal>::TokenType as TypedSyntaxNode>::Green,
30673        trailing_trivia: TriviaGreen,
30674    ) -> Self::Green {
30675        let children = [leading_trivia.0, token.0, trailing_trivia.0];
30676        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
30677        TerminalTraitGreen(
30678            Arc::new(GreenNode {
30679                kind: SyntaxKind::TerminalTrait,
30680                details: GreenNodeDetails::Node { children: children.into(), width },
30681            })
30682            .intern(db),
30683        )
30684    }
30685    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
30686        let GreenNodeDetails::Node { children, .. } =
30687            &self.node.lookup_intern(db).green.lookup_intern(db).details
30688        else {
30689            unreachable!("Expected a node, not a token");
30690        };
30691        extract_matches!(&children[1].lookup_intern(db).details, GreenNodeDetails::Token).clone()
30692    }
30693}
30694impl TerminalTrait {
30695    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
30696        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
30697    }
30698    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenTrait {
30699        TokenTrait::from_syntax_node(db, self.node.get_children(db)[1])
30700    }
30701    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
30702        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
30703    }
30704}
30705#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
30706pub struct TerminalTraitPtr(pub SyntaxStablePtrId);
30707impl TerminalTraitPtr {}
30708impl TypedStablePtr for TerminalTraitPtr {
30709    type SyntaxNode = TerminalTrait;
30710    fn untyped(&self) -> SyntaxStablePtrId {
30711        self.0
30712    }
30713    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalTrait {
30714        TerminalTrait::from_syntax_node(db, self.0.lookup(db))
30715    }
30716}
30717impl From<TerminalTraitPtr> for SyntaxStablePtrId {
30718    fn from(ptr: TerminalTraitPtr) -> Self {
30719        ptr.untyped()
30720    }
30721}
30722#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
30723pub struct TerminalTraitGreen(pub GreenId);
30724impl TypedSyntaxNode for TerminalTrait {
30725    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalTrait);
30726    type StablePtr = TerminalTraitPtr;
30727    type Green = TerminalTraitGreen;
30728    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
30729        TerminalTraitGreen(
30730            Arc::new(GreenNode {
30731                kind: SyntaxKind::TerminalTrait,
30732                details: GreenNodeDetails::Node {
30733                    children: [
30734                        Trivia::missing(db).0,
30735                        TokenTrait::missing(db).0,
30736                        Trivia::missing(db).0,
30737                    ]
30738                    .into(),
30739                    width: TextWidth::default(),
30740                },
30741            })
30742            .intern(db),
30743        )
30744    }
30745    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
30746        let kind = node.kind(db);
30747        assert_eq!(
30748            kind,
30749            SyntaxKind::TerminalTrait,
30750            "Unexpected SyntaxKind {:?}. Expected {:?}.",
30751            kind,
30752            SyntaxKind::TerminalTrait
30753        );
30754        Self { node }
30755    }
30756    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
30757        let kind = node.kind(db);
30758        if kind == SyntaxKind::TerminalTrait {
30759            Some(Self::from_syntax_node(db, node))
30760        } else {
30761            None
30762        }
30763    }
30764    fn as_syntax_node(&self) -> SyntaxNode {
30765        self.node
30766    }
30767    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
30768        TerminalTraitPtr(self.node.stable_ptr(db))
30769    }
30770}
30771#[derive(Clone, Debug, Eq, Hash, PartialEq)]
30772pub struct TokenTrue {
30773    node: SyntaxNode,
30774}
30775impl Token for TokenTrue {
30776    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
30777        TokenTrueGreen(
30778            Arc::new(GreenNode {
30779                kind: SyntaxKind::TokenTrue,
30780                details: GreenNodeDetails::Token(text),
30781            })
30782            .intern(db),
30783        )
30784    }
30785    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
30786        extract_matches!(
30787            &self.node.lookup_intern(db).green.lookup_intern(db).details,
30788            GreenNodeDetails::Token
30789        )
30790        .clone()
30791    }
30792}
30793#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
30794pub struct TokenTruePtr(pub SyntaxStablePtrId);
30795impl TypedStablePtr for TokenTruePtr {
30796    type SyntaxNode = TokenTrue;
30797    fn untyped(&self) -> SyntaxStablePtrId {
30798        self.0
30799    }
30800    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenTrue {
30801        TokenTrue::from_syntax_node(db, self.0.lookup(db))
30802    }
30803}
30804impl From<TokenTruePtr> for SyntaxStablePtrId {
30805    fn from(ptr: TokenTruePtr) -> Self {
30806        ptr.untyped()
30807    }
30808}
30809#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
30810pub struct TokenTrueGreen(pub GreenId);
30811impl TokenTrueGreen {
30812    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
30813        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
30814    }
30815}
30816impl TypedSyntaxNode for TokenTrue {
30817    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenTrue);
30818    type StablePtr = TokenTruePtr;
30819    type Green = TokenTrueGreen;
30820    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
30821        TokenTrueGreen(
30822            Arc::new(GreenNode {
30823                kind: SyntaxKind::TokenMissing,
30824                details: GreenNodeDetails::Token("".into()),
30825            })
30826            .intern(db),
30827        )
30828    }
30829    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
30830        match node.lookup_intern(db).green.lookup_intern(db).details {
30831            GreenNodeDetails::Token(_) => Self { node },
30832            GreenNodeDetails::Node { .. } => {
30833                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenTrue)
30834            }
30835        }
30836    }
30837    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
30838        match node.lookup_intern(db).green.lookup_intern(db).details {
30839            GreenNodeDetails::Token(_) => Some(Self { node }),
30840            GreenNodeDetails::Node { .. } => None,
30841        }
30842    }
30843    fn as_syntax_node(&self) -> SyntaxNode {
30844        self.node
30845    }
30846    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
30847        TokenTruePtr(self.node.stable_ptr(db))
30848    }
30849}
30850#[derive(Clone, Debug, Eq, Hash, PartialEq)]
30851pub struct TerminalTrue {
30852    node: SyntaxNode,
30853}
30854impl Terminal for TerminalTrue {
30855    const KIND: SyntaxKind = SyntaxKind::TerminalTrue;
30856    type TokenType = TokenTrue;
30857    fn new_green(
30858        db: &dyn SyntaxGroup,
30859        leading_trivia: TriviaGreen,
30860        token: <<TerminalTrue as Terminal>::TokenType as TypedSyntaxNode>::Green,
30861        trailing_trivia: TriviaGreen,
30862    ) -> Self::Green {
30863        let children = [leading_trivia.0, token.0, trailing_trivia.0];
30864        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
30865        TerminalTrueGreen(
30866            Arc::new(GreenNode {
30867                kind: SyntaxKind::TerminalTrue,
30868                details: GreenNodeDetails::Node { children: children.into(), width },
30869            })
30870            .intern(db),
30871        )
30872    }
30873    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
30874        let GreenNodeDetails::Node { children, .. } =
30875            &self.node.lookup_intern(db).green.lookup_intern(db).details
30876        else {
30877            unreachable!("Expected a node, not a token");
30878        };
30879        extract_matches!(&children[1].lookup_intern(db).details, GreenNodeDetails::Token).clone()
30880    }
30881}
30882impl TerminalTrue {
30883    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
30884        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
30885    }
30886    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenTrue {
30887        TokenTrue::from_syntax_node(db, self.node.get_children(db)[1])
30888    }
30889    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
30890        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
30891    }
30892}
30893#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
30894pub struct TerminalTruePtr(pub SyntaxStablePtrId);
30895impl TerminalTruePtr {}
30896impl TypedStablePtr for TerminalTruePtr {
30897    type SyntaxNode = TerminalTrue;
30898    fn untyped(&self) -> SyntaxStablePtrId {
30899        self.0
30900    }
30901    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalTrue {
30902        TerminalTrue::from_syntax_node(db, self.0.lookup(db))
30903    }
30904}
30905impl From<TerminalTruePtr> for SyntaxStablePtrId {
30906    fn from(ptr: TerminalTruePtr) -> Self {
30907        ptr.untyped()
30908    }
30909}
30910#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
30911pub struct TerminalTrueGreen(pub GreenId);
30912impl TypedSyntaxNode for TerminalTrue {
30913    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalTrue);
30914    type StablePtr = TerminalTruePtr;
30915    type Green = TerminalTrueGreen;
30916    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
30917        TerminalTrueGreen(
30918            Arc::new(GreenNode {
30919                kind: SyntaxKind::TerminalTrue,
30920                details: GreenNodeDetails::Node {
30921                    children: [
30922                        Trivia::missing(db).0,
30923                        TokenTrue::missing(db).0,
30924                        Trivia::missing(db).0,
30925                    ]
30926                    .into(),
30927                    width: TextWidth::default(),
30928                },
30929            })
30930            .intern(db),
30931        )
30932    }
30933    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
30934        let kind = node.kind(db);
30935        assert_eq!(
30936            kind,
30937            SyntaxKind::TerminalTrue,
30938            "Unexpected SyntaxKind {:?}. Expected {:?}.",
30939            kind,
30940            SyntaxKind::TerminalTrue
30941        );
30942        Self { node }
30943    }
30944    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
30945        let kind = node.kind(db);
30946        if kind == SyntaxKind::TerminalTrue { Some(Self::from_syntax_node(db, node)) } else { None }
30947    }
30948    fn as_syntax_node(&self) -> SyntaxNode {
30949        self.node
30950    }
30951    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
30952        TerminalTruePtr(self.node.stable_ptr(db))
30953    }
30954}
30955#[derive(Clone, Debug, Eq, Hash, PartialEq)]
30956pub struct TokenType {
30957    node: SyntaxNode,
30958}
30959impl Token for TokenType {
30960    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
30961        TokenTypeGreen(
30962            Arc::new(GreenNode {
30963                kind: SyntaxKind::TokenType,
30964                details: GreenNodeDetails::Token(text),
30965            })
30966            .intern(db),
30967        )
30968    }
30969    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
30970        extract_matches!(
30971            &self.node.lookup_intern(db).green.lookup_intern(db).details,
30972            GreenNodeDetails::Token
30973        )
30974        .clone()
30975    }
30976}
30977#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
30978pub struct TokenTypePtr(pub SyntaxStablePtrId);
30979impl TypedStablePtr for TokenTypePtr {
30980    type SyntaxNode = TokenType;
30981    fn untyped(&self) -> SyntaxStablePtrId {
30982        self.0
30983    }
30984    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenType {
30985        TokenType::from_syntax_node(db, self.0.lookup(db))
30986    }
30987}
30988impl From<TokenTypePtr> for SyntaxStablePtrId {
30989    fn from(ptr: TokenTypePtr) -> Self {
30990        ptr.untyped()
30991    }
30992}
30993#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
30994pub struct TokenTypeGreen(pub GreenId);
30995impl TokenTypeGreen {
30996    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
30997        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
30998    }
30999}
31000impl TypedSyntaxNode for TokenType {
31001    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenType);
31002    type StablePtr = TokenTypePtr;
31003    type Green = TokenTypeGreen;
31004    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
31005        TokenTypeGreen(
31006            Arc::new(GreenNode {
31007                kind: SyntaxKind::TokenMissing,
31008                details: GreenNodeDetails::Token("".into()),
31009            })
31010            .intern(db),
31011        )
31012    }
31013    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
31014        match node.lookup_intern(db).green.lookup_intern(db).details {
31015            GreenNodeDetails::Token(_) => Self { node },
31016            GreenNodeDetails::Node { .. } => {
31017                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenType)
31018            }
31019        }
31020    }
31021    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
31022        match node.lookup_intern(db).green.lookup_intern(db).details {
31023            GreenNodeDetails::Token(_) => Some(Self { node }),
31024            GreenNodeDetails::Node { .. } => None,
31025        }
31026    }
31027    fn as_syntax_node(&self) -> SyntaxNode {
31028        self.node
31029    }
31030    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
31031        TokenTypePtr(self.node.stable_ptr(db))
31032    }
31033}
31034#[derive(Clone, Debug, Eq, Hash, PartialEq)]
31035pub struct TerminalType {
31036    node: SyntaxNode,
31037}
31038impl Terminal for TerminalType {
31039    const KIND: SyntaxKind = SyntaxKind::TerminalType;
31040    type TokenType = TokenType;
31041    fn new_green(
31042        db: &dyn SyntaxGroup,
31043        leading_trivia: TriviaGreen,
31044        token: <<TerminalType as Terminal>::TokenType as TypedSyntaxNode>::Green,
31045        trailing_trivia: TriviaGreen,
31046    ) -> Self::Green {
31047        let children = [leading_trivia.0, token.0, trailing_trivia.0];
31048        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
31049        TerminalTypeGreen(
31050            Arc::new(GreenNode {
31051                kind: SyntaxKind::TerminalType,
31052                details: GreenNodeDetails::Node { children: children.into(), width },
31053            })
31054            .intern(db),
31055        )
31056    }
31057    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
31058        let GreenNodeDetails::Node { children, .. } =
31059            &self.node.lookup_intern(db).green.lookup_intern(db).details
31060        else {
31061            unreachable!("Expected a node, not a token");
31062        };
31063        extract_matches!(&children[1].lookup_intern(db).details, GreenNodeDetails::Token).clone()
31064    }
31065}
31066impl TerminalType {
31067    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
31068        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
31069    }
31070    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenType {
31071        TokenType::from_syntax_node(db, self.node.get_children(db)[1])
31072    }
31073    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
31074        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
31075    }
31076}
31077#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
31078pub struct TerminalTypePtr(pub SyntaxStablePtrId);
31079impl TerminalTypePtr {}
31080impl TypedStablePtr for TerminalTypePtr {
31081    type SyntaxNode = TerminalType;
31082    fn untyped(&self) -> SyntaxStablePtrId {
31083        self.0
31084    }
31085    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalType {
31086        TerminalType::from_syntax_node(db, self.0.lookup(db))
31087    }
31088}
31089impl From<TerminalTypePtr> for SyntaxStablePtrId {
31090    fn from(ptr: TerminalTypePtr) -> Self {
31091        ptr.untyped()
31092    }
31093}
31094#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
31095pub struct TerminalTypeGreen(pub GreenId);
31096impl TypedSyntaxNode for TerminalType {
31097    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalType);
31098    type StablePtr = TerminalTypePtr;
31099    type Green = TerminalTypeGreen;
31100    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
31101        TerminalTypeGreen(
31102            Arc::new(GreenNode {
31103                kind: SyntaxKind::TerminalType,
31104                details: GreenNodeDetails::Node {
31105                    children: [
31106                        Trivia::missing(db).0,
31107                        TokenType::missing(db).0,
31108                        Trivia::missing(db).0,
31109                    ]
31110                    .into(),
31111                    width: TextWidth::default(),
31112                },
31113            })
31114            .intern(db),
31115        )
31116    }
31117    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
31118        let kind = node.kind(db);
31119        assert_eq!(
31120            kind,
31121            SyntaxKind::TerminalType,
31122            "Unexpected SyntaxKind {:?}. Expected {:?}.",
31123            kind,
31124            SyntaxKind::TerminalType
31125        );
31126        Self { node }
31127    }
31128    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
31129        let kind = node.kind(db);
31130        if kind == SyntaxKind::TerminalType { Some(Self::from_syntax_node(db, node)) } else { None }
31131    }
31132    fn as_syntax_node(&self) -> SyntaxNode {
31133        self.node
31134    }
31135    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
31136        TerminalTypePtr(self.node.stable_ptr(db))
31137    }
31138}
31139#[derive(Clone, Debug, Eq, Hash, PartialEq)]
31140pub struct TokenUse {
31141    node: SyntaxNode,
31142}
31143impl Token for TokenUse {
31144    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
31145        TokenUseGreen(
31146            Arc::new(GreenNode {
31147                kind: SyntaxKind::TokenUse,
31148                details: GreenNodeDetails::Token(text),
31149            })
31150            .intern(db),
31151        )
31152    }
31153    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
31154        extract_matches!(
31155            &self.node.lookup_intern(db).green.lookup_intern(db).details,
31156            GreenNodeDetails::Token
31157        )
31158        .clone()
31159    }
31160}
31161#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
31162pub struct TokenUsePtr(pub SyntaxStablePtrId);
31163impl TypedStablePtr for TokenUsePtr {
31164    type SyntaxNode = TokenUse;
31165    fn untyped(&self) -> SyntaxStablePtrId {
31166        self.0
31167    }
31168    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenUse {
31169        TokenUse::from_syntax_node(db, self.0.lookup(db))
31170    }
31171}
31172impl From<TokenUsePtr> for SyntaxStablePtrId {
31173    fn from(ptr: TokenUsePtr) -> Self {
31174        ptr.untyped()
31175    }
31176}
31177#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
31178pub struct TokenUseGreen(pub GreenId);
31179impl TokenUseGreen {
31180    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
31181        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
31182    }
31183}
31184impl TypedSyntaxNode for TokenUse {
31185    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenUse);
31186    type StablePtr = TokenUsePtr;
31187    type Green = TokenUseGreen;
31188    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
31189        TokenUseGreen(
31190            Arc::new(GreenNode {
31191                kind: SyntaxKind::TokenMissing,
31192                details: GreenNodeDetails::Token("".into()),
31193            })
31194            .intern(db),
31195        )
31196    }
31197    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
31198        match node.lookup_intern(db).green.lookup_intern(db).details {
31199            GreenNodeDetails::Token(_) => Self { node },
31200            GreenNodeDetails::Node { .. } => {
31201                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenUse)
31202            }
31203        }
31204    }
31205    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
31206        match node.lookup_intern(db).green.lookup_intern(db).details {
31207            GreenNodeDetails::Token(_) => Some(Self { node }),
31208            GreenNodeDetails::Node { .. } => None,
31209        }
31210    }
31211    fn as_syntax_node(&self) -> SyntaxNode {
31212        self.node
31213    }
31214    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
31215        TokenUsePtr(self.node.stable_ptr(db))
31216    }
31217}
31218#[derive(Clone, Debug, Eq, Hash, PartialEq)]
31219pub struct TerminalUse {
31220    node: SyntaxNode,
31221}
31222impl Terminal for TerminalUse {
31223    const KIND: SyntaxKind = SyntaxKind::TerminalUse;
31224    type TokenType = TokenUse;
31225    fn new_green(
31226        db: &dyn SyntaxGroup,
31227        leading_trivia: TriviaGreen,
31228        token: <<TerminalUse as Terminal>::TokenType as TypedSyntaxNode>::Green,
31229        trailing_trivia: TriviaGreen,
31230    ) -> Self::Green {
31231        let children = [leading_trivia.0, token.0, trailing_trivia.0];
31232        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
31233        TerminalUseGreen(
31234            Arc::new(GreenNode {
31235                kind: SyntaxKind::TerminalUse,
31236                details: GreenNodeDetails::Node { children: children.into(), width },
31237            })
31238            .intern(db),
31239        )
31240    }
31241    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
31242        let GreenNodeDetails::Node { children, .. } =
31243            &self.node.lookup_intern(db).green.lookup_intern(db).details
31244        else {
31245            unreachable!("Expected a node, not a token");
31246        };
31247        extract_matches!(&children[1].lookup_intern(db).details, GreenNodeDetails::Token).clone()
31248    }
31249}
31250impl TerminalUse {
31251    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
31252        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
31253    }
31254    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenUse {
31255        TokenUse::from_syntax_node(db, self.node.get_children(db)[1])
31256    }
31257    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
31258        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
31259    }
31260}
31261#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
31262pub struct TerminalUsePtr(pub SyntaxStablePtrId);
31263impl TerminalUsePtr {}
31264impl TypedStablePtr for TerminalUsePtr {
31265    type SyntaxNode = TerminalUse;
31266    fn untyped(&self) -> SyntaxStablePtrId {
31267        self.0
31268    }
31269    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalUse {
31270        TerminalUse::from_syntax_node(db, self.0.lookup(db))
31271    }
31272}
31273impl From<TerminalUsePtr> for SyntaxStablePtrId {
31274    fn from(ptr: TerminalUsePtr) -> Self {
31275        ptr.untyped()
31276    }
31277}
31278#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
31279pub struct TerminalUseGreen(pub GreenId);
31280impl TypedSyntaxNode for TerminalUse {
31281    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalUse);
31282    type StablePtr = TerminalUsePtr;
31283    type Green = TerminalUseGreen;
31284    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
31285        TerminalUseGreen(
31286            Arc::new(GreenNode {
31287                kind: SyntaxKind::TerminalUse,
31288                details: GreenNodeDetails::Node {
31289                    children: [
31290                        Trivia::missing(db).0,
31291                        TokenUse::missing(db).0,
31292                        Trivia::missing(db).0,
31293                    ]
31294                    .into(),
31295                    width: TextWidth::default(),
31296                },
31297            })
31298            .intern(db),
31299        )
31300    }
31301    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
31302        let kind = node.kind(db);
31303        assert_eq!(
31304            kind,
31305            SyntaxKind::TerminalUse,
31306            "Unexpected SyntaxKind {:?}. Expected {:?}.",
31307            kind,
31308            SyntaxKind::TerminalUse
31309        );
31310        Self { node }
31311    }
31312    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
31313        let kind = node.kind(db);
31314        if kind == SyntaxKind::TerminalUse { Some(Self::from_syntax_node(db, node)) } else { None }
31315    }
31316    fn as_syntax_node(&self) -> SyntaxNode {
31317        self.node
31318    }
31319    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
31320        TerminalUsePtr(self.node.stable_ptr(db))
31321    }
31322}
31323#[derive(Clone, Debug, Eq, Hash, PartialEq)]
31324pub struct TokenPub {
31325    node: SyntaxNode,
31326}
31327impl Token for TokenPub {
31328    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
31329        TokenPubGreen(
31330            Arc::new(GreenNode {
31331                kind: SyntaxKind::TokenPub,
31332                details: GreenNodeDetails::Token(text),
31333            })
31334            .intern(db),
31335        )
31336    }
31337    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
31338        extract_matches!(
31339            &self.node.lookup_intern(db).green.lookup_intern(db).details,
31340            GreenNodeDetails::Token
31341        )
31342        .clone()
31343    }
31344}
31345#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
31346pub struct TokenPubPtr(pub SyntaxStablePtrId);
31347impl TypedStablePtr for TokenPubPtr {
31348    type SyntaxNode = TokenPub;
31349    fn untyped(&self) -> SyntaxStablePtrId {
31350        self.0
31351    }
31352    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenPub {
31353        TokenPub::from_syntax_node(db, self.0.lookup(db))
31354    }
31355}
31356impl From<TokenPubPtr> for SyntaxStablePtrId {
31357    fn from(ptr: TokenPubPtr) -> Self {
31358        ptr.untyped()
31359    }
31360}
31361#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
31362pub struct TokenPubGreen(pub GreenId);
31363impl TokenPubGreen {
31364    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
31365        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
31366    }
31367}
31368impl TypedSyntaxNode for TokenPub {
31369    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenPub);
31370    type StablePtr = TokenPubPtr;
31371    type Green = TokenPubGreen;
31372    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
31373        TokenPubGreen(
31374            Arc::new(GreenNode {
31375                kind: SyntaxKind::TokenMissing,
31376                details: GreenNodeDetails::Token("".into()),
31377            })
31378            .intern(db),
31379        )
31380    }
31381    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
31382        match node.lookup_intern(db).green.lookup_intern(db).details {
31383            GreenNodeDetails::Token(_) => Self { node },
31384            GreenNodeDetails::Node { .. } => {
31385                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenPub)
31386            }
31387        }
31388    }
31389    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
31390        match node.lookup_intern(db).green.lookup_intern(db).details {
31391            GreenNodeDetails::Token(_) => Some(Self { node }),
31392            GreenNodeDetails::Node { .. } => None,
31393        }
31394    }
31395    fn as_syntax_node(&self) -> SyntaxNode {
31396        self.node
31397    }
31398    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
31399        TokenPubPtr(self.node.stable_ptr(db))
31400    }
31401}
31402#[derive(Clone, Debug, Eq, Hash, PartialEq)]
31403pub struct TerminalPub {
31404    node: SyntaxNode,
31405}
31406impl Terminal for TerminalPub {
31407    const KIND: SyntaxKind = SyntaxKind::TerminalPub;
31408    type TokenType = TokenPub;
31409    fn new_green(
31410        db: &dyn SyntaxGroup,
31411        leading_trivia: TriviaGreen,
31412        token: <<TerminalPub as Terminal>::TokenType as TypedSyntaxNode>::Green,
31413        trailing_trivia: TriviaGreen,
31414    ) -> Self::Green {
31415        let children = [leading_trivia.0, token.0, trailing_trivia.0];
31416        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
31417        TerminalPubGreen(
31418            Arc::new(GreenNode {
31419                kind: SyntaxKind::TerminalPub,
31420                details: GreenNodeDetails::Node { children: children.into(), width },
31421            })
31422            .intern(db),
31423        )
31424    }
31425    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
31426        let GreenNodeDetails::Node { children, .. } =
31427            &self.node.lookup_intern(db).green.lookup_intern(db).details
31428        else {
31429            unreachable!("Expected a node, not a token");
31430        };
31431        extract_matches!(&children[1].lookup_intern(db).details, GreenNodeDetails::Token).clone()
31432    }
31433}
31434impl TerminalPub {
31435    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
31436        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
31437    }
31438    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenPub {
31439        TokenPub::from_syntax_node(db, self.node.get_children(db)[1])
31440    }
31441    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
31442        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
31443    }
31444}
31445#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
31446pub struct TerminalPubPtr(pub SyntaxStablePtrId);
31447impl TerminalPubPtr {}
31448impl TypedStablePtr for TerminalPubPtr {
31449    type SyntaxNode = TerminalPub;
31450    fn untyped(&self) -> SyntaxStablePtrId {
31451        self.0
31452    }
31453    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalPub {
31454        TerminalPub::from_syntax_node(db, self.0.lookup(db))
31455    }
31456}
31457impl From<TerminalPubPtr> for SyntaxStablePtrId {
31458    fn from(ptr: TerminalPubPtr) -> Self {
31459        ptr.untyped()
31460    }
31461}
31462#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
31463pub struct TerminalPubGreen(pub GreenId);
31464impl TypedSyntaxNode for TerminalPub {
31465    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalPub);
31466    type StablePtr = TerminalPubPtr;
31467    type Green = TerminalPubGreen;
31468    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
31469        TerminalPubGreen(
31470            Arc::new(GreenNode {
31471                kind: SyntaxKind::TerminalPub,
31472                details: GreenNodeDetails::Node {
31473                    children: [
31474                        Trivia::missing(db).0,
31475                        TokenPub::missing(db).0,
31476                        Trivia::missing(db).0,
31477                    ]
31478                    .into(),
31479                    width: TextWidth::default(),
31480                },
31481            })
31482            .intern(db),
31483        )
31484    }
31485    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
31486        let kind = node.kind(db);
31487        assert_eq!(
31488            kind,
31489            SyntaxKind::TerminalPub,
31490            "Unexpected SyntaxKind {:?}. Expected {:?}.",
31491            kind,
31492            SyntaxKind::TerminalPub
31493        );
31494        Self { node }
31495    }
31496    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
31497        let kind = node.kind(db);
31498        if kind == SyntaxKind::TerminalPub { Some(Self::from_syntax_node(db, node)) } else { None }
31499    }
31500    fn as_syntax_node(&self) -> SyntaxNode {
31501        self.node
31502    }
31503    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
31504        TerminalPubPtr(self.node.stable_ptr(db))
31505    }
31506}
31507#[derive(Clone, Debug, Eq, Hash, PartialEq)]
31508pub struct TokenAnd {
31509    node: SyntaxNode,
31510}
31511impl Token for TokenAnd {
31512    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
31513        TokenAndGreen(
31514            Arc::new(GreenNode {
31515                kind: SyntaxKind::TokenAnd,
31516                details: GreenNodeDetails::Token(text),
31517            })
31518            .intern(db),
31519        )
31520    }
31521    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
31522        extract_matches!(
31523            &self.node.lookup_intern(db).green.lookup_intern(db).details,
31524            GreenNodeDetails::Token
31525        )
31526        .clone()
31527    }
31528}
31529#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
31530pub struct TokenAndPtr(pub SyntaxStablePtrId);
31531impl TypedStablePtr for TokenAndPtr {
31532    type SyntaxNode = TokenAnd;
31533    fn untyped(&self) -> SyntaxStablePtrId {
31534        self.0
31535    }
31536    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenAnd {
31537        TokenAnd::from_syntax_node(db, self.0.lookup(db))
31538    }
31539}
31540impl From<TokenAndPtr> for SyntaxStablePtrId {
31541    fn from(ptr: TokenAndPtr) -> Self {
31542        ptr.untyped()
31543    }
31544}
31545#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
31546pub struct TokenAndGreen(pub GreenId);
31547impl TokenAndGreen {
31548    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
31549        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
31550    }
31551}
31552impl TypedSyntaxNode for TokenAnd {
31553    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenAnd);
31554    type StablePtr = TokenAndPtr;
31555    type Green = TokenAndGreen;
31556    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
31557        TokenAndGreen(
31558            Arc::new(GreenNode {
31559                kind: SyntaxKind::TokenMissing,
31560                details: GreenNodeDetails::Token("".into()),
31561            })
31562            .intern(db),
31563        )
31564    }
31565    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
31566        match node.lookup_intern(db).green.lookup_intern(db).details {
31567            GreenNodeDetails::Token(_) => Self { node },
31568            GreenNodeDetails::Node { .. } => {
31569                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenAnd)
31570            }
31571        }
31572    }
31573    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
31574        match node.lookup_intern(db).green.lookup_intern(db).details {
31575            GreenNodeDetails::Token(_) => Some(Self { node }),
31576            GreenNodeDetails::Node { .. } => None,
31577        }
31578    }
31579    fn as_syntax_node(&self) -> SyntaxNode {
31580        self.node
31581    }
31582    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
31583        TokenAndPtr(self.node.stable_ptr(db))
31584    }
31585}
31586#[derive(Clone, Debug, Eq, Hash, PartialEq)]
31587pub struct TerminalAnd {
31588    node: SyntaxNode,
31589}
31590impl Terminal for TerminalAnd {
31591    const KIND: SyntaxKind = SyntaxKind::TerminalAnd;
31592    type TokenType = TokenAnd;
31593    fn new_green(
31594        db: &dyn SyntaxGroup,
31595        leading_trivia: TriviaGreen,
31596        token: <<TerminalAnd as Terminal>::TokenType as TypedSyntaxNode>::Green,
31597        trailing_trivia: TriviaGreen,
31598    ) -> Self::Green {
31599        let children = [leading_trivia.0, token.0, trailing_trivia.0];
31600        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
31601        TerminalAndGreen(
31602            Arc::new(GreenNode {
31603                kind: SyntaxKind::TerminalAnd,
31604                details: GreenNodeDetails::Node { children: children.into(), width },
31605            })
31606            .intern(db),
31607        )
31608    }
31609    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
31610        let GreenNodeDetails::Node { children, .. } =
31611            &self.node.lookup_intern(db).green.lookup_intern(db).details
31612        else {
31613            unreachable!("Expected a node, not a token");
31614        };
31615        extract_matches!(&children[1].lookup_intern(db).details, GreenNodeDetails::Token).clone()
31616    }
31617}
31618impl TerminalAnd {
31619    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
31620        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
31621    }
31622    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenAnd {
31623        TokenAnd::from_syntax_node(db, self.node.get_children(db)[1])
31624    }
31625    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
31626        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
31627    }
31628}
31629#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
31630pub struct TerminalAndPtr(pub SyntaxStablePtrId);
31631impl TerminalAndPtr {}
31632impl TypedStablePtr for TerminalAndPtr {
31633    type SyntaxNode = TerminalAnd;
31634    fn untyped(&self) -> SyntaxStablePtrId {
31635        self.0
31636    }
31637    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalAnd {
31638        TerminalAnd::from_syntax_node(db, self.0.lookup(db))
31639    }
31640}
31641impl From<TerminalAndPtr> for SyntaxStablePtrId {
31642    fn from(ptr: TerminalAndPtr) -> Self {
31643        ptr.untyped()
31644    }
31645}
31646#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
31647pub struct TerminalAndGreen(pub GreenId);
31648impl TypedSyntaxNode for TerminalAnd {
31649    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalAnd);
31650    type StablePtr = TerminalAndPtr;
31651    type Green = TerminalAndGreen;
31652    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
31653        TerminalAndGreen(
31654            Arc::new(GreenNode {
31655                kind: SyntaxKind::TerminalAnd,
31656                details: GreenNodeDetails::Node {
31657                    children: [
31658                        Trivia::missing(db).0,
31659                        TokenAnd::missing(db).0,
31660                        Trivia::missing(db).0,
31661                    ]
31662                    .into(),
31663                    width: TextWidth::default(),
31664                },
31665            })
31666            .intern(db),
31667        )
31668    }
31669    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
31670        let kind = node.kind(db);
31671        assert_eq!(
31672            kind,
31673            SyntaxKind::TerminalAnd,
31674            "Unexpected SyntaxKind {:?}. Expected {:?}.",
31675            kind,
31676            SyntaxKind::TerminalAnd
31677        );
31678        Self { node }
31679    }
31680    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
31681        let kind = node.kind(db);
31682        if kind == SyntaxKind::TerminalAnd { Some(Self::from_syntax_node(db, node)) } else { None }
31683    }
31684    fn as_syntax_node(&self) -> SyntaxNode {
31685        self.node
31686    }
31687    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
31688        TerminalAndPtr(self.node.stable_ptr(db))
31689    }
31690}
31691#[derive(Clone, Debug, Eq, Hash, PartialEq)]
31692pub struct TokenAndAnd {
31693    node: SyntaxNode,
31694}
31695impl Token for TokenAndAnd {
31696    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
31697        TokenAndAndGreen(
31698            Arc::new(GreenNode {
31699                kind: SyntaxKind::TokenAndAnd,
31700                details: GreenNodeDetails::Token(text),
31701            })
31702            .intern(db),
31703        )
31704    }
31705    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
31706        extract_matches!(
31707            &self.node.lookup_intern(db).green.lookup_intern(db).details,
31708            GreenNodeDetails::Token
31709        )
31710        .clone()
31711    }
31712}
31713#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
31714pub struct TokenAndAndPtr(pub SyntaxStablePtrId);
31715impl TypedStablePtr for TokenAndAndPtr {
31716    type SyntaxNode = TokenAndAnd;
31717    fn untyped(&self) -> SyntaxStablePtrId {
31718        self.0
31719    }
31720    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenAndAnd {
31721        TokenAndAnd::from_syntax_node(db, self.0.lookup(db))
31722    }
31723}
31724impl From<TokenAndAndPtr> for SyntaxStablePtrId {
31725    fn from(ptr: TokenAndAndPtr) -> Self {
31726        ptr.untyped()
31727    }
31728}
31729#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
31730pub struct TokenAndAndGreen(pub GreenId);
31731impl TokenAndAndGreen {
31732    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
31733        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
31734    }
31735}
31736impl TypedSyntaxNode for TokenAndAnd {
31737    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenAndAnd);
31738    type StablePtr = TokenAndAndPtr;
31739    type Green = TokenAndAndGreen;
31740    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
31741        TokenAndAndGreen(
31742            Arc::new(GreenNode {
31743                kind: SyntaxKind::TokenMissing,
31744                details: GreenNodeDetails::Token("".into()),
31745            })
31746            .intern(db),
31747        )
31748    }
31749    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
31750        match node.lookup_intern(db).green.lookup_intern(db).details {
31751            GreenNodeDetails::Token(_) => Self { node },
31752            GreenNodeDetails::Node { .. } => {
31753                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenAndAnd)
31754            }
31755        }
31756    }
31757    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
31758        match node.lookup_intern(db).green.lookup_intern(db).details {
31759            GreenNodeDetails::Token(_) => Some(Self { node }),
31760            GreenNodeDetails::Node { .. } => None,
31761        }
31762    }
31763    fn as_syntax_node(&self) -> SyntaxNode {
31764        self.node
31765    }
31766    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
31767        TokenAndAndPtr(self.node.stable_ptr(db))
31768    }
31769}
31770#[derive(Clone, Debug, Eq, Hash, PartialEq)]
31771pub struct TerminalAndAnd {
31772    node: SyntaxNode,
31773}
31774impl Terminal for TerminalAndAnd {
31775    const KIND: SyntaxKind = SyntaxKind::TerminalAndAnd;
31776    type TokenType = TokenAndAnd;
31777    fn new_green(
31778        db: &dyn SyntaxGroup,
31779        leading_trivia: TriviaGreen,
31780        token: <<TerminalAndAnd as Terminal>::TokenType as TypedSyntaxNode>::Green,
31781        trailing_trivia: TriviaGreen,
31782    ) -> Self::Green {
31783        let children = [leading_trivia.0, token.0, trailing_trivia.0];
31784        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
31785        TerminalAndAndGreen(
31786            Arc::new(GreenNode {
31787                kind: SyntaxKind::TerminalAndAnd,
31788                details: GreenNodeDetails::Node { children: children.into(), width },
31789            })
31790            .intern(db),
31791        )
31792    }
31793    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
31794        let GreenNodeDetails::Node { children, .. } =
31795            &self.node.lookup_intern(db).green.lookup_intern(db).details
31796        else {
31797            unreachable!("Expected a node, not a token");
31798        };
31799        extract_matches!(&children[1].lookup_intern(db).details, GreenNodeDetails::Token).clone()
31800    }
31801}
31802impl TerminalAndAnd {
31803    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
31804        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
31805    }
31806    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenAndAnd {
31807        TokenAndAnd::from_syntax_node(db, self.node.get_children(db)[1])
31808    }
31809    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
31810        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
31811    }
31812}
31813#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
31814pub struct TerminalAndAndPtr(pub SyntaxStablePtrId);
31815impl TerminalAndAndPtr {}
31816impl TypedStablePtr for TerminalAndAndPtr {
31817    type SyntaxNode = TerminalAndAnd;
31818    fn untyped(&self) -> SyntaxStablePtrId {
31819        self.0
31820    }
31821    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalAndAnd {
31822        TerminalAndAnd::from_syntax_node(db, self.0.lookup(db))
31823    }
31824}
31825impl From<TerminalAndAndPtr> for SyntaxStablePtrId {
31826    fn from(ptr: TerminalAndAndPtr) -> Self {
31827        ptr.untyped()
31828    }
31829}
31830#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
31831pub struct TerminalAndAndGreen(pub GreenId);
31832impl TypedSyntaxNode for TerminalAndAnd {
31833    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalAndAnd);
31834    type StablePtr = TerminalAndAndPtr;
31835    type Green = TerminalAndAndGreen;
31836    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
31837        TerminalAndAndGreen(
31838            Arc::new(GreenNode {
31839                kind: SyntaxKind::TerminalAndAnd,
31840                details: GreenNodeDetails::Node {
31841                    children: [
31842                        Trivia::missing(db).0,
31843                        TokenAndAnd::missing(db).0,
31844                        Trivia::missing(db).0,
31845                    ]
31846                    .into(),
31847                    width: TextWidth::default(),
31848                },
31849            })
31850            .intern(db),
31851        )
31852    }
31853    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
31854        let kind = node.kind(db);
31855        assert_eq!(
31856            kind,
31857            SyntaxKind::TerminalAndAnd,
31858            "Unexpected SyntaxKind {:?}. Expected {:?}.",
31859            kind,
31860            SyntaxKind::TerminalAndAnd
31861        );
31862        Self { node }
31863    }
31864    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
31865        let kind = node.kind(db);
31866        if kind == SyntaxKind::TerminalAndAnd {
31867            Some(Self::from_syntax_node(db, node))
31868        } else {
31869            None
31870        }
31871    }
31872    fn as_syntax_node(&self) -> SyntaxNode {
31873        self.node
31874    }
31875    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
31876        TerminalAndAndPtr(self.node.stable_ptr(db))
31877    }
31878}
31879#[derive(Clone, Debug, Eq, Hash, PartialEq)]
31880pub struct TokenArrow {
31881    node: SyntaxNode,
31882}
31883impl Token for TokenArrow {
31884    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
31885        TokenArrowGreen(
31886            Arc::new(GreenNode {
31887                kind: SyntaxKind::TokenArrow,
31888                details: GreenNodeDetails::Token(text),
31889            })
31890            .intern(db),
31891        )
31892    }
31893    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
31894        extract_matches!(
31895            &self.node.lookup_intern(db).green.lookup_intern(db).details,
31896            GreenNodeDetails::Token
31897        )
31898        .clone()
31899    }
31900}
31901#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
31902pub struct TokenArrowPtr(pub SyntaxStablePtrId);
31903impl TypedStablePtr for TokenArrowPtr {
31904    type SyntaxNode = TokenArrow;
31905    fn untyped(&self) -> SyntaxStablePtrId {
31906        self.0
31907    }
31908    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenArrow {
31909        TokenArrow::from_syntax_node(db, self.0.lookup(db))
31910    }
31911}
31912impl From<TokenArrowPtr> for SyntaxStablePtrId {
31913    fn from(ptr: TokenArrowPtr) -> Self {
31914        ptr.untyped()
31915    }
31916}
31917#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
31918pub struct TokenArrowGreen(pub GreenId);
31919impl TokenArrowGreen {
31920    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
31921        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
31922    }
31923}
31924impl TypedSyntaxNode for TokenArrow {
31925    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenArrow);
31926    type StablePtr = TokenArrowPtr;
31927    type Green = TokenArrowGreen;
31928    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
31929        TokenArrowGreen(
31930            Arc::new(GreenNode {
31931                kind: SyntaxKind::TokenMissing,
31932                details: GreenNodeDetails::Token("".into()),
31933            })
31934            .intern(db),
31935        )
31936    }
31937    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
31938        match node.lookup_intern(db).green.lookup_intern(db).details {
31939            GreenNodeDetails::Token(_) => Self { node },
31940            GreenNodeDetails::Node { .. } => {
31941                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenArrow)
31942            }
31943        }
31944    }
31945    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
31946        match node.lookup_intern(db).green.lookup_intern(db).details {
31947            GreenNodeDetails::Token(_) => Some(Self { node }),
31948            GreenNodeDetails::Node { .. } => None,
31949        }
31950    }
31951    fn as_syntax_node(&self) -> SyntaxNode {
31952        self.node
31953    }
31954    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
31955        TokenArrowPtr(self.node.stable_ptr(db))
31956    }
31957}
31958#[derive(Clone, Debug, Eq, Hash, PartialEq)]
31959pub struct TerminalArrow {
31960    node: SyntaxNode,
31961}
31962impl Terminal for TerminalArrow {
31963    const KIND: SyntaxKind = SyntaxKind::TerminalArrow;
31964    type TokenType = TokenArrow;
31965    fn new_green(
31966        db: &dyn SyntaxGroup,
31967        leading_trivia: TriviaGreen,
31968        token: <<TerminalArrow as Terminal>::TokenType as TypedSyntaxNode>::Green,
31969        trailing_trivia: TriviaGreen,
31970    ) -> Self::Green {
31971        let children = [leading_trivia.0, token.0, trailing_trivia.0];
31972        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
31973        TerminalArrowGreen(
31974            Arc::new(GreenNode {
31975                kind: SyntaxKind::TerminalArrow,
31976                details: GreenNodeDetails::Node { children: children.into(), width },
31977            })
31978            .intern(db),
31979        )
31980    }
31981    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
31982        let GreenNodeDetails::Node { children, .. } =
31983            &self.node.lookup_intern(db).green.lookup_intern(db).details
31984        else {
31985            unreachable!("Expected a node, not a token");
31986        };
31987        extract_matches!(&children[1].lookup_intern(db).details, GreenNodeDetails::Token).clone()
31988    }
31989}
31990impl TerminalArrow {
31991    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
31992        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
31993    }
31994    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenArrow {
31995        TokenArrow::from_syntax_node(db, self.node.get_children(db)[1])
31996    }
31997    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
31998        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
31999    }
32000}
32001#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
32002pub struct TerminalArrowPtr(pub SyntaxStablePtrId);
32003impl TerminalArrowPtr {}
32004impl TypedStablePtr for TerminalArrowPtr {
32005    type SyntaxNode = TerminalArrow;
32006    fn untyped(&self) -> SyntaxStablePtrId {
32007        self.0
32008    }
32009    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalArrow {
32010        TerminalArrow::from_syntax_node(db, self.0.lookup(db))
32011    }
32012}
32013impl From<TerminalArrowPtr> for SyntaxStablePtrId {
32014    fn from(ptr: TerminalArrowPtr) -> Self {
32015        ptr.untyped()
32016    }
32017}
32018#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
32019pub struct TerminalArrowGreen(pub GreenId);
32020impl TypedSyntaxNode for TerminalArrow {
32021    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalArrow);
32022    type StablePtr = TerminalArrowPtr;
32023    type Green = TerminalArrowGreen;
32024    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
32025        TerminalArrowGreen(
32026            Arc::new(GreenNode {
32027                kind: SyntaxKind::TerminalArrow,
32028                details: GreenNodeDetails::Node {
32029                    children: [
32030                        Trivia::missing(db).0,
32031                        TokenArrow::missing(db).0,
32032                        Trivia::missing(db).0,
32033                    ]
32034                    .into(),
32035                    width: TextWidth::default(),
32036                },
32037            })
32038            .intern(db),
32039        )
32040    }
32041    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
32042        let kind = node.kind(db);
32043        assert_eq!(
32044            kind,
32045            SyntaxKind::TerminalArrow,
32046            "Unexpected SyntaxKind {:?}. Expected {:?}.",
32047            kind,
32048            SyntaxKind::TerminalArrow
32049        );
32050        Self { node }
32051    }
32052    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
32053        let kind = node.kind(db);
32054        if kind == SyntaxKind::TerminalArrow {
32055            Some(Self::from_syntax_node(db, node))
32056        } else {
32057            None
32058        }
32059    }
32060    fn as_syntax_node(&self) -> SyntaxNode {
32061        self.node
32062    }
32063    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
32064        TerminalArrowPtr(self.node.stable_ptr(db))
32065    }
32066}
32067#[derive(Clone, Debug, Eq, Hash, PartialEq)]
32068pub struct TokenAt {
32069    node: SyntaxNode,
32070}
32071impl Token for TokenAt {
32072    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
32073        TokenAtGreen(
32074            Arc::new(GreenNode {
32075                kind: SyntaxKind::TokenAt,
32076                details: GreenNodeDetails::Token(text),
32077            })
32078            .intern(db),
32079        )
32080    }
32081    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
32082        extract_matches!(
32083            &self.node.lookup_intern(db).green.lookup_intern(db).details,
32084            GreenNodeDetails::Token
32085        )
32086        .clone()
32087    }
32088}
32089#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
32090pub struct TokenAtPtr(pub SyntaxStablePtrId);
32091impl TypedStablePtr for TokenAtPtr {
32092    type SyntaxNode = TokenAt;
32093    fn untyped(&self) -> SyntaxStablePtrId {
32094        self.0
32095    }
32096    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenAt {
32097        TokenAt::from_syntax_node(db, self.0.lookup(db))
32098    }
32099}
32100impl From<TokenAtPtr> for SyntaxStablePtrId {
32101    fn from(ptr: TokenAtPtr) -> Self {
32102        ptr.untyped()
32103    }
32104}
32105#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
32106pub struct TokenAtGreen(pub GreenId);
32107impl TokenAtGreen {
32108    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
32109        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
32110    }
32111}
32112impl TypedSyntaxNode for TokenAt {
32113    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenAt);
32114    type StablePtr = TokenAtPtr;
32115    type Green = TokenAtGreen;
32116    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
32117        TokenAtGreen(
32118            Arc::new(GreenNode {
32119                kind: SyntaxKind::TokenMissing,
32120                details: GreenNodeDetails::Token("".into()),
32121            })
32122            .intern(db),
32123        )
32124    }
32125    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
32126        match node.lookup_intern(db).green.lookup_intern(db).details {
32127            GreenNodeDetails::Token(_) => Self { node },
32128            GreenNodeDetails::Node { .. } => {
32129                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenAt)
32130            }
32131        }
32132    }
32133    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
32134        match node.lookup_intern(db).green.lookup_intern(db).details {
32135            GreenNodeDetails::Token(_) => Some(Self { node }),
32136            GreenNodeDetails::Node { .. } => None,
32137        }
32138    }
32139    fn as_syntax_node(&self) -> SyntaxNode {
32140        self.node
32141    }
32142    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
32143        TokenAtPtr(self.node.stable_ptr(db))
32144    }
32145}
32146#[derive(Clone, Debug, Eq, Hash, PartialEq)]
32147pub struct TerminalAt {
32148    node: SyntaxNode,
32149}
32150impl Terminal for TerminalAt {
32151    const KIND: SyntaxKind = SyntaxKind::TerminalAt;
32152    type TokenType = TokenAt;
32153    fn new_green(
32154        db: &dyn SyntaxGroup,
32155        leading_trivia: TriviaGreen,
32156        token: <<TerminalAt as Terminal>::TokenType as TypedSyntaxNode>::Green,
32157        trailing_trivia: TriviaGreen,
32158    ) -> Self::Green {
32159        let children = [leading_trivia.0, token.0, trailing_trivia.0];
32160        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
32161        TerminalAtGreen(
32162            Arc::new(GreenNode {
32163                kind: SyntaxKind::TerminalAt,
32164                details: GreenNodeDetails::Node { children: children.into(), width },
32165            })
32166            .intern(db),
32167        )
32168    }
32169    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
32170        let GreenNodeDetails::Node { children, .. } =
32171            &self.node.lookup_intern(db).green.lookup_intern(db).details
32172        else {
32173            unreachable!("Expected a node, not a token");
32174        };
32175        extract_matches!(&children[1].lookup_intern(db).details, GreenNodeDetails::Token).clone()
32176    }
32177}
32178impl TerminalAt {
32179    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
32180        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
32181    }
32182    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenAt {
32183        TokenAt::from_syntax_node(db, self.node.get_children(db)[1])
32184    }
32185    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
32186        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
32187    }
32188}
32189#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
32190pub struct TerminalAtPtr(pub SyntaxStablePtrId);
32191impl TerminalAtPtr {}
32192impl TypedStablePtr for TerminalAtPtr {
32193    type SyntaxNode = TerminalAt;
32194    fn untyped(&self) -> SyntaxStablePtrId {
32195        self.0
32196    }
32197    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalAt {
32198        TerminalAt::from_syntax_node(db, self.0.lookup(db))
32199    }
32200}
32201impl From<TerminalAtPtr> for SyntaxStablePtrId {
32202    fn from(ptr: TerminalAtPtr) -> Self {
32203        ptr.untyped()
32204    }
32205}
32206#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
32207pub struct TerminalAtGreen(pub GreenId);
32208impl TypedSyntaxNode for TerminalAt {
32209    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalAt);
32210    type StablePtr = TerminalAtPtr;
32211    type Green = TerminalAtGreen;
32212    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
32213        TerminalAtGreen(
32214            Arc::new(GreenNode {
32215                kind: SyntaxKind::TerminalAt,
32216                details: GreenNodeDetails::Node {
32217                    children: [
32218                        Trivia::missing(db).0,
32219                        TokenAt::missing(db).0,
32220                        Trivia::missing(db).0,
32221                    ]
32222                    .into(),
32223                    width: TextWidth::default(),
32224                },
32225            })
32226            .intern(db),
32227        )
32228    }
32229    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
32230        let kind = node.kind(db);
32231        assert_eq!(
32232            kind,
32233            SyntaxKind::TerminalAt,
32234            "Unexpected SyntaxKind {:?}. Expected {:?}.",
32235            kind,
32236            SyntaxKind::TerminalAt
32237        );
32238        Self { node }
32239    }
32240    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
32241        let kind = node.kind(db);
32242        if kind == SyntaxKind::TerminalAt { Some(Self::from_syntax_node(db, node)) } else { None }
32243    }
32244    fn as_syntax_node(&self) -> SyntaxNode {
32245        self.node
32246    }
32247    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
32248        TerminalAtPtr(self.node.stable_ptr(db))
32249    }
32250}
32251#[derive(Clone, Debug, Eq, Hash, PartialEq)]
32252pub struct TokenBadCharacters {
32253    node: SyntaxNode,
32254}
32255impl Token for TokenBadCharacters {
32256    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
32257        TokenBadCharactersGreen(
32258            Arc::new(GreenNode {
32259                kind: SyntaxKind::TokenBadCharacters,
32260                details: GreenNodeDetails::Token(text),
32261            })
32262            .intern(db),
32263        )
32264    }
32265    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
32266        extract_matches!(
32267            &self.node.lookup_intern(db).green.lookup_intern(db).details,
32268            GreenNodeDetails::Token
32269        )
32270        .clone()
32271    }
32272}
32273#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
32274pub struct TokenBadCharactersPtr(pub SyntaxStablePtrId);
32275impl TypedStablePtr for TokenBadCharactersPtr {
32276    type SyntaxNode = TokenBadCharacters;
32277    fn untyped(&self) -> SyntaxStablePtrId {
32278        self.0
32279    }
32280    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenBadCharacters {
32281        TokenBadCharacters::from_syntax_node(db, self.0.lookup(db))
32282    }
32283}
32284impl From<TokenBadCharactersPtr> for SyntaxStablePtrId {
32285    fn from(ptr: TokenBadCharactersPtr) -> Self {
32286        ptr.untyped()
32287    }
32288}
32289#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
32290pub struct TokenBadCharactersGreen(pub GreenId);
32291impl TokenBadCharactersGreen {
32292    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
32293        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
32294    }
32295}
32296impl TypedSyntaxNode for TokenBadCharacters {
32297    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenBadCharacters);
32298    type StablePtr = TokenBadCharactersPtr;
32299    type Green = TokenBadCharactersGreen;
32300    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
32301        TokenBadCharactersGreen(
32302            Arc::new(GreenNode {
32303                kind: SyntaxKind::TokenMissing,
32304                details: GreenNodeDetails::Token("".into()),
32305            })
32306            .intern(db),
32307        )
32308    }
32309    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
32310        match node.lookup_intern(db).green.lookup_intern(db).details {
32311            GreenNodeDetails::Token(_) => Self { node },
32312            GreenNodeDetails::Node { .. } => panic!(
32313                "Expected a token {:?}, not an internal node",
32314                SyntaxKind::TokenBadCharacters
32315            ),
32316        }
32317    }
32318    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
32319        match node.lookup_intern(db).green.lookup_intern(db).details {
32320            GreenNodeDetails::Token(_) => Some(Self { node }),
32321            GreenNodeDetails::Node { .. } => None,
32322        }
32323    }
32324    fn as_syntax_node(&self) -> SyntaxNode {
32325        self.node
32326    }
32327    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
32328        TokenBadCharactersPtr(self.node.stable_ptr(db))
32329    }
32330}
32331#[derive(Clone, Debug, Eq, Hash, PartialEq)]
32332pub struct TerminalBadCharacters {
32333    node: SyntaxNode,
32334}
32335impl Terminal for TerminalBadCharacters {
32336    const KIND: SyntaxKind = SyntaxKind::TerminalBadCharacters;
32337    type TokenType = TokenBadCharacters;
32338    fn new_green(
32339        db: &dyn SyntaxGroup,
32340        leading_trivia: TriviaGreen,
32341        token: <<TerminalBadCharacters as Terminal>::TokenType as TypedSyntaxNode>::Green,
32342        trailing_trivia: TriviaGreen,
32343    ) -> Self::Green {
32344        let children = [leading_trivia.0, token.0, trailing_trivia.0];
32345        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
32346        TerminalBadCharactersGreen(
32347            Arc::new(GreenNode {
32348                kind: SyntaxKind::TerminalBadCharacters,
32349                details: GreenNodeDetails::Node { children: children.into(), width },
32350            })
32351            .intern(db),
32352        )
32353    }
32354    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
32355        let GreenNodeDetails::Node { children, .. } =
32356            &self.node.lookup_intern(db).green.lookup_intern(db).details
32357        else {
32358            unreachable!("Expected a node, not a token");
32359        };
32360        extract_matches!(&children[1].lookup_intern(db).details, GreenNodeDetails::Token).clone()
32361    }
32362}
32363impl TerminalBadCharacters {
32364    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
32365        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
32366    }
32367    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenBadCharacters {
32368        TokenBadCharacters::from_syntax_node(db, self.node.get_children(db)[1])
32369    }
32370    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
32371        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
32372    }
32373}
32374#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
32375pub struct TerminalBadCharactersPtr(pub SyntaxStablePtrId);
32376impl TerminalBadCharactersPtr {}
32377impl TypedStablePtr for TerminalBadCharactersPtr {
32378    type SyntaxNode = TerminalBadCharacters;
32379    fn untyped(&self) -> SyntaxStablePtrId {
32380        self.0
32381    }
32382    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalBadCharacters {
32383        TerminalBadCharacters::from_syntax_node(db, self.0.lookup(db))
32384    }
32385}
32386impl From<TerminalBadCharactersPtr> for SyntaxStablePtrId {
32387    fn from(ptr: TerminalBadCharactersPtr) -> Self {
32388        ptr.untyped()
32389    }
32390}
32391#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
32392pub struct TerminalBadCharactersGreen(pub GreenId);
32393impl TypedSyntaxNode for TerminalBadCharacters {
32394    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalBadCharacters);
32395    type StablePtr = TerminalBadCharactersPtr;
32396    type Green = TerminalBadCharactersGreen;
32397    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
32398        TerminalBadCharactersGreen(
32399            Arc::new(GreenNode {
32400                kind: SyntaxKind::TerminalBadCharacters,
32401                details: GreenNodeDetails::Node {
32402                    children: [
32403                        Trivia::missing(db).0,
32404                        TokenBadCharacters::missing(db).0,
32405                        Trivia::missing(db).0,
32406                    ]
32407                    .into(),
32408                    width: TextWidth::default(),
32409                },
32410            })
32411            .intern(db),
32412        )
32413    }
32414    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
32415        let kind = node.kind(db);
32416        assert_eq!(
32417            kind,
32418            SyntaxKind::TerminalBadCharacters,
32419            "Unexpected SyntaxKind {:?}. Expected {:?}.",
32420            kind,
32421            SyntaxKind::TerminalBadCharacters
32422        );
32423        Self { node }
32424    }
32425    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
32426        let kind = node.kind(db);
32427        if kind == SyntaxKind::TerminalBadCharacters {
32428            Some(Self::from_syntax_node(db, node))
32429        } else {
32430            None
32431        }
32432    }
32433    fn as_syntax_node(&self) -> SyntaxNode {
32434        self.node
32435    }
32436    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
32437        TerminalBadCharactersPtr(self.node.stable_ptr(db))
32438    }
32439}
32440#[derive(Clone, Debug, Eq, Hash, PartialEq)]
32441pub struct TokenColon {
32442    node: SyntaxNode,
32443}
32444impl Token for TokenColon {
32445    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
32446        TokenColonGreen(
32447            Arc::new(GreenNode {
32448                kind: SyntaxKind::TokenColon,
32449                details: GreenNodeDetails::Token(text),
32450            })
32451            .intern(db),
32452        )
32453    }
32454    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
32455        extract_matches!(
32456            &self.node.lookup_intern(db).green.lookup_intern(db).details,
32457            GreenNodeDetails::Token
32458        )
32459        .clone()
32460    }
32461}
32462#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
32463pub struct TokenColonPtr(pub SyntaxStablePtrId);
32464impl TypedStablePtr for TokenColonPtr {
32465    type SyntaxNode = TokenColon;
32466    fn untyped(&self) -> SyntaxStablePtrId {
32467        self.0
32468    }
32469    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenColon {
32470        TokenColon::from_syntax_node(db, self.0.lookup(db))
32471    }
32472}
32473impl From<TokenColonPtr> for SyntaxStablePtrId {
32474    fn from(ptr: TokenColonPtr) -> Self {
32475        ptr.untyped()
32476    }
32477}
32478#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
32479pub struct TokenColonGreen(pub GreenId);
32480impl TokenColonGreen {
32481    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
32482        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
32483    }
32484}
32485impl TypedSyntaxNode for TokenColon {
32486    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenColon);
32487    type StablePtr = TokenColonPtr;
32488    type Green = TokenColonGreen;
32489    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
32490        TokenColonGreen(
32491            Arc::new(GreenNode {
32492                kind: SyntaxKind::TokenMissing,
32493                details: GreenNodeDetails::Token("".into()),
32494            })
32495            .intern(db),
32496        )
32497    }
32498    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
32499        match node.lookup_intern(db).green.lookup_intern(db).details {
32500            GreenNodeDetails::Token(_) => Self { node },
32501            GreenNodeDetails::Node { .. } => {
32502                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenColon)
32503            }
32504        }
32505    }
32506    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
32507        match node.lookup_intern(db).green.lookup_intern(db).details {
32508            GreenNodeDetails::Token(_) => Some(Self { node }),
32509            GreenNodeDetails::Node { .. } => None,
32510        }
32511    }
32512    fn as_syntax_node(&self) -> SyntaxNode {
32513        self.node
32514    }
32515    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
32516        TokenColonPtr(self.node.stable_ptr(db))
32517    }
32518}
32519#[derive(Clone, Debug, Eq, Hash, PartialEq)]
32520pub struct TerminalColon {
32521    node: SyntaxNode,
32522}
32523impl Terminal for TerminalColon {
32524    const KIND: SyntaxKind = SyntaxKind::TerminalColon;
32525    type TokenType = TokenColon;
32526    fn new_green(
32527        db: &dyn SyntaxGroup,
32528        leading_trivia: TriviaGreen,
32529        token: <<TerminalColon as Terminal>::TokenType as TypedSyntaxNode>::Green,
32530        trailing_trivia: TriviaGreen,
32531    ) -> Self::Green {
32532        let children = [leading_trivia.0, token.0, trailing_trivia.0];
32533        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
32534        TerminalColonGreen(
32535            Arc::new(GreenNode {
32536                kind: SyntaxKind::TerminalColon,
32537                details: GreenNodeDetails::Node { children: children.into(), width },
32538            })
32539            .intern(db),
32540        )
32541    }
32542    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
32543        let GreenNodeDetails::Node { children, .. } =
32544            &self.node.lookup_intern(db).green.lookup_intern(db).details
32545        else {
32546            unreachable!("Expected a node, not a token");
32547        };
32548        extract_matches!(&children[1].lookup_intern(db).details, GreenNodeDetails::Token).clone()
32549    }
32550}
32551impl TerminalColon {
32552    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
32553        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
32554    }
32555    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenColon {
32556        TokenColon::from_syntax_node(db, self.node.get_children(db)[1])
32557    }
32558    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
32559        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
32560    }
32561}
32562#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
32563pub struct TerminalColonPtr(pub SyntaxStablePtrId);
32564impl TerminalColonPtr {}
32565impl TypedStablePtr for TerminalColonPtr {
32566    type SyntaxNode = TerminalColon;
32567    fn untyped(&self) -> SyntaxStablePtrId {
32568        self.0
32569    }
32570    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalColon {
32571        TerminalColon::from_syntax_node(db, self.0.lookup(db))
32572    }
32573}
32574impl From<TerminalColonPtr> for SyntaxStablePtrId {
32575    fn from(ptr: TerminalColonPtr) -> Self {
32576        ptr.untyped()
32577    }
32578}
32579#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
32580pub struct TerminalColonGreen(pub GreenId);
32581impl TypedSyntaxNode for TerminalColon {
32582    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalColon);
32583    type StablePtr = TerminalColonPtr;
32584    type Green = TerminalColonGreen;
32585    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
32586        TerminalColonGreen(
32587            Arc::new(GreenNode {
32588                kind: SyntaxKind::TerminalColon,
32589                details: GreenNodeDetails::Node {
32590                    children: [
32591                        Trivia::missing(db).0,
32592                        TokenColon::missing(db).0,
32593                        Trivia::missing(db).0,
32594                    ]
32595                    .into(),
32596                    width: TextWidth::default(),
32597                },
32598            })
32599            .intern(db),
32600        )
32601    }
32602    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
32603        let kind = node.kind(db);
32604        assert_eq!(
32605            kind,
32606            SyntaxKind::TerminalColon,
32607            "Unexpected SyntaxKind {:?}. Expected {:?}.",
32608            kind,
32609            SyntaxKind::TerminalColon
32610        );
32611        Self { node }
32612    }
32613    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
32614        let kind = node.kind(db);
32615        if kind == SyntaxKind::TerminalColon {
32616            Some(Self::from_syntax_node(db, node))
32617        } else {
32618            None
32619        }
32620    }
32621    fn as_syntax_node(&self) -> SyntaxNode {
32622        self.node
32623    }
32624    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
32625        TerminalColonPtr(self.node.stable_ptr(db))
32626    }
32627}
32628#[derive(Clone, Debug, Eq, Hash, PartialEq)]
32629pub struct TokenColonColon {
32630    node: SyntaxNode,
32631}
32632impl Token for TokenColonColon {
32633    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
32634        TokenColonColonGreen(
32635            Arc::new(GreenNode {
32636                kind: SyntaxKind::TokenColonColon,
32637                details: GreenNodeDetails::Token(text),
32638            })
32639            .intern(db),
32640        )
32641    }
32642    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
32643        extract_matches!(
32644            &self.node.lookup_intern(db).green.lookup_intern(db).details,
32645            GreenNodeDetails::Token
32646        )
32647        .clone()
32648    }
32649}
32650#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
32651pub struct TokenColonColonPtr(pub SyntaxStablePtrId);
32652impl TypedStablePtr for TokenColonColonPtr {
32653    type SyntaxNode = TokenColonColon;
32654    fn untyped(&self) -> SyntaxStablePtrId {
32655        self.0
32656    }
32657    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenColonColon {
32658        TokenColonColon::from_syntax_node(db, self.0.lookup(db))
32659    }
32660}
32661impl From<TokenColonColonPtr> for SyntaxStablePtrId {
32662    fn from(ptr: TokenColonColonPtr) -> Self {
32663        ptr.untyped()
32664    }
32665}
32666#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
32667pub struct TokenColonColonGreen(pub GreenId);
32668impl TokenColonColonGreen {
32669    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
32670        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
32671    }
32672}
32673impl TypedSyntaxNode for TokenColonColon {
32674    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenColonColon);
32675    type StablePtr = TokenColonColonPtr;
32676    type Green = TokenColonColonGreen;
32677    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
32678        TokenColonColonGreen(
32679            Arc::new(GreenNode {
32680                kind: SyntaxKind::TokenMissing,
32681                details: GreenNodeDetails::Token("".into()),
32682            })
32683            .intern(db),
32684        )
32685    }
32686    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
32687        match node.lookup_intern(db).green.lookup_intern(db).details {
32688            GreenNodeDetails::Token(_) => Self { node },
32689            GreenNodeDetails::Node { .. } => {
32690                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenColonColon)
32691            }
32692        }
32693    }
32694    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
32695        match node.lookup_intern(db).green.lookup_intern(db).details {
32696            GreenNodeDetails::Token(_) => Some(Self { node }),
32697            GreenNodeDetails::Node { .. } => None,
32698        }
32699    }
32700    fn as_syntax_node(&self) -> SyntaxNode {
32701        self.node
32702    }
32703    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
32704        TokenColonColonPtr(self.node.stable_ptr(db))
32705    }
32706}
32707#[derive(Clone, Debug, Eq, Hash, PartialEq)]
32708pub struct TerminalColonColon {
32709    node: SyntaxNode,
32710}
32711impl Terminal for TerminalColonColon {
32712    const KIND: SyntaxKind = SyntaxKind::TerminalColonColon;
32713    type TokenType = TokenColonColon;
32714    fn new_green(
32715        db: &dyn SyntaxGroup,
32716        leading_trivia: TriviaGreen,
32717        token: <<TerminalColonColon as Terminal>::TokenType as TypedSyntaxNode>::Green,
32718        trailing_trivia: TriviaGreen,
32719    ) -> Self::Green {
32720        let children = [leading_trivia.0, token.0, trailing_trivia.0];
32721        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
32722        TerminalColonColonGreen(
32723            Arc::new(GreenNode {
32724                kind: SyntaxKind::TerminalColonColon,
32725                details: GreenNodeDetails::Node { children: children.into(), width },
32726            })
32727            .intern(db),
32728        )
32729    }
32730    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
32731        let GreenNodeDetails::Node { children, .. } =
32732            &self.node.lookup_intern(db).green.lookup_intern(db).details
32733        else {
32734            unreachable!("Expected a node, not a token");
32735        };
32736        extract_matches!(&children[1].lookup_intern(db).details, GreenNodeDetails::Token).clone()
32737    }
32738}
32739impl TerminalColonColon {
32740    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
32741        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
32742    }
32743    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenColonColon {
32744        TokenColonColon::from_syntax_node(db, self.node.get_children(db)[1])
32745    }
32746    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
32747        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
32748    }
32749}
32750#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
32751pub struct TerminalColonColonPtr(pub SyntaxStablePtrId);
32752impl TerminalColonColonPtr {}
32753impl TypedStablePtr for TerminalColonColonPtr {
32754    type SyntaxNode = TerminalColonColon;
32755    fn untyped(&self) -> SyntaxStablePtrId {
32756        self.0
32757    }
32758    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalColonColon {
32759        TerminalColonColon::from_syntax_node(db, self.0.lookup(db))
32760    }
32761}
32762impl From<TerminalColonColonPtr> for SyntaxStablePtrId {
32763    fn from(ptr: TerminalColonColonPtr) -> Self {
32764        ptr.untyped()
32765    }
32766}
32767#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
32768pub struct TerminalColonColonGreen(pub GreenId);
32769impl TypedSyntaxNode for TerminalColonColon {
32770    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalColonColon);
32771    type StablePtr = TerminalColonColonPtr;
32772    type Green = TerminalColonColonGreen;
32773    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
32774        TerminalColonColonGreen(
32775            Arc::new(GreenNode {
32776                kind: SyntaxKind::TerminalColonColon,
32777                details: GreenNodeDetails::Node {
32778                    children: [
32779                        Trivia::missing(db).0,
32780                        TokenColonColon::missing(db).0,
32781                        Trivia::missing(db).0,
32782                    ]
32783                    .into(),
32784                    width: TextWidth::default(),
32785                },
32786            })
32787            .intern(db),
32788        )
32789    }
32790    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
32791        let kind = node.kind(db);
32792        assert_eq!(
32793            kind,
32794            SyntaxKind::TerminalColonColon,
32795            "Unexpected SyntaxKind {:?}. Expected {:?}.",
32796            kind,
32797            SyntaxKind::TerminalColonColon
32798        );
32799        Self { node }
32800    }
32801    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
32802        let kind = node.kind(db);
32803        if kind == SyntaxKind::TerminalColonColon {
32804            Some(Self::from_syntax_node(db, node))
32805        } else {
32806            None
32807        }
32808    }
32809    fn as_syntax_node(&self) -> SyntaxNode {
32810        self.node
32811    }
32812    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
32813        TerminalColonColonPtr(self.node.stable_ptr(db))
32814    }
32815}
32816#[derive(Clone, Debug, Eq, Hash, PartialEq)]
32817pub struct TokenComma {
32818    node: SyntaxNode,
32819}
32820impl Token for TokenComma {
32821    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
32822        TokenCommaGreen(
32823            Arc::new(GreenNode {
32824                kind: SyntaxKind::TokenComma,
32825                details: GreenNodeDetails::Token(text),
32826            })
32827            .intern(db),
32828        )
32829    }
32830    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
32831        extract_matches!(
32832            &self.node.lookup_intern(db).green.lookup_intern(db).details,
32833            GreenNodeDetails::Token
32834        )
32835        .clone()
32836    }
32837}
32838#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
32839pub struct TokenCommaPtr(pub SyntaxStablePtrId);
32840impl TypedStablePtr for TokenCommaPtr {
32841    type SyntaxNode = TokenComma;
32842    fn untyped(&self) -> SyntaxStablePtrId {
32843        self.0
32844    }
32845    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenComma {
32846        TokenComma::from_syntax_node(db, self.0.lookup(db))
32847    }
32848}
32849impl From<TokenCommaPtr> for SyntaxStablePtrId {
32850    fn from(ptr: TokenCommaPtr) -> Self {
32851        ptr.untyped()
32852    }
32853}
32854#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
32855pub struct TokenCommaGreen(pub GreenId);
32856impl TokenCommaGreen {
32857    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
32858        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
32859    }
32860}
32861impl TypedSyntaxNode for TokenComma {
32862    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenComma);
32863    type StablePtr = TokenCommaPtr;
32864    type Green = TokenCommaGreen;
32865    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
32866        TokenCommaGreen(
32867            Arc::new(GreenNode {
32868                kind: SyntaxKind::TokenMissing,
32869                details: GreenNodeDetails::Token("".into()),
32870            })
32871            .intern(db),
32872        )
32873    }
32874    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
32875        match node.lookup_intern(db).green.lookup_intern(db).details {
32876            GreenNodeDetails::Token(_) => Self { node },
32877            GreenNodeDetails::Node { .. } => {
32878                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenComma)
32879            }
32880        }
32881    }
32882    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
32883        match node.lookup_intern(db).green.lookup_intern(db).details {
32884            GreenNodeDetails::Token(_) => Some(Self { node }),
32885            GreenNodeDetails::Node { .. } => None,
32886        }
32887    }
32888    fn as_syntax_node(&self) -> SyntaxNode {
32889        self.node
32890    }
32891    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
32892        TokenCommaPtr(self.node.stable_ptr(db))
32893    }
32894}
32895#[derive(Clone, Debug, Eq, Hash, PartialEq)]
32896pub struct TerminalComma {
32897    node: SyntaxNode,
32898}
32899impl Terminal for TerminalComma {
32900    const KIND: SyntaxKind = SyntaxKind::TerminalComma;
32901    type TokenType = TokenComma;
32902    fn new_green(
32903        db: &dyn SyntaxGroup,
32904        leading_trivia: TriviaGreen,
32905        token: <<TerminalComma as Terminal>::TokenType as TypedSyntaxNode>::Green,
32906        trailing_trivia: TriviaGreen,
32907    ) -> Self::Green {
32908        let children = [leading_trivia.0, token.0, trailing_trivia.0];
32909        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
32910        TerminalCommaGreen(
32911            Arc::new(GreenNode {
32912                kind: SyntaxKind::TerminalComma,
32913                details: GreenNodeDetails::Node { children: children.into(), width },
32914            })
32915            .intern(db),
32916        )
32917    }
32918    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
32919        let GreenNodeDetails::Node { children, .. } =
32920            &self.node.lookup_intern(db).green.lookup_intern(db).details
32921        else {
32922            unreachable!("Expected a node, not a token");
32923        };
32924        extract_matches!(&children[1].lookup_intern(db).details, GreenNodeDetails::Token).clone()
32925    }
32926}
32927impl TerminalComma {
32928    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
32929        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
32930    }
32931    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenComma {
32932        TokenComma::from_syntax_node(db, self.node.get_children(db)[1])
32933    }
32934    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
32935        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
32936    }
32937}
32938#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
32939pub struct TerminalCommaPtr(pub SyntaxStablePtrId);
32940impl TerminalCommaPtr {}
32941impl TypedStablePtr for TerminalCommaPtr {
32942    type SyntaxNode = TerminalComma;
32943    fn untyped(&self) -> SyntaxStablePtrId {
32944        self.0
32945    }
32946    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalComma {
32947        TerminalComma::from_syntax_node(db, self.0.lookup(db))
32948    }
32949}
32950impl From<TerminalCommaPtr> for SyntaxStablePtrId {
32951    fn from(ptr: TerminalCommaPtr) -> Self {
32952        ptr.untyped()
32953    }
32954}
32955#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
32956pub struct TerminalCommaGreen(pub GreenId);
32957impl TypedSyntaxNode for TerminalComma {
32958    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalComma);
32959    type StablePtr = TerminalCommaPtr;
32960    type Green = TerminalCommaGreen;
32961    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
32962        TerminalCommaGreen(
32963            Arc::new(GreenNode {
32964                kind: SyntaxKind::TerminalComma,
32965                details: GreenNodeDetails::Node {
32966                    children: [
32967                        Trivia::missing(db).0,
32968                        TokenComma::missing(db).0,
32969                        Trivia::missing(db).0,
32970                    ]
32971                    .into(),
32972                    width: TextWidth::default(),
32973                },
32974            })
32975            .intern(db),
32976        )
32977    }
32978    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
32979        let kind = node.kind(db);
32980        assert_eq!(
32981            kind,
32982            SyntaxKind::TerminalComma,
32983            "Unexpected SyntaxKind {:?}. Expected {:?}.",
32984            kind,
32985            SyntaxKind::TerminalComma
32986        );
32987        Self { node }
32988    }
32989    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
32990        let kind = node.kind(db);
32991        if kind == SyntaxKind::TerminalComma {
32992            Some(Self::from_syntax_node(db, node))
32993        } else {
32994            None
32995        }
32996    }
32997    fn as_syntax_node(&self) -> SyntaxNode {
32998        self.node
32999    }
33000    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
33001        TerminalCommaPtr(self.node.stable_ptr(db))
33002    }
33003}
33004#[derive(Clone, Debug, Eq, Hash, PartialEq)]
33005pub struct TokenDiv {
33006    node: SyntaxNode,
33007}
33008impl Token for TokenDiv {
33009    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
33010        TokenDivGreen(
33011            Arc::new(GreenNode {
33012                kind: SyntaxKind::TokenDiv,
33013                details: GreenNodeDetails::Token(text),
33014            })
33015            .intern(db),
33016        )
33017    }
33018    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
33019        extract_matches!(
33020            &self.node.lookup_intern(db).green.lookup_intern(db).details,
33021            GreenNodeDetails::Token
33022        )
33023        .clone()
33024    }
33025}
33026#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
33027pub struct TokenDivPtr(pub SyntaxStablePtrId);
33028impl TypedStablePtr for TokenDivPtr {
33029    type SyntaxNode = TokenDiv;
33030    fn untyped(&self) -> SyntaxStablePtrId {
33031        self.0
33032    }
33033    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenDiv {
33034        TokenDiv::from_syntax_node(db, self.0.lookup(db))
33035    }
33036}
33037impl From<TokenDivPtr> for SyntaxStablePtrId {
33038    fn from(ptr: TokenDivPtr) -> Self {
33039        ptr.untyped()
33040    }
33041}
33042#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
33043pub struct TokenDivGreen(pub GreenId);
33044impl TokenDivGreen {
33045    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
33046        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
33047    }
33048}
33049impl TypedSyntaxNode for TokenDiv {
33050    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenDiv);
33051    type StablePtr = TokenDivPtr;
33052    type Green = TokenDivGreen;
33053    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
33054        TokenDivGreen(
33055            Arc::new(GreenNode {
33056                kind: SyntaxKind::TokenMissing,
33057                details: GreenNodeDetails::Token("".into()),
33058            })
33059            .intern(db),
33060        )
33061    }
33062    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
33063        match node.lookup_intern(db).green.lookup_intern(db).details {
33064            GreenNodeDetails::Token(_) => Self { node },
33065            GreenNodeDetails::Node { .. } => {
33066                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenDiv)
33067            }
33068        }
33069    }
33070    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
33071        match node.lookup_intern(db).green.lookup_intern(db).details {
33072            GreenNodeDetails::Token(_) => Some(Self { node }),
33073            GreenNodeDetails::Node { .. } => None,
33074        }
33075    }
33076    fn as_syntax_node(&self) -> SyntaxNode {
33077        self.node
33078    }
33079    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
33080        TokenDivPtr(self.node.stable_ptr(db))
33081    }
33082}
33083#[derive(Clone, Debug, Eq, Hash, PartialEq)]
33084pub struct TerminalDiv {
33085    node: SyntaxNode,
33086}
33087impl Terminal for TerminalDiv {
33088    const KIND: SyntaxKind = SyntaxKind::TerminalDiv;
33089    type TokenType = TokenDiv;
33090    fn new_green(
33091        db: &dyn SyntaxGroup,
33092        leading_trivia: TriviaGreen,
33093        token: <<TerminalDiv as Terminal>::TokenType as TypedSyntaxNode>::Green,
33094        trailing_trivia: TriviaGreen,
33095    ) -> Self::Green {
33096        let children = [leading_trivia.0, token.0, trailing_trivia.0];
33097        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
33098        TerminalDivGreen(
33099            Arc::new(GreenNode {
33100                kind: SyntaxKind::TerminalDiv,
33101                details: GreenNodeDetails::Node { children: children.into(), width },
33102            })
33103            .intern(db),
33104        )
33105    }
33106    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
33107        let GreenNodeDetails::Node { children, .. } =
33108            &self.node.lookup_intern(db).green.lookup_intern(db).details
33109        else {
33110            unreachable!("Expected a node, not a token");
33111        };
33112        extract_matches!(&children[1].lookup_intern(db).details, GreenNodeDetails::Token).clone()
33113    }
33114}
33115impl TerminalDiv {
33116    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
33117        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
33118    }
33119    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenDiv {
33120        TokenDiv::from_syntax_node(db, self.node.get_children(db)[1])
33121    }
33122    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
33123        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
33124    }
33125}
33126#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
33127pub struct TerminalDivPtr(pub SyntaxStablePtrId);
33128impl TerminalDivPtr {}
33129impl TypedStablePtr for TerminalDivPtr {
33130    type SyntaxNode = TerminalDiv;
33131    fn untyped(&self) -> SyntaxStablePtrId {
33132        self.0
33133    }
33134    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalDiv {
33135        TerminalDiv::from_syntax_node(db, self.0.lookup(db))
33136    }
33137}
33138impl From<TerminalDivPtr> for SyntaxStablePtrId {
33139    fn from(ptr: TerminalDivPtr) -> Self {
33140        ptr.untyped()
33141    }
33142}
33143#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
33144pub struct TerminalDivGreen(pub GreenId);
33145impl TypedSyntaxNode for TerminalDiv {
33146    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalDiv);
33147    type StablePtr = TerminalDivPtr;
33148    type Green = TerminalDivGreen;
33149    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
33150        TerminalDivGreen(
33151            Arc::new(GreenNode {
33152                kind: SyntaxKind::TerminalDiv,
33153                details: GreenNodeDetails::Node {
33154                    children: [
33155                        Trivia::missing(db).0,
33156                        TokenDiv::missing(db).0,
33157                        Trivia::missing(db).0,
33158                    ]
33159                    .into(),
33160                    width: TextWidth::default(),
33161                },
33162            })
33163            .intern(db),
33164        )
33165    }
33166    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
33167        let kind = node.kind(db);
33168        assert_eq!(
33169            kind,
33170            SyntaxKind::TerminalDiv,
33171            "Unexpected SyntaxKind {:?}. Expected {:?}.",
33172            kind,
33173            SyntaxKind::TerminalDiv
33174        );
33175        Self { node }
33176    }
33177    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
33178        let kind = node.kind(db);
33179        if kind == SyntaxKind::TerminalDiv { Some(Self::from_syntax_node(db, node)) } else { None }
33180    }
33181    fn as_syntax_node(&self) -> SyntaxNode {
33182        self.node
33183    }
33184    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
33185        TerminalDivPtr(self.node.stable_ptr(db))
33186    }
33187}
33188#[derive(Clone, Debug, Eq, Hash, PartialEq)]
33189pub struct TokenDivEq {
33190    node: SyntaxNode,
33191}
33192impl Token for TokenDivEq {
33193    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
33194        TokenDivEqGreen(
33195            Arc::new(GreenNode {
33196                kind: SyntaxKind::TokenDivEq,
33197                details: GreenNodeDetails::Token(text),
33198            })
33199            .intern(db),
33200        )
33201    }
33202    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
33203        extract_matches!(
33204            &self.node.lookup_intern(db).green.lookup_intern(db).details,
33205            GreenNodeDetails::Token
33206        )
33207        .clone()
33208    }
33209}
33210#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
33211pub struct TokenDivEqPtr(pub SyntaxStablePtrId);
33212impl TypedStablePtr for TokenDivEqPtr {
33213    type SyntaxNode = TokenDivEq;
33214    fn untyped(&self) -> SyntaxStablePtrId {
33215        self.0
33216    }
33217    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenDivEq {
33218        TokenDivEq::from_syntax_node(db, self.0.lookup(db))
33219    }
33220}
33221impl From<TokenDivEqPtr> for SyntaxStablePtrId {
33222    fn from(ptr: TokenDivEqPtr) -> Self {
33223        ptr.untyped()
33224    }
33225}
33226#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
33227pub struct TokenDivEqGreen(pub GreenId);
33228impl TokenDivEqGreen {
33229    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
33230        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
33231    }
33232}
33233impl TypedSyntaxNode for TokenDivEq {
33234    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenDivEq);
33235    type StablePtr = TokenDivEqPtr;
33236    type Green = TokenDivEqGreen;
33237    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
33238        TokenDivEqGreen(
33239            Arc::new(GreenNode {
33240                kind: SyntaxKind::TokenMissing,
33241                details: GreenNodeDetails::Token("".into()),
33242            })
33243            .intern(db),
33244        )
33245    }
33246    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
33247        match node.lookup_intern(db).green.lookup_intern(db).details {
33248            GreenNodeDetails::Token(_) => Self { node },
33249            GreenNodeDetails::Node { .. } => {
33250                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenDivEq)
33251            }
33252        }
33253    }
33254    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
33255        match node.lookup_intern(db).green.lookup_intern(db).details {
33256            GreenNodeDetails::Token(_) => Some(Self { node }),
33257            GreenNodeDetails::Node { .. } => None,
33258        }
33259    }
33260    fn as_syntax_node(&self) -> SyntaxNode {
33261        self.node
33262    }
33263    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
33264        TokenDivEqPtr(self.node.stable_ptr(db))
33265    }
33266}
33267#[derive(Clone, Debug, Eq, Hash, PartialEq)]
33268pub struct TerminalDivEq {
33269    node: SyntaxNode,
33270}
33271impl Terminal for TerminalDivEq {
33272    const KIND: SyntaxKind = SyntaxKind::TerminalDivEq;
33273    type TokenType = TokenDivEq;
33274    fn new_green(
33275        db: &dyn SyntaxGroup,
33276        leading_trivia: TriviaGreen,
33277        token: <<TerminalDivEq as Terminal>::TokenType as TypedSyntaxNode>::Green,
33278        trailing_trivia: TriviaGreen,
33279    ) -> Self::Green {
33280        let children = [leading_trivia.0, token.0, trailing_trivia.0];
33281        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
33282        TerminalDivEqGreen(
33283            Arc::new(GreenNode {
33284                kind: SyntaxKind::TerminalDivEq,
33285                details: GreenNodeDetails::Node { children: children.into(), width },
33286            })
33287            .intern(db),
33288        )
33289    }
33290    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
33291        let GreenNodeDetails::Node { children, .. } =
33292            &self.node.lookup_intern(db).green.lookup_intern(db).details
33293        else {
33294            unreachable!("Expected a node, not a token");
33295        };
33296        extract_matches!(&children[1].lookup_intern(db).details, GreenNodeDetails::Token).clone()
33297    }
33298}
33299impl TerminalDivEq {
33300    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
33301        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
33302    }
33303    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenDivEq {
33304        TokenDivEq::from_syntax_node(db, self.node.get_children(db)[1])
33305    }
33306    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
33307        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
33308    }
33309}
33310#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
33311pub struct TerminalDivEqPtr(pub SyntaxStablePtrId);
33312impl TerminalDivEqPtr {}
33313impl TypedStablePtr for TerminalDivEqPtr {
33314    type SyntaxNode = TerminalDivEq;
33315    fn untyped(&self) -> SyntaxStablePtrId {
33316        self.0
33317    }
33318    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalDivEq {
33319        TerminalDivEq::from_syntax_node(db, self.0.lookup(db))
33320    }
33321}
33322impl From<TerminalDivEqPtr> for SyntaxStablePtrId {
33323    fn from(ptr: TerminalDivEqPtr) -> Self {
33324        ptr.untyped()
33325    }
33326}
33327#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
33328pub struct TerminalDivEqGreen(pub GreenId);
33329impl TypedSyntaxNode for TerminalDivEq {
33330    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalDivEq);
33331    type StablePtr = TerminalDivEqPtr;
33332    type Green = TerminalDivEqGreen;
33333    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
33334        TerminalDivEqGreen(
33335            Arc::new(GreenNode {
33336                kind: SyntaxKind::TerminalDivEq,
33337                details: GreenNodeDetails::Node {
33338                    children: [
33339                        Trivia::missing(db).0,
33340                        TokenDivEq::missing(db).0,
33341                        Trivia::missing(db).0,
33342                    ]
33343                    .into(),
33344                    width: TextWidth::default(),
33345                },
33346            })
33347            .intern(db),
33348        )
33349    }
33350    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
33351        let kind = node.kind(db);
33352        assert_eq!(
33353            kind,
33354            SyntaxKind::TerminalDivEq,
33355            "Unexpected SyntaxKind {:?}. Expected {:?}.",
33356            kind,
33357            SyntaxKind::TerminalDivEq
33358        );
33359        Self { node }
33360    }
33361    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
33362        let kind = node.kind(db);
33363        if kind == SyntaxKind::TerminalDivEq {
33364            Some(Self::from_syntax_node(db, node))
33365        } else {
33366            None
33367        }
33368    }
33369    fn as_syntax_node(&self) -> SyntaxNode {
33370        self.node
33371    }
33372    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
33373        TerminalDivEqPtr(self.node.stable_ptr(db))
33374    }
33375}
33376#[derive(Clone, Debug, Eq, Hash, PartialEq)]
33377pub struct TokenDollar {
33378    node: SyntaxNode,
33379}
33380impl Token for TokenDollar {
33381    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
33382        TokenDollarGreen(
33383            Arc::new(GreenNode {
33384                kind: SyntaxKind::TokenDollar,
33385                details: GreenNodeDetails::Token(text),
33386            })
33387            .intern(db),
33388        )
33389    }
33390    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
33391        extract_matches!(
33392            &self.node.lookup_intern(db).green.lookup_intern(db).details,
33393            GreenNodeDetails::Token
33394        )
33395        .clone()
33396    }
33397}
33398#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
33399pub struct TokenDollarPtr(pub SyntaxStablePtrId);
33400impl TypedStablePtr for TokenDollarPtr {
33401    type SyntaxNode = TokenDollar;
33402    fn untyped(&self) -> SyntaxStablePtrId {
33403        self.0
33404    }
33405    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenDollar {
33406        TokenDollar::from_syntax_node(db, self.0.lookup(db))
33407    }
33408}
33409impl From<TokenDollarPtr> for SyntaxStablePtrId {
33410    fn from(ptr: TokenDollarPtr) -> Self {
33411        ptr.untyped()
33412    }
33413}
33414#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
33415pub struct TokenDollarGreen(pub GreenId);
33416impl TokenDollarGreen {
33417    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
33418        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
33419    }
33420}
33421impl TypedSyntaxNode for TokenDollar {
33422    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenDollar);
33423    type StablePtr = TokenDollarPtr;
33424    type Green = TokenDollarGreen;
33425    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
33426        TokenDollarGreen(
33427            Arc::new(GreenNode {
33428                kind: SyntaxKind::TokenMissing,
33429                details: GreenNodeDetails::Token("".into()),
33430            })
33431            .intern(db),
33432        )
33433    }
33434    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
33435        match node.lookup_intern(db).green.lookup_intern(db).details {
33436            GreenNodeDetails::Token(_) => Self { node },
33437            GreenNodeDetails::Node { .. } => {
33438                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenDollar)
33439            }
33440        }
33441    }
33442    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
33443        match node.lookup_intern(db).green.lookup_intern(db).details {
33444            GreenNodeDetails::Token(_) => Some(Self { node }),
33445            GreenNodeDetails::Node { .. } => None,
33446        }
33447    }
33448    fn as_syntax_node(&self) -> SyntaxNode {
33449        self.node
33450    }
33451    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
33452        TokenDollarPtr(self.node.stable_ptr(db))
33453    }
33454}
33455#[derive(Clone, Debug, Eq, Hash, PartialEq)]
33456pub struct TerminalDollar {
33457    node: SyntaxNode,
33458}
33459impl Terminal for TerminalDollar {
33460    const KIND: SyntaxKind = SyntaxKind::TerminalDollar;
33461    type TokenType = TokenDollar;
33462    fn new_green(
33463        db: &dyn SyntaxGroup,
33464        leading_trivia: TriviaGreen,
33465        token: <<TerminalDollar as Terminal>::TokenType as TypedSyntaxNode>::Green,
33466        trailing_trivia: TriviaGreen,
33467    ) -> Self::Green {
33468        let children = [leading_trivia.0, token.0, trailing_trivia.0];
33469        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
33470        TerminalDollarGreen(
33471            Arc::new(GreenNode {
33472                kind: SyntaxKind::TerminalDollar,
33473                details: GreenNodeDetails::Node { children: children.into(), width },
33474            })
33475            .intern(db),
33476        )
33477    }
33478    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
33479        let GreenNodeDetails::Node { children, .. } =
33480            &self.node.lookup_intern(db).green.lookup_intern(db).details
33481        else {
33482            unreachable!("Expected a node, not a token");
33483        };
33484        extract_matches!(&children[1].lookup_intern(db).details, GreenNodeDetails::Token).clone()
33485    }
33486}
33487impl TerminalDollar {
33488    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
33489        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
33490    }
33491    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenDollar {
33492        TokenDollar::from_syntax_node(db, self.node.get_children(db)[1])
33493    }
33494    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
33495        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
33496    }
33497}
33498#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
33499pub struct TerminalDollarPtr(pub SyntaxStablePtrId);
33500impl TerminalDollarPtr {}
33501impl TypedStablePtr for TerminalDollarPtr {
33502    type SyntaxNode = TerminalDollar;
33503    fn untyped(&self) -> SyntaxStablePtrId {
33504        self.0
33505    }
33506    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalDollar {
33507        TerminalDollar::from_syntax_node(db, self.0.lookup(db))
33508    }
33509}
33510impl From<TerminalDollarPtr> for SyntaxStablePtrId {
33511    fn from(ptr: TerminalDollarPtr) -> Self {
33512        ptr.untyped()
33513    }
33514}
33515#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
33516pub struct TerminalDollarGreen(pub GreenId);
33517impl TypedSyntaxNode for TerminalDollar {
33518    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalDollar);
33519    type StablePtr = TerminalDollarPtr;
33520    type Green = TerminalDollarGreen;
33521    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
33522        TerminalDollarGreen(
33523            Arc::new(GreenNode {
33524                kind: SyntaxKind::TerminalDollar,
33525                details: GreenNodeDetails::Node {
33526                    children: [
33527                        Trivia::missing(db).0,
33528                        TokenDollar::missing(db).0,
33529                        Trivia::missing(db).0,
33530                    ]
33531                    .into(),
33532                    width: TextWidth::default(),
33533                },
33534            })
33535            .intern(db),
33536        )
33537    }
33538    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
33539        let kind = node.kind(db);
33540        assert_eq!(
33541            kind,
33542            SyntaxKind::TerminalDollar,
33543            "Unexpected SyntaxKind {:?}. Expected {:?}.",
33544            kind,
33545            SyntaxKind::TerminalDollar
33546        );
33547        Self { node }
33548    }
33549    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
33550        let kind = node.kind(db);
33551        if kind == SyntaxKind::TerminalDollar {
33552            Some(Self::from_syntax_node(db, node))
33553        } else {
33554            None
33555        }
33556    }
33557    fn as_syntax_node(&self) -> SyntaxNode {
33558        self.node
33559    }
33560    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
33561        TerminalDollarPtr(self.node.stable_ptr(db))
33562    }
33563}
33564#[derive(Clone, Debug, Eq, Hash, PartialEq)]
33565pub struct TokenDot {
33566    node: SyntaxNode,
33567}
33568impl Token for TokenDot {
33569    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
33570        TokenDotGreen(
33571            Arc::new(GreenNode {
33572                kind: SyntaxKind::TokenDot,
33573                details: GreenNodeDetails::Token(text),
33574            })
33575            .intern(db),
33576        )
33577    }
33578    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
33579        extract_matches!(
33580            &self.node.lookup_intern(db).green.lookup_intern(db).details,
33581            GreenNodeDetails::Token
33582        )
33583        .clone()
33584    }
33585}
33586#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
33587pub struct TokenDotPtr(pub SyntaxStablePtrId);
33588impl TypedStablePtr for TokenDotPtr {
33589    type SyntaxNode = TokenDot;
33590    fn untyped(&self) -> SyntaxStablePtrId {
33591        self.0
33592    }
33593    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenDot {
33594        TokenDot::from_syntax_node(db, self.0.lookup(db))
33595    }
33596}
33597impl From<TokenDotPtr> for SyntaxStablePtrId {
33598    fn from(ptr: TokenDotPtr) -> Self {
33599        ptr.untyped()
33600    }
33601}
33602#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
33603pub struct TokenDotGreen(pub GreenId);
33604impl TokenDotGreen {
33605    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
33606        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
33607    }
33608}
33609impl TypedSyntaxNode for TokenDot {
33610    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenDot);
33611    type StablePtr = TokenDotPtr;
33612    type Green = TokenDotGreen;
33613    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
33614        TokenDotGreen(
33615            Arc::new(GreenNode {
33616                kind: SyntaxKind::TokenMissing,
33617                details: GreenNodeDetails::Token("".into()),
33618            })
33619            .intern(db),
33620        )
33621    }
33622    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
33623        match node.lookup_intern(db).green.lookup_intern(db).details {
33624            GreenNodeDetails::Token(_) => Self { node },
33625            GreenNodeDetails::Node { .. } => {
33626                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenDot)
33627            }
33628        }
33629    }
33630    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
33631        match node.lookup_intern(db).green.lookup_intern(db).details {
33632            GreenNodeDetails::Token(_) => Some(Self { node }),
33633            GreenNodeDetails::Node { .. } => None,
33634        }
33635    }
33636    fn as_syntax_node(&self) -> SyntaxNode {
33637        self.node
33638    }
33639    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
33640        TokenDotPtr(self.node.stable_ptr(db))
33641    }
33642}
33643#[derive(Clone, Debug, Eq, Hash, PartialEq)]
33644pub struct TerminalDot {
33645    node: SyntaxNode,
33646}
33647impl Terminal for TerminalDot {
33648    const KIND: SyntaxKind = SyntaxKind::TerminalDot;
33649    type TokenType = TokenDot;
33650    fn new_green(
33651        db: &dyn SyntaxGroup,
33652        leading_trivia: TriviaGreen,
33653        token: <<TerminalDot as Terminal>::TokenType as TypedSyntaxNode>::Green,
33654        trailing_trivia: TriviaGreen,
33655    ) -> Self::Green {
33656        let children = [leading_trivia.0, token.0, trailing_trivia.0];
33657        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
33658        TerminalDotGreen(
33659            Arc::new(GreenNode {
33660                kind: SyntaxKind::TerminalDot,
33661                details: GreenNodeDetails::Node { children: children.into(), width },
33662            })
33663            .intern(db),
33664        )
33665    }
33666    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
33667        let GreenNodeDetails::Node { children, .. } =
33668            &self.node.lookup_intern(db).green.lookup_intern(db).details
33669        else {
33670            unreachable!("Expected a node, not a token");
33671        };
33672        extract_matches!(&children[1].lookup_intern(db).details, GreenNodeDetails::Token).clone()
33673    }
33674}
33675impl TerminalDot {
33676    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
33677        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
33678    }
33679    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenDot {
33680        TokenDot::from_syntax_node(db, self.node.get_children(db)[1])
33681    }
33682    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
33683        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
33684    }
33685}
33686#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
33687pub struct TerminalDotPtr(pub SyntaxStablePtrId);
33688impl TerminalDotPtr {}
33689impl TypedStablePtr for TerminalDotPtr {
33690    type SyntaxNode = TerminalDot;
33691    fn untyped(&self) -> SyntaxStablePtrId {
33692        self.0
33693    }
33694    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalDot {
33695        TerminalDot::from_syntax_node(db, self.0.lookup(db))
33696    }
33697}
33698impl From<TerminalDotPtr> for SyntaxStablePtrId {
33699    fn from(ptr: TerminalDotPtr) -> Self {
33700        ptr.untyped()
33701    }
33702}
33703#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
33704pub struct TerminalDotGreen(pub GreenId);
33705impl TypedSyntaxNode for TerminalDot {
33706    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalDot);
33707    type StablePtr = TerminalDotPtr;
33708    type Green = TerminalDotGreen;
33709    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
33710        TerminalDotGreen(
33711            Arc::new(GreenNode {
33712                kind: SyntaxKind::TerminalDot,
33713                details: GreenNodeDetails::Node {
33714                    children: [
33715                        Trivia::missing(db).0,
33716                        TokenDot::missing(db).0,
33717                        Trivia::missing(db).0,
33718                    ]
33719                    .into(),
33720                    width: TextWidth::default(),
33721                },
33722            })
33723            .intern(db),
33724        )
33725    }
33726    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
33727        let kind = node.kind(db);
33728        assert_eq!(
33729            kind,
33730            SyntaxKind::TerminalDot,
33731            "Unexpected SyntaxKind {:?}. Expected {:?}.",
33732            kind,
33733            SyntaxKind::TerminalDot
33734        );
33735        Self { node }
33736    }
33737    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
33738        let kind = node.kind(db);
33739        if kind == SyntaxKind::TerminalDot { Some(Self::from_syntax_node(db, node)) } else { None }
33740    }
33741    fn as_syntax_node(&self) -> SyntaxNode {
33742        self.node
33743    }
33744    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
33745        TerminalDotPtr(self.node.stable_ptr(db))
33746    }
33747}
33748#[derive(Clone, Debug, Eq, Hash, PartialEq)]
33749pub struct TokenDotDot {
33750    node: SyntaxNode,
33751}
33752impl Token for TokenDotDot {
33753    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
33754        TokenDotDotGreen(
33755            Arc::new(GreenNode {
33756                kind: SyntaxKind::TokenDotDot,
33757                details: GreenNodeDetails::Token(text),
33758            })
33759            .intern(db),
33760        )
33761    }
33762    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
33763        extract_matches!(
33764            &self.node.lookup_intern(db).green.lookup_intern(db).details,
33765            GreenNodeDetails::Token
33766        )
33767        .clone()
33768    }
33769}
33770#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
33771pub struct TokenDotDotPtr(pub SyntaxStablePtrId);
33772impl TypedStablePtr for TokenDotDotPtr {
33773    type SyntaxNode = TokenDotDot;
33774    fn untyped(&self) -> SyntaxStablePtrId {
33775        self.0
33776    }
33777    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenDotDot {
33778        TokenDotDot::from_syntax_node(db, self.0.lookup(db))
33779    }
33780}
33781impl From<TokenDotDotPtr> for SyntaxStablePtrId {
33782    fn from(ptr: TokenDotDotPtr) -> Self {
33783        ptr.untyped()
33784    }
33785}
33786#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
33787pub struct TokenDotDotGreen(pub GreenId);
33788impl TokenDotDotGreen {
33789    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
33790        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
33791    }
33792}
33793impl TypedSyntaxNode for TokenDotDot {
33794    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenDotDot);
33795    type StablePtr = TokenDotDotPtr;
33796    type Green = TokenDotDotGreen;
33797    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
33798        TokenDotDotGreen(
33799            Arc::new(GreenNode {
33800                kind: SyntaxKind::TokenMissing,
33801                details: GreenNodeDetails::Token("".into()),
33802            })
33803            .intern(db),
33804        )
33805    }
33806    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
33807        match node.lookup_intern(db).green.lookup_intern(db).details {
33808            GreenNodeDetails::Token(_) => Self { node },
33809            GreenNodeDetails::Node { .. } => {
33810                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenDotDot)
33811            }
33812        }
33813    }
33814    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
33815        match node.lookup_intern(db).green.lookup_intern(db).details {
33816            GreenNodeDetails::Token(_) => Some(Self { node }),
33817            GreenNodeDetails::Node { .. } => None,
33818        }
33819    }
33820    fn as_syntax_node(&self) -> SyntaxNode {
33821        self.node
33822    }
33823    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
33824        TokenDotDotPtr(self.node.stable_ptr(db))
33825    }
33826}
33827#[derive(Clone, Debug, Eq, Hash, PartialEq)]
33828pub struct TerminalDotDot {
33829    node: SyntaxNode,
33830}
33831impl Terminal for TerminalDotDot {
33832    const KIND: SyntaxKind = SyntaxKind::TerminalDotDot;
33833    type TokenType = TokenDotDot;
33834    fn new_green(
33835        db: &dyn SyntaxGroup,
33836        leading_trivia: TriviaGreen,
33837        token: <<TerminalDotDot as Terminal>::TokenType as TypedSyntaxNode>::Green,
33838        trailing_trivia: TriviaGreen,
33839    ) -> Self::Green {
33840        let children = [leading_trivia.0, token.0, trailing_trivia.0];
33841        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
33842        TerminalDotDotGreen(
33843            Arc::new(GreenNode {
33844                kind: SyntaxKind::TerminalDotDot,
33845                details: GreenNodeDetails::Node { children: children.into(), width },
33846            })
33847            .intern(db),
33848        )
33849    }
33850    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
33851        let GreenNodeDetails::Node { children, .. } =
33852            &self.node.lookup_intern(db).green.lookup_intern(db).details
33853        else {
33854            unreachable!("Expected a node, not a token");
33855        };
33856        extract_matches!(&children[1].lookup_intern(db).details, GreenNodeDetails::Token).clone()
33857    }
33858}
33859impl TerminalDotDot {
33860    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
33861        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
33862    }
33863    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenDotDot {
33864        TokenDotDot::from_syntax_node(db, self.node.get_children(db)[1])
33865    }
33866    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
33867        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
33868    }
33869}
33870#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
33871pub struct TerminalDotDotPtr(pub SyntaxStablePtrId);
33872impl TerminalDotDotPtr {}
33873impl TypedStablePtr for TerminalDotDotPtr {
33874    type SyntaxNode = TerminalDotDot;
33875    fn untyped(&self) -> SyntaxStablePtrId {
33876        self.0
33877    }
33878    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalDotDot {
33879        TerminalDotDot::from_syntax_node(db, self.0.lookup(db))
33880    }
33881}
33882impl From<TerminalDotDotPtr> for SyntaxStablePtrId {
33883    fn from(ptr: TerminalDotDotPtr) -> Self {
33884        ptr.untyped()
33885    }
33886}
33887#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
33888pub struct TerminalDotDotGreen(pub GreenId);
33889impl TypedSyntaxNode for TerminalDotDot {
33890    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalDotDot);
33891    type StablePtr = TerminalDotDotPtr;
33892    type Green = TerminalDotDotGreen;
33893    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
33894        TerminalDotDotGreen(
33895            Arc::new(GreenNode {
33896                kind: SyntaxKind::TerminalDotDot,
33897                details: GreenNodeDetails::Node {
33898                    children: [
33899                        Trivia::missing(db).0,
33900                        TokenDotDot::missing(db).0,
33901                        Trivia::missing(db).0,
33902                    ]
33903                    .into(),
33904                    width: TextWidth::default(),
33905                },
33906            })
33907            .intern(db),
33908        )
33909    }
33910    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
33911        let kind = node.kind(db);
33912        assert_eq!(
33913            kind,
33914            SyntaxKind::TerminalDotDot,
33915            "Unexpected SyntaxKind {:?}. Expected {:?}.",
33916            kind,
33917            SyntaxKind::TerminalDotDot
33918        );
33919        Self { node }
33920    }
33921    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
33922        let kind = node.kind(db);
33923        if kind == SyntaxKind::TerminalDotDot {
33924            Some(Self::from_syntax_node(db, node))
33925        } else {
33926            None
33927        }
33928    }
33929    fn as_syntax_node(&self) -> SyntaxNode {
33930        self.node
33931    }
33932    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
33933        TerminalDotDotPtr(self.node.stable_ptr(db))
33934    }
33935}
33936#[derive(Clone, Debug, Eq, Hash, PartialEq)]
33937pub struct TokenDotDotEq {
33938    node: SyntaxNode,
33939}
33940impl Token for TokenDotDotEq {
33941    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
33942        TokenDotDotEqGreen(
33943            Arc::new(GreenNode {
33944                kind: SyntaxKind::TokenDotDotEq,
33945                details: GreenNodeDetails::Token(text),
33946            })
33947            .intern(db),
33948        )
33949    }
33950    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
33951        extract_matches!(
33952            &self.node.lookup_intern(db).green.lookup_intern(db).details,
33953            GreenNodeDetails::Token
33954        )
33955        .clone()
33956    }
33957}
33958#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
33959pub struct TokenDotDotEqPtr(pub SyntaxStablePtrId);
33960impl TypedStablePtr for TokenDotDotEqPtr {
33961    type SyntaxNode = TokenDotDotEq;
33962    fn untyped(&self) -> SyntaxStablePtrId {
33963        self.0
33964    }
33965    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenDotDotEq {
33966        TokenDotDotEq::from_syntax_node(db, self.0.lookup(db))
33967    }
33968}
33969impl From<TokenDotDotEqPtr> for SyntaxStablePtrId {
33970    fn from(ptr: TokenDotDotEqPtr) -> Self {
33971        ptr.untyped()
33972    }
33973}
33974#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
33975pub struct TokenDotDotEqGreen(pub GreenId);
33976impl TokenDotDotEqGreen {
33977    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
33978        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
33979    }
33980}
33981impl TypedSyntaxNode for TokenDotDotEq {
33982    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenDotDotEq);
33983    type StablePtr = TokenDotDotEqPtr;
33984    type Green = TokenDotDotEqGreen;
33985    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
33986        TokenDotDotEqGreen(
33987            Arc::new(GreenNode {
33988                kind: SyntaxKind::TokenMissing,
33989                details: GreenNodeDetails::Token("".into()),
33990            })
33991            .intern(db),
33992        )
33993    }
33994    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
33995        match node.lookup_intern(db).green.lookup_intern(db).details {
33996            GreenNodeDetails::Token(_) => Self { node },
33997            GreenNodeDetails::Node { .. } => {
33998                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenDotDotEq)
33999            }
34000        }
34001    }
34002    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
34003        match node.lookup_intern(db).green.lookup_intern(db).details {
34004            GreenNodeDetails::Token(_) => Some(Self { node }),
34005            GreenNodeDetails::Node { .. } => None,
34006        }
34007    }
34008    fn as_syntax_node(&self) -> SyntaxNode {
34009        self.node
34010    }
34011    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
34012        TokenDotDotEqPtr(self.node.stable_ptr(db))
34013    }
34014}
34015#[derive(Clone, Debug, Eq, Hash, PartialEq)]
34016pub struct TerminalDotDotEq {
34017    node: SyntaxNode,
34018}
34019impl Terminal for TerminalDotDotEq {
34020    const KIND: SyntaxKind = SyntaxKind::TerminalDotDotEq;
34021    type TokenType = TokenDotDotEq;
34022    fn new_green(
34023        db: &dyn SyntaxGroup,
34024        leading_trivia: TriviaGreen,
34025        token: <<TerminalDotDotEq as Terminal>::TokenType as TypedSyntaxNode>::Green,
34026        trailing_trivia: TriviaGreen,
34027    ) -> Self::Green {
34028        let children = [leading_trivia.0, token.0, trailing_trivia.0];
34029        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
34030        TerminalDotDotEqGreen(
34031            Arc::new(GreenNode {
34032                kind: SyntaxKind::TerminalDotDotEq,
34033                details: GreenNodeDetails::Node { children: children.into(), width },
34034            })
34035            .intern(db),
34036        )
34037    }
34038    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
34039        let GreenNodeDetails::Node { children, .. } =
34040            &self.node.lookup_intern(db).green.lookup_intern(db).details
34041        else {
34042            unreachable!("Expected a node, not a token");
34043        };
34044        extract_matches!(&children[1].lookup_intern(db).details, GreenNodeDetails::Token).clone()
34045    }
34046}
34047impl TerminalDotDotEq {
34048    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
34049        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
34050    }
34051    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenDotDotEq {
34052        TokenDotDotEq::from_syntax_node(db, self.node.get_children(db)[1])
34053    }
34054    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
34055        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
34056    }
34057}
34058#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
34059pub struct TerminalDotDotEqPtr(pub SyntaxStablePtrId);
34060impl TerminalDotDotEqPtr {}
34061impl TypedStablePtr for TerminalDotDotEqPtr {
34062    type SyntaxNode = TerminalDotDotEq;
34063    fn untyped(&self) -> SyntaxStablePtrId {
34064        self.0
34065    }
34066    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalDotDotEq {
34067        TerminalDotDotEq::from_syntax_node(db, self.0.lookup(db))
34068    }
34069}
34070impl From<TerminalDotDotEqPtr> for SyntaxStablePtrId {
34071    fn from(ptr: TerminalDotDotEqPtr) -> Self {
34072        ptr.untyped()
34073    }
34074}
34075#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
34076pub struct TerminalDotDotEqGreen(pub GreenId);
34077impl TypedSyntaxNode for TerminalDotDotEq {
34078    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalDotDotEq);
34079    type StablePtr = TerminalDotDotEqPtr;
34080    type Green = TerminalDotDotEqGreen;
34081    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
34082        TerminalDotDotEqGreen(
34083            Arc::new(GreenNode {
34084                kind: SyntaxKind::TerminalDotDotEq,
34085                details: GreenNodeDetails::Node {
34086                    children: [
34087                        Trivia::missing(db).0,
34088                        TokenDotDotEq::missing(db).0,
34089                        Trivia::missing(db).0,
34090                    ]
34091                    .into(),
34092                    width: TextWidth::default(),
34093                },
34094            })
34095            .intern(db),
34096        )
34097    }
34098    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
34099        let kind = node.kind(db);
34100        assert_eq!(
34101            kind,
34102            SyntaxKind::TerminalDotDotEq,
34103            "Unexpected SyntaxKind {:?}. Expected {:?}.",
34104            kind,
34105            SyntaxKind::TerminalDotDotEq
34106        );
34107        Self { node }
34108    }
34109    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
34110        let kind = node.kind(db);
34111        if kind == SyntaxKind::TerminalDotDotEq {
34112            Some(Self::from_syntax_node(db, node))
34113        } else {
34114            None
34115        }
34116    }
34117    fn as_syntax_node(&self) -> SyntaxNode {
34118        self.node
34119    }
34120    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
34121        TerminalDotDotEqPtr(self.node.stable_ptr(db))
34122    }
34123}
34124#[derive(Clone, Debug, Eq, Hash, PartialEq)]
34125pub struct TokenEndOfFile {
34126    node: SyntaxNode,
34127}
34128impl Token for TokenEndOfFile {
34129    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
34130        TokenEndOfFileGreen(
34131            Arc::new(GreenNode {
34132                kind: SyntaxKind::TokenEndOfFile,
34133                details: GreenNodeDetails::Token(text),
34134            })
34135            .intern(db),
34136        )
34137    }
34138    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
34139        extract_matches!(
34140            &self.node.lookup_intern(db).green.lookup_intern(db).details,
34141            GreenNodeDetails::Token
34142        )
34143        .clone()
34144    }
34145}
34146#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
34147pub struct TokenEndOfFilePtr(pub SyntaxStablePtrId);
34148impl TypedStablePtr for TokenEndOfFilePtr {
34149    type SyntaxNode = TokenEndOfFile;
34150    fn untyped(&self) -> SyntaxStablePtrId {
34151        self.0
34152    }
34153    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenEndOfFile {
34154        TokenEndOfFile::from_syntax_node(db, self.0.lookup(db))
34155    }
34156}
34157impl From<TokenEndOfFilePtr> for SyntaxStablePtrId {
34158    fn from(ptr: TokenEndOfFilePtr) -> Self {
34159        ptr.untyped()
34160    }
34161}
34162#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
34163pub struct TokenEndOfFileGreen(pub GreenId);
34164impl TokenEndOfFileGreen {
34165    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
34166        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
34167    }
34168}
34169impl TypedSyntaxNode for TokenEndOfFile {
34170    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenEndOfFile);
34171    type StablePtr = TokenEndOfFilePtr;
34172    type Green = TokenEndOfFileGreen;
34173    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
34174        TokenEndOfFileGreen(
34175            Arc::new(GreenNode {
34176                kind: SyntaxKind::TokenMissing,
34177                details: GreenNodeDetails::Token("".into()),
34178            })
34179            .intern(db),
34180        )
34181    }
34182    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
34183        match node.lookup_intern(db).green.lookup_intern(db).details {
34184            GreenNodeDetails::Token(_) => Self { node },
34185            GreenNodeDetails::Node { .. } => {
34186                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenEndOfFile)
34187            }
34188        }
34189    }
34190    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
34191        match node.lookup_intern(db).green.lookup_intern(db).details {
34192            GreenNodeDetails::Token(_) => Some(Self { node }),
34193            GreenNodeDetails::Node { .. } => None,
34194        }
34195    }
34196    fn as_syntax_node(&self) -> SyntaxNode {
34197        self.node
34198    }
34199    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
34200        TokenEndOfFilePtr(self.node.stable_ptr(db))
34201    }
34202}
34203#[derive(Clone, Debug, Eq, Hash, PartialEq)]
34204pub struct TerminalEndOfFile {
34205    node: SyntaxNode,
34206}
34207impl Terminal for TerminalEndOfFile {
34208    const KIND: SyntaxKind = SyntaxKind::TerminalEndOfFile;
34209    type TokenType = TokenEndOfFile;
34210    fn new_green(
34211        db: &dyn SyntaxGroup,
34212        leading_trivia: TriviaGreen,
34213        token: <<TerminalEndOfFile as Terminal>::TokenType as TypedSyntaxNode>::Green,
34214        trailing_trivia: TriviaGreen,
34215    ) -> Self::Green {
34216        let children = [leading_trivia.0, token.0, trailing_trivia.0];
34217        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
34218        TerminalEndOfFileGreen(
34219            Arc::new(GreenNode {
34220                kind: SyntaxKind::TerminalEndOfFile,
34221                details: GreenNodeDetails::Node { children: children.into(), width },
34222            })
34223            .intern(db),
34224        )
34225    }
34226    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
34227        let GreenNodeDetails::Node { children, .. } =
34228            &self.node.lookup_intern(db).green.lookup_intern(db).details
34229        else {
34230            unreachable!("Expected a node, not a token");
34231        };
34232        extract_matches!(&children[1].lookup_intern(db).details, GreenNodeDetails::Token).clone()
34233    }
34234}
34235impl TerminalEndOfFile {
34236    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
34237        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
34238    }
34239    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenEndOfFile {
34240        TokenEndOfFile::from_syntax_node(db, self.node.get_children(db)[1])
34241    }
34242    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
34243        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
34244    }
34245}
34246#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
34247pub struct TerminalEndOfFilePtr(pub SyntaxStablePtrId);
34248impl TerminalEndOfFilePtr {}
34249impl TypedStablePtr for TerminalEndOfFilePtr {
34250    type SyntaxNode = TerminalEndOfFile;
34251    fn untyped(&self) -> SyntaxStablePtrId {
34252        self.0
34253    }
34254    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalEndOfFile {
34255        TerminalEndOfFile::from_syntax_node(db, self.0.lookup(db))
34256    }
34257}
34258impl From<TerminalEndOfFilePtr> for SyntaxStablePtrId {
34259    fn from(ptr: TerminalEndOfFilePtr) -> Self {
34260        ptr.untyped()
34261    }
34262}
34263#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
34264pub struct TerminalEndOfFileGreen(pub GreenId);
34265impl TypedSyntaxNode for TerminalEndOfFile {
34266    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalEndOfFile);
34267    type StablePtr = TerminalEndOfFilePtr;
34268    type Green = TerminalEndOfFileGreen;
34269    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
34270        TerminalEndOfFileGreen(
34271            Arc::new(GreenNode {
34272                kind: SyntaxKind::TerminalEndOfFile,
34273                details: GreenNodeDetails::Node {
34274                    children: [
34275                        Trivia::missing(db).0,
34276                        TokenEndOfFile::missing(db).0,
34277                        Trivia::missing(db).0,
34278                    ]
34279                    .into(),
34280                    width: TextWidth::default(),
34281                },
34282            })
34283            .intern(db),
34284        )
34285    }
34286    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
34287        let kind = node.kind(db);
34288        assert_eq!(
34289            kind,
34290            SyntaxKind::TerminalEndOfFile,
34291            "Unexpected SyntaxKind {:?}. Expected {:?}.",
34292            kind,
34293            SyntaxKind::TerminalEndOfFile
34294        );
34295        Self { node }
34296    }
34297    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
34298        let kind = node.kind(db);
34299        if kind == SyntaxKind::TerminalEndOfFile {
34300            Some(Self::from_syntax_node(db, node))
34301        } else {
34302            None
34303        }
34304    }
34305    fn as_syntax_node(&self) -> SyntaxNode {
34306        self.node
34307    }
34308    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
34309        TerminalEndOfFilePtr(self.node.stable_ptr(db))
34310    }
34311}
34312#[derive(Clone, Debug, Eq, Hash, PartialEq)]
34313pub struct TokenEq {
34314    node: SyntaxNode,
34315}
34316impl Token for TokenEq {
34317    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
34318        TokenEqGreen(
34319            Arc::new(GreenNode {
34320                kind: SyntaxKind::TokenEq,
34321                details: GreenNodeDetails::Token(text),
34322            })
34323            .intern(db),
34324        )
34325    }
34326    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
34327        extract_matches!(
34328            &self.node.lookup_intern(db).green.lookup_intern(db).details,
34329            GreenNodeDetails::Token
34330        )
34331        .clone()
34332    }
34333}
34334#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
34335pub struct TokenEqPtr(pub SyntaxStablePtrId);
34336impl TypedStablePtr for TokenEqPtr {
34337    type SyntaxNode = TokenEq;
34338    fn untyped(&self) -> SyntaxStablePtrId {
34339        self.0
34340    }
34341    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenEq {
34342        TokenEq::from_syntax_node(db, self.0.lookup(db))
34343    }
34344}
34345impl From<TokenEqPtr> for SyntaxStablePtrId {
34346    fn from(ptr: TokenEqPtr) -> Self {
34347        ptr.untyped()
34348    }
34349}
34350#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
34351pub struct TokenEqGreen(pub GreenId);
34352impl TokenEqGreen {
34353    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
34354        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
34355    }
34356}
34357impl TypedSyntaxNode for TokenEq {
34358    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenEq);
34359    type StablePtr = TokenEqPtr;
34360    type Green = TokenEqGreen;
34361    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
34362        TokenEqGreen(
34363            Arc::new(GreenNode {
34364                kind: SyntaxKind::TokenMissing,
34365                details: GreenNodeDetails::Token("".into()),
34366            })
34367            .intern(db),
34368        )
34369    }
34370    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
34371        match node.lookup_intern(db).green.lookup_intern(db).details {
34372            GreenNodeDetails::Token(_) => Self { node },
34373            GreenNodeDetails::Node { .. } => {
34374                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenEq)
34375            }
34376        }
34377    }
34378    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
34379        match node.lookup_intern(db).green.lookup_intern(db).details {
34380            GreenNodeDetails::Token(_) => Some(Self { node }),
34381            GreenNodeDetails::Node { .. } => None,
34382        }
34383    }
34384    fn as_syntax_node(&self) -> SyntaxNode {
34385        self.node
34386    }
34387    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
34388        TokenEqPtr(self.node.stable_ptr(db))
34389    }
34390}
34391#[derive(Clone, Debug, Eq, Hash, PartialEq)]
34392pub struct TerminalEq {
34393    node: SyntaxNode,
34394}
34395impl Terminal for TerminalEq {
34396    const KIND: SyntaxKind = SyntaxKind::TerminalEq;
34397    type TokenType = TokenEq;
34398    fn new_green(
34399        db: &dyn SyntaxGroup,
34400        leading_trivia: TriviaGreen,
34401        token: <<TerminalEq as Terminal>::TokenType as TypedSyntaxNode>::Green,
34402        trailing_trivia: TriviaGreen,
34403    ) -> Self::Green {
34404        let children = [leading_trivia.0, token.0, trailing_trivia.0];
34405        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
34406        TerminalEqGreen(
34407            Arc::new(GreenNode {
34408                kind: SyntaxKind::TerminalEq,
34409                details: GreenNodeDetails::Node { children: children.into(), width },
34410            })
34411            .intern(db),
34412        )
34413    }
34414    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
34415        let GreenNodeDetails::Node { children, .. } =
34416            &self.node.lookup_intern(db).green.lookup_intern(db).details
34417        else {
34418            unreachable!("Expected a node, not a token");
34419        };
34420        extract_matches!(&children[1].lookup_intern(db).details, GreenNodeDetails::Token).clone()
34421    }
34422}
34423impl TerminalEq {
34424    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
34425        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
34426    }
34427    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenEq {
34428        TokenEq::from_syntax_node(db, self.node.get_children(db)[1])
34429    }
34430    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
34431        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
34432    }
34433}
34434#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
34435pub struct TerminalEqPtr(pub SyntaxStablePtrId);
34436impl TerminalEqPtr {}
34437impl TypedStablePtr for TerminalEqPtr {
34438    type SyntaxNode = TerminalEq;
34439    fn untyped(&self) -> SyntaxStablePtrId {
34440        self.0
34441    }
34442    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalEq {
34443        TerminalEq::from_syntax_node(db, self.0.lookup(db))
34444    }
34445}
34446impl From<TerminalEqPtr> for SyntaxStablePtrId {
34447    fn from(ptr: TerminalEqPtr) -> Self {
34448        ptr.untyped()
34449    }
34450}
34451#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
34452pub struct TerminalEqGreen(pub GreenId);
34453impl TypedSyntaxNode for TerminalEq {
34454    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalEq);
34455    type StablePtr = TerminalEqPtr;
34456    type Green = TerminalEqGreen;
34457    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
34458        TerminalEqGreen(
34459            Arc::new(GreenNode {
34460                kind: SyntaxKind::TerminalEq,
34461                details: GreenNodeDetails::Node {
34462                    children: [
34463                        Trivia::missing(db).0,
34464                        TokenEq::missing(db).0,
34465                        Trivia::missing(db).0,
34466                    ]
34467                    .into(),
34468                    width: TextWidth::default(),
34469                },
34470            })
34471            .intern(db),
34472        )
34473    }
34474    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
34475        let kind = node.kind(db);
34476        assert_eq!(
34477            kind,
34478            SyntaxKind::TerminalEq,
34479            "Unexpected SyntaxKind {:?}. Expected {:?}.",
34480            kind,
34481            SyntaxKind::TerminalEq
34482        );
34483        Self { node }
34484    }
34485    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
34486        let kind = node.kind(db);
34487        if kind == SyntaxKind::TerminalEq { Some(Self::from_syntax_node(db, node)) } else { None }
34488    }
34489    fn as_syntax_node(&self) -> SyntaxNode {
34490        self.node
34491    }
34492    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
34493        TerminalEqPtr(self.node.stable_ptr(db))
34494    }
34495}
34496#[derive(Clone, Debug, Eq, Hash, PartialEq)]
34497pub struct TokenEqEq {
34498    node: SyntaxNode,
34499}
34500impl Token for TokenEqEq {
34501    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
34502        TokenEqEqGreen(
34503            Arc::new(GreenNode {
34504                kind: SyntaxKind::TokenEqEq,
34505                details: GreenNodeDetails::Token(text),
34506            })
34507            .intern(db),
34508        )
34509    }
34510    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
34511        extract_matches!(
34512            &self.node.lookup_intern(db).green.lookup_intern(db).details,
34513            GreenNodeDetails::Token
34514        )
34515        .clone()
34516    }
34517}
34518#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
34519pub struct TokenEqEqPtr(pub SyntaxStablePtrId);
34520impl TypedStablePtr for TokenEqEqPtr {
34521    type SyntaxNode = TokenEqEq;
34522    fn untyped(&self) -> SyntaxStablePtrId {
34523        self.0
34524    }
34525    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenEqEq {
34526        TokenEqEq::from_syntax_node(db, self.0.lookup(db))
34527    }
34528}
34529impl From<TokenEqEqPtr> for SyntaxStablePtrId {
34530    fn from(ptr: TokenEqEqPtr) -> Self {
34531        ptr.untyped()
34532    }
34533}
34534#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
34535pub struct TokenEqEqGreen(pub GreenId);
34536impl TokenEqEqGreen {
34537    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
34538        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
34539    }
34540}
34541impl TypedSyntaxNode for TokenEqEq {
34542    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenEqEq);
34543    type StablePtr = TokenEqEqPtr;
34544    type Green = TokenEqEqGreen;
34545    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
34546        TokenEqEqGreen(
34547            Arc::new(GreenNode {
34548                kind: SyntaxKind::TokenMissing,
34549                details: GreenNodeDetails::Token("".into()),
34550            })
34551            .intern(db),
34552        )
34553    }
34554    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
34555        match node.lookup_intern(db).green.lookup_intern(db).details {
34556            GreenNodeDetails::Token(_) => Self { node },
34557            GreenNodeDetails::Node { .. } => {
34558                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenEqEq)
34559            }
34560        }
34561    }
34562    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
34563        match node.lookup_intern(db).green.lookup_intern(db).details {
34564            GreenNodeDetails::Token(_) => Some(Self { node }),
34565            GreenNodeDetails::Node { .. } => None,
34566        }
34567    }
34568    fn as_syntax_node(&self) -> SyntaxNode {
34569        self.node
34570    }
34571    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
34572        TokenEqEqPtr(self.node.stable_ptr(db))
34573    }
34574}
34575#[derive(Clone, Debug, Eq, Hash, PartialEq)]
34576pub struct TerminalEqEq {
34577    node: SyntaxNode,
34578}
34579impl Terminal for TerminalEqEq {
34580    const KIND: SyntaxKind = SyntaxKind::TerminalEqEq;
34581    type TokenType = TokenEqEq;
34582    fn new_green(
34583        db: &dyn SyntaxGroup,
34584        leading_trivia: TriviaGreen,
34585        token: <<TerminalEqEq as Terminal>::TokenType as TypedSyntaxNode>::Green,
34586        trailing_trivia: TriviaGreen,
34587    ) -> Self::Green {
34588        let children = [leading_trivia.0, token.0, trailing_trivia.0];
34589        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
34590        TerminalEqEqGreen(
34591            Arc::new(GreenNode {
34592                kind: SyntaxKind::TerminalEqEq,
34593                details: GreenNodeDetails::Node { children: children.into(), width },
34594            })
34595            .intern(db),
34596        )
34597    }
34598    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
34599        let GreenNodeDetails::Node { children, .. } =
34600            &self.node.lookup_intern(db).green.lookup_intern(db).details
34601        else {
34602            unreachable!("Expected a node, not a token");
34603        };
34604        extract_matches!(&children[1].lookup_intern(db).details, GreenNodeDetails::Token).clone()
34605    }
34606}
34607impl TerminalEqEq {
34608    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
34609        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
34610    }
34611    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenEqEq {
34612        TokenEqEq::from_syntax_node(db, self.node.get_children(db)[1])
34613    }
34614    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
34615        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
34616    }
34617}
34618#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
34619pub struct TerminalEqEqPtr(pub SyntaxStablePtrId);
34620impl TerminalEqEqPtr {}
34621impl TypedStablePtr for TerminalEqEqPtr {
34622    type SyntaxNode = TerminalEqEq;
34623    fn untyped(&self) -> SyntaxStablePtrId {
34624        self.0
34625    }
34626    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalEqEq {
34627        TerminalEqEq::from_syntax_node(db, self.0.lookup(db))
34628    }
34629}
34630impl From<TerminalEqEqPtr> for SyntaxStablePtrId {
34631    fn from(ptr: TerminalEqEqPtr) -> Self {
34632        ptr.untyped()
34633    }
34634}
34635#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
34636pub struct TerminalEqEqGreen(pub GreenId);
34637impl TypedSyntaxNode for TerminalEqEq {
34638    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalEqEq);
34639    type StablePtr = TerminalEqEqPtr;
34640    type Green = TerminalEqEqGreen;
34641    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
34642        TerminalEqEqGreen(
34643            Arc::new(GreenNode {
34644                kind: SyntaxKind::TerminalEqEq,
34645                details: GreenNodeDetails::Node {
34646                    children: [
34647                        Trivia::missing(db).0,
34648                        TokenEqEq::missing(db).0,
34649                        Trivia::missing(db).0,
34650                    ]
34651                    .into(),
34652                    width: TextWidth::default(),
34653                },
34654            })
34655            .intern(db),
34656        )
34657    }
34658    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
34659        let kind = node.kind(db);
34660        assert_eq!(
34661            kind,
34662            SyntaxKind::TerminalEqEq,
34663            "Unexpected SyntaxKind {:?}. Expected {:?}.",
34664            kind,
34665            SyntaxKind::TerminalEqEq
34666        );
34667        Self { node }
34668    }
34669    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
34670        let kind = node.kind(db);
34671        if kind == SyntaxKind::TerminalEqEq { Some(Self::from_syntax_node(db, node)) } else { None }
34672    }
34673    fn as_syntax_node(&self) -> SyntaxNode {
34674        self.node
34675    }
34676    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
34677        TerminalEqEqPtr(self.node.stable_ptr(db))
34678    }
34679}
34680#[derive(Clone, Debug, Eq, Hash, PartialEq)]
34681pub struct TokenGE {
34682    node: SyntaxNode,
34683}
34684impl Token for TokenGE {
34685    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
34686        TokenGEGreen(
34687            Arc::new(GreenNode {
34688                kind: SyntaxKind::TokenGE,
34689                details: GreenNodeDetails::Token(text),
34690            })
34691            .intern(db),
34692        )
34693    }
34694    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
34695        extract_matches!(
34696            &self.node.lookup_intern(db).green.lookup_intern(db).details,
34697            GreenNodeDetails::Token
34698        )
34699        .clone()
34700    }
34701}
34702#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
34703pub struct TokenGEPtr(pub SyntaxStablePtrId);
34704impl TypedStablePtr for TokenGEPtr {
34705    type SyntaxNode = TokenGE;
34706    fn untyped(&self) -> SyntaxStablePtrId {
34707        self.0
34708    }
34709    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenGE {
34710        TokenGE::from_syntax_node(db, self.0.lookup(db))
34711    }
34712}
34713impl From<TokenGEPtr> for SyntaxStablePtrId {
34714    fn from(ptr: TokenGEPtr) -> Self {
34715        ptr.untyped()
34716    }
34717}
34718#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
34719pub struct TokenGEGreen(pub GreenId);
34720impl TokenGEGreen {
34721    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
34722        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
34723    }
34724}
34725impl TypedSyntaxNode for TokenGE {
34726    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenGE);
34727    type StablePtr = TokenGEPtr;
34728    type Green = TokenGEGreen;
34729    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
34730        TokenGEGreen(
34731            Arc::new(GreenNode {
34732                kind: SyntaxKind::TokenMissing,
34733                details: GreenNodeDetails::Token("".into()),
34734            })
34735            .intern(db),
34736        )
34737    }
34738    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
34739        match node.lookup_intern(db).green.lookup_intern(db).details {
34740            GreenNodeDetails::Token(_) => Self { node },
34741            GreenNodeDetails::Node { .. } => {
34742                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenGE)
34743            }
34744        }
34745    }
34746    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
34747        match node.lookup_intern(db).green.lookup_intern(db).details {
34748            GreenNodeDetails::Token(_) => Some(Self { node }),
34749            GreenNodeDetails::Node { .. } => None,
34750        }
34751    }
34752    fn as_syntax_node(&self) -> SyntaxNode {
34753        self.node
34754    }
34755    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
34756        TokenGEPtr(self.node.stable_ptr(db))
34757    }
34758}
34759#[derive(Clone, Debug, Eq, Hash, PartialEq)]
34760pub struct TerminalGE {
34761    node: SyntaxNode,
34762}
34763impl Terminal for TerminalGE {
34764    const KIND: SyntaxKind = SyntaxKind::TerminalGE;
34765    type TokenType = TokenGE;
34766    fn new_green(
34767        db: &dyn SyntaxGroup,
34768        leading_trivia: TriviaGreen,
34769        token: <<TerminalGE as Terminal>::TokenType as TypedSyntaxNode>::Green,
34770        trailing_trivia: TriviaGreen,
34771    ) -> Self::Green {
34772        let children = [leading_trivia.0, token.0, trailing_trivia.0];
34773        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
34774        TerminalGEGreen(
34775            Arc::new(GreenNode {
34776                kind: SyntaxKind::TerminalGE,
34777                details: GreenNodeDetails::Node { children: children.into(), width },
34778            })
34779            .intern(db),
34780        )
34781    }
34782    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
34783        let GreenNodeDetails::Node { children, .. } =
34784            &self.node.lookup_intern(db).green.lookup_intern(db).details
34785        else {
34786            unreachable!("Expected a node, not a token");
34787        };
34788        extract_matches!(&children[1].lookup_intern(db).details, GreenNodeDetails::Token).clone()
34789    }
34790}
34791impl TerminalGE {
34792    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
34793        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
34794    }
34795    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenGE {
34796        TokenGE::from_syntax_node(db, self.node.get_children(db)[1])
34797    }
34798    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
34799        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
34800    }
34801}
34802#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
34803pub struct TerminalGEPtr(pub SyntaxStablePtrId);
34804impl TerminalGEPtr {}
34805impl TypedStablePtr for TerminalGEPtr {
34806    type SyntaxNode = TerminalGE;
34807    fn untyped(&self) -> SyntaxStablePtrId {
34808        self.0
34809    }
34810    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalGE {
34811        TerminalGE::from_syntax_node(db, self.0.lookup(db))
34812    }
34813}
34814impl From<TerminalGEPtr> for SyntaxStablePtrId {
34815    fn from(ptr: TerminalGEPtr) -> Self {
34816        ptr.untyped()
34817    }
34818}
34819#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
34820pub struct TerminalGEGreen(pub GreenId);
34821impl TypedSyntaxNode for TerminalGE {
34822    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalGE);
34823    type StablePtr = TerminalGEPtr;
34824    type Green = TerminalGEGreen;
34825    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
34826        TerminalGEGreen(
34827            Arc::new(GreenNode {
34828                kind: SyntaxKind::TerminalGE,
34829                details: GreenNodeDetails::Node {
34830                    children: [
34831                        Trivia::missing(db).0,
34832                        TokenGE::missing(db).0,
34833                        Trivia::missing(db).0,
34834                    ]
34835                    .into(),
34836                    width: TextWidth::default(),
34837                },
34838            })
34839            .intern(db),
34840        )
34841    }
34842    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
34843        let kind = node.kind(db);
34844        assert_eq!(
34845            kind,
34846            SyntaxKind::TerminalGE,
34847            "Unexpected SyntaxKind {:?}. Expected {:?}.",
34848            kind,
34849            SyntaxKind::TerminalGE
34850        );
34851        Self { node }
34852    }
34853    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
34854        let kind = node.kind(db);
34855        if kind == SyntaxKind::TerminalGE { Some(Self::from_syntax_node(db, node)) } else { None }
34856    }
34857    fn as_syntax_node(&self) -> SyntaxNode {
34858        self.node
34859    }
34860    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
34861        TerminalGEPtr(self.node.stable_ptr(db))
34862    }
34863}
34864#[derive(Clone, Debug, Eq, Hash, PartialEq)]
34865pub struct TokenGT {
34866    node: SyntaxNode,
34867}
34868impl Token for TokenGT {
34869    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
34870        TokenGTGreen(
34871            Arc::new(GreenNode {
34872                kind: SyntaxKind::TokenGT,
34873                details: GreenNodeDetails::Token(text),
34874            })
34875            .intern(db),
34876        )
34877    }
34878    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
34879        extract_matches!(
34880            &self.node.lookup_intern(db).green.lookup_intern(db).details,
34881            GreenNodeDetails::Token
34882        )
34883        .clone()
34884    }
34885}
34886#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
34887pub struct TokenGTPtr(pub SyntaxStablePtrId);
34888impl TypedStablePtr for TokenGTPtr {
34889    type SyntaxNode = TokenGT;
34890    fn untyped(&self) -> SyntaxStablePtrId {
34891        self.0
34892    }
34893    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenGT {
34894        TokenGT::from_syntax_node(db, self.0.lookup(db))
34895    }
34896}
34897impl From<TokenGTPtr> for SyntaxStablePtrId {
34898    fn from(ptr: TokenGTPtr) -> Self {
34899        ptr.untyped()
34900    }
34901}
34902#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
34903pub struct TokenGTGreen(pub GreenId);
34904impl TokenGTGreen {
34905    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
34906        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
34907    }
34908}
34909impl TypedSyntaxNode for TokenGT {
34910    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenGT);
34911    type StablePtr = TokenGTPtr;
34912    type Green = TokenGTGreen;
34913    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
34914        TokenGTGreen(
34915            Arc::new(GreenNode {
34916                kind: SyntaxKind::TokenMissing,
34917                details: GreenNodeDetails::Token("".into()),
34918            })
34919            .intern(db),
34920        )
34921    }
34922    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
34923        match node.lookup_intern(db).green.lookup_intern(db).details {
34924            GreenNodeDetails::Token(_) => Self { node },
34925            GreenNodeDetails::Node { .. } => {
34926                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenGT)
34927            }
34928        }
34929    }
34930    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
34931        match node.lookup_intern(db).green.lookup_intern(db).details {
34932            GreenNodeDetails::Token(_) => Some(Self { node }),
34933            GreenNodeDetails::Node { .. } => None,
34934        }
34935    }
34936    fn as_syntax_node(&self) -> SyntaxNode {
34937        self.node
34938    }
34939    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
34940        TokenGTPtr(self.node.stable_ptr(db))
34941    }
34942}
34943#[derive(Clone, Debug, Eq, Hash, PartialEq)]
34944pub struct TerminalGT {
34945    node: SyntaxNode,
34946}
34947impl Terminal for TerminalGT {
34948    const KIND: SyntaxKind = SyntaxKind::TerminalGT;
34949    type TokenType = TokenGT;
34950    fn new_green(
34951        db: &dyn SyntaxGroup,
34952        leading_trivia: TriviaGreen,
34953        token: <<TerminalGT as Terminal>::TokenType as TypedSyntaxNode>::Green,
34954        trailing_trivia: TriviaGreen,
34955    ) -> Self::Green {
34956        let children = [leading_trivia.0, token.0, trailing_trivia.0];
34957        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
34958        TerminalGTGreen(
34959            Arc::new(GreenNode {
34960                kind: SyntaxKind::TerminalGT,
34961                details: GreenNodeDetails::Node { children: children.into(), width },
34962            })
34963            .intern(db),
34964        )
34965    }
34966    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
34967        let GreenNodeDetails::Node { children, .. } =
34968            &self.node.lookup_intern(db).green.lookup_intern(db).details
34969        else {
34970            unreachable!("Expected a node, not a token");
34971        };
34972        extract_matches!(&children[1].lookup_intern(db).details, GreenNodeDetails::Token).clone()
34973    }
34974}
34975impl TerminalGT {
34976    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
34977        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
34978    }
34979    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenGT {
34980        TokenGT::from_syntax_node(db, self.node.get_children(db)[1])
34981    }
34982    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
34983        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
34984    }
34985}
34986#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
34987pub struct TerminalGTPtr(pub SyntaxStablePtrId);
34988impl TerminalGTPtr {}
34989impl TypedStablePtr for TerminalGTPtr {
34990    type SyntaxNode = TerminalGT;
34991    fn untyped(&self) -> SyntaxStablePtrId {
34992        self.0
34993    }
34994    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalGT {
34995        TerminalGT::from_syntax_node(db, self.0.lookup(db))
34996    }
34997}
34998impl From<TerminalGTPtr> for SyntaxStablePtrId {
34999    fn from(ptr: TerminalGTPtr) -> Self {
35000        ptr.untyped()
35001    }
35002}
35003#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
35004pub struct TerminalGTGreen(pub GreenId);
35005impl TypedSyntaxNode for TerminalGT {
35006    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalGT);
35007    type StablePtr = TerminalGTPtr;
35008    type Green = TerminalGTGreen;
35009    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
35010        TerminalGTGreen(
35011            Arc::new(GreenNode {
35012                kind: SyntaxKind::TerminalGT,
35013                details: GreenNodeDetails::Node {
35014                    children: [
35015                        Trivia::missing(db).0,
35016                        TokenGT::missing(db).0,
35017                        Trivia::missing(db).0,
35018                    ]
35019                    .into(),
35020                    width: TextWidth::default(),
35021                },
35022            })
35023            .intern(db),
35024        )
35025    }
35026    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
35027        let kind = node.kind(db);
35028        assert_eq!(
35029            kind,
35030            SyntaxKind::TerminalGT,
35031            "Unexpected SyntaxKind {:?}. Expected {:?}.",
35032            kind,
35033            SyntaxKind::TerminalGT
35034        );
35035        Self { node }
35036    }
35037    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
35038        let kind = node.kind(db);
35039        if kind == SyntaxKind::TerminalGT { Some(Self::from_syntax_node(db, node)) } else { None }
35040    }
35041    fn as_syntax_node(&self) -> SyntaxNode {
35042        self.node
35043    }
35044    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
35045        TerminalGTPtr(self.node.stable_ptr(db))
35046    }
35047}
35048#[derive(Clone, Debug, Eq, Hash, PartialEq)]
35049pub struct TokenHash {
35050    node: SyntaxNode,
35051}
35052impl Token for TokenHash {
35053    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
35054        TokenHashGreen(
35055            Arc::new(GreenNode {
35056                kind: SyntaxKind::TokenHash,
35057                details: GreenNodeDetails::Token(text),
35058            })
35059            .intern(db),
35060        )
35061    }
35062    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
35063        extract_matches!(
35064            &self.node.lookup_intern(db).green.lookup_intern(db).details,
35065            GreenNodeDetails::Token
35066        )
35067        .clone()
35068    }
35069}
35070#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
35071pub struct TokenHashPtr(pub SyntaxStablePtrId);
35072impl TypedStablePtr for TokenHashPtr {
35073    type SyntaxNode = TokenHash;
35074    fn untyped(&self) -> SyntaxStablePtrId {
35075        self.0
35076    }
35077    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenHash {
35078        TokenHash::from_syntax_node(db, self.0.lookup(db))
35079    }
35080}
35081impl From<TokenHashPtr> for SyntaxStablePtrId {
35082    fn from(ptr: TokenHashPtr) -> Self {
35083        ptr.untyped()
35084    }
35085}
35086#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
35087pub struct TokenHashGreen(pub GreenId);
35088impl TokenHashGreen {
35089    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
35090        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
35091    }
35092}
35093impl TypedSyntaxNode for TokenHash {
35094    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenHash);
35095    type StablePtr = TokenHashPtr;
35096    type Green = TokenHashGreen;
35097    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
35098        TokenHashGreen(
35099            Arc::new(GreenNode {
35100                kind: SyntaxKind::TokenMissing,
35101                details: GreenNodeDetails::Token("".into()),
35102            })
35103            .intern(db),
35104        )
35105    }
35106    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
35107        match node.lookup_intern(db).green.lookup_intern(db).details {
35108            GreenNodeDetails::Token(_) => Self { node },
35109            GreenNodeDetails::Node { .. } => {
35110                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenHash)
35111            }
35112        }
35113    }
35114    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
35115        match node.lookup_intern(db).green.lookup_intern(db).details {
35116            GreenNodeDetails::Token(_) => Some(Self { node }),
35117            GreenNodeDetails::Node { .. } => None,
35118        }
35119    }
35120    fn as_syntax_node(&self) -> SyntaxNode {
35121        self.node
35122    }
35123    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
35124        TokenHashPtr(self.node.stable_ptr(db))
35125    }
35126}
35127#[derive(Clone, Debug, Eq, Hash, PartialEq)]
35128pub struct TerminalHash {
35129    node: SyntaxNode,
35130}
35131impl Terminal for TerminalHash {
35132    const KIND: SyntaxKind = SyntaxKind::TerminalHash;
35133    type TokenType = TokenHash;
35134    fn new_green(
35135        db: &dyn SyntaxGroup,
35136        leading_trivia: TriviaGreen,
35137        token: <<TerminalHash as Terminal>::TokenType as TypedSyntaxNode>::Green,
35138        trailing_trivia: TriviaGreen,
35139    ) -> Self::Green {
35140        let children = [leading_trivia.0, token.0, trailing_trivia.0];
35141        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
35142        TerminalHashGreen(
35143            Arc::new(GreenNode {
35144                kind: SyntaxKind::TerminalHash,
35145                details: GreenNodeDetails::Node { children: children.into(), width },
35146            })
35147            .intern(db),
35148        )
35149    }
35150    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
35151        let GreenNodeDetails::Node { children, .. } =
35152            &self.node.lookup_intern(db).green.lookup_intern(db).details
35153        else {
35154            unreachable!("Expected a node, not a token");
35155        };
35156        extract_matches!(&children[1].lookup_intern(db).details, GreenNodeDetails::Token).clone()
35157    }
35158}
35159impl TerminalHash {
35160    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
35161        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
35162    }
35163    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenHash {
35164        TokenHash::from_syntax_node(db, self.node.get_children(db)[1])
35165    }
35166    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
35167        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
35168    }
35169}
35170#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
35171pub struct TerminalHashPtr(pub SyntaxStablePtrId);
35172impl TerminalHashPtr {}
35173impl TypedStablePtr for TerminalHashPtr {
35174    type SyntaxNode = TerminalHash;
35175    fn untyped(&self) -> SyntaxStablePtrId {
35176        self.0
35177    }
35178    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalHash {
35179        TerminalHash::from_syntax_node(db, self.0.lookup(db))
35180    }
35181}
35182impl From<TerminalHashPtr> for SyntaxStablePtrId {
35183    fn from(ptr: TerminalHashPtr) -> Self {
35184        ptr.untyped()
35185    }
35186}
35187#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
35188pub struct TerminalHashGreen(pub GreenId);
35189impl TypedSyntaxNode for TerminalHash {
35190    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalHash);
35191    type StablePtr = TerminalHashPtr;
35192    type Green = TerminalHashGreen;
35193    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
35194        TerminalHashGreen(
35195            Arc::new(GreenNode {
35196                kind: SyntaxKind::TerminalHash,
35197                details: GreenNodeDetails::Node {
35198                    children: [
35199                        Trivia::missing(db).0,
35200                        TokenHash::missing(db).0,
35201                        Trivia::missing(db).0,
35202                    ]
35203                    .into(),
35204                    width: TextWidth::default(),
35205                },
35206            })
35207            .intern(db),
35208        )
35209    }
35210    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
35211        let kind = node.kind(db);
35212        assert_eq!(
35213            kind,
35214            SyntaxKind::TerminalHash,
35215            "Unexpected SyntaxKind {:?}. Expected {:?}.",
35216            kind,
35217            SyntaxKind::TerminalHash
35218        );
35219        Self { node }
35220    }
35221    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
35222        let kind = node.kind(db);
35223        if kind == SyntaxKind::TerminalHash { Some(Self::from_syntax_node(db, node)) } else { None }
35224    }
35225    fn as_syntax_node(&self) -> SyntaxNode {
35226        self.node
35227    }
35228    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
35229        TerminalHashPtr(self.node.stable_ptr(db))
35230    }
35231}
35232#[derive(Clone, Debug, Eq, Hash, PartialEq)]
35233pub struct TokenLBrace {
35234    node: SyntaxNode,
35235}
35236impl Token for TokenLBrace {
35237    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
35238        TokenLBraceGreen(
35239            Arc::new(GreenNode {
35240                kind: SyntaxKind::TokenLBrace,
35241                details: GreenNodeDetails::Token(text),
35242            })
35243            .intern(db),
35244        )
35245    }
35246    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
35247        extract_matches!(
35248            &self.node.lookup_intern(db).green.lookup_intern(db).details,
35249            GreenNodeDetails::Token
35250        )
35251        .clone()
35252    }
35253}
35254#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
35255pub struct TokenLBracePtr(pub SyntaxStablePtrId);
35256impl TypedStablePtr for TokenLBracePtr {
35257    type SyntaxNode = TokenLBrace;
35258    fn untyped(&self) -> SyntaxStablePtrId {
35259        self.0
35260    }
35261    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenLBrace {
35262        TokenLBrace::from_syntax_node(db, self.0.lookup(db))
35263    }
35264}
35265impl From<TokenLBracePtr> for SyntaxStablePtrId {
35266    fn from(ptr: TokenLBracePtr) -> Self {
35267        ptr.untyped()
35268    }
35269}
35270#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
35271pub struct TokenLBraceGreen(pub GreenId);
35272impl TokenLBraceGreen {
35273    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
35274        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
35275    }
35276}
35277impl TypedSyntaxNode for TokenLBrace {
35278    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenLBrace);
35279    type StablePtr = TokenLBracePtr;
35280    type Green = TokenLBraceGreen;
35281    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
35282        TokenLBraceGreen(
35283            Arc::new(GreenNode {
35284                kind: SyntaxKind::TokenMissing,
35285                details: GreenNodeDetails::Token("".into()),
35286            })
35287            .intern(db),
35288        )
35289    }
35290    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
35291        match node.lookup_intern(db).green.lookup_intern(db).details {
35292            GreenNodeDetails::Token(_) => Self { node },
35293            GreenNodeDetails::Node { .. } => {
35294                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenLBrace)
35295            }
35296        }
35297    }
35298    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
35299        match node.lookup_intern(db).green.lookup_intern(db).details {
35300            GreenNodeDetails::Token(_) => Some(Self { node }),
35301            GreenNodeDetails::Node { .. } => None,
35302        }
35303    }
35304    fn as_syntax_node(&self) -> SyntaxNode {
35305        self.node
35306    }
35307    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
35308        TokenLBracePtr(self.node.stable_ptr(db))
35309    }
35310}
35311#[derive(Clone, Debug, Eq, Hash, PartialEq)]
35312pub struct TerminalLBrace {
35313    node: SyntaxNode,
35314}
35315impl Terminal for TerminalLBrace {
35316    const KIND: SyntaxKind = SyntaxKind::TerminalLBrace;
35317    type TokenType = TokenLBrace;
35318    fn new_green(
35319        db: &dyn SyntaxGroup,
35320        leading_trivia: TriviaGreen,
35321        token: <<TerminalLBrace as Terminal>::TokenType as TypedSyntaxNode>::Green,
35322        trailing_trivia: TriviaGreen,
35323    ) -> Self::Green {
35324        let children = [leading_trivia.0, token.0, trailing_trivia.0];
35325        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
35326        TerminalLBraceGreen(
35327            Arc::new(GreenNode {
35328                kind: SyntaxKind::TerminalLBrace,
35329                details: GreenNodeDetails::Node { children: children.into(), width },
35330            })
35331            .intern(db),
35332        )
35333    }
35334    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
35335        let GreenNodeDetails::Node { children, .. } =
35336            &self.node.lookup_intern(db).green.lookup_intern(db).details
35337        else {
35338            unreachable!("Expected a node, not a token");
35339        };
35340        extract_matches!(&children[1].lookup_intern(db).details, GreenNodeDetails::Token).clone()
35341    }
35342}
35343impl TerminalLBrace {
35344    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
35345        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
35346    }
35347    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenLBrace {
35348        TokenLBrace::from_syntax_node(db, self.node.get_children(db)[1])
35349    }
35350    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
35351        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
35352    }
35353}
35354#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
35355pub struct TerminalLBracePtr(pub SyntaxStablePtrId);
35356impl TerminalLBracePtr {}
35357impl TypedStablePtr for TerminalLBracePtr {
35358    type SyntaxNode = TerminalLBrace;
35359    fn untyped(&self) -> SyntaxStablePtrId {
35360        self.0
35361    }
35362    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalLBrace {
35363        TerminalLBrace::from_syntax_node(db, self.0.lookup(db))
35364    }
35365}
35366impl From<TerminalLBracePtr> for SyntaxStablePtrId {
35367    fn from(ptr: TerminalLBracePtr) -> Self {
35368        ptr.untyped()
35369    }
35370}
35371#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
35372pub struct TerminalLBraceGreen(pub GreenId);
35373impl TypedSyntaxNode for TerminalLBrace {
35374    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalLBrace);
35375    type StablePtr = TerminalLBracePtr;
35376    type Green = TerminalLBraceGreen;
35377    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
35378        TerminalLBraceGreen(
35379            Arc::new(GreenNode {
35380                kind: SyntaxKind::TerminalLBrace,
35381                details: GreenNodeDetails::Node {
35382                    children: [
35383                        Trivia::missing(db).0,
35384                        TokenLBrace::missing(db).0,
35385                        Trivia::missing(db).0,
35386                    ]
35387                    .into(),
35388                    width: TextWidth::default(),
35389                },
35390            })
35391            .intern(db),
35392        )
35393    }
35394    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
35395        let kind = node.kind(db);
35396        assert_eq!(
35397            kind,
35398            SyntaxKind::TerminalLBrace,
35399            "Unexpected SyntaxKind {:?}. Expected {:?}.",
35400            kind,
35401            SyntaxKind::TerminalLBrace
35402        );
35403        Self { node }
35404    }
35405    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
35406        let kind = node.kind(db);
35407        if kind == SyntaxKind::TerminalLBrace {
35408            Some(Self::from_syntax_node(db, node))
35409        } else {
35410            None
35411        }
35412    }
35413    fn as_syntax_node(&self) -> SyntaxNode {
35414        self.node
35415    }
35416    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
35417        TerminalLBracePtr(self.node.stable_ptr(db))
35418    }
35419}
35420#[derive(Clone, Debug, Eq, Hash, PartialEq)]
35421pub struct TokenLBrack {
35422    node: SyntaxNode,
35423}
35424impl Token for TokenLBrack {
35425    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
35426        TokenLBrackGreen(
35427            Arc::new(GreenNode {
35428                kind: SyntaxKind::TokenLBrack,
35429                details: GreenNodeDetails::Token(text),
35430            })
35431            .intern(db),
35432        )
35433    }
35434    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
35435        extract_matches!(
35436            &self.node.lookup_intern(db).green.lookup_intern(db).details,
35437            GreenNodeDetails::Token
35438        )
35439        .clone()
35440    }
35441}
35442#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
35443pub struct TokenLBrackPtr(pub SyntaxStablePtrId);
35444impl TypedStablePtr for TokenLBrackPtr {
35445    type SyntaxNode = TokenLBrack;
35446    fn untyped(&self) -> SyntaxStablePtrId {
35447        self.0
35448    }
35449    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenLBrack {
35450        TokenLBrack::from_syntax_node(db, self.0.lookup(db))
35451    }
35452}
35453impl From<TokenLBrackPtr> for SyntaxStablePtrId {
35454    fn from(ptr: TokenLBrackPtr) -> Self {
35455        ptr.untyped()
35456    }
35457}
35458#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
35459pub struct TokenLBrackGreen(pub GreenId);
35460impl TokenLBrackGreen {
35461    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
35462        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
35463    }
35464}
35465impl TypedSyntaxNode for TokenLBrack {
35466    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenLBrack);
35467    type StablePtr = TokenLBrackPtr;
35468    type Green = TokenLBrackGreen;
35469    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
35470        TokenLBrackGreen(
35471            Arc::new(GreenNode {
35472                kind: SyntaxKind::TokenMissing,
35473                details: GreenNodeDetails::Token("".into()),
35474            })
35475            .intern(db),
35476        )
35477    }
35478    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
35479        match node.lookup_intern(db).green.lookup_intern(db).details {
35480            GreenNodeDetails::Token(_) => Self { node },
35481            GreenNodeDetails::Node { .. } => {
35482                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenLBrack)
35483            }
35484        }
35485    }
35486    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
35487        match node.lookup_intern(db).green.lookup_intern(db).details {
35488            GreenNodeDetails::Token(_) => Some(Self { node }),
35489            GreenNodeDetails::Node { .. } => None,
35490        }
35491    }
35492    fn as_syntax_node(&self) -> SyntaxNode {
35493        self.node
35494    }
35495    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
35496        TokenLBrackPtr(self.node.stable_ptr(db))
35497    }
35498}
35499#[derive(Clone, Debug, Eq, Hash, PartialEq)]
35500pub struct TerminalLBrack {
35501    node: SyntaxNode,
35502}
35503impl Terminal for TerminalLBrack {
35504    const KIND: SyntaxKind = SyntaxKind::TerminalLBrack;
35505    type TokenType = TokenLBrack;
35506    fn new_green(
35507        db: &dyn SyntaxGroup,
35508        leading_trivia: TriviaGreen,
35509        token: <<TerminalLBrack as Terminal>::TokenType as TypedSyntaxNode>::Green,
35510        trailing_trivia: TriviaGreen,
35511    ) -> Self::Green {
35512        let children = [leading_trivia.0, token.0, trailing_trivia.0];
35513        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
35514        TerminalLBrackGreen(
35515            Arc::new(GreenNode {
35516                kind: SyntaxKind::TerminalLBrack,
35517                details: GreenNodeDetails::Node { children: children.into(), width },
35518            })
35519            .intern(db),
35520        )
35521    }
35522    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
35523        let GreenNodeDetails::Node { children, .. } =
35524            &self.node.lookup_intern(db).green.lookup_intern(db).details
35525        else {
35526            unreachable!("Expected a node, not a token");
35527        };
35528        extract_matches!(&children[1].lookup_intern(db).details, GreenNodeDetails::Token).clone()
35529    }
35530}
35531impl TerminalLBrack {
35532    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
35533        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
35534    }
35535    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenLBrack {
35536        TokenLBrack::from_syntax_node(db, self.node.get_children(db)[1])
35537    }
35538    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
35539        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
35540    }
35541}
35542#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
35543pub struct TerminalLBrackPtr(pub SyntaxStablePtrId);
35544impl TerminalLBrackPtr {}
35545impl TypedStablePtr for TerminalLBrackPtr {
35546    type SyntaxNode = TerminalLBrack;
35547    fn untyped(&self) -> SyntaxStablePtrId {
35548        self.0
35549    }
35550    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalLBrack {
35551        TerminalLBrack::from_syntax_node(db, self.0.lookup(db))
35552    }
35553}
35554impl From<TerminalLBrackPtr> for SyntaxStablePtrId {
35555    fn from(ptr: TerminalLBrackPtr) -> Self {
35556        ptr.untyped()
35557    }
35558}
35559#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
35560pub struct TerminalLBrackGreen(pub GreenId);
35561impl TypedSyntaxNode for TerminalLBrack {
35562    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalLBrack);
35563    type StablePtr = TerminalLBrackPtr;
35564    type Green = TerminalLBrackGreen;
35565    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
35566        TerminalLBrackGreen(
35567            Arc::new(GreenNode {
35568                kind: SyntaxKind::TerminalLBrack,
35569                details: GreenNodeDetails::Node {
35570                    children: [
35571                        Trivia::missing(db).0,
35572                        TokenLBrack::missing(db).0,
35573                        Trivia::missing(db).0,
35574                    ]
35575                    .into(),
35576                    width: TextWidth::default(),
35577                },
35578            })
35579            .intern(db),
35580        )
35581    }
35582    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
35583        let kind = node.kind(db);
35584        assert_eq!(
35585            kind,
35586            SyntaxKind::TerminalLBrack,
35587            "Unexpected SyntaxKind {:?}. Expected {:?}.",
35588            kind,
35589            SyntaxKind::TerminalLBrack
35590        );
35591        Self { node }
35592    }
35593    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
35594        let kind = node.kind(db);
35595        if kind == SyntaxKind::TerminalLBrack {
35596            Some(Self::from_syntax_node(db, node))
35597        } else {
35598            None
35599        }
35600    }
35601    fn as_syntax_node(&self) -> SyntaxNode {
35602        self.node
35603    }
35604    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
35605        TerminalLBrackPtr(self.node.stable_ptr(db))
35606    }
35607}
35608#[derive(Clone, Debug, Eq, Hash, PartialEq)]
35609pub struct TokenLE {
35610    node: SyntaxNode,
35611}
35612impl Token for TokenLE {
35613    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
35614        TokenLEGreen(
35615            Arc::new(GreenNode {
35616                kind: SyntaxKind::TokenLE,
35617                details: GreenNodeDetails::Token(text),
35618            })
35619            .intern(db),
35620        )
35621    }
35622    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
35623        extract_matches!(
35624            &self.node.lookup_intern(db).green.lookup_intern(db).details,
35625            GreenNodeDetails::Token
35626        )
35627        .clone()
35628    }
35629}
35630#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
35631pub struct TokenLEPtr(pub SyntaxStablePtrId);
35632impl TypedStablePtr for TokenLEPtr {
35633    type SyntaxNode = TokenLE;
35634    fn untyped(&self) -> SyntaxStablePtrId {
35635        self.0
35636    }
35637    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenLE {
35638        TokenLE::from_syntax_node(db, self.0.lookup(db))
35639    }
35640}
35641impl From<TokenLEPtr> for SyntaxStablePtrId {
35642    fn from(ptr: TokenLEPtr) -> Self {
35643        ptr.untyped()
35644    }
35645}
35646#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
35647pub struct TokenLEGreen(pub GreenId);
35648impl TokenLEGreen {
35649    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
35650        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
35651    }
35652}
35653impl TypedSyntaxNode for TokenLE {
35654    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenLE);
35655    type StablePtr = TokenLEPtr;
35656    type Green = TokenLEGreen;
35657    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
35658        TokenLEGreen(
35659            Arc::new(GreenNode {
35660                kind: SyntaxKind::TokenMissing,
35661                details: GreenNodeDetails::Token("".into()),
35662            })
35663            .intern(db),
35664        )
35665    }
35666    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
35667        match node.lookup_intern(db).green.lookup_intern(db).details {
35668            GreenNodeDetails::Token(_) => Self { node },
35669            GreenNodeDetails::Node { .. } => {
35670                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenLE)
35671            }
35672        }
35673    }
35674    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
35675        match node.lookup_intern(db).green.lookup_intern(db).details {
35676            GreenNodeDetails::Token(_) => Some(Self { node }),
35677            GreenNodeDetails::Node { .. } => None,
35678        }
35679    }
35680    fn as_syntax_node(&self) -> SyntaxNode {
35681        self.node
35682    }
35683    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
35684        TokenLEPtr(self.node.stable_ptr(db))
35685    }
35686}
35687#[derive(Clone, Debug, Eq, Hash, PartialEq)]
35688pub struct TerminalLE {
35689    node: SyntaxNode,
35690}
35691impl Terminal for TerminalLE {
35692    const KIND: SyntaxKind = SyntaxKind::TerminalLE;
35693    type TokenType = TokenLE;
35694    fn new_green(
35695        db: &dyn SyntaxGroup,
35696        leading_trivia: TriviaGreen,
35697        token: <<TerminalLE as Terminal>::TokenType as TypedSyntaxNode>::Green,
35698        trailing_trivia: TriviaGreen,
35699    ) -> Self::Green {
35700        let children = [leading_trivia.0, token.0, trailing_trivia.0];
35701        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
35702        TerminalLEGreen(
35703            Arc::new(GreenNode {
35704                kind: SyntaxKind::TerminalLE,
35705                details: GreenNodeDetails::Node { children: children.into(), width },
35706            })
35707            .intern(db),
35708        )
35709    }
35710    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
35711        let GreenNodeDetails::Node { children, .. } =
35712            &self.node.lookup_intern(db).green.lookup_intern(db).details
35713        else {
35714            unreachable!("Expected a node, not a token");
35715        };
35716        extract_matches!(&children[1].lookup_intern(db).details, GreenNodeDetails::Token).clone()
35717    }
35718}
35719impl TerminalLE {
35720    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
35721        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
35722    }
35723    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenLE {
35724        TokenLE::from_syntax_node(db, self.node.get_children(db)[1])
35725    }
35726    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
35727        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
35728    }
35729}
35730#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
35731pub struct TerminalLEPtr(pub SyntaxStablePtrId);
35732impl TerminalLEPtr {}
35733impl TypedStablePtr for TerminalLEPtr {
35734    type SyntaxNode = TerminalLE;
35735    fn untyped(&self) -> SyntaxStablePtrId {
35736        self.0
35737    }
35738    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalLE {
35739        TerminalLE::from_syntax_node(db, self.0.lookup(db))
35740    }
35741}
35742impl From<TerminalLEPtr> for SyntaxStablePtrId {
35743    fn from(ptr: TerminalLEPtr) -> Self {
35744        ptr.untyped()
35745    }
35746}
35747#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
35748pub struct TerminalLEGreen(pub GreenId);
35749impl TypedSyntaxNode for TerminalLE {
35750    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalLE);
35751    type StablePtr = TerminalLEPtr;
35752    type Green = TerminalLEGreen;
35753    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
35754        TerminalLEGreen(
35755            Arc::new(GreenNode {
35756                kind: SyntaxKind::TerminalLE,
35757                details: GreenNodeDetails::Node {
35758                    children: [
35759                        Trivia::missing(db).0,
35760                        TokenLE::missing(db).0,
35761                        Trivia::missing(db).0,
35762                    ]
35763                    .into(),
35764                    width: TextWidth::default(),
35765                },
35766            })
35767            .intern(db),
35768        )
35769    }
35770    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
35771        let kind = node.kind(db);
35772        assert_eq!(
35773            kind,
35774            SyntaxKind::TerminalLE,
35775            "Unexpected SyntaxKind {:?}. Expected {:?}.",
35776            kind,
35777            SyntaxKind::TerminalLE
35778        );
35779        Self { node }
35780    }
35781    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
35782        let kind = node.kind(db);
35783        if kind == SyntaxKind::TerminalLE { Some(Self::from_syntax_node(db, node)) } else { None }
35784    }
35785    fn as_syntax_node(&self) -> SyntaxNode {
35786        self.node
35787    }
35788    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
35789        TerminalLEPtr(self.node.stable_ptr(db))
35790    }
35791}
35792#[derive(Clone, Debug, Eq, Hash, PartialEq)]
35793pub struct TokenLParen {
35794    node: SyntaxNode,
35795}
35796impl Token for TokenLParen {
35797    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
35798        TokenLParenGreen(
35799            Arc::new(GreenNode {
35800                kind: SyntaxKind::TokenLParen,
35801                details: GreenNodeDetails::Token(text),
35802            })
35803            .intern(db),
35804        )
35805    }
35806    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
35807        extract_matches!(
35808            &self.node.lookup_intern(db).green.lookup_intern(db).details,
35809            GreenNodeDetails::Token
35810        )
35811        .clone()
35812    }
35813}
35814#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
35815pub struct TokenLParenPtr(pub SyntaxStablePtrId);
35816impl TypedStablePtr for TokenLParenPtr {
35817    type SyntaxNode = TokenLParen;
35818    fn untyped(&self) -> SyntaxStablePtrId {
35819        self.0
35820    }
35821    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenLParen {
35822        TokenLParen::from_syntax_node(db, self.0.lookup(db))
35823    }
35824}
35825impl From<TokenLParenPtr> for SyntaxStablePtrId {
35826    fn from(ptr: TokenLParenPtr) -> Self {
35827        ptr.untyped()
35828    }
35829}
35830#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
35831pub struct TokenLParenGreen(pub GreenId);
35832impl TokenLParenGreen {
35833    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
35834        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
35835    }
35836}
35837impl TypedSyntaxNode for TokenLParen {
35838    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenLParen);
35839    type StablePtr = TokenLParenPtr;
35840    type Green = TokenLParenGreen;
35841    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
35842        TokenLParenGreen(
35843            Arc::new(GreenNode {
35844                kind: SyntaxKind::TokenMissing,
35845                details: GreenNodeDetails::Token("".into()),
35846            })
35847            .intern(db),
35848        )
35849    }
35850    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
35851        match node.lookup_intern(db).green.lookup_intern(db).details {
35852            GreenNodeDetails::Token(_) => Self { node },
35853            GreenNodeDetails::Node { .. } => {
35854                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenLParen)
35855            }
35856        }
35857    }
35858    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
35859        match node.lookup_intern(db).green.lookup_intern(db).details {
35860            GreenNodeDetails::Token(_) => Some(Self { node }),
35861            GreenNodeDetails::Node { .. } => None,
35862        }
35863    }
35864    fn as_syntax_node(&self) -> SyntaxNode {
35865        self.node
35866    }
35867    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
35868        TokenLParenPtr(self.node.stable_ptr(db))
35869    }
35870}
35871#[derive(Clone, Debug, Eq, Hash, PartialEq)]
35872pub struct TerminalLParen {
35873    node: SyntaxNode,
35874}
35875impl Terminal for TerminalLParen {
35876    const KIND: SyntaxKind = SyntaxKind::TerminalLParen;
35877    type TokenType = TokenLParen;
35878    fn new_green(
35879        db: &dyn SyntaxGroup,
35880        leading_trivia: TriviaGreen,
35881        token: <<TerminalLParen as Terminal>::TokenType as TypedSyntaxNode>::Green,
35882        trailing_trivia: TriviaGreen,
35883    ) -> Self::Green {
35884        let children = [leading_trivia.0, token.0, trailing_trivia.0];
35885        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
35886        TerminalLParenGreen(
35887            Arc::new(GreenNode {
35888                kind: SyntaxKind::TerminalLParen,
35889                details: GreenNodeDetails::Node { children: children.into(), width },
35890            })
35891            .intern(db),
35892        )
35893    }
35894    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
35895        let GreenNodeDetails::Node { children, .. } =
35896            &self.node.lookup_intern(db).green.lookup_intern(db).details
35897        else {
35898            unreachable!("Expected a node, not a token");
35899        };
35900        extract_matches!(&children[1].lookup_intern(db).details, GreenNodeDetails::Token).clone()
35901    }
35902}
35903impl TerminalLParen {
35904    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
35905        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
35906    }
35907    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenLParen {
35908        TokenLParen::from_syntax_node(db, self.node.get_children(db)[1])
35909    }
35910    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
35911        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
35912    }
35913}
35914#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
35915pub struct TerminalLParenPtr(pub SyntaxStablePtrId);
35916impl TerminalLParenPtr {}
35917impl TypedStablePtr for TerminalLParenPtr {
35918    type SyntaxNode = TerminalLParen;
35919    fn untyped(&self) -> SyntaxStablePtrId {
35920        self.0
35921    }
35922    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalLParen {
35923        TerminalLParen::from_syntax_node(db, self.0.lookup(db))
35924    }
35925}
35926impl From<TerminalLParenPtr> for SyntaxStablePtrId {
35927    fn from(ptr: TerminalLParenPtr) -> Self {
35928        ptr.untyped()
35929    }
35930}
35931#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
35932pub struct TerminalLParenGreen(pub GreenId);
35933impl TypedSyntaxNode for TerminalLParen {
35934    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalLParen);
35935    type StablePtr = TerminalLParenPtr;
35936    type Green = TerminalLParenGreen;
35937    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
35938        TerminalLParenGreen(
35939            Arc::new(GreenNode {
35940                kind: SyntaxKind::TerminalLParen,
35941                details: GreenNodeDetails::Node {
35942                    children: [
35943                        Trivia::missing(db).0,
35944                        TokenLParen::missing(db).0,
35945                        Trivia::missing(db).0,
35946                    ]
35947                    .into(),
35948                    width: TextWidth::default(),
35949                },
35950            })
35951            .intern(db),
35952        )
35953    }
35954    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
35955        let kind = node.kind(db);
35956        assert_eq!(
35957            kind,
35958            SyntaxKind::TerminalLParen,
35959            "Unexpected SyntaxKind {:?}. Expected {:?}.",
35960            kind,
35961            SyntaxKind::TerminalLParen
35962        );
35963        Self { node }
35964    }
35965    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
35966        let kind = node.kind(db);
35967        if kind == SyntaxKind::TerminalLParen {
35968            Some(Self::from_syntax_node(db, node))
35969        } else {
35970            None
35971        }
35972    }
35973    fn as_syntax_node(&self) -> SyntaxNode {
35974        self.node
35975    }
35976    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
35977        TerminalLParenPtr(self.node.stable_ptr(db))
35978    }
35979}
35980#[derive(Clone, Debug, Eq, Hash, PartialEq)]
35981pub struct TokenLT {
35982    node: SyntaxNode,
35983}
35984impl Token for TokenLT {
35985    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
35986        TokenLTGreen(
35987            Arc::new(GreenNode {
35988                kind: SyntaxKind::TokenLT,
35989                details: GreenNodeDetails::Token(text),
35990            })
35991            .intern(db),
35992        )
35993    }
35994    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
35995        extract_matches!(
35996            &self.node.lookup_intern(db).green.lookup_intern(db).details,
35997            GreenNodeDetails::Token
35998        )
35999        .clone()
36000    }
36001}
36002#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
36003pub struct TokenLTPtr(pub SyntaxStablePtrId);
36004impl TypedStablePtr for TokenLTPtr {
36005    type SyntaxNode = TokenLT;
36006    fn untyped(&self) -> SyntaxStablePtrId {
36007        self.0
36008    }
36009    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenLT {
36010        TokenLT::from_syntax_node(db, self.0.lookup(db))
36011    }
36012}
36013impl From<TokenLTPtr> for SyntaxStablePtrId {
36014    fn from(ptr: TokenLTPtr) -> Self {
36015        ptr.untyped()
36016    }
36017}
36018#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
36019pub struct TokenLTGreen(pub GreenId);
36020impl TokenLTGreen {
36021    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
36022        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
36023    }
36024}
36025impl TypedSyntaxNode for TokenLT {
36026    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenLT);
36027    type StablePtr = TokenLTPtr;
36028    type Green = TokenLTGreen;
36029    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
36030        TokenLTGreen(
36031            Arc::new(GreenNode {
36032                kind: SyntaxKind::TokenMissing,
36033                details: GreenNodeDetails::Token("".into()),
36034            })
36035            .intern(db),
36036        )
36037    }
36038    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
36039        match node.lookup_intern(db).green.lookup_intern(db).details {
36040            GreenNodeDetails::Token(_) => Self { node },
36041            GreenNodeDetails::Node { .. } => {
36042                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenLT)
36043            }
36044        }
36045    }
36046    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
36047        match node.lookup_intern(db).green.lookup_intern(db).details {
36048            GreenNodeDetails::Token(_) => Some(Self { node }),
36049            GreenNodeDetails::Node { .. } => None,
36050        }
36051    }
36052    fn as_syntax_node(&self) -> SyntaxNode {
36053        self.node
36054    }
36055    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
36056        TokenLTPtr(self.node.stable_ptr(db))
36057    }
36058}
36059#[derive(Clone, Debug, Eq, Hash, PartialEq)]
36060pub struct TerminalLT {
36061    node: SyntaxNode,
36062}
36063impl Terminal for TerminalLT {
36064    const KIND: SyntaxKind = SyntaxKind::TerminalLT;
36065    type TokenType = TokenLT;
36066    fn new_green(
36067        db: &dyn SyntaxGroup,
36068        leading_trivia: TriviaGreen,
36069        token: <<TerminalLT as Terminal>::TokenType as TypedSyntaxNode>::Green,
36070        trailing_trivia: TriviaGreen,
36071    ) -> Self::Green {
36072        let children = [leading_trivia.0, token.0, trailing_trivia.0];
36073        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
36074        TerminalLTGreen(
36075            Arc::new(GreenNode {
36076                kind: SyntaxKind::TerminalLT,
36077                details: GreenNodeDetails::Node { children: children.into(), width },
36078            })
36079            .intern(db),
36080        )
36081    }
36082    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
36083        let GreenNodeDetails::Node { children, .. } =
36084            &self.node.lookup_intern(db).green.lookup_intern(db).details
36085        else {
36086            unreachable!("Expected a node, not a token");
36087        };
36088        extract_matches!(&children[1].lookup_intern(db).details, GreenNodeDetails::Token).clone()
36089    }
36090}
36091impl TerminalLT {
36092    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
36093        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
36094    }
36095    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenLT {
36096        TokenLT::from_syntax_node(db, self.node.get_children(db)[1])
36097    }
36098    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
36099        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
36100    }
36101}
36102#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
36103pub struct TerminalLTPtr(pub SyntaxStablePtrId);
36104impl TerminalLTPtr {}
36105impl TypedStablePtr for TerminalLTPtr {
36106    type SyntaxNode = TerminalLT;
36107    fn untyped(&self) -> SyntaxStablePtrId {
36108        self.0
36109    }
36110    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalLT {
36111        TerminalLT::from_syntax_node(db, self.0.lookup(db))
36112    }
36113}
36114impl From<TerminalLTPtr> for SyntaxStablePtrId {
36115    fn from(ptr: TerminalLTPtr) -> Self {
36116        ptr.untyped()
36117    }
36118}
36119#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
36120pub struct TerminalLTGreen(pub GreenId);
36121impl TypedSyntaxNode for TerminalLT {
36122    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalLT);
36123    type StablePtr = TerminalLTPtr;
36124    type Green = TerminalLTGreen;
36125    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
36126        TerminalLTGreen(
36127            Arc::new(GreenNode {
36128                kind: SyntaxKind::TerminalLT,
36129                details: GreenNodeDetails::Node {
36130                    children: [
36131                        Trivia::missing(db).0,
36132                        TokenLT::missing(db).0,
36133                        Trivia::missing(db).0,
36134                    ]
36135                    .into(),
36136                    width: TextWidth::default(),
36137                },
36138            })
36139            .intern(db),
36140        )
36141    }
36142    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
36143        let kind = node.kind(db);
36144        assert_eq!(
36145            kind,
36146            SyntaxKind::TerminalLT,
36147            "Unexpected SyntaxKind {:?}. Expected {:?}.",
36148            kind,
36149            SyntaxKind::TerminalLT
36150        );
36151        Self { node }
36152    }
36153    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
36154        let kind = node.kind(db);
36155        if kind == SyntaxKind::TerminalLT { Some(Self::from_syntax_node(db, node)) } else { None }
36156    }
36157    fn as_syntax_node(&self) -> SyntaxNode {
36158        self.node
36159    }
36160    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
36161        TerminalLTPtr(self.node.stable_ptr(db))
36162    }
36163}
36164#[derive(Clone, Debug, Eq, Hash, PartialEq)]
36165pub struct TokenMatchArrow {
36166    node: SyntaxNode,
36167}
36168impl Token for TokenMatchArrow {
36169    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
36170        TokenMatchArrowGreen(
36171            Arc::new(GreenNode {
36172                kind: SyntaxKind::TokenMatchArrow,
36173                details: GreenNodeDetails::Token(text),
36174            })
36175            .intern(db),
36176        )
36177    }
36178    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
36179        extract_matches!(
36180            &self.node.lookup_intern(db).green.lookup_intern(db).details,
36181            GreenNodeDetails::Token
36182        )
36183        .clone()
36184    }
36185}
36186#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
36187pub struct TokenMatchArrowPtr(pub SyntaxStablePtrId);
36188impl TypedStablePtr for TokenMatchArrowPtr {
36189    type SyntaxNode = TokenMatchArrow;
36190    fn untyped(&self) -> SyntaxStablePtrId {
36191        self.0
36192    }
36193    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenMatchArrow {
36194        TokenMatchArrow::from_syntax_node(db, self.0.lookup(db))
36195    }
36196}
36197impl From<TokenMatchArrowPtr> for SyntaxStablePtrId {
36198    fn from(ptr: TokenMatchArrowPtr) -> Self {
36199        ptr.untyped()
36200    }
36201}
36202#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
36203pub struct TokenMatchArrowGreen(pub GreenId);
36204impl TokenMatchArrowGreen {
36205    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
36206        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
36207    }
36208}
36209impl TypedSyntaxNode for TokenMatchArrow {
36210    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenMatchArrow);
36211    type StablePtr = TokenMatchArrowPtr;
36212    type Green = TokenMatchArrowGreen;
36213    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
36214        TokenMatchArrowGreen(
36215            Arc::new(GreenNode {
36216                kind: SyntaxKind::TokenMissing,
36217                details: GreenNodeDetails::Token("".into()),
36218            })
36219            .intern(db),
36220        )
36221    }
36222    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
36223        match node.lookup_intern(db).green.lookup_intern(db).details {
36224            GreenNodeDetails::Token(_) => Self { node },
36225            GreenNodeDetails::Node { .. } => {
36226                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenMatchArrow)
36227            }
36228        }
36229    }
36230    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
36231        match node.lookup_intern(db).green.lookup_intern(db).details {
36232            GreenNodeDetails::Token(_) => Some(Self { node }),
36233            GreenNodeDetails::Node { .. } => None,
36234        }
36235    }
36236    fn as_syntax_node(&self) -> SyntaxNode {
36237        self.node
36238    }
36239    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
36240        TokenMatchArrowPtr(self.node.stable_ptr(db))
36241    }
36242}
36243#[derive(Clone, Debug, Eq, Hash, PartialEq)]
36244pub struct TerminalMatchArrow {
36245    node: SyntaxNode,
36246}
36247impl Terminal for TerminalMatchArrow {
36248    const KIND: SyntaxKind = SyntaxKind::TerminalMatchArrow;
36249    type TokenType = TokenMatchArrow;
36250    fn new_green(
36251        db: &dyn SyntaxGroup,
36252        leading_trivia: TriviaGreen,
36253        token: <<TerminalMatchArrow as Terminal>::TokenType as TypedSyntaxNode>::Green,
36254        trailing_trivia: TriviaGreen,
36255    ) -> Self::Green {
36256        let children = [leading_trivia.0, token.0, trailing_trivia.0];
36257        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
36258        TerminalMatchArrowGreen(
36259            Arc::new(GreenNode {
36260                kind: SyntaxKind::TerminalMatchArrow,
36261                details: GreenNodeDetails::Node { children: children.into(), width },
36262            })
36263            .intern(db),
36264        )
36265    }
36266    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
36267        let GreenNodeDetails::Node { children, .. } =
36268            &self.node.lookup_intern(db).green.lookup_intern(db).details
36269        else {
36270            unreachable!("Expected a node, not a token");
36271        };
36272        extract_matches!(&children[1].lookup_intern(db).details, GreenNodeDetails::Token).clone()
36273    }
36274}
36275impl TerminalMatchArrow {
36276    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
36277        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
36278    }
36279    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenMatchArrow {
36280        TokenMatchArrow::from_syntax_node(db, self.node.get_children(db)[1])
36281    }
36282    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
36283        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
36284    }
36285}
36286#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
36287pub struct TerminalMatchArrowPtr(pub SyntaxStablePtrId);
36288impl TerminalMatchArrowPtr {}
36289impl TypedStablePtr for TerminalMatchArrowPtr {
36290    type SyntaxNode = TerminalMatchArrow;
36291    fn untyped(&self) -> SyntaxStablePtrId {
36292        self.0
36293    }
36294    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalMatchArrow {
36295        TerminalMatchArrow::from_syntax_node(db, self.0.lookup(db))
36296    }
36297}
36298impl From<TerminalMatchArrowPtr> for SyntaxStablePtrId {
36299    fn from(ptr: TerminalMatchArrowPtr) -> Self {
36300        ptr.untyped()
36301    }
36302}
36303#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
36304pub struct TerminalMatchArrowGreen(pub GreenId);
36305impl TypedSyntaxNode for TerminalMatchArrow {
36306    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalMatchArrow);
36307    type StablePtr = TerminalMatchArrowPtr;
36308    type Green = TerminalMatchArrowGreen;
36309    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
36310        TerminalMatchArrowGreen(
36311            Arc::new(GreenNode {
36312                kind: SyntaxKind::TerminalMatchArrow,
36313                details: GreenNodeDetails::Node {
36314                    children: [
36315                        Trivia::missing(db).0,
36316                        TokenMatchArrow::missing(db).0,
36317                        Trivia::missing(db).0,
36318                    ]
36319                    .into(),
36320                    width: TextWidth::default(),
36321                },
36322            })
36323            .intern(db),
36324        )
36325    }
36326    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
36327        let kind = node.kind(db);
36328        assert_eq!(
36329            kind,
36330            SyntaxKind::TerminalMatchArrow,
36331            "Unexpected SyntaxKind {:?}. Expected {:?}.",
36332            kind,
36333            SyntaxKind::TerminalMatchArrow
36334        );
36335        Self { node }
36336    }
36337    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
36338        let kind = node.kind(db);
36339        if kind == SyntaxKind::TerminalMatchArrow {
36340            Some(Self::from_syntax_node(db, node))
36341        } else {
36342            None
36343        }
36344    }
36345    fn as_syntax_node(&self) -> SyntaxNode {
36346        self.node
36347    }
36348    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
36349        TerminalMatchArrowPtr(self.node.stable_ptr(db))
36350    }
36351}
36352#[derive(Clone, Debug, Eq, Hash, PartialEq)]
36353pub struct TokenMinus {
36354    node: SyntaxNode,
36355}
36356impl Token for TokenMinus {
36357    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
36358        TokenMinusGreen(
36359            Arc::new(GreenNode {
36360                kind: SyntaxKind::TokenMinus,
36361                details: GreenNodeDetails::Token(text),
36362            })
36363            .intern(db),
36364        )
36365    }
36366    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
36367        extract_matches!(
36368            &self.node.lookup_intern(db).green.lookup_intern(db).details,
36369            GreenNodeDetails::Token
36370        )
36371        .clone()
36372    }
36373}
36374#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
36375pub struct TokenMinusPtr(pub SyntaxStablePtrId);
36376impl TypedStablePtr for TokenMinusPtr {
36377    type SyntaxNode = TokenMinus;
36378    fn untyped(&self) -> SyntaxStablePtrId {
36379        self.0
36380    }
36381    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenMinus {
36382        TokenMinus::from_syntax_node(db, self.0.lookup(db))
36383    }
36384}
36385impl From<TokenMinusPtr> for SyntaxStablePtrId {
36386    fn from(ptr: TokenMinusPtr) -> Self {
36387        ptr.untyped()
36388    }
36389}
36390#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
36391pub struct TokenMinusGreen(pub GreenId);
36392impl TokenMinusGreen {
36393    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
36394        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
36395    }
36396}
36397impl TypedSyntaxNode for TokenMinus {
36398    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenMinus);
36399    type StablePtr = TokenMinusPtr;
36400    type Green = TokenMinusGreen;
36401    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
36402        TokenMinusGreen(
36403            Arc::new(GreenNode {
36404                kind: SyntaxKind::TokenMissing,
36405                details: GreenNodeDetails::Token("".into()),
36406            })
36407            .intern(db),
36408        )
36409    }
36410    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
36411        match node.lookup_intern(db).green.lookup_intern(db).details {
36412            GreenNodeDetails::Token(_) => Self { node },
36413            GreenNodeDetails::Node { .. } => {
36414                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenMinus)
36415            }
36416        }
36417    }
36418    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
36419        match node.lookup_intern(db).green.lookup_intern(db).details {
36420            GreenNodeDetails::Token(_) => Some(Self { node }),
36421            GreenNodeDetails::Node { .. } => None,
36422        }
36423    }
36424    fn as_syntax_node(&self) -> SyntaxNode {
36425        self.node
36426    }
36427    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
36428        TokenMinusPtr(self.node.stable_ptr(db))
36429    }
36430}
36431#[derive(Clone, Debug, Eq, Hash, PartialEq)]
36432pub struct TerminalMinus {
36433    node: SyntaxNode,
36434}
36435impl Terminal for TerminalMinus {
36436    const KIND: SyntaxKind = SyntaxKind::TerminalMinus;
36437    type TokenType = TokenMinus;
36438    fn new_green(
36439        db: &dyn SyntaxGroup,
36440        leading_trivia: TriviaGreen,
36441        token: <<TerminalMinus as Terminal>::TokenType as TypedSyntaxNode>::Green,
36442        trailing_trivia: TriviaGreen,
36443    ) -> Self::Green {
36444        let children = [leading_trivia.0, token.0, trailing_trivia.0];
36445        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
36446        TerminalMinusGreen(
36447            Arc::new(GreenNode {
36448                kind: SyntaxKind::TerminalMinus,
36449                details: GreenNodeDetails::Node { children: children.into(), width },
36450            })
36451            .intern(db),
36452        )
36453    }
36454    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
36455        let GreenNodeDetails::Node { children, .. } =
36456            &self.node.lookup_intern(db).green.lookup_intern(db).details
36457        else {
36458            unreachable!("Expected a node, not a token");
36459        };
36460        extract_matches!(&children[1].lookup_intern(db).details, GreenNodeDetails::Token).clone()
36461    }
36462}
36463impl TerminalMinus {
36464    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
36465        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
36466    }
36467    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenMinus {
36468        TokenMinus::from_syntax_node(db, self.node.get_children(db)[1])
36469    }
36470    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
36471        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
36472    }
36473}
36474#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
36475pub struct TerminalMinusPtr(pub SyntaxStablePtrId);
36476impl TerminalMinusPtr {}
36477impl TypedStablePtr for TerminalMinusPtr {
36478    type SyntaxNode = TerminalMinus;
36479    fn untyped(&self) -> SyntaxStablePtrId {
36480        self.0
36481    }
36482    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalMinus {
36483        TerminalMinus::from_syntax_node(db, self.0.lookup(db))
36484    }
36485}
36486impl From<TerminalMinusPtr> for SyntaxStablePtrId {
36487    fn from(ptr: TerminalMinusPtr) -> Self {
36488        ptr.untyped()
36489    }
36490}
36491#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
36492pub struct TerminalMinusGreen(pub GreenId);
36493impl TypedSyntaxNode for TerminalMinus {
36494    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalMinus);
36495    type StablePtr = TerminalMinusPtr;
36496    type Green = TerminalMinusGreen;
36497    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
36498        TerminalMinusGreen(
36499            Arc::new(GreenNode {
36500                kind: SyntaxKind::TerminalMinus,
36501                details: GreenNodeDetails::Node {
36502                    children: [
36503                        Trivia::missing(db).0,
36504                        TokenMinus::missing(db).0,
36505                        Trivia::missing(db).0,
36506                    ]
36507                    .into(),
36508                    width: TextWidth::default(),
36509                },
36510            })
36511            .intern(db),
36512        )
36513    }
36514    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
36515        let kind = node.kind(db);
36516        assert_eq!(
36517            kind,
36518            SyntaxKind::TerminalMinus,
36519            "Unexpected SyntaxKind {:?}. Expected {:?}.",
36520            kind,
36521            SyntaxKind::TerminalMinus
36522        );
36523        Self { node }
36524    }
36525    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
36526        let kind = node.kind(db);
36527        if kind == SyntaxKind::TerminalMinus {
36528            Some(Self::from_syntax_node(db, node))
36529        } else {
36530            None
36531        }
36532    }
36533    fn as_syntax_node(&self) -> SyntaxNode {
36534        self.node
36535    }
36536    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
36537        TerminalMinusPtr(self.node.stable_ptr(db))
36538    }
36539}
36540#[derive(Clone, Debug, Eq, Hash, PartialEq)]
36541pub struct TokenMinusEq {
36542    node: SyntaxNode,
36543}
36544impl Token for TokenMinusEq {
36545    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
36546        TokenMinusEqGreen(
36547            Arc::new(GreenNode {
36548                kind: SyntaxKind::TokenMinusEq,
36549                details: GreenNodeDetails::Token(text),
36550            })
36551            .intern(db),
36552        )
36553    }
36554    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
36555        extract_matches!(
36556            &self.node.lookup_intern(db).green.lookup_intern(db).details,
36557            GreenNodeDetails::Token
36558        )
36559        .clone()
36560    }
36561}
36562#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
36563pub struct TokenMinusEqPtr(pub SyntaxStablePtrId);
36564impl TypedStablePtr for TokenMinusEqPtr {
36565    type SyntaxNode = TokenMinusEq;
36566    fn untyped(&self) -> SyntaxStablePtrId {
36567        self.0
36568    }
36569    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenMinusEq {
36570        TokenMinusEq::from_syntax_node(db, self.0.lookup(db))
36571    }
36572}
36573impl From<TokenMinusEqPtr> for SyntaxStablePtrId {
36574    fn from(ptr: TokenMinusEqPtr) -> Self {
36575        ptr.untyped()
36576    }
36577}
36578#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
36579pub struct TokenMinusEqGreen(pub GreenId);
36580impl TokenMinusEqGreen {
36581    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
36582        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
36583    }
36584}
36585impl TypedSyntaxNode for TokenMinusEq {
36586    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenMinusEq);
36587    type StablePtr = TokenMinusEqPtr;
36588    type Green = TokenMinusEqGreen;
36589    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
36590        TokenMinusEqGreen(
36591            Arc::new(GreenNode {
36592                kind: SyntaxKind::TokenMissing,
36593                details: GreenNodeDetails::Token("".into()),
36594            })
36595            .intern(db),
36596        )
36597    }
36598    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
36599        match node.lookup_intern(db).green.lookup_intern(db).details {
36600            GreenNodeDetails::Token(_) => Self { node },
36601            GreenNodeDetails::Node { .. } => {
36602                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenMinusEq)
36603            }
36604        }
36605    }
36606    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
36607        match node.lookup_intern(db).green.lookup_intern(db).details {
36608            GreenNodeDetails::Token(_) => Some(Self { node }),
36609            GreenNodeDetails::Node { .. } => None,
36610        }
36611    }
36612    fn as_syntax_node(&self) -> SyntaxNode {
36613        self.node
36614    }
36615    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
36616        TokenMinusEqPtr(self.node.stable_ptr(db))
36617    }
36618}
36619#[derive(Clone, Debug, Eq, Hash, PartialEq)]
36620pub struct TerminalMinusEq {
36621    node: SyntaxNode,
36622}
36623impl Terminal for TerminalMinusEq {
36624    const KIND: SyntaxKind = SyntaxKind::TerminalMinusEq;
36625    type TokenType = TokenMinusEq;
36626    fn new_green(
36627        db: &dyn SyntaxGroup,
36628        leading_trivia: TriviaGreen,
36629        token: <<TerminalMinusEq as Terminal>::TokenType as TypedSyntaxNode>::Green,
36630        trailing_trivia: TriviaGreen,
36631    ) -> Self::Green {
36632        let children = [leading_trivia.0, token.0, trailing_trivia.0];
36633        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
36634        TerminalMinusEqGreen(
36635            Arc::new(GreenNode {
36636                kind: SyntaxKind::TerminalMinusEq,
36637                details: GreenNodeDetails::Node { children: children.into(), width },
36638            })
36639            .intern(db),
36640        )
36641    }
36642    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
36643        let GreenNodeDetails::Node { children, .. } =
36644            &self.node.lookup_intern(db).green.lookup_intern(db).details
36645        else {
36646            unreachable!("Expected a node, not a token");
36647        };
36648        extract_matches!(&children[1].lookup_intern(db).details, GreenNodeDetails::Token).clone()
36649    }
36650}
36651impl TerminalMinusEq {
36652    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
36653        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
36654    }
36655    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenMinusEq {
36656        TokenMinusEq::from_syntax_node(db, self.node.get_children(db)[1])
36657    }
36658    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
36659        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
36660    }
36661}
36662#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
36663pub struct TerminalMinusEqPtr(pub SyntaxStablePtrId);
36664impl TerminalMinusEqPtr {}
36665impl TypedStablePtr for TerminalMinusEqPtr {
36666    type SyntaxNode = TerminalMinusEq;
36667    fn untyped(&self) -> SyntaxStablePtrId {
36668        self.0
36669    }
36670    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalMinusEq {
36671        TerminalMinusEq::from_syntax_node(db, self.0.lookup(db))
36672    }
36673}
36674impl From<TerminalMinusEqPtr> for SyntaxStablePtrId {
36675    fn from(ptr: TerminalMinusEqPtr) -> Self {
36676        ptr.untyped()
36677    }
36678}
36679#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
36680pub struct TerminalMinusEqGreen(pub GreenId);
36681impl TypedSyntaxNode for TerminalMinusEq {
36682    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalMinusEq);
36683    type StablePtr = TerminalMinusEqPtr;
36684    type Green = TerminalMinusEqGreen;
36685    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
36686        TerminalMinusEqGreen(
36687            Arc::new(GreenNode {
36688                kind: SyntaxKind::TerminalMinusEq,
36689                details: GreenNodeDetails::Node {
36690                    children: [
36691                        Trivia::missing(db).0,
36692                        TokenMinusEq::missing(db).0,
36693                        Trivia::missing(db).0,
36694                    ]
36695                    .into(),
36696                    width: TextWidth::default(),
36697                },
36698            })
36699            .intern(db),
36700        )
36701    }
36702    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
36703        let kind = node.kind(db);
36704        assert_eq!(
36705            kind,
36706            SyntaxKind::TerminalMinusEq,
36707            "Unexpected SyntaxKind {:?}. Expected {:?}.",
36708            kind,
36709            SyntaxKind::TerminalMinusEq
36710        );
36711        Self { node }
36712    }
36713    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
36714        let kind = node.kind(db);
36715        if kind == SyntaxKind::TerminalMinusEq {
36716            Some(Self::from_syntax_node(db, node))
36717        } else {
36718            None
36719        }
36720    }
36721    fn as_syntax_node(&self) -> SyntaxNode {
36722        self.node
36723    }
36724    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
36725        TerminalMinusEqPtr(self.node.stable_ptr(db))
36726    }
36727}
36728#[derive(Clone, Debug, Eq, Hash, PartialEq)]
36729pub struct TokenMod {
36730    node: SyntaxNode,
36731}
36732impl Token for TokenMod {
36733    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
36734        TokenModGreen(
36735            Arc::new(GreenNode {
36736                kind: SyntaxKind::TokenMod,
36737                details: GreenNodeDetails::Token(text),
36738            })
36739            .intern(db),
36740        )
36741    }
36742    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
36743        extract_matches!(
36744            &self.node.lookup_intern(db).green.lookup_intern(db).details,
36745            GreenNodeDetails::Token
36746        )
36747        .clone()
36748    }
36749}
36750#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
36751pub struct TokenModPtr(pub SyntaxStablePtrId);
36752impl TypedStablePtr for TokenModPtr {
36753    type SyntaxNode = TokenMod;
36754    fn untyped(&self) -> SyntaxStablePtrId {
36755        self.0
36756    }
36757    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenMod {
36758        TokenMod::from_syntax_node(db, self.0.lookup(db))
36759    }
36760}
36761impl From<TokenModPtr> for SyntaxStablePtrId {
36762    fn from(ptr: TokenModPtr) -> Self {
36763        ptr.untyped()
36764    }
36765}
36766#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
36767pub struct TokenModGreen(pub GreenId);
36768impl TokenModGreen {
36769    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
36770        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
36771    }
36772}
36773impl TypedSyntaxNode for TokenMod {
36774    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenMod);
36775    type StablePtr = TokenModPtr;
36776    type Green = TokenModGreen;
36777    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
36778        TokenModGreen(
36779            Arc::new(GreenNode {
36780                kind: SyntaxKind::TokenMissing,
36781                details: GreenNodeDetails::Token("".into()),
36782            })
36783            .intern(db),
36784        )
36785    }
36786    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
36787        match node.lookup_intern(db).green.lookup_intern(db).details {
36788            GreenNodeDetails::Token(_) => Self { node },
36789            GreenNodeDetails::Node { .. } => {
36790                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenMod)
36791            }
36792        }
36793    }
36794    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
36795        match node.lookup_intern(db).green.lookup_intern(db).details {
36796            GreenNodeDetails::Token(_) => Some(Self { node }),
36797            GreenNodeDetails::Node { .. } => None,
36798        }
36799    }
36800    fn as_syntax_node(&self) -> SyntaxNode {
36801        self.node
36802    }
36803    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
36804        TokenModPtr(self.node.stable_ptr(db))
36805    }
36806}
36807#[derive(Clone, Debug, Eq, Hash, PartialEq)]
36808pub struct TerminalMod {
36809    node: SyntaxNode,
36810}
36811impl Terminal for TerminalMod {
36812    const KIND: SyntaxKind = SyntaxKind::TerminalMod;
36813    type TokenType = TokenMod;
36814    fn new_green(
36815        db: &dyn SyntaxGroup,
36816        leading_trivia: TriviaGreen,
36817        token: <<TerminalMod as Terminal>::TokenType as TypedSyntaxNode>::Green,
36818        trailing_trivia: TriviaGreen,
36819    ) -> Self::Green {
36820        let children = [leading_trivia.0, token.0, trailing_trivia.0];
36821        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
36822        TerminalModGreen(
36823            Arc::new(GreenNode {
36824                kind: SyntaxKind::TerminalMod,
36825                details: GreenNodeDetails::Node { children: children.into(), width },
36826            })
36827            .intern(db),
36828        )
36829    }
36830    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
36831        let GreenNodeDetails::Node { children, .. } =
36832            &self.node.lookup_intern(db).green.lookup_intern(db).details
36833        else {
36834            unreachable!("Expected a node, not a token");
36835        };
36836        extract_matches!(&children[1].lookup_intern(db).details, GreenNodeDetails::Token).clone()
36837    }
36838}
36839impl TerminalMod {
36840    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
36841        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
36842    }
36843    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenMod {
36844        TokenMod::from_syntax_node(db, self.node.get_children(db)[1])
36845    }
36846    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
36847        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
36848    }
36849}
36850#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
36851pub struct TerminalModPtr(pub SyntaxStablePtrId);
36852impl TerminalModPtr {}
36853impl TypedStablePtr for TerminalModPtr {
36854    type SyntaxNode = TerminalMod;
36855    fn untyped(&self) -> SyntaxStablePtrId {
36856        self.0
36857    }
36858    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalMod {
36859        TerminalMod::from_syntax_node(db, self.0.lookup(db))
36860    }
36861}
36862impl From<TerminalModPtr> for SyntaxStablePtrId {
36863    fn from(ptr: TerminalModPtr) -> Self {
36864        ptr.untyped()
36865    }
36866}
36867#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
36868pub struct TerminalModGreen(pub GreenId);
36869impl TypedSyntaxNode for TerminalMod {
36870    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalMod);
36871    type StablePtr = TerminalModPtr;
36872    type Green = TerminalModGreen;
36873    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
36874        TerminalModGreen(
36875            Arc::new(GreenNode {
36876                kind: SyntaxKind::TerminalMod,
36877                details: GreenNodeDetails::Node {
36878                    children: [
36879                        Trivia::missing(db).0,
36880                        TokenMod::missing(db).0,
36881                        Trivia::missing(db).0,
36882                    ]
36883                    .into(),
36884                    width: TextWidth::default(),
36885                },
36886            })
36887            .intern(db),
36888        )
36889    }
36890    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
36891        let kind = node.kind(db);
36892        assert_eq!(
36893            kind,
36894            SyntaxKind::TerminalMod,
36895            "Unexpected SyntaxKind {:?}. Expected {:?}.",
36896            kind,
36897            SyntaxKind::TerminalMod
36898        );
36899        Self { node }
36900    }
36901    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
36902        let kind = node.kind(db);
36903        if kind == SyntaxKind::TerminalMod { Some(Self::from_syntax_node(db, node)) } else { None }
36904    }
36905    fn as_syntax_node(&self) -> SyntaxNode {
36906        self.node
36907    }
36908    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
36909        TerminalModPtr(self.node.stable_ptr(db))
36910    }
36911}
36912#[derive(Clone, Debug, Eq, Hash, PartialEq)]
36913pub struct TokenModEq {
36914    node: SyntaxNode,
36915}
36916impl Token for TokenModEq {
36917    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
36918        TokenModEqGreen(
36919            Arc::new(GreenNode {
36920                kind: SyntaxKind::TokenModEq,
36921                details: GreenNodeDetails::Token(text),
36922            })
36923            .intern(db),
36924        )
36925    }
36926    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
36927        extract_matches!(
36928            &self.node.lookup_intern(db).green.lookup_intern(db).details,
36929            GreenNodeDetails::Token
36930        )
36931        .clone()
36932    }
36933}
36934#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
36935pub struct TokenModEqPtr(pub SyntaxStablePtrId);
36936impl TypedStablePtr for TokenModEqPtr {
36937    type SyntaxNode = TokenModEq;
36938    fn untyped(&self) -> SyntaxStablePtrId {
36939        self.0
36940    }
36941    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenModEq {
36942        TokenModEq::from_syntax_node(db, self.0.lookup(db))
36943    }
36944}
36945impl From<TokenModEqPtr> for SyntaxStablePtrId {
36946    fn from(ptr: TokenModEqPtr) -> Self {
36947        ptr.untyped()
36948    }
36949}
36950#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
36951pub struct TokenModEqGreen(pub GreenId);
36952impl TokenModEqGreen {
36953    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
36954        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
36955    }
36956}
36957impl TypedSyntaxNode for TokenModEq {
36958    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenModEq);
36959    type StablePtr = TokenModEqPtr;
36960    type Green = TokenModEqGreen;
36961    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
36962        TokenModEqGreen(
36963            Arc::new(GreenNode {
36964                kind: SyntaxKind::TokenMissing,
36965                details: GreenNodeDetails::Token("".into()),
36966            })
36967            .intern(db),
36968        )
36969    }
36970    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
36971        match node.lookup_intern(db).green.lookup_intern(db).details {
36972            GreenNodeDetails::Token(_) => Self { node },
36973            GreenNodeDetails::Node { .. } => {
36974                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenModEq)
36975            }
36976        }
36977    }
36978    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
36979        match node.lookup_intern(db).green.lookup_intern(db).details {
36980            GreenNodeDetails::Token(_) => Some(Self { node }),
36981            GreenNodeDetails::Node { .. } => None,
36982        }
36983    }
36984    fn as_syntax_node(&self) -> SyntaxNode {
36985        self.node
36986    }
36987    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
36988        TokenModEqPtr(self.node.stable_ptr(db))
36989    }
36990}
36991#[derive(Clone, Debug, Eq, Hash, PartialEq)]
36992pub struct TerminalModEq {
36993    node: SyntaxNode,
36994}
36995impl Terminal for TerminalModEq {
36996    const KIND: SyntaxKind = SyntaxKind::TerminalModEq;
36997    type TokenType = TokenModEq;
36998    fn new_green(
36999        db: &dyn SyntaxGroup,
37000        leading_trivia: TriviaGreen,
37001        token: <<TerminalModEq as Terminal>::TokenType as TypedSyntaxNode>::Green,
37002        trailing_trivia: TriviaGreen,
37003    ) -> Self::Green {
37004        let children = [leading_trivia.0, token.0, trailing_trivia.0];
37005        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
37006        TerminalModEqGreen(
37007            Arc::new(GreenNode {
37008                kind: SyntaxKind::TerminalModEq,
37009                details: GreenNodeDetails::Node { children: children.into(), width },
37010            })
37011            .intern(db),
37012        )
37013    }
37014    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
37015        let GreenNodeDetails::Node { children, .. } =
37016            &self.node.lookup_intern(db).green.lookup_intern(db).details
37017        else {
37018            unreachable!("Expected a node, not a token");
37019        };
37020        extract_matches!(&children[1].lookup_intern(db).details, GreenNodeDetails::Token).clone()
37021    }
37022}
37023impl TerminalModEq {
37024    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
37025        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
37026    }
37027    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenModEq {
37028        TokenModEq::from_syntax_node(db, self.node.get_children(db)[1])
37029    }
37030    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
37031        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
37032    }
37033}
37034#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
37035pub struct TerminalModEqPtr(pub SyntaxStablePtrId);
37036impl TerminalModEqPtr {}
37037impl TypedStablePtr for TerminalModEqPtr {
37038    type SyntaxNode = TerminalModEq;
37039    fn untyped(&self) -> SyntaxStablePtrId {
37040        self.0
37041    }
37042    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalModEq {
37043        TerminalModEq::from_syntax_node(db, self.0.lookup(db))
37044    }
37045}
37046impl From<TerminalModEqPtr> for SyntaxStablePtrId {
37047    fn from(ptr: TerminalModEqPtr) -> Self {
37048        ptr.untyped()
37049    }
37050}
37051#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
37052pub struct TerminalModEqGreen(pub GreenId);
37053impl TypedSyntaxNode for TerminalModEq {
37054    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalModEq);
37055    type StablePtr = TerminalModEqPtr;
37056    type Green = TerminalModEqGreen;
37057    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
37058        TerminalModEqGreen(
37059            Arc::new(GreenNode {
37060                kind: SyntaxKind::TerminalModEq,
37061                details: GreenNodeDetails::Node {
37062                    children: [
37063                        Trivia::missing(db).0,
37064                        TokenModEq::missing(db).0,
37065                        Trivia::missing(db).0,
37066                    ]
37067                    .into(),
37068                    width: TextWidth::default(),
37069                },
37070            })
37071            .intern(db),
37072        )
37073    }
37074    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
37075        let kind = node.kind(db);
37076        assert_eq!(
37077            kind,
37078            SyntaxKind::TerminalModEq,
37079            "Unexpected SyntaxKind {:?}. Expected {:?}.",
37080            kind,
37081            SyntaxKind::TerminalModEq
37082        );
37083        Self { node }
37084    }
37085    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
37086        let kind = node.kind(db);
37087        if kind == SyntaxKind::TerminalModEq {
37088            Some(Self::from_syntax_node(db, node))
37089        } else {
37090            None
37091        }
37092    }
37093    fn as_syntax_node(&self) -> SyntaxNode {
37094        self.node
37095    }
37096    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
37097        TerminalModEqPtr(self.node.stable_ptr(db))
37098    }
37099}
37100#[derive(Clone, Debug, Eq, Hash, PartialEq)]
37101pub struct TokenMul {
37102    node: SyntaxNode,
37103}
37104impl Token for TokenMul {
37105    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
37106        TokenMulGreen(
37107            Arc::new(GreenNode {
37108                kind: SyntaxKind::TokenMul,
37109                details: GreenNodeDetails::Token(text),
37110            })
37111            .intern(db),
37112        )
37113    }
37114    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
37115        extract_matches!(
37116            &self.node.lookup_intern(db).green.lookup_intern(db).details,
37117            GreenNodeDetails::Token
37118        )
37119        .clone()
37120    }
37121}
37122#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
37123pub struct TokenMulPtr(pub SyntaxStablePtrId);
37124impl TypedStablePtr for TokenMulPtr {
37125    type SyntaxNode = TokenMul;
37126    fn untyped(&self) -> SyntaxStablePtrId {
37127        self.0
37128    }
37129    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenMul {
37130        TokenMul::from_syntax_node(db, self.0.lookup(db))
37131    }
37132}
37133impl From<TokenMulPtr> for SyntaxStablePtrId {
37134    fn from(ptr: TokenMulPtr) -> Self {
37135        ptr.untyped()
37136    }
37137}
37138#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
37139pub struct TokenMulGreen(pub GreenId);
37140impl TokenMulGreen {
37141    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
37142        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
37143    }
37144}
37145impl TypedSyntaxNode for TokenMul {
37146    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenMul);
37147    type StablePtr = TokenMulPtr;
37148    type Green = TokenMulGreen;
37149    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
37150        TokenMulGreen(
37151            Arc::new(GreenNode {
37152                kind: SyntaxKind::TokenMissing,
37153                details: GreenNodeDetails::Token("".into()),
37154            })
37155            .intern(db),
37156        )
37157    }
37158    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
37159        match node.lookup_intern(db).green.lookup_intern(db).details {
37160            GreenNodeDetails::Token(_) => Self { node },
37161            GreenNodeDetails::Node { .. } => {
37162                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenMul)
37163            }
37164        }
37165    }
37166    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
37167        match node.lookup_intern(db).green.lookup_intern(db).details {
37168            GreenNodeDetails::Token(_) => Some(Self { node }),
37169            GreenNodeDetails::Node { .. } => None,
37170        }
37171    }
37172    fn as_syntax_node(&self) -> SyntaxNode {
37173        self.node
37174    }
37175    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
37176        TokenMulPtr(self.node.stable_ptr(db))
37177    }
37178}
37179#[derive(Clone, Debug, Eq, Hash, PartialEq)]
37180pub struct TerminalMul {
37181    node: SyntaxNode,
37182}
37183impl Terminal for TerminalMul {
37184    const KIND: SyntaxKind = SyntaxKind::TerminalMul;
37185    type TokenType = TokenMul;
37186    fn new_green(
37187        db: &dyn SyntaxGroup,
37188        leading_trivia: TriviaGreen,
37189        token: <<TerminalMul as Terminal>::TokenType as TypedSyntaxNode>::Green,
37190        trailing_trivia: TriviaGreen,
37191    ) -> Self::Green {
37192        let children = [leading_trivia.0, token.0, trailing_trivia.0];
37193        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
37194        TerminalMulGreen(
37195            Arc::new(GreenNode {
37196                kind: SyntaxKind::TerminalMul,
37197                details: GreenNodeDetails::Node { children: children.into(), width },
37198            })
37199            .intern(db),
37200        )
37201    }
37202    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
37203        let GreenNodeDetails::Node { children, .. } =
37204            &self.node.lookup_intern(db).green.lookup_intern(db).details
37205        else {
37206            unreachable!("Expected a node, not a token");
37207        };
37208        extract_matches!(&children[1].lookup_intern(db).details, GreenNodeDetails::Token).clone()
37209    }
37210}
37211impl TerminalMul {
37212    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
37213        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
37214    }
37215    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenMul {
37216        TokenMul::from_syntax_node(db, self.node.get_children(db)[1])
37217    }
37218    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
37219        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
37220    }
37221}
37222#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
37223pub struct TerminalMulPtr(pub SyntaxStablePtrId);
37224impl TerminalMulPtr {}
37225impl TypedStablePtr for TerminalMulPtr {
37226    type SyntaxNode = TerminalMul;
37227    fn untyped(&self) -> SyntaxStablePtrId {
37228        self.0
37229    }
37230    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalMul {
37231        TerminalMul::from_syntax_node(db, self.0.lookup(db))
37232    }
37233}
37234impl From<TerminalMulPtr> for SyntaxStablePtrId {
37235    fn from(ptr: TerminalMulPtr) -> Self {
37236        ptr.untyped()
37237    }
37238}
37239#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
37240pub struct TerminalMulGreen(pub GreenId);
37241impl TypedSyntaxNode for TerminalMul {
37242    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalMul);
37243    type StablePtr = TerminalMulPtr;
37244    type Green = TerminalMulGreen;
37245    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
37246        TerminalMulGreen(
37247            Arc::new(GreenNode {
37248                kind: SyntaxKind::TerminalMul,
37249                details: GreenNodeDetails::Node {
37250                    children: [
37251                        Trivia::missing(db).0,
37252                        TokenMul::missing(db).0,
37253                        Trivia::missing(db).0,
37254                    ]
37255                    .into(),
37256                    width: TextWidth::default(),
37257                },
37258            })
37259            .intern(db),
37260        )
37261    }
37262    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
37263        let kind = node.kind(db);
37264        assert_eq!(
37265            kind,
37266            SyntaxKind::TerminalMul,
37267            "Unexpected SyntaxKind {:?}. Expected {:?}.",
37268            kind,
37269            SyntaxKind::TerminalMul
37270        );
37271        Self { node }
37272    }
37273    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
37274        let kind = node.kind(db);
37275        if kind == SyntaxKind::TerminalMul { Some(Self::from_syntax_node(db, node)) } else { None }
37276    }
37277    fn as_syntax_node(&self) -> SyntaxNode {
37278        self.node
37279    }
37280    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
37281        TerminalMulPtr(self.node.stable_ptr(db))
37282    }
37283}
37284#[derive(Clone, Debug, Eq, Hash, PartialEq)]
37285pub struct TokenMulEq {
37286    node: SyntaxNode,
37287}
37288impl Token for TokenMulEq {
37289    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
37290        TokenMulEqGreen(
37291            Arc::new(GreenNode {
37292                kind: SyntaxKind::TokenMulEq,
37293                details: GreenNodeDetails::Token(text),
37294            })
37295            .intern(db),
37296        )
37297    }
37298    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
37299        extract_matches!(
37300            &self.node.lookup_intern(db).green.lookup_intern(db).details,
37301            GreenNodeDetails::Token
37302        )
37303        .clone()
37304    }
37305}
37306#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
37307pub struct TokenMulEqPtr(pub SyntaxStablePtrId);
37308impl TypedStablePtr for TokenMulEqPtr {
37309    type SyntaxNode = TokenMulEq;
37310    fn untyped(&self) -> SyntaxStablePtrId {
37311        self.0
37312    }
37313    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenMulEq {
37314        TokenMulEq::from_syntax_node(db, self.0.lookup(db))
37315    }
37316}
37317impl From<TokenMulEqPtr> for SyntaxStablePtrId {
37318    fn from(ptr: TokenMulEqPtr) -> Self {
37319        ptr.untyped()
37320    }
37321}
37322#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
37323pub struct TokenMulEqGreen(pub GreenId);
37324impl TokenMulEqGreen {
37325    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
37326        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
37327    }
37328}
37329impl TypedSyntaxNode for TokenMulEq {
37330    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenMulEq);
37331    type StablePtr = TokenMulEqPtr;
37332    type Green = TokenMulEqGreen;
37333    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
37334        TokenMulEqGreen(
37335            Arc::new(GreenNode {
37336                kind: SyntaxKind::TokenMissing,
37337                details: GreenNodeDetails::Token("".into()),
37338            })
37339            .intern(db),
37340        )
37341    }
37342    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
37343        match node.lookup_intern(db).green.lookup_intern(db).details {
37344            GreenNodeDetails::Token(_) => Self { node },
37345            GreenNodeDetails::Node { .. } => {
37346                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenMulEq)
37347            }
37348        }
37349    }
37350    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
37351        match node.lookup_intern(db).green.lookup_intern(db).details {
37352            GreenNodeDetails::Token(_) => Some(Self { node }),
37353            GreenNodeDetails::Node { .. } => None,
37354        }
37355    }
37356    fn as_syntax_node(&self) -> SyntaxNode {
37357        self.node
37358    }
37359    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
37360        TokenMulEqPtr(self.node.stable_ptr(db))
37361    }
37362}
37363#[derive(Clone, Debug, Eq, Hash, PartialEq)]
37364pub struct TerminalMulEq {
37365    node: SyntaxNode,
37366}
37367impl Terminal for TerminalMulEq {
37368    const KIND: SyntaxKind = SyntaxKind::TerminalMulEq;
37369    type TokenType = TokenMulEq;
37370    fn new_green(
37371        db: &dyn SyntaxGroup,
37372        leading_trivia: TriviaGreen,
37373        token: <<TerminalMulEq as Terminal>::TokenType as TypedSyntaxNode>::Green,
37374        trailing_trivia: TriviaGreen,
37375    ) -> Self::Green {
37376        let children = [leading_trivia.0, token.0, trailing_trivia.0];
37377        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
37378        TerminalMulEqGreen(
37379            Arc::new(GreenNode {
37380                kind: SyntaxKind::TerminalMulEq,
37381                details: GreenNodeDetails::Node { children: children.into(), width },
37382            })
37383            .intern(db),
37384        )
37385    }
37386    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
37387        let GreenNodeDetails::Node { children, .. } =
37388            &self.node.lookup_intern(db).green.lookup_intern(db).details
37389        else {
37390            unreachable!("Expected a node, not a token");
37391        };
37392        extract_matches!(&children[1].lookup_intern(db).details, GreenNodeDetails::Token).clone()
37393    }
37394}
37395impl TerminalMulEq {
37396    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
37397        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
37398    }
37399    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenMulEq {
37400        TokenMulEq::from_syntax_node(db, self.node.get_children(db)[1])
37401    }
37402    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
37403        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
37404    }
37405}
37406#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
37407pub struct TerminalMulEqPtr(pub SyntaxStablePtrId);
37408impl TerminalMulEqPtr {}
37409impl TypedStablePtr for TerminalMulEqPtr {
37410    type SyntaxNode = TerminalMulEq;
37411    fn untyped(&self) -> SyntaxStablePtrId {
37412        self.0
37413    }
37414    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalMulEq {
37415        TerminalMulEq::from_syntax_node(db, self.0.lookup(db))
37416    }
37417}
37418impl From<TerminalMulEqPtr> for SyntaxStablePtrId {
37419    fn from(ptr: TerminalMulEqPtr) -> Self {
37420        ptr.untyped()
37421    }
37422}
37423#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
37424pub struct TerminalMulEqGreen(pub GreenId);
37425impl TypedSyntaxNode for TerminalMulEq {
37426    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalMulEq);
37427    type StablePtr = TerminalMulEqPtr;
37428    type Green = TerminalMulEqGreen;
37429    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
37430        TerminalMulEqGreen(
37431            Arc::new(GreenNode {
37432                kind: SyntaxKind::TerminalMulEq,
37433                details: GreenNodeDetails::Node {
37434                    children: [
37435                        Trivia::missing(db).0,
37436                        TokenMulEq::missing(db).0,
37437                        Trivia::missing(db).0,
37438                    ]
37439                    .into(),
37440                    width: TextWidth::default(),
37441                },
37442            })
37443            .intern(db),
37444        )
37445    }
37446    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
37447        let kind = node.kind(db);
37448        assert_eq!(
37449            kind,
37450            SyntaxKind::TerminalMulEq,
37451            "Unexpected SyntaxKind {:?}. Expected {:?}.",
37452            kind,
37453            SyntaxKind::TerminalMulEq
37454        );
37455        Self { node }
37456    }
37457    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
37458        let kind = node.kind(db);
37459        if kind == SyntaxKind::TerminalMulEq {
37460            Some(Self::from_syntax_node(db, node))
37461        } else {
37462            None
37463        }
37464    }
37465    fn as_syntax_node(&self) -> SyntaxNode {
37466        self.node
37467    }
37468    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
37469        TerminalMulEqPtr(self.node.stable_ptr(db))
37470    }
37471}
37472#[derive(Clone, Debug, Eq, Hash, PartialEq)]
37473pub struct TokenNeq {
37474    node: SyntaxNode,
37475}
37476impl Token for TokenNeq {
37477    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
37478        TokenNeqGreen(
37479            Arc::new(GreenNode {
37480                kind: SyntaxKind::TokenNeq,
37481                details: GreenNodeDetails::Token(text),
37482            })
37483            .intern(db),
37484        )
37485    }
37486    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
37487        extract_matches!(
37488            &self.node.lookup_intern(db).green.lookup_intern(db).details,
37489            GreenNodeDetails::Token
37490        )
37491        .clone()
37492    }
37493}
37494#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
37495pub struct TokenNeqPtr(pub SyntaxStablePtrId);
37496impl TypedStablePtr for TokenNeqPtr {
37497    type SyntaxNode = TokenNeq;
37498    fn untyped(&self) -> SyntaxStablePtrId {
37499        self.0
37500    }
37501    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenNeq {
37502        TokenNeq::from_syntax_node(db, self.0.lookup(db))
37503    }
37504}
37505impl From<TokenNeqPtr> for SyntaxStablePtrId {
37506    fn from(ptr: TokenNeqPtr) -> Self {
37507        ptr.untyped()
37508    }
37509}
37510#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
37511pub struct TokenNeqGreen(pub GreenId);
37512impl TokenNeqGreen {
37513    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
37514        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
37515    }
37516}
37517impl TypedSyntaxNode for TokenNeq {
37518    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenNeq);
37519    type StablePtr = TokenNeqPtr;
37520    type Green = TokenNeqGreen;
37521    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
37522        TokenNeqGreen(
37523            Arc::new(GreenNode {
37524                kind: SyntaxKind::TokenMissing,
37525                details: GreenNodeDetails::Token("".into()),
37526            })
37527            .intern(db),
37528        )
37529    }
37530    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
37531        match node.lookup_intern(db).green.lookup_intern(db).details {
37532            GreenNodeDetails::Token(_) => Self { node },
37533            GreenNodeDetails::Node { .. } => {
37534                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenNeq)
37535            }
37536        }
37537    }
37538    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
37539        match node.lookup_intern(db).green.lookup_intern(db).details {
37540            GreenNodeDetails::Token(_) => Some(Self { node }),
37541            GreenNodeDetails::Node { .. } => None,
37542        }
37543    }
37544    fn as_syntax_node(&self) -> SyntaxNode {
37545        self.node
37546    }
37547    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
37548        TokenNeqPtr(self.node.stable_ptr(db))
37549    }
37550}
37551#[derive(Clone, Debug, Eq, Hash, PartialEq)]
37552pub struct TerminalNeq {
37553    node: SyntaxNode,
37554}
37555impl Terminal for TerminalNeq {
37556    const KIND: SyntaxKind = SyntaxKind::TerminalNeq;
37557    type TokenType = TokenNeq;
37558    fn new_green(
37559        db: &dyn SyntaxGroup,
37560        leading_trivia: TriviaGreen,
37561        token: <<TerminalNeq as Terminal>::TokenType as TypedSyntaxNode>::Green,
37562        trailing_trivia: TriviaGreen,
37563    ) -> Self::Green {
37564        let children = [leading_trivia.0, token.0, trailing_trivia.0];
37565        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
37566        TerminalNeqGreen(
37567            Arc::new(GreenNode {
37568                kind: SyntaxKind::TerminalNeq,
37569                details: GreenNodeDetails::Node { children: children.into(), width },
37570            })
37571            .intern(db),
37572        )
37573    }
37574    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
37575        let GreenNodeDetails::Node { children, .. } =
37576            &self.node.lookup_intern(db).green.lookup_intern(db).details
37577        else {
37578            unreachable!("Expected a node, not a token");
37579        };
37580        extract_matches!(&children[1].lookup_intern(db).details, GreenNodeDetails::Token).clone()
37581    }
37582}
37583impl TerminalNeq {
37584    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
37585        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
37586    }
37587    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenNeq {
37588        TokenNeq::from_syntax_node(db, self.node.get_children(db)[1])
37589    }
37590    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
37591        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
37592    }
37593}
37594#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
37595pub struct TerminalNeqPtr(pub SyntaxStablePtrId);
37596impl TerminalNeqPtr {}
37597impl TypedStablePtr for TerminalNeqPtr {
37598    type SyntaxNode = TerminalNeq;
37599    fn untyped(&self) -> SyntaxStablePtrId {
37600        self.0
37601    }
37602    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalNeq {
37603        TerminalNeq::from_syntax_node(db, self.0.lookup(db))
37604    }
37605}
37606impl From<TerminalNeqPtr> for SyntaxStablePtrId {
37607    fn from(ptr: TerminalNeqPtr) -> Self {
37608        ptr.untyped()
37609    }
37610}
37611#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
37612pub struct TerminalNeqGreen(pub GreenId);
37613impl TypedSyntaxNode for TerminalNeq {
37614    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalNeq);
37615    type StablePtr = TerminalNeqPtr;
37616    type Green = TerminalNeqGreen;
37617    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
37618        TerminalNeqGreen(
37619            Arc::new(GreenNode {
37620                kind: SyntaxKind::TerminalNeq,
37621                details: GreenNodeDetails::Node {
37622                    children: [
37623                        Trivia::missing(db).0,
37624                        TokenNeq::missing(db).0,
37625                        Trivia::missing(db).0,
37626                    ]
37627                    .into(),
37628                    width: TextWidth::default(),
37629                },
37630            })
37631            .intern(db),
37632        )
37633    }
37634    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
37635        let kind = node.kind(db);
37636        assert_eq!(
37637            kind,
37638            SyntaxKind::TerminalNeq,
37639            "Unexpected SyntaxKind {:?}. Expected {:?}.",
37640            kind,
37641            SyntaxKind::TerminalNeq
37642        );
37643        Self { node }
37644    }
37645    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
37646        let kind = node.kind(db);
37647        if kind == SyntaxKind::TerminalNeq { Some(Self::from_syntax_node(db, node)) } else { None }
37648    }
37649    fn as_syntax_node(&self) -> SyntaxNode {
37650        self.node
37651    }
37652    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
37653        TerminalNeqPtr(self.node.stable_ptr(db))
37654    }
37655}
37656#[derive(Clone, Debug, Eq, Hash, PartialEq)]
37657pub struct TokenNot {
37658    node: SyntaxNode,
37659}
37660impl Token for TokenNot {
37661    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
37662        TokenNotGreen(
37663            Arc::new(GreenNode {
37664                kind: SyntaxKind::TokenNot,
37665                details: GreenNodeDetails::Token(text),
37666            })
37667            .intern(db),
37668        )
37669    }
37670    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
37671        extract_matches!(
37672            &self.node.lookup_intern(db).green.lookup_intern(db).details,
37673            GreenNodeDetails::Token
37674        )
37675        .clone()
37676    }
37677}
37678#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
37679pub struct TokenNotPtr(pub SyntaxStablePtrId);
37680impl TypedStablePtr for TokenNotPtr {
37681    type SyntaxNode = TokenNot;
37682    fn untyped(&self) -> SyntaxStablePtrId {
37683        self.0
37684    }
37685    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenNot {
37686        TokenNot::from_syntax_node(db, self.0.lookup(db))
37687    }
37688}
37689impl From<TokenNotPtr> for SyntaxStablePtrId {
37690    fn from(ptr: TokenNotPtr) -> Self {
37691        ptr.untyped()
37692    }
37693}
37694#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
37695pub struct TokenNotGreen(pub GreenId);
37696impl TokenNotGreen {
37697    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
37698        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
37699    }
37700}
37701impl TypedSyntaxNode for TokenNot {
37702    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenNot);
37703    type StablePtr = TokenNotPtr;
37704    type Green = TokenNotGreen;
37705    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
37706        TokenNotGreen(
37707            Arc::new(GreenNode {
37708                kind: SyntaxKind::TokenMissing,
37709                details: GreenNodeDetails::Token("".into()),
37710            })
37711            .intern(db),
37712        )
37713    }
37714    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
37715        match node.lookup_intern(db).green.lookup_intern(db).details {
37716            GreenNodeDetails::Token(_) => Self { node },
37717            GreenNodeDetails::Node { .. } => {
37718                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenNot)
37719            }
37720        }
37721    }
37722    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
37723        match node.lookup_intern(db).green.lookup_intern(db).details {
37724            GreenNodeDetails::Token(_) => Some(Self { node }),
37725            GreenNodeDetails::Node { .. } => None,
37726        }
37727    }
37728    fn as_syntax_node(&self) -> SyntaxNode {
37729        self.node
37730    }
37731    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
37732        TokenNotPtr(self.node.stable_ptr(db))
37733    }
37734}
37735#[derive(Clone, Debug, Eq, Hash, PartialEq)]
37736pub struct TerminalNot {
37737    node: SyntaxNode,
37738}
37739impl Terminal for TerminalNot {
37740    const KIND: SyntaxKind = SyntaxKind::TerminalNot;
37741    type TokenType = TokenNot;
37742    fn new_green(
37743        db: &dyn SyntaxGroup,
37744        leading_trivia: TriviaGreen,
37745        token: <<TerminalNot as Terminal>::TokenType as TypedSyntaxNode>::Green,
37746        trailing_trivia: TriviaGreen,
37747    ) -> Self::Green {
37748        let children = [leading_trivia.0, token.0, trailing_trivia.0];
37749        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
37750        TerminalNotGreen(
37751            Arc::new(GreenNode {
37752                kind: SyntaxKind::TerminalNot,
37753                details: GreenNodeDetails::Node { children: children.into(), width },
37754            })
37755            .intern(db),
37756        )
37757    }
37758    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
37759        let GreenNodeDetails::Node { children, .. } =
37760            &self.node.lookup_intern(db).green.lookup_intern(db).details
37761        else {
37762            unreachable!("Expected a node, not a token");
37763        };
37764        extract_matches!(&children[1].lookup_intern(db).details, GreenNodeDetails::Token).clone()
37765    }
37766}
37767impl TerminalNot {
37768    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
37769        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
37770    }
37771    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenNot {
37772        TokenNot::from_syntax_node(db, self.node.get_children(db)[1])
37773    }
37774    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
37775        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
37776    }
37777}
37778#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
37779pub struct TerminalNotPtr(pub SyntaxStablePtrId);
37780impl TerminalNotPtr {}
37781impl TypedStablePtr for TerminalNotPtr {
37782    type SyntaxNode = TerminalNot;
37783    fn untyped(&self) -> SyntaxStablePtrId {
37784        self.0
37785    }
37786    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalNot {
37787        TerminalNot::from_syntax_node(db, self.0.lookup(db))
37788    }
37789}
37790impl From<TerminalNotPtr> for SyntaxStablePtrId {
37791    fn from(ptr: TerminalNotPtr) -> Self {
37792        ptr.untyped()
37793    }
37794}
37795#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
37796pub struct TerminalNotGreen(pub GreenId);
37797impl TypedSyntaxNode for TerminalNot {
37798    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalNot);
37799    type StablePtr = TerminalNotPtr;
37800    type Green = TerminalNotGreen;
37801    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
37802        TerminalNotGreen(
37803            Arc::new(GreenNode {
37804                kind: SyntaxKind::TerminalNot,
37805                details: GreenNodeDetails::Node {
37806                    children: [
37807                        Trivia::missing(db).0,
37808                        TokenNot::missing(db).0,
37809                        Trivia::missing(db).0,
37810                    ]
37811                    .into(),
37812                    width: TextWidth::default(),
37813                },
37814            })
37815            .intern(db),
37816        )
37817    }
37818    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
37819        let kind = node.kind(db);
37820        assert_eq!(
37821            kind,
37822            SyntaxKind::TerminalNot,
37823            "Unexpected SyntaxKind {:?}. Expected {:?}.",
37824            kind,
37825            SyntaxKind::TerminalNot
37826        );
37827        Self { node }
37828    }
37829    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
37830        let kind = node.kind(db);
37831        if kind == SyntaxKind::TerminalNot { Some(Self::from_syntax_node(db, node)) } else { None }
37832    }
37833    fn as_syntax_node(&self) -> SyntaxNode {
37834        self.node
37835    }
37836    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
37837        TerminalNotPtr(self.node.stable_ptr(db))
37838    }
37839}
37840#[derive(Clone, Debug, Eq, Hash, PartialEq)]
37841pub struct TokenBitNot {
37842    node: SyntaxNode,
37843}
37844impl Token for TokenBitNot {
37845    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
37846        TokenBitNotGreen(
37847            Arc::new(GreenNode {
37848                kind: SyntaxKind::TokenBitNot,
37849                details: GreenNodeDetails::Token(text),
37850            })
37851            .intern(db),
37852        )
37853    }
37854    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
37855        extract_matches!(
37856            &self.node.lookup_intern(db).green.lookup_intern(db).details,
37857            GreenNodeDetails::Token
37858        )
37859        .clone()
37860    }
37861}
37862#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
37863pub struct TokenBitNotPtr(pub SyntaxStablePtrId);
37864impl TypedStablePtr for TokenBitNotPtr {
37865    type SyntaxNode = TokenBitNot;
37866    fn untyped(&self) -> SyntaxStablePtrId {
37867        self.0
37868    }
37869    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenBitNot {
37870        TokenBitNot::from_syntax_node(db, self.0.lookup(db))
37871    }
37872}
37873impl From<TokenBitNotPtr> for SyntaxStablePtrId {
37874    fn from(ptr: TokenBitNotPtr) -> Self {
37875        ptr.untyped()
37876    }
37877}
37878#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
37879pub struct TokenBitNotGreen(pub GreenId);
37880impl TokenBitNotGreen {
37881    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
37882        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
37883    }
37884}
37885impl TypedSyntaxNode for TokenBitNot {
37886    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenBitNot);
37887    type StablePtr = TokenBitNotPtr;
37888    type Green = TokenBitNotGreen;
37889    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
37890        TokenBitNotGreen(
37891            Arc::new(GreenNode {
37892                kind: SyntaxKind::TokenMissing,
37893                details: GreenNodeDetails::Token("".into()),
37894            })
37895            .intern(db),
37896        )
37897    }
37898    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
37899        match node.lookup_intern(db).green.lookup_intern(db).details {
37900            GreenNodeDetails::Token(_) => Self { node },
37901            GreenNodeDetails::Node { .. } => {
37902                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenBitNot)
37903            }
37904        }
37905    }
37906    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
37907        match node.lookup_intern(db).green.lookup_intern(db).details {
37908            GreenNodeDetails::Token(_) => Some(Self { node }),
37909            GreenNodeDetails::Node { .. } => None,
37910        }
37911    }
37912    fn as_syntax_node(&self) -> SyntaxNode {
37913        self.node
37914    }
37915    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
37916        TokenBitNotPtr(self.node.stable_ptr(db))
37917    }
37918}
37919#[derive(Clone, Debug, Eq, Hash, PartialEq)]
37920pub struct TerminalBitNot {
37921    node: SyntaxNode,
37922}
37923impl Terminal for TerminalBitNot {
37924    const KIND: SyntaxKind = SyntaxKind::TerminalBitNot;
37925    type TokenType = TokenBitNot;
37926    fn new_green(
37927        db: &dyn SyntaxGroup,
37928        leading_trivia: TriviaGreen,
37929        token: <<TerminalBitNot as Terminal>::TokenType as TypedSyntaxNode>::Green,
37930        trailing_trivia: TriviaGreen,
37931    ) -> Self::Green {
37932        let children = [leading_trivia.0, token.0, trailing_trivia.0];
37933        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
37934        TerminalBitNotGreen(
37935            Arc::new(GreenNode {
37936                kind: SyntaxKind::TerminalBitNot,
37937                details: GreenNodeDetails::Node { children: children.into(), width },
37938            })
37939            .intern(db),
37940        )
37941    }
37942    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
37943        let GreenNodeDetails::Node { children, .. } =
37944            &self.node.lookup_intern(db).green.lookup_intern(db).details
37945        else {
37946            unreachable!("Expected a node, not a token");
37947        };
37948        extract_matches!(&children[1].lookup_intern(db).details, GreenNodeDetails::Token).clone()
37949    }
37950}
37951impl TerminalBitNot {
37952    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
37953        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
37954    }
37955    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenBitNot {
37956        TokenBitNot::from_syntax_node(db, self.node.get_children(db)[1])
37957    }
37958    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
37959        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
37960    }
37961}
37962#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
37963pub struct TerminalBitNotPtr(pub SyntaxStablePtrId);
37964impl TerminalBitNotPtr {}
37965impl TypedStablePtr for TerminalBitNotPtr {
37966    type SyntaxNode = TerminalBitNot;
37967    fn untyped(&self) -> SyntaxStablePtrId {
37968        self.0
37969    }
37970    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalBitNot {
37971        TerminalBitNot::from_syntax_node(db, self.0.lookup(db))
37972    }
37973}
37974impl From<TerminalBitNotPtr> for SyntaxStablePtrId {
37975    fn from(ptr: TerminalBitNotPtr) -> Self {
37976        ptr.untyped()
37977    }
37978}
37979#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
37980pub struct TerminalBitNotGreen(pub GreenId);
37981impl TypedSyntaxNode for TerminalBitNot {
37982    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalBitNot);
37983    type StablePtr = TerminalBitNotPtr;
37984    type Green = TerminalBitNotGreen;
37985    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
37986        TerminalBitNotGreen(
37987            Arc::new(GreenNode {
37988                kind: SyntaxKind::TerminalBitNot,
37989                details: GreenNodeDetails::Node {
37990                    children: [
37991                        Trivia::missing(db).0,
37992                        TokenBitNot::missing(db).0,
37993                        Trivia::missing(db).0,
37994                    ]
37995                    .into(),
37996                    width: TextWidth::default(),
37997                },
37998            })
37999            .intern(db),
38000        )
38001    }
38002    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
38003        let kind = node.kind(db);
38004        assert_eq!(
38005            kind,
38006            SyntaxKind::TerminalBitNot,
38007            "Unexpected SyntaxKind {:?}. Expected {:?}.",
38008            kind,
38009            SyntaxKind::TerminalBitNot
38010        );
38011        Self { node }
38012    }
38013    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
38014        let kind = node.kind(db);
38015        if kind == SyntaxKind::TerminalBitNot {
38016            Some(Self::from_syntax_node(db, node))
38017        } else {
38018            None
38019        }
38020    }
38021    fn as_syntax_node(&self) -> SyntaxNode {
38022        self.node
38023    }
38024    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
38025        TerminalBitNotPtr(self.node.stable_ptr(db))
38026    }
38027}
38028#[derive(Clone, Debug, Eq, Hash, PartialEq)]
38029pub struct TokenOr {
38030    node: SyntaxNode,
38031}
38032impl Token for TokenOr {
38033    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
38034        TokenOrGreen(
38035            Arc::new(GreenNode {
38036                kind: SyntaxKind::TokenOr,
38037                details: GreenNodeDetails::Token(text),
38038            })
38039            .intern(db),
38040        )
38041    }
38042    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
38043        extract_matches!(
38044            &self.node.lookup_intern(db).green.lookup_intern(db).details,
38045            GreenNodeDetails::Token
38046        )
38047        .clone()
38048    }
38049}
38050#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
38051pub struct TokenOrPtr(pub SyntaxStablePtrId);
38052impl TypedStablePtr for TokenOrPtr {
38053    type SyntaxNode = TokenOr;
38054    fn untyped(&self) -> SyntaxStablePtrId {
38055        self.0
38056    }
38057    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenOr {
38058        TokenOr::from_syntax_node(db, self.0.lookup(db))
38059    }
38060}
38061impl From<TokenOrPtr> for SyntaxStablePtrId {
38062    fn from(ptr: TokenOrPtr) -> Self {
38063        ptr.untyped()
38064    }
38065}
38066#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
38067pub struct TokenOrGreen(pub GreenId);
38068impl TokenOrGreen {
38069    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
38070        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
38071    }
38072}
38073impl TypedSyntaxNode for TokenOr {
38074    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenOr);
38075    type StablePtr = TokenOrPtr;
38076    type Green = TokenOrGreen;
38077    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
38078        TokenOrGreen(
38079            Arc::new(GreenNode {
38080                kind: SyntaxKind::TokenMissing,
38081                details: GreenNodeDetails::Token("".into()),
38082            })
38083            .intern(db),
38084        )
38085    }
38086    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
38087        match node.lookup_intern(db).green.lookup_intern(db).details {
38088            GreenNodeDetails::Token(_) => Self { node },
38089            GreenNodeDetails::Node { .. } => {
38090                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenOr)
38091            }
38092        }
38093    }
38094    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
38095        match node.lookup_intern(db).green.lookup_intern(db).details {
38096            GreenNodeDetails::Token(_) => Some(Self { node }),
38097            GreenNodeDetails::Node { .. } => None,
38098        }
38099    }
38100    fn as_syntax_node(&self) -> SyntaxNode {
38101        self.node
38102    }
38103    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
38104        TokenOrPtr(self.node.stable_ptr(db))
38105    }
38106}
38107#[derive(Clone, Debug, Eq, Hash, PartialEq)]
38108pub struct TerminalOr {
38109    node: SyntaxNode,
38110}
38111impl Terminal for TerminalOr {
38112    const KIND: SyntaxKind = SyntaxKind::TerminalOr;
38113    type TokenType = TokenOr;
38114    fn new_green(
38115        db: &dyn SyntaxGroup,
38116        leading_trivia: TriviaGreen,
38117        token: <<TerminalOr as Terminal>::TokenType as TypedSyntaxNode>::Green,
38118        trailing_trivia: TriviaGreen,
38119    ) -> Self::Green {
38120        let children = [leading_trivia.0, token.0, trailing_trivia.0];
38121        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
38122        TerminalOrGreen(
38123            Arc::new(GreenNode {
38124                kind: SyntaxKind::TerminalOr,
38125                details: GreenNodeDetails::Node { children: children.into(), width },
38126            })
38127            .intern(db),
38128        )
38129    }
38130    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
38131        let GreenNodeDetails::Node { children, .. } =
38132            &self.node.lookup_intern(db).green.lookup_intern(db).details
38133        else {
38134            unreachable!("Expected a node, not a token");
38135        };
38136        extract_matches!(&children[1].lookup_intern(db).details, GreenNodeDetails::Token).clone()
38137    }
38138}
38139impl TerminalOr {
38140    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
38141        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
38142    }
38143    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenOr {
38144        TokenOr::from_syntax_node(db, self.node.get_children(db)[1])
38145    }
38146    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
38147        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
38148    }
38149}
38150#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
38151pub struct TerminalOrPtr(pub SyntaxStablePtrId);
38152impl TerminalOrPtr {}
38153impl TypedStablePtr for TerminalOrPtr {
38154    type SyntaxNode = TerminalOr;
38155    fn untyped(&self) -> SyntaxStablePtrId {
38156        self.0
38157    }
38158    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalOr {
38159        TerminalOr::from_syntax_node(db, self.0.lookup(db))
38160    }
38161}
38162impl From<TerminalOrPtr> for SyntaxStablePtrId {
38163    fn from(ptr: TerminalOrPtr) -> Self {
38164        ptr.untyped()
38165    }
38166}
38167#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
38168pub struct TerminalOrGreen(pub GreenId);
38169impl TypedSyntaxNode for TerminalOr {
38170    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalOr);
38171    type StablePtr = TerminalOrPtr;
38172    type Green = TerminalOrGreen;
38173    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
38174        TerminalOrGreen(
38175            Arc::new(GreenNode {
38176                kind: SyntaxKind::TerminalOr,
38177                details: GreenNodeDetails::Node {
38178                    children: [
38179                        Trivia::missing(db).0,
38180                        TokenOr::missing(db).0,
38181                        Trivia::missing(db).0,
38182                    ]
38183                    .into(),
38184                    width: TextWidth::default(),
38185                },
38186            })
38187            .intern(db),
38188        )
38189    }
38190    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
38191        let kind = node.kind(db);
38192        assert_eq!(
38193            kind,
38194            SyntaxKind::TerminalOr,
38195            "Unexpected SyntaxKind {:?}. Expected {:?}.",
38196            kind,
38197            SyntaxKind::TerminalOr
38198        );
38199        Self { node }
38200    }
38201    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
38202        let kind = node.kind(db);
38203        if kind == SyntaxKind::TerminalOr { Some(Self::from_syntax_node(db, node)) } else { None }
38204    }
38205    fn as_syntax_node(&self) -> SyntaxNode {
38206        self.node
38207    }
38208    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
38209        TerminalOrPtr(self.node.stable_ptr(db))
38210    }
38211}
38212#[derive(Clone, Debug, Eq, Hash, PartialEq)]
38213pub struct TokenOrOr {
38214    node: SyntaxNode,
38215}
38216impl Token for TokenOrOr {
38217    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
38218        TokenOrOrGreen(
38219            Arc::new(GreenNode {
38220                kind: SyntaxKind::TokenOrOr,
38221                details: GreenNodeDetails::Token(text),
38222            })
38223            .intern(db),
38224        )
38225    }
38226    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
38227        extract_matches!(
38228            &self.node.lookup_intern(db).green.lookup_intern(db).details,
38229            GreenNodeDetails::Token
38230        )
38231        .clone()
38232    }
38233}
38234#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
38235pub struct TokenOrOrPtr(pub SyntaxStablePtrId);
38236impl TypedStablePtr for TokenOrOrPtr {
38237    type SyntaxNode = TokenOrOr;
38238    fn untyped(&self) -> SyntaxStablePtrId {
38239        self.0
38240    }
38241    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenOrOr {
38242        TokenOrOr::from_syntax_node(db, self.0.lookup(db))
38243    }
38244}
38245impl From<TokenOrOrPtr> for SyntaxStablePtrId {
38246    fn from(ptr: TokenOrOrPtr) -> Self {
38247        ptr.untyped()
38248    }
38249}
38250#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
38251pub struct TokenOrOrGreen(pub GreenId);
38252impl TokenOrOrGreen {
38253    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
38254        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
38255    }
38256}
38257impl TypedSyntaxNode for TokenOrOr {
38258    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenOrOr);
38259    type StablePtr = TokenOrOrPtr;
38260    type Green = TokenOrOrGreen;
38261    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
38262        TokenOrOrGreen(
38263            Arc::new(GreenNode {
38264                kind: SyntaxKind::TokenMissing,
38265                details: GreenNodeDetails::Token("".into()),
38266            })
38267            .intern(db),
38268        )
38269    }
38270    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
38271        match node.lookup_intern(db).green.lookup_intern(db).details {
38272            GreenNodeDetails::Token(_) => Self { node },
38273            GreenNodeDetails::Node { .. } => {
38274                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenOrOr)
38275            }
38276        }
38277    }
38278    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
38279        match node.lookup_intern(db).green.lookup_intern(db).details {
38280            GreenNodeDetails::Token(_) => Some(Self { node }),
38281            GreenNodeDetails::Node { .. } => None,
38282        }
38283    }
38284    fn as_syntax_node(&self) -> SyntaxNode {
38285        self.node
38286    }
38287    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
38288        TokenOrOrPtr(self.node.stable_ptr(db))
38289    }
38290}
38291#[derive(Clone, Debug, Eq, Hash, PartialEq)]
38292pub struct TerminalOrOr {
38293    node: SyntaxNode,
38294}
38295impl Terminal for TerminalOrOr {
38296    const KIND: SyntaxKind = SyntaxKind::TerminalOrOr;
38297    type TokenType = TokenOrOr;
38298    fn new_green(
38299        db: &dyn SyntaxGroup,
38300        leading_trivia: TriviaGreen,
38301        token: <<TerminalOrOr as Terminal>::TokenType as TypedSyntaxNode>::Green,
38302        trailing_trivia: TriviaGreen,
38303    ) -> Self::Green {
38304        let children = [leading_trivia.0, token.0, trailing_trivia.0];
38305        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
38306        TerminalOrOrGreen(
38307            Arc::new(GreenNode {
38308                kind: SyntaxKind::TerminalOrOr,
38309                details: GreenNodeDetails::Node { children: children.into(), width },
38310            })
38311            .intern(db),
38312        )
38313    }
38314    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
38315        let GreenNodeDetails::Node { children, .. } =
38316            &self.node.lookup_intern(db).green.lookup_intern(db).details
38317        else {
38318            unreachable!("Expected a node, not a token");
38319        };
38320        extract_matches!(&children[1].lookup_intern(db).details, GreenNodeDetails::Token).clone()
38321    }
38322}
38323impl TerminalOrOr {
38324    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
38325        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
38326    }
38327    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenOrOr {
38328        TokenOrOr::from_syntax_node(db, self.node.get_children(db)[1])
38329    }
38330    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
38331        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
38332    }
38333}
38334#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
38335pub struct TerminalOrOrPtr(pub SyntaxStablePtrId);
38336impl TerminalOrOrPtr {}
38337impl TypedStablePtr for TerminalOrOrPtr {
38338    type SyntaxNode = TerminalOrOr;
38339    fn untyped(&self) -> SyntaxStablePtrId {
38340        self.0
38341    }
38342    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalOrOr {
38343        TerminalOrOr::from_syntax_node(db, self.0.lookup(db))
38344    }
38345}
38346impl From<TerminalOrOrPtr> for SyntaxStablePtrId {
38347    fn from(ptr: TerminalOrOrPtr) -> Self {
38348        ptr.untyped()
38349    }
38350}
38351#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
38352pub struct TerminalOrOrGreen(pub GreenId);
38353impl TypedSyntaxNode for TerminalOrOr {
38354    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalOrOr);
38355    type StablePtr = TerminalOrOrPtr;
38356    type Green = TerminalOrOrGreen;
38357    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
38358        TerminalOrOrGreen(
38359            Arc::new(GreenNode {
38360                kind: SyntaxKind::TerminalOrOr,
38361                details: GreenNodeDetails::Node {
38362                    children: [
38363                        Trivia::missing(db).0,
38364                        TokenOrOr::missing(db).0,
38365                        Trivia::missing(db).0,
38366                    ]
38367                    .into(),
38368                    width: TextWidth::default(),
38369                },
38370            })
38371            .intern(db),
38372        )
38373    }
38374    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
38375        let kind = node.kind(db);
38376        assert_eq!(
38377            kind,
38378            SyntaxKind::TerminalOrOr,
38379            "Unexpected SyntaxKind {:?}. Expected {:?}.",
38380            kind,
38381            SyntaxKind::TerminalOrOr
38382        );
38383        Self { node }
38384    }
38385    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
38386        let kind = node.kind(db);
38387        if kind == SyntaxKind::TerminalOrOr { Some(Self::from_syntax_node(db, node)) } else { None }
38388    }
38389    fn as_syntax_node(&self) -> SyntaxNode {
38390        self.node
38391    }
38392    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
38393        TerminalOrOrPtr(self.node.stable_ptr(db))
38394    }
38395}
38396#[derive(Clone, Debug, Eq, Hash, PartialEq)]
38397pub struct TokenPlus {
38398    node: SyntaxNode,
38399}
38400impl Token for TokenPlus {
38401    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
38402        TokenPlusGreen(
38403            Arc::new(GreenNode {
38404                kind: SyntaxKind::TokenPlus,
38405                details: GreenNodeDetails::Token(text),
38406            })
38407            .intern(db),
38408        )
38409    }
38410    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
38411        extract_matches!(
38412            &self.node.lookup_intern(db).green.lookup_intern(db).details,
38413            GreenNodeDetails::Token
38414        )
38415        .clone()
38416    }
38417}
38418#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
38419pub struct TokenPlusPtr(pub SyntaxStablePtrId);
38420impl TypedStablePtr for TokenPlusPtr {
38421    type SyntaxNode = TokenPlus;
38422    fn untyped(&self) -> SyntaxStablePtrId {
38423        self.0
38424    }
38425    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenPlus {
38426        TokenPlus::from_syntax_node(db, self.0.lookup(db))
38427    }
38428}
38429impl From<TokenPlusPtr> for SyntaxStablePtrId {
38430    fn from(ptr: TokenPlusPtr) -> Self {
38431        ptr.untyped()
38432    }
38433}
38434#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
38435pub struct TokenPlusGreen(pub GreenId);
38436impl TokenPlusGreen {
38437    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
38438        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
38439    }
38440}
38441impl TypedSyntaxNode for TokenPlus {
38442    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenPlus);
38443    type StablePtr = TokenPlusPtr;
38444    type Green = TokenPlusGreen;
38445    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
38446        TokenPlusGreen(
38447            Arc::new(GreenNode {
38448                kind: SyntaxKind::TokenMissing,
38449                details: GreenNodeDetails::Token("".into()),
38450            })
38451            .intern(db),
38452        )
38453    }
38454    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
38455        match node.lookup_intern(db).green.lookup_intern(db).details {
38456            GreenNodeDetails::Token(_) => Self { node },
38457            GreenNodeDetails::Node { .. } => {
38458                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenPlus)
38459            }
38460        }
38461    }
38462    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
38463        match node.lookup_intern(db).green.lookup_intern(db).details {
38464            GreenNodeDetails::Token(_) => Some(Self { node }),
38465            GreenNodeDetails::Node { .. } => None,
38466        }
38467    }
38468    fn as_syntax_node(&self) -> SyntaxNode {
38469        self.node
38470    }
38471    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
38472        TokenPlusPtr(self.node.stable_ptr(db))
38473    }
38474}
38475#[derive(Clone, Debug, Eq, Hash, PartialEq)]
38476pub struct TerminalPlus {
38477    node: SyntaxNode,
38478}
38479impl Terminal for TerminalPlus {
38480    const KIND: SyntaxKind = SyntaxKind::TerminalPlus;
38481    type TokenType = TokenPlus;
38482    fn new_green(
38483        db: &dyn SyntaxGroup,
38484        leading_trivia: TriviaGreen,
38485        token: <<TerminalPlus as Terminal>::TokenType as TypedSyntaxNode>::Green,
38486        trailing_trivia: TriviaGreen,
38487    ) -> Self::Green {
38488        let children = [leading_trivia.0, token.0, trailing_trivia.0];
38489        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
38490        TerminalPlusGreen(
38491            Arc::new(GreenNode {
38492                kind: SyntaxKind::TerminalPlus,
38493                details: GreenNodeDetails::Node { children: children.into(), width },
38494            })
38495            .intern(db),
38496        )
38497    }
38498    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
38499        let GreenNodeDetails::Node { children, .. } =
38500            &self.node.lookup_intern(db).green.lookup_intern(db).details
38501        else {
38502            unreachable!("Expected a node, not a token");
38503        };
38504        extract_matches!(&children[1].lookup_intern(db).details, GreenNodeDetails::Token).clone()
38505    }
38506}
38507impl TerminalPlus {
38508    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
38509        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
38510    }
38511    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenPlus {
38512        TokenPlus::from_syntax_node(db, self.node.get_children(db)[1])
38513    }
38514    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
38515        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
38516    }
38517}
38518#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
38519pub struct TerminalPlusPtr(pub SyntaxStablePtrId);
38520impl TerminalPlusPtr {}
38521impl TypedStablePtr for TerminalPlusPtr {
38522    type SyntaxNode = TerminalPlus;
38523    fn untyped(&self) -> SyntaxStablePtrId {
38524        self.0
38525    }
38526    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalPlus {
38527        TerminalPlus::from_syntax_node(db, self.0.lookup(db))
38528    }
38529}
38530impl From<TerminalPlusPtr> for SyntaxStablePtrId {
38531    fn from(ptr: TerminalPlusPtr) -> Self {
38532        ptr.untyped()
38533    }
38534}
38535#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
38536pub struct TerminalPlusGreen(pub GreenId);
38537impl TypedSyntaxNode for TerminalPlus {
38538    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalPlus);
38539    type StablePtr = TerminalPlusPtr;
38540    type Green = TerminalPlusGreen;
38541    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
38542        TerminalPlusGreen(
38543            Arc::new(GreenNode {
38544                kind: SyntaxKind::TerminalPlus,
38545                details: GreenNodeDetails::Node {
38546                    children: [
38547                        Trivia::missing(db).0,
38548                        TokenPlus::missing(db).0,
38549                        Trivia::missing(db).0,
38550                    ]
38551                    .into(),
38552                    width: TextWidth::default(),
38553                },
38554            })
38555            .intern(db),
38556        )
38557    }
38558    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
38559        let kind = node.kind(db);
38560        assert_eq!(
38561            kind,
38562            SyntaxKind::TerminalPlus,
38563            "Unexpected SyntaxKind {:?}. Expected {:?}.",
38564            kind,
38565            SyntaxKind::TerminalPlus
38566        );
38567        Self { node }
38568    }
38569    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
38570        let kind = node.kind(db);
38571        if kind == SyntaxKind::TerminalPlus { Some(Self::from_syntax_node(db, node)) } else { None }
38572    }
38573    fn as_syntax_node(&self) -> SyntaxNode {
38574        self.node
38575    }
38576    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
38577        TerminalPlusPtr(self.node.stable_ptr(db))
38578    }
38579}
38580#[derive(Clone, Debug, Eq, Hash, PartialEq)]
38581pub struct TokenPlusEq {
38582    node: SyntaxNode,
38583}
38584impl Token for TokenPlusEq {
38585    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
38586        TokenPlusEqGreen(
38587            Arc::new(GreenNode {
38588                kind: SyntaxKind::TokenPlusEq,
38589                details: GreenNodeDetails::Token(text),
38590            })
38591            .intern(db),
38592        )
38593    }
38594    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
38595        extract_matches!(
38596            &self.node.lookup_intern(db).green.lookup_intern(db).details,
38597            GreenNodeDetails::Token
38598        )
38599        .clone()
38600    }
38601}
38602#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
38603pub struct TokenPlusEqPtr(pub SyntaxStablePtrId);
38604impl TypedStablePtr for TokenPlusEqPtr {
38605    type SyntaxNode = TokenPlusEq;
38606    fn untyped(&self) -> SyntaxStablePtrId {
38607        self.0
38608    }
38609    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenPlusEq {
38610        TokenPlusEq::from_syntax_node(db, self.0.lookup(db))
38611    }
38612}
38613impl From<TokenPlusEqPtr> for SyntaxStablePtrId {
38614    fn from(ptr: TokenPlusEqPtr) -> Self {
38615        ptr.untyped()
38616    }
38617}
38618#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
38619pub struct TokenPlusEqGreen(pub GreenId);
38620impl TokenPlusEqGreen {
38621    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
38622        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
38623    }
38624}
38625impl TypedSyntaxNode for TokenPlusEq {
38626    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenPlusEq);
38627    type StablePtr = TokenPlusEqPtr;
38628    type Green = TokenPlusEqGreen;
38629    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
38630        TokenPlusEqGreen(
38631            Arc::new(GreenNode {
38632                kind: SyntaxKind::TokenMissing,
38633                details: GreenNodeDetails::Token("".into()),
38634            })
38635            .intern(db),
38636        )
38637    }
38638    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
38639        match node.lookup_intern(db).green.lookup_intern(db).details {
38640            GreenNodeDetails::Token(_) => Self { node },
38641            GreenNodeDetails::Node { .. } => {
38642                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenPlusEq)
38643            }
38644        }
38645    }
38646    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
38647        match node.lookup_intern(db).green.lookup_intern(db).details {
38648            GreenNodeDetails::Token(_) => Some(Self { node }),
38649            GreenNodeDetails::Node { .. } => None,
38650        }
38651    }
38652    fn as_syntax_node(&self) -> SyntaxNode {
38653        self.node
38654    }
38655    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
38656        TokenPlusEqPtr(self.node.stable_ptr(db))
38657    }
38658}
38659#[derive(Clone, Debug, Eq, Hash, PartialEq)]
38660pub struct TerminalPlusEq {
38661    node: SyntaxNode,
38662}
38663impl Terminal for TerminalPlusEq {
38664    const KIND: SyntaxKind = SyntaxKind::TerminalPlusEq;
38665    type TokenType = TokenPlusEq;
38666    fn new_green(
38667        db: &dyn SyntaxGroup,
38668        leading_trivia: TriviaGreen,
38669        token: <<TerminalPlusEq as Terminal>::TokenType as TypedSyntaxNode>::Green,
38670        trailing_trivia: TriviaGreen,
38671    ) -> Self::Green {
38672        let children = [leading_trivia.0, token.0, trailing_trivia.0];
38673        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
38674        TerminalPlusEqGreen(
38675            Arc::new(GreenNode {
38676                kind: SyntaxKind::TerminalPlusEq,
38677                details: GreenNodeDetails::Node { children: children.into(), width },
38678            })
38679            .intern(db),
38680        )
38681    }
38682    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
38683        let GreenNodeDetails::Node { children, .. } =
38684            &self.node.lookup_intern(db).green.lookup_intern(db).details
38685        else {
38686            unreachable!("Expected a node, not a token");
38687        };
38688        extract_matches!(&children[1].lookup_intern(db).details, GreenNodeDetails::Token).clone()
38689    }
38690}
38691impl TerminalPlusEq {
38692    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
38693        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
38694    }
38695    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenPlusEq {
38696        TokenPlusEq::from_syntax_node(db, self.node.get_children(db)[1])
38697    }
38698    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
38699        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
38700    }
38701}
38702#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
38703pub struct TerminalPlusEqPtr(pub SyntaxStablePtrId);
38704impl TerminalPlusEqPtr {}
38705impl TypedStablePtr for TerminalPlusEqPtr {
38706    type SyntaxNode = TerminalPlusEq;
38707    fn untyped(&self) -> SyntaxStablePtrId {
38708        self.0
38709    }
38710    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalPlusEq {
38711        TerminalPlusEq::from_syntax_node(db, self.0.lookup(db))
38712    }
38713}
38714impl From<TerminalPlusEqPtr> for SyntaxStablePtrId {
38715    fn from(ptr: TerminalPlusEqPtr) -> Self {
38716        ptr.untyped()
38717    }
38718}
38719#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
38720pub struct TerminalPlusEqGreen(pub GreenId);
38721impl TypedSyntaxNode for TerminalPlusEq {
38722    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalPlusEq);
38723    type StablePtr = TerminalPlusEqPtr;
38724    type Green = TerminalPlusEqGreen;
38725    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
38726        TerminalPlusEqGreen(
38727            Arc::new(GreenNode {
38728                kind: SyntaxKind::TerminalPlusEq,
38729                details: GreenNodeDetails::Node {
38730                    children: [
38731                        Trivia::missing(db).0,
38732                        TokenPlusEq::missing(db).0,
38733                        Trivia::missing(db).0,
38734                    ]
38735                    .into(),
38736                    width: TextWidth::default(),
38737                },
38738            })
38739            .intern(db),
38740        )
38741    }
38742    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
38743        let kind = node.kind(db);
38744        assert_eq!(
38745            kind,
38746            SyntaxKind::TerminalPlusEq,
38747            "Unexpected SyntaxKind {:?}. Expected {:?}.",
38748            kind,
38749            SyntaxKind::TerminalPlusEq
38750        );
38751        Self { node }
38752    }
38753    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
38754        let kind = node.kind(db);
38755        if kind == SyntaxKind::TerminalPlusEq {
38756            Some(Self::from_syntax_node(db, node))
38757        } else {
38758            None
38759        }
38760    }
38761    fn as_syntax_node(&self) -> SyntaxNode {
38762        self.node
38763    }
38764    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
38765        TerminalPlusEqPtr(self.node.stable_ptr(db))
38766    }
38767}
38768#[derive(Clone, Debug, Eq, Hash, PartialEq)]
38769pub struct TokenQuestionMark {
38770    node: SyntaxNode,
38771}
38772impl Token for TokenQuestionMark {
38773    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
38774        TokenQuestionMarkGreen(
38775            Arc::new(GreenNode {
38776                kind: SyntaxKind::TokenQuestionMark,
38777                details: GreenNodeDetails::Token(text),
38778            })
38779            .intern(db),
38780        )
38781    }
38782    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
38783        extract_matches!(
38784            &self.node.lookup_intern(db).green.lookup_intern(db).details,
38785            GreenNodeDetails::Token
38786        )
38787        .clone()
38788    }
38789}
38790#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
38791pub struct TokenQuestionMarkPtr(pub SyntaxStablePtrId);
38792impl TypedStablePtr for TokenQuestionMarkPtr {
38793    type SyntaxNode = TokenQuestionMark;
38794    fn untyped(&self) -> SyntaxStablePtrId {
38795        self.0
38796    }
38797    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenQuestionMark {
38798        TokenQuestionMark::from_syntax_node(db, self.0.lookup(db))
38799    }
38800}
38801impl From<TokenQuestionMarkPtr> for SyntaxStablePtrId {
38802    fn from(ptr: TokenQuestionMarkPtr) -> Self {
38803        ptr.untyped()
38804    }
38805}
38806#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
38807pub struct TokenQuestionMarkGreen(pub GreenId);
38808impl TokenQuestionMarkGreen {
38809    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
38810        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
38811    }
38812}
38813impl TypedSyntaxNode for TokenQuestionMark {
38814    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenQuestionMark);
38815    type StablePtr = TokenQuestionMarkPtr;
38816    type Green = TokenQuestionMarkGreen;
38817    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
38818        TokenQuestionMarkGreen(
38819            Arc::new(GreenNode {
38820                kind: SyntaxKind::TokenMissing,
38821                details: GreenNodeDetails::Token("".into()),
38822            })
38823            .intern(db),
38824        )
38825    }
38826    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
38827        match node.lookup_intern(db).green.lookup_intern(db).details {
38828            GreenNodeDetails::Token(_) => Self { node },
38829            GreenNodeDetails::Node { .. } => {
38830                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenQuestionMark)
38831            }
38832        }
38833    }
38834    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
38835        match node.lookup_intern(db).green.lookup_intern(db).details {
38836            GreenNodeDetails::Token(_) => Some(Self { node }),
38837            GreenNodeDetails::Node { .. } => None,
38838        }
38839    }
38840    fn as_syntax_node(&self) -> SyntaxNode {
38841        self.node
38842    }
38843    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
38844        TokenQuestionMarkPtr(self.node.stable_ptr(db))
38845    }
38846}
38847#[derive(Clone, Debug, Eq, Hash, PartialEq)]
38848pub struct TerminalQuestionMark {
38849    node: SyntaxNode,
38850}
38851impl Terminal for TerminalQuestionMark {
38852    const KIND: SyntaxKind = SyntaxKind::TerminalQuestionMark;
38853    type TokenType = TokenQuestionMark;
38854    fn new_green(
38855        db: &dyn SyntaxGroup,
38856        leading_trivia: TriviaGreen,
38857        token: <<TerminalQuestionMark as Terminal>::TokenType as TypedSyntaxNode>::Green,
38858        trailing_trivia: TriviaGreen,
38859    ) -> Self::Green {
38860        let children = [leading_trivia.0, token.0, trailing_trivia.0];
38861        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
38862        TerminalQuestionMarkGreen(
38863            Arc::new(GreenNode {
38864                kind: SyntaxKind::TerminalQuestionMark,
38865                details: GreenNodeDetails::Node { children: children.into(), width },
38866            })
38867            .intern(db),
38868        )
38869    }
38870    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
38871        let GreenNodeDetails::Node { children, .. } =
38872            &self.node.lookup_intern(db).green.lookup_intern(db).details
38873        else {
38874            unreachable!("Expected a node, not a token");
38875        };
38876        extract_matches!(&children[1].lookup_intern(db).details, GreenNodeDetails::Token).clone()
38877    }
38878}
38879impl TerminalQuestionMark {
38880    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
38881        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
38882    }
38883    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenQuestionMark {
38884        TokenQuestionMark::from_syntax_node(db, self.node.get_children(db)[1])
38885    }
38886    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
38887        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
38888    }
38889}
38890#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
38891pub struct TerminalQuestionMarkPtr(pub SyntaxStablePtrId);
38892impl TerminalQuestionMarkPtr {}
38893impl TypedStablePtr for TerminalQuestionMarkPtr {
38894    type SyntaxNode = TerminalQuestionMark;
38895    fn untyped(&self) -> SyntaxStablePtrId {
38896        self.0
38897    }
38898    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalQuestionMark {
38899        TerminalQuestionMark::from_syntax_node(db, self.0.lookup(db))
38900    }
38901}
38902impl From<TerminalQuestionMarkPtr> for SyntaxStablePtrId {
38903    fn from(ptr: TerminalQuestionMarkPtr) -> Self {
38904        ptr.untyped()
38905    }
38906}
38907#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
38908pub struct TerminalQuestionMarkGreen(pub GreenId);
38909impl TypedSyntaxNode for TerminalQuestionMark {
38910    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalQuestionMark);
38911    type StablePtr = TerminalQuestionMarkPtr;
38912    type Green = TerminalQuestionMarkGreen;
38913    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
38914        TerminalQuestionMarkGreen(
38915            Arc::new(GreenNode {
38916                kind: SyntaxKind::TerminalQuestionMark,
38917                details: GreenNodeDetails::Node {
38918                    children: [
38919                        Trivia::missing(db).0,
38920                        TokenQuestionMark::missing(db).0,
38921                        Trivia::missing(db).0,
38922                    ]
38923                    .into(),
38924                    width: TextWidth::default(),
38925                },
38926            })
38927            .intern(db),
38928        )
38929    }
38930    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
38931        let kind = node.kind(db);
38932        assert_eq!(
38933            kind,
38934            SyntaxKind::TerminalQuestionMark,
38935            "Unexpected SyntaxKind {:?}. Expected {:?}.",
38936            kind,
38937            SyntaxKind::TerminalQuestionMark
38938        );
38939        Self { node }
38940    }
38941    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
38942        let kind = node.kind(db);
38943        if kind == SyntaxKind::TerminalQuestionMark {
38944            Some(Self::from_syntax_node(db, node))
38945        } else {
38946            None
38947        }
38948    }
38949    fn as_syntax_node(&self) -> SyntaxNode {
38950        self.node
38951    }
38952    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
38953        TerminalQuestionMarkPtr(self.node.stable_ptr(db))
38954    }
38955}
38956#[derive(Clone, Debug, Eq, Hash, PartialEq)]
38957pub struct TokenRBrace {
38958    node: SyntaxNode,
38959}
38960impl Token for TokenRBrace {
38961    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
38962        TokenRBraceGreen(
38963            Arc::new(GreenNode {
38964                kind: SyntaxKind::TokenRBrace,
38965                details: GreenNodeDetails::Token(text),
38966            })
38967            .intern(db),
38968        )
38969    }
38970    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
38971        extract_matches!(
38972            &self.node.lookup_intern(db).green.lookup_intern(db).details,
38973            GreenNodeDetails::Token
38974        )
38975        .clone()
38976    }
38977}
38978#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
38979pub struct TokenRBracePtr(pub SyntaxStablePtrId);
38980impl TypedStablePtr for TokenRBracePtr {
38981    type SyntaxNode = TokenRBrace;
38982    fn untyped(&self) -> SyntaxStablePtrId {
38983        self.0
38984    }
38985    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenRBrace {
38986        TokenRBrace::from_syntax_node(db, self.0.lookup(db))
38987    }
38988}
38989impl From<TokenRBracePtr> for SyntaxStablePtrId {
38990    fn from(ptr: TokenRBracePtr) -> Self {
38991        ptr.untyped()
38992    }
38993}
38994#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
38995pub struct TokenRBraceGreen(pub GreenId);
38996impl TokenRBraceGreen {
38997    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
38998        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
38999    }
39000}
39001impl TypedSyntaxNode for TokenRBrace {
39002    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenRBrace);
39003    type StablePtr = TokenRBracePtr;
39004    type Green = TokenRBraceGreen;
39005    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
39006        TokenRBraceGreen(
39007            Arc::new(GreenNode {
39008                kind: SyntaxKind::TokenMissing,
39009                details: GreenNodeDetails::Token("".into()),
39010            })
39011            .intern(db),
39012        )
39013    }
39014    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
39015        match node.lookup_intern(db).green.lookup_intern(db).details {
39016            GreenNodeDetails::Token(_) => Self { node },
39017            GreenNodeDetails::Node { .. } => {
39018                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenRBrace)
39019            }
39020        }
39021    }
39022    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
39023        match node.lookup_intern(db).green.lookup_intern(db).details {
39024            GreenNodeDetails::Token(_) => Some(Self { node }),
39025            GreenNodeDetails::Node { .. } => None,
39026        }
39027    }
39028    fn as_syntax_node(&self) -> SyntaxNode {
39029        self.node
39030    }
39031    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
39032        TokenRBracePtr(self.node.stable_ptr(db))
39033    }
39034}
39035#[derive(Clone, Debug, Eq, Hash, PartialEq)]
39036pub struct TerminalRBrace {
39037    node: SyntaxNode,
39038}
39039impl Terminal for TerminalRBrace {
39040    const KIND: SyntaxKind = SyntaxKind::TerminalRBrace;
39041    type TokenType = TokenRBrace;
39042    fn new_green(
39043        db: &dyn SyntaxGroup,
39044        leading_trivia: TriviaGreen,
39045        token: <<TerminalRBrace as Terminal>::TokenType as TypedSyntaxNode>::Green,
39046        trailing_trivia: TriviaGreen,
39047    ) -> Self::Green {
39048        let children = [leading_trivia.0, token.0, trailing_trivia.0];
39049        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
39050        TerminalRBraceGreen(
39051            Arc::new(GreenNode {
39052                kind: SyntaxKind::TerminalRBrace,
39053                details: GreenNodeDetails::Node { children: children.into(), width },
39054            })
39055            .intern(db),
39056        )
39057    }
39058    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
39059        let GreenNodeDetails::Node { children, .. } =
39060            &self.node.lookup_intern(db).green.lookup_intern(db).details
39061        else {
39062            unreachable!("Expected a node, not a token");
39063        };
39064        extract_matches!(&children[1].lookup_intern(db).details, GreenNodeDetails::Token).clone()
39065    }
39066}
39067impl TerminalRBrace {
39068    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
39069        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
39070    }
39071    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenRBrace {
39072        TokenRBrace::from_syntax_node(db, self.node.get_children(db)[1])
39073    }
39074    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
39075        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
39076    }
39077}
39078#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
39079pub struct TerminalRBracePtr(pub SyntaxStablePtrId);
39080impl TerminalRBracePtr {}
39081impl TypedStablePtr for TerminalRBracePtr {
39082    type SyntaxNode = TerminalRBrace;
39083    fn untyped(&self) -> SyntaxStablePtrId {
39084        self.0
39085    }
39086    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalRBrace {
39087        TerminalRBrace::from_syntax_node(db, self.0.lookup(db))
39088    }
39089}
39090impl From<TerminalRBracePtr> for SyntaxStablePtrId {
39091    fn from(ptr: TerminalRBracePtr) -> Self {
39092        ptr.untyped()
39093    }
39094}
39095#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
39096pub struct TerminalRBraceGreen(pub GreenId);
39097impl TypedSyntaxNode for TerminalRBrace {
39098    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalRBrace);
39099    type StablePtr = TerminalRBracePtr;
39100    type Green = TerminalRBraceGreen;
39101    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
39102        TerminalRBraceGreen(
39103            Arc::new(GreenNode {
39104                kind: SyntaxKind::TerminalRBrace,
39105                details: GreenNodeDetails::Node {
39106                    children: [
39107                        Trivia::missing(db).0,
39108                        TokenRBrace::missing(db).0,
39109                        Trivia::missing(db).0,
39110                    ]
39111                    .into(),
39112                    width: TextWidth::default(),
39113                },
39114            })
39115            .intern(db),
39116        )
39117    }
39118    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
39119        let kind = node.kind(db);
39120        assert_eq!(
39121            kind,
39122            SyntaxKind::TerminalRBrace,
39123            "Unexpected SyntaxKind {:?}. Expected {:?}.",
39124            kind,
39125            SyntaxKind::TerminalRBrace
39126        );
39127        Self { node }
39128    }
39129    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
39130        let kind = node.kind(db);
39131        if kind == SyntaxKind::TerminalRBrace {
39132            Some(Self::from_syntax_node(db, node))
39133        } else {
39134            None
39135        }
39136    }
39137    fn as_syntax_node(&self) -> SyntaxNode {
39138        self.node
39139    }
39140    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
39141        TerminalRBracePtr(self.node.stable_ptr(db))
39142    }
39143}
39144#[derive(Clone, Debug, Eq, Hash, PartialEq)]
39145pub struct TokenRBrack {
39146    node: SyntaxNode,
39147}
39148impl Token for TokenRBrack {
39149    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
39150        TokenRBrackGreen(
39151            Arc::new(GreenNode {
39152                kind: SyntaxKind::TokenRBrack,
39153                details: GreenNodeDetails::Token(text),
39154            })
39155            .intern(db),
39156        )
39157    }
39158    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
39159        extract_matches!(
39160            &self.node.lookup_intern(db).green.lookup_intern(db).details,
39161            GreenNodeDetails::Token
39162        )
39163        .clone()
39164    }
39165}
39166#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
39167pub struct TokenRBrackPtr(pub SyntaxStablePtrId);
39168impl TypedStablePtr for TokenRBrackPtr {
39169    type SyntaxNode = TokenRBrack;
39170    fn untyped(&self) -> SyntaxStablePtrId {
39171        self.0
39172    }
39173    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenRBrack {
39174        TokenRBrack::from_syntax_node(db, self.0.lookup(db))
39175    }
39176}
39177impl From<TokenRBrackPtr> for SyntaxStablePtrId {
39178    fn from(ptr: TokenRBrackPtr) -> Self {
39179        ptr.untyped()
39180    }
39181}
39182#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
39183pub struct TokenRBrackGreen(pub GreenId);
39184impl TokenRBrackGreen {
39185    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
39186        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
39187    }
39188}
39189impl TypedSyntaxNode for TokenRBrack {
39190    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenRBrack);
39191    type StablePtr = TokenRBrackPtr;
39192    type Green = TokenRBrackGreen;
39193    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
39194        TokenRBrackGreen(
39195            Arc::new(GreenNode {
39196                kind: SyntaxKind::TokenMissing,
39197                details: GreenNodeDetails::Token("".into()),
39198            })
39199            .intern(db),
39200        )
39201    }
39202    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
39203        match node.lookup_intern(db).green.lookup_intern(db).details {
39204            GreenNodeDetails::Token(_) => Self { node },
39205            GreenNodeDetails::Node { .. } => {
39206                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenRBrack)
39207            }
39208        }
39209    }
39210    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
39211        match node.lookup_intern(db).green.lookup_intern(db).details {
39212            GreenNodeDetails::Token(_) => Some(Self { node }),
39213            GreenNodeDetails::Node { .. } => None,
39214        }
39215    }
39216    fn as_syntax_node(&self) -> SyntaxNode {
39217        self.node
39218    }
39219    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
39220        TokenRBrackPtr(self.node.stable_ptr(db))
39221    }
39222}
39223#[derive(Clone, Debug, Eq, Hash, PartialEq)]
39224pub struct TerminalRBrack {
39225    node: SyntaxNode,
39226}
39227impl Terminal for TerminalRBrack {
39228    const KIND: SyntaxKind = SyntaxKind::TerminalRBrack;
39229    type TokenType = TokenRBrack;
39230    fn new_green(
39231        db: &dyn SyntaxGroup,
39232        leading_trivia: TriviaGreen,
39233        token: <<TerminalRBrack as Terminal>::TokenType as TypedSyntaxNode>::Green,
39234        trailing_trivia: TriviaGreen,
39235    ) -> Self::Green {
39236        let children = [leading_trivia.0, token.0, trailing_trivia.0];
39237        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
39238        TerminalRBrackGreen(
39239            Arc::new(GreenNode {
39240                kind: SyntaxKind::TerminalRBrack,
39241                details: GreenNodeDetails::Node { children: children.into(), width },
39242            })
39243            .intern(db),
39244        )
39245    }
39246    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
39247        let GreenNodeDetails::Node { children, .. } =
39248            &self.node.lookup_intern(db).green.lookup_intern(db).details
39249        else {
39250            unreachable!("Expected a node, not a token");
39251        };
39252        extract_matches!(&children[1].lookup_intern(db).details, GreenNodeDetails::Token).clone()
39253    }
39254}
39255impl TerminalRBrack {
39256    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
39257        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
39258    }
39259    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenRBrack {
39260        TokenRBrack::from_syntax_node(db, self.node.get_children(db)[1])
39261    }
39262    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
39263        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
39264    }
39265}
39266#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
39267pub struct TerminalRBrackPtr(pub SyntaxStablePtrId);
39268impl TerminalRBrackPtr {}
39269impl TypedStablePtr for TerminalRBrackPtr {
39270    type SyntaxNode = TerminalRBrack;
39271    fn untyped(&self) -> SyntaxStablePtrId {
39272        self.0
39273    }
39274    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalRBrack {
39275        TerminalRBrack::from_syntax_node(db, self.0.lookup(db))
39276    }
39277}
39278impl From<TerminalRBrackPtr> for SyntaxStablePtrId {
39279    fn from(ptr: TerminalRBrackPtr) -> Self {
39280        ptr.untyped()
39281    }
39282}
39283#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
39284pub struct TerminalRBrackGreen(pub GreenId);
39285impl TypedSyntaxNode for TerminalRBrack {
39286    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalRBrack);
39287    type StablePtr = TerminalRBrackPtr;
39288    type Green = TerminalRBrackGreen;
39289    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
39290        TerminalRBrackGreen(
39291            Arc::new(GreenNode {
39292                kind: SyntaxKind::TerminalRBrack,
39293                details: GreenNodeDetails::Node {
39294                    children: [
39295                        Trivia::missing(db).0,
39296                        TokenRBrack::missing(db).0,
39297                        Trivia::missing(db).0,
39298                    ]
39299                    .into(),
39300                    width: TextWidth::default(),
39301                },
39302            })
39303            .intern(db),
39304        )
39305    }
39306    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
39307        let kind = node.kind(db);
39308        assert_eq!(
39309            kind,
39310            SyntaxKind::TerminalRBrack,
39311            "Unexpected SyntaxKind {:?}. Expected {:?}.",
39312            kind,
39313            SyntaxKind::TerminalRBrack
39314        );
39315        Self { node }
39316    }
39317    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
39318        let kind = node.kind(db);
39319        if kind == SyntaxKind::TerminalRBrack {
39320            Some(Self::from_syntax_node(db, node))
39321        } else {
39322            None
39323        }
39324    }
39325    fn as_syntax_node(&self) -> SyntaxNode {
39326        self.node
39327    }
39328    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
39329        TerminalRBrackPtr(self.node.stable_ptr(db))
39330    }
39331}
39332#[derive(Clone, Debug, Eq, Hash, PartialEq)]
39333pub struct TokenRParen {
39334    node: SyntaxNode,
39335}
39336impl Token for TokenRParen {
39337    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
39338        TokenRParenGreen(
39339            Arc::new(GreenNode {
39340                kind: SyntaxKind::TokenRParen,
39341                details: GreenNodeDetails::Token(text),
39342            })
39343            .intern(db),
39344        )
39345    }
39346    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
39347        extract_matches!(
39348            &self.node.lookup_intern(db).green.lookup_intern(db).details,
39349            GreenNodeDetails::Token
39350        )
39351        .clone()
39352    }
39353}
39354#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
39355pub struct TokenRParenPtr(pub SyntaxStablePtrId);
39356impl TypedStablePtr for TokenRParenPtr {
39357    type SyntaxNode = TokenRParen;
39358    fn untyped(&self) -> SyntaxStablePtrId {
39359        self.0
39360    }
39361    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenRParen {
39362        TokenRParen::from_syntax_node(db, self.0.lookup(db))
39363    }
39364}
39365impl From<TokenRParenPtr> for SyntaxStablePtrId {
39366    fn from(ptr: TokenRParenPtr) -> Self {
39367        ptr.untyped()
39368    }
39369}
39370#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
39371pub struct TokenRParenGreen(pub GreenId);
39372impl TokenRParenGreen {
39373    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
39374        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
39375    }
39376}
39377impl TypedSyntaxNode for TokenRParen {
39378    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenRParen);
39379    type StablePtr = TokenRParenPtr;
39380    type Green = TokenRParenGreen;
39381    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
39382        TokenRParenGreen(
39383            Arc::new(GreenNode {
39384                kind: SyntaxKind::TokenMissing,
39385                details: GreenNodeDetails::Token("".into()),
39386            })
39387            .intern(db),
39388        )
39389    }
39390    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
39391        match node.lookup_intern(db).green.lookup_intern(db).details {
39392            GreenNodeDetails::Token(_) => Self { node },
39393            GreenNodeDetails::Node { .. } => {
39394                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenRParen)
39395            }
39396        }
39397    }
39398    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
39399        match node.lookup_intern(db).green.lookup_intern(db).details {
39400            GreenNodeDetails::Token(_) => Some(Self { node }),
39401            GreenNodeDetails::Node { .. } => None,
39402        }
39403    }
39404    fn as_syntax_node(&self) -> SyntaxNode {
39405        self.node
39406    }
39407    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
39408        TokenRParenPtr(self.node.stable_ptr(db))
39409    }
39410}
39411#[derive(Clone, Debug, Eq, Hash, PartialEq)]
39412pub struct TerminalRParen {
39413    node: SyntaxNode,
39414}
39415impl Terminal for TerminalRParen {
39416    const KIND: SyntaxKind = SyntaxKind::TerminalRParen;
39417    type TokenType = TokenRParen;
39418    fn new_green(
39419        db: &dyn SyntaxGroup,
39420        leading_trivia: TriviaGreen,
39421        token: <<TerminalRParen as Terminal>::TokenType as TypedSyntaxNode>::Green,
39422        trailing_trivia: TriviaGreen,
39423    ) -> Self::Green {
39424        let children = [leading_trivia.0, token.0, trailing_trivia.0];
39425        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
39426        TerminalRParenGreen(
39427            Arc::new(GreenNode {
39428                kind: SyntaxKind::TerminalRParen,
39429                details: GreenNodeDetails::Node { children: children.into(), width },
39430            })
39431            .intern(db),
39432        )
39433    }
39434    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
39435        let GreenNodeDetails::Node { children, .. } =
39436            &self.node.lookup_intern(db).green.lookup_intern(db).details
39437        else {
39438            unreachable!("Expected a node, not a token");
39439        };
39440        extract_matches!(&children[1].lookup_intern(db).details, GreenNodeDetails::Token).clone()
39441    }
39442}
39443impl TerminalRParen {
39444    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
39445        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
39446    }
39447    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenRParen {
39448        TokenRParen::from_syntax_node(db, self.node.get_children(db)[1])
39449    }
39450    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
39451        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
39452    }
39453}
39454#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
39455pub struct TerminalRParenPtr(pub SyntaxStablePtrId);
39456impl TerminalRParenPtr {}
39457impl TypedStablePtr for TerminalRParenPtr {
39458    type SyntaxNode = TerminalRParen;
39459    fn untyped(&self) -> SyntaxStablePtrId {
39460        self.0
39461    }
39462    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalRParen {
39463        TerminalRParen::from_syntax_node(db, self.0.lookup(db))
39464    }
39465}
39466impl From<TerminalRParenPtr> for SyntaxStablePtrId {
39467    fn from(ptr: TerminalRParenPtr) -> Self {
39468        ptr.untyped()
39469    }
39470}
39471#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
39472pub struct TerminalRParenGreen(pub GreenId);
39473impl TypedSyntaxNode for TerminalRParen {
39474    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalRParen);
39475    type StablePtr = TerminalRParenPtr;
39476    type Green = TerminalRParenGreen;
39477    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
39478        TerminalRParenGreen(
39479            Arc::new(GreenNode {
39480                kind: SyntaxKind::TerminalRParen,
39481                details: GreenNodeDetails::Node {
39482                    children: [
39483                        Trivia::missing(db).0,
39484                        TokenRParen::missing(db).0,
39485                        Trivia::missing(db).0,
39486                    ]
39487                    .into(),
39488                    width: TextWidth::default(),
39489                },
39490            })
39491            .intern(db),
39492        )
39493    }
39494    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
39495        let kind = node.kind(db);
39496        assert_eq!(
39497            kind,
39498            SyntaxKind::TerminalRParen,
39499            "Unexpected SyntaxKind {:?}. Expected {:?}.",
39500            kind,
39501            SyntaxKind::TerminalRParen
39502        );
39503        Self { node }
39504    }
39505    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
39506        let kind = node.kind(db);
39507        if kind == SyntaxKind::TerminalRParen {
39508            Some(Self::from_syntax_node(db, node))
39509        } else {
39510            None
39511        }
39512    }
39513    fn as_syntax_node(&self) -> SyntaxNode {
39514        self.node
39515    }
39516    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
39517        TerminalRParenPtr(self.node.stable_ptr(db))
39518    }
39519}
39520#[derive(Clone, Debug, Eq, Hash, PartialEq)]
39521pub struct TokenSemicolon {
39522    node: SyntaxNode,
39523}
39524impl Token for TokenSemicolon {
39525    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
39526        TokenSemicolonGreen(
39527            Arc::new(GreenNode {
39528                kind: SyntaxKind::TokenSemicolon,
39529                details: GreenNodeDetails::Token(text),
39530            })
39531            .intern(db),
39532        )
39533    }
39534    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
39535        extract_matches!(
39536            &self.node.lookup_intern(db).green.lookup_intern(db).details,
39537            GreenNodeDetails::Token
39538        )
39539        .clone()
39540    }
39541}
39542#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
39543pub struct TokenSemicolonPtr(pub SyntaxStablePtrId);
39544impl TypedStablePtr for TokenSemicolonPtr {
39545    type SyntaxNode = TokenSemicolon;
39546    fn untyped(&self) -> SyntaxStablePtrId {
39547        self.0
39548    }
39549    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenSemicolon {
39550        TokenSemicolon::from_syntax_node(db, self.0.lookup(db))
39551    }
39552}
39553impl From<TokenSemicolonPtr> for SyntaxStablePtrId {
39554    fn from(ptr: TokenSemicolonPtr) -> Self {
39555        ptr.untyped()
39556    }
39557}
39558#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
39559pub struct TokenSemicolonGreen(pub GreenId);
39560impl TokenSemicolonGreen {
39561    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
39562        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
39563    }
39564}
39565impl TypedSyntaxNode for TokenSemicolon {
39566    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenSemicolon);
39567    type StablePtr = TokenSemicolonPtr;
39568    type Green = TokenSemicolonGreen;
39569    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
39570        TokenSemicolonGreen(
39571            Arc::new(GreenNode {
39572                kind: SyntaxKind::TokenMissing,
39573                details: GreenNodeDetails::Token("".into()),
39574            })
39575            .intern(db),
39576        )
39577    }
39578    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
39579        match node.lookup_intern(db).green.lookup_intern(db).details {
39580            GreenNodeDetails::Token(_) => Self { node },
39581            GreenNodeDetails::Node { .. } => {
39582                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenSemicolon)
39583            }
39584        }
39585    }
39586    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
39587        match node.lookup_intern(db).green.lookup_intern(db).details {
39588            GreenNodeDetails::Token(_) => Some(Self { node }),
39589            GreenNodeDetails::Node { .. } => None,
39590        }
39591    }
39592    fn as_syntax_node(&self) -> SyntaxNode {
39593        self.node
39594    }
39595    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
39596        TokenSemicolonPtr(self.node.stable_ptr(db))
39597    }
39598}
39599#[derive(Clone, Debug, Eq, Hash, PartialEq)]
39600pub struct TerminalSemicolon {
39601    node: SyntaxNode,
39602}
39603impl Terminal for TerminalSemicolon {
39604    const KIND: SyntaxKind = SyntaxKind::TerminalSemicolon;
39605    type TokenType = TokenSemicolon;
39606    fn new_green(
39607        db: &dyn SyntaxGroup,
39608        leading_trivia: TriviaGreen,
39609        token: <<TerminalSemicolon as Terminal>::TokenType as TypedSyntaxNode>::Green,
39610        trailing_trivia: TriviaGreen,
39611    ) -> Self::Green {
39612        let children = [leading_trivia.0, token.0, trailing_trivia.0];
39613        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
39614        TerminalSemicolonGreen(
39615            Arc::new(GreenNode {
39616                kind: SyntaxKind::TerminalSemicolon,
39617                details: GreenNodeDetails::Node { children: children.into(), width },
39618            })
39619            .intern(db),
39620        )
39621    }
39622    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
39623        let GreenNodeDetails::Node { children, .. } =
39624            &self.node.lookup_intern(db).green.lookup_intern(db).details
39625        else {
39626            unreachable!("Expected a node, not a token");
39627        };
39628        extract_matches!(&children[1].lookup_intern(db).details, GreenNodeDetails::Token).clone()
39629    }
39630}
39631impl TerminalSemicolon {
39632    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
39633        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
39634    }
39635    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenSemicolon {
39636        TokenSemicolon::from_syntax_node(db, self.node.get_children(db)[1])
39637    }
39638    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
39639        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
39640    }
39641}
39642#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
39643pub struct TerminalSemicolonPtr(pub SyntaxStablePtrId);
39644impl TerminalSemicolonPtr {}
39645impl TypedStablePtr for TerminalSemicolonPtr {
39646    type SyntaxNode = TerminalSemicolon;
39647    fn untyped(&self) -> SyntaxStablePtrId {
39648        self.0
39649    }
39650    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalSemicolon {
39651        TerminalSemicolon::from_syntax_node(db, self.0.lookup(db))
39652    }
39653}
39654impl From<TerminalSemicolonPtr> for SyntaxStablePtrId {
39655    fn from(ptr: TerminalSemicolonPtr) -> Self {
39656        ptr.untyped()
39657    }
39658}
39659#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
39660pub struct TerminalSemicolonGreen(pub GreenId);
39661impl TypedSyntaxNode for TerminalSemicolon {
39662    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalSemicolon);
39663    type StablePtr = TerminalSemicolonPtr;
39664    type Green = TerminalSemicolonGreen;
39665    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
39666        TerminalSemicolonGreen(
39667            Arc::new(GreenNode {
39668                kind: SyntaxKind::TerminalSemicolon,
39669                details: GreenNodeDetails::Node {
39670                    children: [
39671                        Trivia::missing(db).0,
39672                        TokenSemicolon::missing(db).0,
39673                        Trivia::missing(db).0,
39674                    ]
39675                    .into(),
39676                    width: TextWidth::default(),
39677                },
39678            })
39679            .intern(db),
39680        )
39681    }
39682    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
39683        let kind = node.kind(db);
39684        assert_eq!(
39685            kind,
39686            SyntaxKind::TerminalSemicolon,
39687            "Unexpected SyntaxKind {:?}. Expected {:?}.",
39688            kind,
39689            SyntaxKind::TerminalSemicolon
39690        );
39691        Self { node }
39692    }
39693    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
39694        let kind = node.kind(db);
39695        if kind == SyntaxKind::TerminalSemicolon {
39696            Some(Self::from_syntax_node(db, node))
39697        } else {
39698            None
39699        }
39700    }
39701    fn as_syntax_node(&self) -> SyntaxNode {
39702        self.node
39703    }
39704    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
39705        TerminalSemicolonPtr(self.node.stable_ptr(db))
39706    }
39707}
39708#[derive(Clone, Debug, Eq, Hash, PartialEq)]
39709pub struct TokenUnderscore {
39710    node: SyntaxNode,
39711}
39712impl Token for TokenUnderscore {
39713    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
39714        TokenUnderscoreGreen(
39715            Arc::new(GreenNode {
39716                kind: SyntaxKind::TokenUnderscore,
39717                details: GreenNodeDetails::Token(text),
39718            })
39719            .intern(db),
39720        )
39721    }
39722    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
39723        extract_matches!(
39724            &self.node.lookup_intern(db).green.lookup_intern(db).details,
39725            GreenNodeDetails::Token
39726        )
39727        .clone()
39728    }
39729}
39730#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
39731pub struct TokenUnderscorePtr(pub SyntaxStablePtrId);
39732impl TypedStablePtr for TokenUnderscorePtr {
39733    type SyntaxNode = TokenUnderscore;
39734    fn untyped(&self) -> SyntaxStablePtrId {
39735        self.0
39736    }
39737    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenUnderscore {
39738        TokenUnderscore::from_syntax_node(db, self.0.lookup(db))
39739    }
39740}
39741impl From<TokenUnderscorePtr> for SyntaxStablePtrId {
39742    fn from(ptr: TokenUnderscorePtr) -> Self {
39743        ptr.untyped()
39744    }
39745}
39746#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
39747pub struct TokenUnderscoreGreen(pub GreenId);
39748impl TokenUnderscoreGreen {
39749    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
39750        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
39751    }
39752}
39753impl TypedSyntaxNode for TokenUnderscore {
39754    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenUnderscore);
39755    type StablePtr = TokenUnderscorePtr;
39756    type Green = TokenUnderscoreGreen;
39757    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
39758        TokenUnderscoreGreen(
39759            Arc::new(GreenNode {
39760                kind: SyntaxKind::TokenMissing,
39761                details: GreenNodeDetails::Token("".into()),
39762            })
39763            .intern(db),
39764        )
39765    }
39766    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
39767        match node.lookup_intern(db).green.lookup_intern(db).details {
39768            GreenNodeDetails::Token(_) => Self { node },
39769            GreenNodeDetails::Node { .. } => {
39770                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenUnderscore)
39771            }
39772        }
39773    }
39774    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
39775        match node.lookup_intern(db).green.lookup_intern(db).details {
39776            GreenNodeDetails::Token(_) => Some(Self { node }),
39777            GreenNodeDetails::Node { .. } => None,
39778        }
39779    }
39780    fn as_syntax_node(&self) -> SyntaxNode {
39781        self.node
39782    }
39783    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
39784        TokenUnderscorePtr(self.node.stable_ptr(db))
39785    }
39786}
39787#[derive(Clone, Debug, Eq, Hash, PartialEq)]
39788pub struct TerminalUnderscore {
39789    node: SyntaxNode,
39790}
39791impl Terminal for TerminalUnderscore {
39792    const KIND: SyntaxKind = SyntaxKind::TerminalUnderscore;
39793    type TokenType = TokenUnderscore;
39794    fn new_green(
39795        db: &dyn SyntaxGroup,
39796        leading_trivia: TriviaGreen,
39797        token: <<TerminalUnderscore as Terminal>::TokenType as TypedSyntaxNode>::Green,
39798        trailing_trivia: TriviaGreen,
39799    ) -> Self::Green {
39800        let children = [leading_trivia.0, token.0, trailing_trivia.0];
39801        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
39802        TerminalUnderscoreGreen(
39803            Arc::new(GreenNode {
39804                kind: SyntaxKind::TerminalUnderscore,
39805                details: GreenNodeDetails::Node { children: children.into(), width },
39806            })
39807            .intern(db),
39808        )
39809    }
39810    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
39811        let GreenNodeDetails::Node { children, .. } =
39812            &self.node.lookup_intern(db).green.lookup_intern(db).details
39813        else {
39814            unreachable!("Expected a node, not a token");
39815        };
39816        extract_matches!(&children[1].lookup_intern(db).details, GreenNodeDetails::Token).clone()
39817    }
39818}
39819impl TerminalUnderscore {
39820    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
39821        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
39822    }
39823    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenUnderscore {
39824        TokenUnderscore::from_syntax_node(db, self.node.get_children(db)[1])
39825    }
39826    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
39827        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
39828    }
39829}
39830#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
39831pub struct TerminalUnderscorePtr(pub SyntaxStablePtrId);
39832impl TerminalUnderscorePtr {}
39833impl TypedStablePtr for TerminalUnderscorePtr {
39834    type SyntaxNode = TerminalUnderscore;
39835    fn untyped(&self) -> SyntaxStablePtrId {
39836        self.0
39837    }
39838    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalUnderscore {
39839        TerminalUnderscore::from_syntax_node(db, self.0.lookup(db))
39840    }
39841}
39842impl From<TerminalUnderscorePtr> for SyntaxStablePtrId {
39843    fn from(ptr: TerminalUnderscorePtr) -> Self {
39844        ptr.untyped()
39845    }
39846}
39847#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
39848pub struct TerminalUnderscoreGreen(pub GreenId);
39849impl TypedSyntaxNode for TerminalUnderscore {
39850    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalUnderscore);
39851    type StablePtr = TerminalUnderscorePtr;
39852    type Green = TerminalUnderscoreGreen;
39853    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
39854        TerminalUnderscoreGreen(
39855            Arc::new(GreenNode {
39856                kind: SyntaxKind::TerminalUnderscore,
39857                details: GreenNodeDetails::Node {
39858                    children: [
39859                        Trivia::missing(db).0,
39860                        TokenUnderscore::missing(db).0,
39861                        Trivia::missing(db).0,
39862                    ]
39863                    .into(),
39864                    width: TextWidth::default(),
39865                },
39866            })
39867            .intern(db),
39868        )
39869    }
39870    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
39871        let kind = node.kind(db);
39872        assert_eq!(
39873            kind,
39874            SyntaxKind::TerminalUnderscore,
39875            "Unexpected SyntaxKind {:?}. Expected {:?}.",
39876            kind,
39877            SyntaxKind::TerminalUnderscore
39878        );
39879        Self { node }
39880    }
39881    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
39882        let kind = node.kind(db);
39883        if kind == SyntaxKind::TerminalUnderscore {
39884            Some(Self::from_syntax_node(db, node))
39885        } else {
39886            None
39887        }
39888    }
39889    fn as_syntax_node(&self) -> SyntaxNode {
39890        self.node
39891    }
39892    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
39893        TerminalUnderscorePtr(self.node.stable_ptr(db))
39894    }
39895}
39896#[derive(Clone, Debug, Eq, Hash, PartialEq)]
39897pub struct TokenXor {
39898    node: SyntaxNode,
39899}
39900impl Token for TokenXor {
39901    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
39902        TokenXorGreen(
39903            Arc::new(GreenNode {
39904                kind: SyntaxKind::TokenXor,
39905                details: GreenNodeDetails::Token(text),
39906            })
39907            .intern(db),
39908        )
39909    }
39910    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
39911        extract_matches!(
39912            &self.node.lookup_intern(db).green.lookup_intern(db).details,
39913            GreenNodeDetails::Token
39914        )
39915        .clone()
39916    }
39917}
39918#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
39919pub struct TokenXorPtr(pub SyntaxStablePtrId);
39920impl TypedStablePtr for TokenXorPtr {
39921    type SyntaxNode = TokenXor;
39922    fn untyped(&self) -> SyntaxStablePtrId {
39923        self.0
39924    }
39925    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenXor {
39926        TokenXor::from_syntax_node(db, self.0.lookup(db))
39927    }
39928}
39929impl From<TokenXorPtr> for SyntaxStablePtrId {
39930    fn from(ptr: TokenXorPtr) -> Self {
39931        ptr.untyped()
39932    }
39933}
39934#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
39935pub struct TokenXorGreen(pub GreenId);
39936impl TokenXorGreen {
39937    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
39938        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
39939    }
39940}
39941impl TypedSyntaxNode for TokenXor {
39942    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenXor);
39943    type StablePtr = TokenXorPtr;
39944    type Green = TokenXorGreen;
39945    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
39946        TokenXorGreen(
39947            Arc::new(GreenNode {
39948                kind: SyntaxKind::TokenMissing,
39949                details: GreenNodeDetails::Token("".into()),
39950            })
39951            .intern(db),
39952        )
39953    }
39954    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
39955        match node.lookup_intern(db).green.lookup_intern(db).details {
39956            GreenNodeDetails::Token(_) => Self { node },
39957            GreenNodeDetails::Node { .. } => {
39958                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenXor)
39959            }
39960        }
39961    }
39962    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
39963        match node.lookup_intern(db).green.lookup_intern(db).details {
39964            GreenNodeDetails::Token(_) => Some(Self { node }),
39965            GreenNodeDetails::Node { .. } => None,
39966        }
39967    }
39968    fn as_syntax_node(&self) -> SyntaxNode {
39969        self.node
39970    }
39971    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
39972        TokenXorPtr(self.node.stable_ptr(db))
39973    }
39974}
39975#[derive(Clone, Debug, Eq, Hash, PartialEq)]
39976pub struct TerminalXor {
39977    node: SyntaxNode,
39978}
39979impl Terminal for TerminalXor {
39980    const KIND: SyntaxKind = SyntaxKind::TerminalXor;
39981    type TokenType = TokenXor;
39982    fn new_green(
39983        db: &dyn SyntaxGroup,
39984        leading_trivia: TriviaGreen,
39985        token: <<TerminalXor as Terminal>::TokenType as TypedSyntaxNode>::Green,
39986        trailing_trivia: TriviaGreen,
39987    ) -> Self::Green {
39988        let children = [leading_trivia.0, token.0, trailing_trivia.0];
39989        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
39990        TerminalXorGreen(
39991            Arc::new(GreenNode {
39992                kind: SyntaxKind::TerminalXor,
39993                details: GreenNodeDetails::Node { children: children.into(), width },
39994            })
39995            .intern(db),
39996        )
39997    }
39998    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
39999        let GreenNodeDetails::Node { children, .. } =
40000            &self.node.lookup_intern(db).green.lookup_intern(db).details
40001        else {
40002            unreachable!("Expected a node, not a token");
40003        };
40004        extract_matches!(&children[1].lookup_intern(db).details, GreenNodeDetails::Token).clone()
40005    }
40006}
40007impl TerminalXor {
40008    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
40009        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
40010    }
40011    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenXor {
40012        TokenXor::from_syntax_node(db, self.node.get_children(db)[1])
40013    }
40014    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
40015        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
40016    }
40017}
40018#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
40019pub struct TerminalXorPtr(pub SyntaxStablePtrId);
40020impl TerminalXorPtr {}
40021impl TypedStablePtr for TerminalXorPtr {
40022    type SyntaxNode = TerminalXor;
40023    fn untyped(&self) -> SyntaxStablePtrId {
40024        self.0
40025    }
40026    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalXor {
40027        TerminalXor::from_syntax_node(db, self.0.lookup(db))
40028    }
40029}
40030impl From<TerminalXorPtr> for SyntaxStablePtrId {
40031    fn from(ptr: TerminalXorPtr) -> Self {
40032        ptr.untyped()
40033    }
40034}
40035#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
40036pub struct TerminalXorGreen(pub GreenId);
40037impl TypedSyntaxNode for TerminalXor {
40038    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalXor);
40039    type StablePtr = TerminalXorPtr;
40040    type Green = TerminalXorGreen;
40041    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
40042        TerminalXorGreen(
40043            Arc::new(GreenNode {
40044                kind: SyntaxKind::TerminalXor,
40045                details: GreenNodeDetails::Node {
40046                    children: [
40047                        Trivia::missing(db).0,
40048                        TokenXor::missing(db).0,
40049                        Trivia::missing(db).0,
40050                    ]
40051                    .into(),
40052                    width: TextWidth::default(),
40053                },
40054            })
40055            .intern(db),
40056        )
40057    }
40058    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
40059        let kind = node.kind(db);
40060        assert_eq!(
40061            kind,
40062            SyntaxKind::TerminalXor,
40063            "Unexpected SyntaxKind {:?}. Expected {:?}.",
40064            kind,
40065            SyntaxKind::TerminalXor
40066        );
40067        Self { node }
40068    }
40069    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
40070        let kind = node.kind(db);
40071        if kind == SyntaxKind::TerminalXor { Some(Self::from_syntax_node(db, node)) } else { None }
40072    }
40073    fn as_syntax_node(&self) -> SyntaxNode {
40074        self.node
40075    }
40076    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
40077        TerminalXorPtr(self.node.stable_ptr(db))
40078    }
40079}
40080#[derive(Clone, Debug, Eq, Hash, PartialEq)]
40081pub struct SyntaxFile {
40082    node: SyntaxNode,
40083}
40084impl SyntaxFile {
40085    pub const INDEX_ITEMS: usize = 0;
40086    pub const INDEX_EOF: usize = 1;
40087    pub fn new_green(
40088        db: &dyn SyntaxGroup,
40089        items: ModuleItemListGreen,
40090        eof: TerminalEndOfFileGreen,
40091    ) -> SyntaxFileGreen {
40092        let children = [items.0, eof.0];
40093        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
40094        SyntaxFileGreen(
40095            Arc::new(GreenNode {
40096                kind: SyntaxKind::SyntaxFile,
40097                details: GreenNodeDetails::Node { children: children.into(), width },
40098            })
40099            .intern(db),
40100        )
40101    }
40102}
40103impl SyntaxFile {
40104    pub fn items(&self, db: &dyn SyntaxGroup) -> ModuleItemList {
40105        ModuleItemList::from_syntax_node(db, self.node.get_children(db)[0])
40106    }
40107    pub fn eof(&self, db: &dyn SyntaxGroup) -> TerminalEndOfFile {
40108        TerminalEndOfFile::from_syntax_node(db, self.node.get_children(db)[1])
40109    }
40110}
40111#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
40112pub struct SyntaxFilePtr(pub SyntaxStablePtrId);
40113impl SyntaxFilePtr {}
40114impl TypedStablePtr for SyntaxFilePtr {
40115    type SyntaxNode = SyntaxFile;
40116    fn untyped(&self) -> SyntaxStablePtrId {
40117        self.0
40118    }
40119    fn lookup(&self, db: &dyn SyntaxGroup) -> SyntaxFile {
40120        SyntaxFile::from_syntax_node(db, self.0.lookup(db))
40121    }
40122}
40123impl From<SyntaxFilePtr> for SyntaxStablePtrId {
40124    fn from(ptr: SyntaxFilePtr) -> Self {
40125        ptr.untyped()
40126    }
40127}
40128#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
40129pub struct SyntaxFileGreen(pub GreenId);
40130impl TypedSyntaxNode for SyntaxFile {
40131    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::SyntaxFile);
40132    type StablePtr = SyntaxFilePtr;
40133    type Green = SyntaxFileGreen;
40134    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
40135        SyntaxFileGreen(
40136            Arc::new(GreenNode {
40137                kind: SyntaxKind::SyntaxFile,
40138                details: GreenNodeDetails::Node {
40139                    children: [ModuleItemList::missing(db).0, TerminalEndOfFile::missing(db).0]
40140                        .into(),
40141                    width: TextWidth::default(),
40142                },
40143            })
40144            .intern(db),
40145        )
40146    }
40147    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
40148        let kind = node.kind(db);
40149        assert_eq!(
40150            kind,
40151            SyntaxKind::SyntaxFile,
40152            "Unexpected SyntaxKind {:?}. Expected {:?}.",
40153            kind,
40154            SyntaxKind::SyntaxFile
40155        );
40156        Self { node }
40157    }
40158    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
40159        let kind = node.kind(db);
40160        if kind == SyntaxKind::SyntaxFile { Some(Self::from_syntax_node(db, node)) } else { None }
40161    }
40162    fn as_syntax_node(&self) -> SyntaxNode {
40163        self.node
40164    }
40165    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
40166        SyntaxFilePtr(self.node.stable_ptr(db))
40167    }
40168}
40169#[derive(Clone, Debug, Eq, Hash, PartialEq)]
40170pub struct TokenEmpty {
40171    node: SyntaxNode,
40172}
40173impl Token for TokenEmpty {
40174    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
40175        TokenEmptyGreen(
40176            Arc::new(GreenNode {
40177                kind: SyntaxKind::TokenEmpty,
40178                details: GreenNodeDetails::Token(text),
40179            })
40180            .intern(db),
40181        )
40182    }
40183    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
40184        extract_matches!(
40185            &self.node.lookup_intern(db).green.lookup_intern(db).details,
40186            GreenNodeDetails::Token
40187        )
40188        .clone()
40189    }
40190}
40191#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
40192pub struct TokenEmptyPtr(pub SyntaxStablePtrId);
40193impl TypedStablePtr for TokenEmptyPtr {
40194    type SyntaxNode = TokenEmpty;
40195    fn untyped(&self) -> SyntaxStablePtrId {
40196        self.0
40197    }
40198    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenEmpty {
40199        TokenEmpty::from_syntax_node(db, self.0.lookup(db))
40200    }
40201}
40202impl From<TokenEmptyPtr> for SyntaxStablePtrId {
40203    fn from(ptr: TokenEmptyPtr) -> Self {
40204        ptr.untyped()
40205    }
40206}
40207#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
40208pub struct TokenEmptyGreen(pub GreenId);
40209impl TokenEmptyGreen {
40210    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
40211        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
40212    }
40213}
40214impl TypedSyntaxNode for TokenEmpty {
40215    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenEmpty);
40216    type StablePtr = TokenEmptyPtr;
40217    type Green = TokenEmptyGreen;
40218    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
40219        TokenEmptyGreen(
40220            Arc::new(GreenNode {
40221                kind: SyntaxKind::TokenMissing,
40222                details: GreenNodeDetails::Token("".into()),
40223            })
40224            .intern(db),
40225        )
40226    }
40227    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
40228        match node.lookup_intern(db).green.lookup_intern(db).details {
40229            GreenNodeDetails::Token(_) => Self { node },
40230            GreenNodeDetails::Node { .. } => {
40231                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenEmpty)
40232            }
40233        }
40234    }
40235    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
40236        match node.lookup_intern(db).green.lookup_intern(db).details {
40237            GreenNodeDetails::Token(_) => Some(Self { node }),
40238            GreenNodeDetails::Node { .. } => None,
40239        }
40240    }
40241    fn as_syntax_node(&self) -> SyntaxNode {
40242        self.node
40243    }
40244    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
40245        TokenEmptyPtr(self.node.stable_ptr(db))
40246    }
40247}
40248#[derive(Clone, Debug, Eq, Hash, PartialEq)]
40249pub struct TerminalEmpty {
40250    node: SyntaxNode,
40251}
40252impl Terminal for TerminalEmpty {
40253    const KIND: SyntaxKind = SyntaxKind::TerminalEmpty;
40254    type TokenType = TokenEmpty;
40255    fn new_green(
40256        db: &dyn SyntaxGroup,
40257        leading_trivia: TriviaGreen,
40258        token: <<TerminalEmpty as Terminal>::TokenType as TypedSyntaxNode>::Green,
40259        trailing_trivia: TriviaGreen,
40260    ) -> Self::Green {
40261        let children = [leading_trivia.0, token.0, trailing_trivia.0];
40262        let width = children.into_iter().map(|id: GreenId| id.lookup_intern(db).width()).sum();
40263        TerminalEmptyGreen(
40264            Arc::new(GreenNode {
40265                kind: SyntaxKind::TerminalEmpty,
40266                details: GreenNodeDetails::Node { children: children.into(), width },
40267            })
40268            .intern(db),
40269        )
40270    }
40271    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
40272        let GreenNodeDetails::Node { children, .. } =
40273            &self.node.lookup_intern(db).green.lookup_intern(db).details
40274        else {
40275            unreachable!("Expected a node, not a token");
40276        };
40277        extract_matches!(&children[1].lookup_intern(db).details, GreenNodeDetails::Token).clone()
40278    }
40279}
40280impl TerminalEmpty {
40281    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
40282        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
40283    }
40284    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenEmpty {
40285        TokenEmpty::from_syntax_node(db, self.node.get_children(db)[1])
40286    }
40287    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
40288        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
40289    }
40290}
40291#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
40292pub struct TerminalEmptyPtr(pub SyntaxStablePtrId);
40293impl TerminalEmptyPtr {}
40294impl TypedStablePtr for TerminalEmptyPtr {
40295    type SyntaxNode = TerminalEmpty;
40296    fn untyped(&self) -> SyntaxStablePtrId {
40297        self.0
40298    }
40299    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalEmpty {
40300        TerminalEmpty::from_syntax_node(db, self.0.lookup(db))
40301    }
40302}
40303impl From<TerminalEmptyPtr> for SyntaxStablePtrId {
40304    fn from(ptr: TerminalEmptyPtr) -> Self {
40305        ptr.untyped()
40306    }
40307}
40308#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
40309pub struct TerminalEmptyGreen(pub GreenId);
40310impl TypedSyntaxNode for TerminalEmpty {
40311    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalEmpty);
40312    type StablePtr = TerminalEmptyPtr;
40313    type Green = TerminalEmptyGreen;
40314    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
40315        TerminalEmptyGreen(
40316            Arc::new(GreenNode {
40317                kind: SyntaxKind::TerminalEmpty,
40318                details: GreenNodeDetails::Node {
40319                    children: [
40320                        Trivia::missing(db).0,
40321                        TokenEmpty::missing(db).0,
40322                        Trivia::missing(db).0,
40323                    ]
40324                    .into(),
40325                    width: TextWidth::default(),
40326                },
40327            })
40328            .intern(db),
40329        )
40330    }
40331    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
40332        let kind = node.kind(db);
40333        assert_eq!(
40334            kind,
40335            SyntaxKind::TerminalEmpty,
40336            "Unexpected SyntaxKind {:?}. Expected {:?}.",
40337            kind,
40338            SyntaxKind::TerminalEmpty
40339        );
40340        Self { node }
40341    }
40342    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
40343        let kind = node.kind(db);
40344        if kind == SyntaxKind::TerminalEmpty {
40345            Some(Self::from_syntax_node(db, node))
40346        } else {
40347            None
40348        }
40349    }
40350    fn as_syntax_node(&self) -> SyntaxNode {
40351        self.node
40352    }
40353    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
40354        TerminalEmptyPtr(self.node.stable_ptr(db))
40355    }
40356}
40357#[derive(Clone, Debug, Eq, Hash, PartialEq)]
40358pub struct TokenSingleLineComment {
40359    node: SyntaxNode,
40360}
40361impl Token for TokenSingleLineComment {
40362    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
40363        TokenSingleLineCommentGreen(
40364            Arc::new(GreenNode {
40365                kind: SyntaxKind::TokenSingleLineComment,
40366                details: GreenNodeDetails::Token(text),
40367            })
40368            .intern(db),
40369        )
40370    }
40371    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
40372        extract_matches!(
40373            &self.node.lookup_intern(db).green.lookup_intern(db).details,
40374            GreenNodeDetails::Token
40375        )
40376        .clone()
40377    }
40378}
40379#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
40380pub struct TokenSingleLineCommentPtr(pub SyntaxStablePtrId);
40381impl TypedStablePtr for TokenSingleLineCommentPtr {
40382    type SyntaxNode = TokenSingleLineComment;
40383    fn untyped(&self) -> SyntaxStablePtrId {
40384        self.0
40385    }
40386    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenSingleLineComment {
40387        TokenSingleLineComment::from_syntax_node(db, self.0.lookup(db))
40388    }
40389}
40390impl From<TokenSingleLineCommentPtr> for SyntaxStablePtrId {
40391    fn from(ptr: TokenSingleLineCommentPtr) -> Self {
40392        ptr.untyped()
40393    }
40394}
40395#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
40396pub struct TokenSingleLineCommentGreen(pub GreenId);
40397impl TokenSingleLineCommentGreen {
40398    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
40399        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
40400    }
40401}
40402impl TypedSyntaxNode for TokenSingleLineComment {
40403    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenSingleLineComment);
40404    type StablePtr = TokenSingleLineCommentPtr;
40405    type Green = TokenSingleLineCommentGreen;
40406    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
40407        TokenSingleLineCommentGreen(
40408            Arc::new(GreenNode {
40409                kind: SyntaxKind::TokenMissing,
40410                details: GreenNodeDetails::Token("".into()),
40411            })
40412            .intern(db),
40413        )
40414    }
40415    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
40416        match node.lookup_intern(db).green.lookup_intern(db).details {
40417            GreenNodeDetails::Token(_) => Self { node },
40418            GreenNodeDetails::Node { .. } => panic!(
40419                "Expected a token {:?}, not an internal node",
40420                SyntaxKind::TokenSingleLineComment
40421            ),
40422        }
40423    }
40424    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
40425        match node.lookup_intern(db).green.lookup_intern(db).details {
40426            GreenNodeDetails::Token(_) => Some(Self { node }),
40427            GreenNodeDetails::Node { .. } => None,
40428        }
40429    }
40430    fn as_syntax_node(&self) -> SyntaxNode {
40431        self.node
40432    }
40433    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
40434        TokenSingleLineCommentPtr(self.node.stable_ptr(db))
40435    }
40436}
40437#[derive(Clone, Debug, Eq, Hash, PartialEq)]
40438pub struct TokenSingleLineInnerComment {
40439    node: SyntaxNode,
40440}
40441impl Token for TokenSingleLineInnerComment {
40442    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
40443        TokenSingleLineInnerCommentGreen(
40444            Arc::new(GreenNode {
40445                kind: SyntaxKind::TokenSingleLineInnerComment,
40446                details: GreenNodeDetails::Token(text),
40447            })
40448            .intern(db),
40449        )
40450    }
40451    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
40452        extract_matches!(
40453            &self.node.lookup_intern(db).green.lookup_intern(db).details,
40454            GreenNodeDetails::Token
40455        )
40456        .clone()
40457    }
40458}
40459#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
40460pub struct TokenSingleLineInnerCommentPtr(pub SyntaxStablePtrId);
40461impl TypedStablePtr for TokenSingleLineInnerCommentPtr {
40462    type SyntaxNode = TokenSingleLineInnerComment;
40463    fn untyped(&self) -> SyntaxStablePtrId {
40464        self.0
40465    }
40466    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenSingleLineInnerComment {
40467        TokenSingleLineInnerComment::from_syntax_node(db, self.0.lookup(db))
40468    }
40469}
40470impl From<TokenSingleLineInnerCommentPtr> for SyntaxStablePtrId {
40471    fn from(ptr: TokenSingleLineInnerCommentPtr) -> Self {
40472        ptr.untyped()
40473    }
40474}
40475#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
40476pub struct TokenSingleLineInnerCommentGreen(pub GreenId);
40477impl TokenSingleLineInnerCommentGreen {
40478    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
40479        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
40480    }
40481}
40482impl TypedSyntaxNode for TokenSingleLineInnerComment {
40483    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenSingleLineInnerComment);
40484    type StablePtr = TokenSingleLineInnerCommentPtr;
40485    type Green = TokenSingleLineInnerCommentGreen;
40486    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
40487        TokenSingleLineInnerCommentGreen(
40488            Arc::new(GreenNode {
40489                kind: SyntaxKind::TokenMissing,
40490                details: GreenNodeDetails::Token("".into()),
40491            })
40492            .intern(db),
40493        )
40494    }
40495    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
40496        match node.lookup_intern(db).green.lookup_intern(db).details {
40497            GreenNodeDetails::Token(_) => Self { node },
40498            GreenNodeDetails::Node { .. } => panic!(
40499                "Expected a token {:?}, not an internal node",
40500                SyntaxKind::TokenSingleLineInnerComment
40501            ),
40502        }
40503    }
40504    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
40505        match node.lookup_intern(db).green.lookup_intern(db).details {
40506            GreenNodeDetails::Token(_) => Some(Self { node }),
40507            GreenNodeDetails::Node { .. } => None,
40508        }
40509    }
40510    fn as_syntax_node(&self) -> SyntaxNode {
40511        self.node
40512    }
40513    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
40514        TokenSingleLineInnerCommentPtr(self.node.stable_ptr(db))
40515    }
40516}
40517#[derive(Clone, Debug, Eq, Hash, PartialEq)]
40518pub struct TokenSingleLineDocComment {
40519    node: SyntaxNode,
40520}
40521impl Token for TokenSingleLineDocComment {
40522    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
40523        TokenSingleLineDocCommentGreen(
40524            Arc::new(GreenNode {
40525                kind: SyntaxKind::TokenSingleLineDocComment,
40526                details: GreenNodeDetails::Token(text),
40527            })
40528            .intern(db),
40529        )
40530    }
40531    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
40532        extract_matches!(
40533            &self.node.lookup_intern(db).green.lookup_intern(db).details,
40534            GreenNodeDetails::Token
40535        )
40536        .clone()
40537    }
40538}
40539#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
40540pub struct TokenSingleLineDocCommentPtr(pub SyntaxStablePtrId);
40541impl TypedStablePtr for TokenSingleLineDocCommentPtr {
40542    type SyntaxNode = TokenSingleLineDocComment;
40543    fn untyped(&self) -> SyntaxStablePtrId {
40544        self.0
40545    }
40546    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenSingleLineDocComment {
40547        TokenSingleLineDocComment::from_syntax_node(db, self.0.lookup(db))
40548    }
40549}
40550impl From<TokenSingleLineDocCommentPtr> for SyntaxStablePtrId {
40551    fn from(ptr: TokenSingleLineDocCommentPtr) -> Self {
40552        ptr.untyped()
40553    }
40554}
40555#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
40556pub struct TokenSingleLineDocCommentGreen(pub GreenId);
40557impl TokenSingleLineDocCommentGreen {
40558    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
40559        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
40560    }
40561}
40562impl TypedSyntaxNode for TokenSingleLineDocComment {
40563    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenSingleLineDocComment);
40564    type StablePtr = TokenSingleLineDocCommentPtr;
40565    type Green = TokenSingleLineDocCommentGreen;
40566    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
40567        TokenSingleLineDocCommentGreen(
40568            Arc::new(GreenNode {
40569                kind: SyntaxKind::TokenMissing,
40570                details: GreenNodeDetails::Token("".into()),
40571            })
40572            .intern(db),
40573        )
40574    }
40575    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
40576        match node.lookup_intern(db).green.lookup_intern(db).details {
40577            GreenNodeDetails::Token(_) => Self { node },
40578            GreenNodeDetails::Node { .. } => panic!(
40579                "Expected a token {:?}, not an internal node",
40580                SyntaxKind::TokenSingleLineDocComment
40581            ),
40582        }
40583    }
40584    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
40585        match node.lookup_intern(db).green.lookup_intern(db).details {
40586            GreenNodeDetails::Token(_) => Some(Self { node }),
40587            GreenNodeDetails::Node { .. } => None,
40588        }
40589    }
40590    fn as_syntax_node(&self) -> SyntaxNode {
40591        self.node
40592    }
40593    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
40594        TokenSingleLineDocCommentPtr(self.node.stable_ptr(db))
40595    }
40596}
40597#[derive(Clone, Debug, Eq, Hash, PartialEq)]
40598pub struct TokenWhitespace {
40599    node: SyntaxNode,
40600}
40601impl Token for TokenWhitespace {
40602    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
40603        TokenWhitespaceGreen(
40604            Arc::new(GreenNode {
40605                kind: SyntaxKind::TokenWhitespace,
40606                details: GreenNodeDetails::Token(text),
40607            })
40608            .intern(db),
40609        )
40610    }
40611    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
40612        extract_matches!(
40613            &self.node.lookup_intern(db).green.lookup_intern(db).details,
40614            GreenNodeDetails::Token
40615        )
40616        .clone()
40617    }
40618}
40619#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
40620pub struct TokenWhitespacePtr(pub SyntaxStablePtrId);
40621impl TypedStablePtr for TokenWhitespacePtr {
40622    type SyntaxNode = TokenWhitespace;
40623    fn untyped(&self) -> SyntaxStablePtrId {
40624        self.0
40625    }
40626    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenWhitespace {
40627        TokenWhitespace::from_syntax_node(db, self.0.lookup(db))
40628    }
40629}
40630impl From<TokenWhitespacePtr> for SyntaxStablePtrId {
40631    fn from(ptr: TokenWhitespacePtr) -> Self {
40632        ptr.untyped()
40633    }
40634}
40635#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
40636pub struct TokenWhitespaceGreen(pub GreenId);
40637impl TokenWhitespaceGreen {
40638    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
40639        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
40640    }
40641}
40642impl TypedSyntaxNode for TokenWhitespace {
40643    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenWhitespace);
40644    type StablePtr = TokenWhitespacePtr;
40645    type Green = TokenWhitespaceGreen;
40646    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
40647        TokenWhitespaceGreen(
40648            Arc::new(GreenNode {
40649                kind: SyntaxKind::TokenMissing,
40650                details: GreenNodeDetails::Token("".into()),
40651            })
40652            .intern(db),
40653        )
40654    }
40655    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
40656        match node.lookup_intern(db).green.lookup_intern(db).details {
40657            GreenNodeDetails::Token(_) => Self { node },
40658            GreenNodeDetails::Node { .. } => {
40659                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenWhitespace)
40660            }
40661        }
40662    }
40663    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
40664        match node.lookup_intern(db).green.lookup_intern(db).details {
40665            GreenNodeDetails::Token(_) => Some(Self { node }),
40666            GreenNodeDetails::Node { .. } => None,
40667        }
40668    }
40669    fn as_syntax_node(&self) -> SyntaxNode {
40670        self.node
40671    }
40672    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
40673        TokenWhitespacePtr(self.node.stable_ptr(db))
40674    }
40675}
40676#[derive(Clone, Debug, Eq, Hash, PartialEq)]
40677pub struct TokenNewline {
40678    node: SyntaxNode,
40679}
40680impl Token for TokenNewline {
40681    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
40682        TokenNewlineGreen(
40683            Arc::new(GreenNode {
40684                kind: SyntaxKind::TokenNewline,
40685                details: GreenNodeDetails::Token(text),
40686            })
40687            .intern(db),
40688        )
40689    }
40690    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
40691        extract_matches!(
40692            &self.node.lookup_intern(db).green.lookup_intern(db).details,
40693            GreenNodeDetails::Token
40694        )
40695        .clone()
40696    }
40697}
40698#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
40699pub struct TokenNewlinePtr(pub SyntaxStablePtrId);
40700impl TypedStablePtr for TokenNewlinePtr {
40701    type SyntaxNode = TokenNewline;
40702    fn untyped(&self) -> SyntaxStablePtrId {
40703        self.0
40704    }
40705    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenNewline {
40706        TokenNewline::from_syntax_node(db, self.0.lookup(db))
40707    }
40708}
40709impl From<TokenNewlinePtr> for SyntaxStablePtrId {
40710    fn from(ptr: TokenNewlinePtr) -> Self {
40711        ptr.untyped()
40712    }
40713}
40714#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
40715pub struct TokenNewlineGreen(pub GreenId);
40716impl TokenNewlineGreen {
40717    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
40718        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
40719    }
40720}
40721impl TypedSyntaxNode for TokenNewline {
40722    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenNewline);
40723    type StablePtr = TokenNewlinePtr;
40724    type Green = TokenNewlineGreen;
40725    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
40726        TokenNewlineGreen(
40727            Arc::new(GreenNode {
40728                kind: SyntaxKind::TokenMissing,
40729                details: GreenNodeDetails::Token("".into()),
40730            })
40731            .intern(db),
40732        )
40733    }
40734    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
40735        match node.lookup_intern(db).green.lookup_intern(db).details {
40736            GreenNodeDetails::Token(_) => Self { node },
40737            GreenNodeDetails::Node { .. } => {
40738                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenNewline)
40739            }
40740        }
40741    }
40742    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
40743        match node.lookup_intern(db).green.lookup_intern(db).details {
40744            GreenNodeDetails::Token(_) => Some(Self { node }),
40745            GreenNodeDetails::Node { .. } => None,
40746        }
40747    }
40748    fn as_syntax_node(&self) -> SyntaxNode {
40749        self.node
40750    }
40751    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
40752        TokenNewlinePtr(self.node.stable_ptr(db))
40753    }
40754}
40755#[derive(Clone, Debug, Eq, Hash, PartialEq)]
40756pub struct TokenMissing {
40757    node: SyntaxNode,
40758}
40759impl Token for TokenMissing {
40760    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
40761        TokenMissingGreen(
40762            Arc::new(GreenNode {
40763                kind: SyntaxKind::TokenMissing,
40764                details: GreenNodeDetails::Token(text),
40765            })
40766            .intern(db),
40767        )
40768    }
40769    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
40770        extract_matches!(
40771            &self.node.lookup_intern(db).green.lookup_intern(db).details,
40772            GreenNodeDetails::Token
40773        )
40774        .clone()
40775    }
40776}
40777#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
40778pub struct TokenMissingPtr(pub SyntaxStablePtrId);
40779impl TypedStablePtr for TokenMissingPtr {
40780    type SyntaxNode = TokenMissing;
40781    fn untyped(&self) -> SyntaxStablePtrId {
40782        self.0
40783    }
40784    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenMissing {
40785        TokenMissing::from_syntax_node(db, self.0.lookup(db))
40786    }
40787}
40788impl From<TokenMissingPtr> for SyntaxStablePtrId {
40789    fn from(ptr: TokenMissingPtr) -> Self {
40790        ptr.untyped()
40791    }
40792}
40793#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
40794pub struct TokenMissingGreen(pub GreenId);
40795impl TokenMissingGreen {
40796    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
40797        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
40798    }
40799}
40800impl TypedSyntaxNode for TokenMissing {
40801    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenMissing);
40802    type StablePtr = TokenMissingPtr;
40803    type Green = TokenMissingGreen;
40804    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
40805        TokenMissingGreen(
40806            Arc::new(GreenNode {
40807                kind: SyntaxKind::TokenMissing,
40808                details: GreenNodeDetails::Token("".into()),
40809            })
40810            .intern(db),
40811        )
40812    }
40813    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
40814        match node.lookup_intern(db).green.lookup_intern(db).details {
40815            GreenNodeDetails::Token(_) => Self { node },
40816            GreenNodeDetails::Node { .. } => {
40817                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenMissing)
40818            }
40819        }
40820    }
40821    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
40822        match node.lookup_intern(db).green.lookup_intern(db).details {
40823            GreenNodeDetails::Token(_) => Some(Self { node }),
40824            GreenNodeDetails::Node { .. } => None,
40825        }
40826    }
40827    fn as_syntax_node(&self) -> SyntaxNode {
40828        self.node
40829    }
40830    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
40831        TokenMissingPtr(self.node.stable_ptr(db))
40832    }
40833}
40834#[derive(Clone, Debug, Eq, Hash, PartialEq)]
40835pub struct TokenSkipped {
40836    node: SyntaxNode,
40837}
40838impl Token for TokenSkipped {
40839    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
40840        TokenSkippedGreen(
40841            Arc::new(GreenNode {
40842                kind: SyntaxKind::TokenSkipped,
40843                details: GreenNodeDetails::Token(text),
40844            })
40845            .intern(db),
40846        )
40847    }
40848    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
40849        extract_matches!(
40850            &self.node.lookup_intern(db).green.lookup_intern(db).details,
40851            GreenNodeDetails::Token
40852        )
40853        .clone()
40854    }
40855}
40856#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
40857pub struct TokenSkippedPtr(pub SyntaxStablePtrId);
40858impl TypedStablePtr for TokenSkippedPtr {
40859    type SyntaxNode = TokenSkipped;
40860    fn untyped(&self) -> SyntaxStablePtrId {
40861        self.0
40862    }
40863    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenSkipped {
40864        TokenSkipped::from_syntax_node(db, self.0.lookup(db))
40865    }
40866}
40867impl From<TokenSkippedPtr> for SyntaxStablePtrId {
40868    fn from(ptr: TokenSkippedPtr) -> Self {
40869        ptr.untyped()
40870    }
40871}
40872#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
40873pub struct TokenSkippedGreen(pub GreenId);
40874impl TokenSkippedGreen {
40875    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
40876        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
40877    }
40878}
40879impl TypedSyntaxNode for TokenSkipped {
40880    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenSkipped);
40881    type StablePtr = TokenSkippedPtr;
40882    type Green = TokenSkippedGreen;
40883    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
40884        TokenSkippedGreen(
40885            Arc::new(GreenNode {
40886                kind: SyntaxKind::TokenMissing,
40887                details: GreenNodeDetails::Token("".into()),
40888            })
40889            .intern(db),
40890        )
40891    }
40892    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
40893        match node.lookup_intern(db).green.lookup_intern(db).details {
40894            GreenNodeDetails::Token(_) => Self { node },
40895            GreenNodeDetails::Node { .. } => {
40896                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenSkipped)
40897            }
40898        }
40899    }
40900    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
40901        match node.lookup_intern(db).green.lookup_intern(db).details {
40902            GreenNodeDetails::Token(_) => Some(Self { node }),
40903            GreenNodeDetails::Node { .. } => None,
40904        }
40905    }
40906    fn as_syntax_node(&self) -> SyntaxNode {
40907        self.node
40908    }
40909    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
40910        TokenSkippedPtr(self.node.stable_ptr(db))
40911    }
40912}
40913#[derive(Clone, Debug, Eq, Hash, PartialEq)]
40914pub enum TokenNode {
40915    TerminalIdentifier(TerminalIdentifier),
40916    TerminalLiteralNumber(TerminalLiteralNumber),
40917    TerminalShortString(TerminalShortString),
40918    TerminalString(TerminalString),
40919    TerminalAs(TerminalAs),
40920    TerminalConst(TerminalConst),
40921    TerminalElse(TerminalElse),
40922    TerminalEnum(TerminalEnum),
40923    TerminalExtern(TerminalExtern),
40924    TerminalFalse(TerminalFalse),
40925    TerminalFunction(TerminalFunction),
40926    TerminalIf(TerminalIf),
40927    TerminalWhile(TerminalWhile),
40928    TerminalFor(TerminalFor),
40929    TerminalLoop(TerminalLoop),
40930    TerminalImpl(TerminalImpl),
40931    TerminalImplicits(TerminalImplicits),
40932    TerminalLet(TerminalLet),
40933    TerminalMacro(TerminalMacro),
40934    TerminalMatch(TerminalMatch),
40935    TerminalModule(TerminalModule),
40936    TerminalMut(TerminalMut),
40937    TerminalNoPanic(TerminalNoPanic),
40938    TerminalOf(TerminalOf),
40939    TerminalRef(TerminalRef),
40940    TerminalContinue(TerminalContinue),
40941    TerminalReturn(TerminalReturn),
40942    TerminalBreak(TerminalBreak),
40943    TerminalStruct(TerminalStruct),
40944    TerminalTrait(TerminalTrait),
40945    TerminalTrue(TerminalTrue),
40946    TerminalType(TerminalType),
40947    TerminalUse(TerminalUse),
40948    TerminalPub(TerminalPub),
40949    TerminalAnd(TerminalAnd),
40950    TerminalAndAnd(TerminalAndAnd),
40951    TerminalArrow(TerminalArrow),
40952    TerminalAt(TerminalAt),
40953    TerminalBadCharacters(TerminalBadCharacters),
40954    TerminalColon(TerminalColon),
40955    TerminalColonColon(TerminalColonColon),
40956    TerminalComma(TerminalComma),
40957    TerminalDiv(TerminalDiv),
40958    TerminalDivEq(TerminalDivEq),
40959    TerminalDollar(TerminalDollar),
40960    TerminalDot(TerminalDot),
40961    TerminalDotDot(TerminalDotDot),
40962    TerminalDotDotEq(TerminalDotDotEq),
40963    TerminalEndOfFile(TerminalEndOfFile),
40964    TerminalEq(TerminalEq),
40965    TerminalEqEq(TerminalEqEq),
40966    TerminalGE(TerminalGE),
40967    TerminalGT(TerminalGT),
40968    TerminalHash(TerminalHash),
40969    TerminalLBrace(TerminalLBrace),
40970    TerminalLBrack(TerminalLBrack),
40971    TerminalLE(TerminalLE),
40972    TerminalLParen(TerminalLParen),
40973    TerminalLT(TerminalLT),
40974    TerminalMatchArrow(TerminalMatchArrow),
40975    TerminalMinus(TerminalMinus),
40976    TerminalMinusEq(TerminalMinusEq),
40977    TerminalMod(TerminalMod),
40978    TerminalModEq(TerminalModEq),
40979    TerminalMul(TerminalMul),
40980    TerminalMulEq(TerminalMulEq),
40981    TerminalNeq(TerminalNeq),
40982    TerminalNot(TerminalNot),
40983    TerminalBitNot(TerminalBitNot),
40984    TerminalOr(TerminalOr),
40985    TerminalOrOr(TerminalOrOr),
40986    TerminalPlus(TerminalPlus),
40987    TerminalPlusEq(TerminalPlusEq),
40988    TerminalQuestionMark(TerminalQuestionMark),
40989    TerminalRBrace(TerminalRBrace),
40990    TerminalRBrack(TerminalRBrack),
40991    TerminalRParen(TerminalRParen),
40992    TerminalSemicolon(TerminalSemicolon),
40993    TerminalUnderscore(TerminalUnderscore),
40994    TerminalXor(TerminalXor),
40995    TerminalEmpty(TerminalEmpty),
40996}
40997#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
40998pub struct TokenNodePtr(pub SyntaxStablePtrId);
40999impl TypedStablePtr for TokenNodePtr {
41000    type SyntaxNode = TokenNode;
41001    fn untyped(&self) -> SyntaxStablePtrId {
41002        self.0
41003    }
41004    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenNode {
41005        TokenNode::from_syntax_node(db, self.0.lookup(db))
41006    }
41007}
41008impl From<TokenNodePtr> for SyntaxStablePtrId {
41009    fn from(ptr: TokenNodePtr) -> Self {
41010        ptr.untyped()
41011    }
41012}
41013impl From<TerminalIdentifierPtr> for TokenNodePtr {
41014    fn from(value: TerminalIdentifierPtr) -> Self {
41015        Self(value.0)
41016    }
41017}
41018impl From<TerminalLiteralNumberPtr> for TokenNodePtr {
41019    fn from(value: TerminalLiteralNumberPtr) -> Self {
41020        Self(value.0)
41021    }
41022}
41023impl From<TerminalShortStringPtr> for TokenNodePtr {
41024    fn from(value: TerminalShortStringPtr) -> Self {
41025        Self(value.0)
41026    }
41027}
41028impl From<TerminalStringPtr> for TokenNodePtr {
41029    fn from(value: TerminalStringPtr) -> Self {
41030        Self(value.0)
41031    }
41032}
41033impl From<TerminalAsPtr> for TokenNodePtr {
41034    fn from(value: TerminalAsPtr) -> Self {
41035        Self(value.0)
41036    }
41037}
41038impl From<TerminalConstPtr> for TokenNodePtr {
41039    fn from(value: TerminalConstPtr) -> Self {
41040        Self(value.0)
41041    }
41042}
41043impl From<TerminalElsePtr> for TokenNodePtr {
41044    fn from(value: TerminalElsePtr) -> Self {
41045        Self(value.0)
41046    }
41047}
41048impl From<TerminalEnumPtr> for TokenNodePtr {
41049    fn from(value: TerminalEnumPtr) -> Self {
41050        Self(value.0)
41051    }
41052}
41053impl From<TerminalExternPtr> for TokenNodePtr {
41054    fn from(value: TerminalExternPtr) -> Self {
41055        Self(value.0)
41056    }
41057}
41058impl From<TerminalFalsePtr> for TokenNodePtr {
41059    fn from(value: TerminalFalsePtr) -> Self {
41060        Self(value.0)
41061    }
41062}
41063impl From<TerminalFunctionPtr> for TokenNodePtr {
41064    fn from(value: TerminalFunctionPtr) -> Self {
41065        Self(value.0)
41066    }
41067}
41068impl From<TerminalIfPtr> for TokenNodePtr {
41069    fn from(value: TerminalIfPtr) -> Self {
41070        Self(value.0)
41071    }
41072}
41073impl From<TerminalWhilePtr> for TokenNodePtr {
41074    fn from(value: TerminalWhilePtr) -> Self {
41075        Self(value.0)
41076    }
41077}
41078impl From<TerminalForPtr> for TokenNodePtr {
41079    fn from(value: TerminalForPtr) -> Self {
41080        Self(value.0)
41081    }
41082}
41083impl From<TerminalLoopPtr> for TokenNodePtr {
41084    fn from(value: TerminalLoopPtr) -> Self {
41085        Self(value.0)
41086    }
41087}
41088impl From<TerminalImplPtr> for TokenNodePtr {
41089    fn from(value: TerminalImplPtr) -> Self {
41090        Self(value.0)
41091    }
41092}
41093impl From<TerminalImplicitsPtr> for TokenNodePtr {
41094    fn from(value: TerminalImplicitsPtr) -> Self {
41095        Self(value.0)
41096    }
41097}
41098impl From<TerminalLetPtr> for TokenNodePtr {
41099    fn from(value: TerminalLetPtr) -> Self {
41100        Self(value.0)
41101    }
41102}
41103impl From<TerminalMacroPtr> for TokenNodePtr {
41104    fn from(value: TerminalMacroPtr) -> Self {
41105        Self(value.0)
41106    }
41107}
41108impl From<TerminalMatchPtr> for TokenNodePtr {
41109    fn from(value: TerminalMatchPtr) -> Self {
41110        Self(value.0)
41111    }
41112}
41113impl From<TerminalModulePtr> for TokenNodePtr {
41114    fn from(value: TerminalModulePtr) -> Self {
41115        Self(value.0)
41116    }
41117}
41118impl From<TerminalMutPtr> for TokenNodePtr {
41119    fn from(value: TerminalMutPtr) -> Self {
41120        Self(value.0)
41121    }
41122}
41123impl From<TerminalNoPanicPtr> for TokenNodePtr {
41124    fn from(value: TerminalNoPanicPtr) -> Self {
41125        Self(value.0)
41126    }
41127}
41128impl From<TerminalOfPtr> for TokenNodePtr {
41129    fn from(value: TerminalOfPtr) -> Self {
41130        Self(value.0)
41131    }
41132}
41133impl From<TerminalRefPtr> for TokenNodePtr {
41134    fn from(value: TerminalRefPtr) -> Self {
41135        Self(value.0)
41136    }
41137}
41138impl From<TerminalContinuePtr> for TokenNodePtr {
41139    fn from(value: TerminalContinuePtr) -> Self {
41140        Self(value.0)
41141    }
41142}
41143impl From<TerminalReturnPtr> for TokenNodePtr {
41144    fn from(value: TerminalReturnPtr) -> Self {
41145        Self(value.0)
41146    }
41147}
41148impl From<TerminalBreakPtr> for TokenNodePtr {
41149    fn from(value: TerminalBreakPtr) -> Self {
41150        Self(value.0)
41151    }
41152}
41153impl From<TerminalStructPtr> for TokenNodePtr {
41154    fn from(value: TerminalStructPtr) -> Self {
41155        Self(value.0)
41156    }
41157}
41158impl From<TerminalTraitPtr> for TokenNodePtr {
41159    fn from(value: TerminalTraitPtr) -> Self {
41160        Self(value.0)
41161    }
41162}
41163impl From<TerminalTruePtr> for TokenNodePtr {
41164    fn from(value: TerminalTruePtr) -> Self {
41165        Self(value.0)
41166    }
41167}
41168impl From<TerminalTypePtr> for TokenNodePtr {
41169    fn from(value: TerminalTypePtr) -> Self {
41170        Self(value.0)
41171    }
41172}
41173impl From<TerminalUsePtr> for TokenNodePtr {
41174    fn from(value: TerminalUsePtr) -> Self {
41175        Self(value.0)
41176    }
41177}
41178impl From<TerminalPubPtr> for TokenNodePtr {
41179    fn from(value: TerminalPubPtr) -> Self {
41180        Self(value.0)
41181    }
41182}
41183impl From<TerminalAndPtr> for TokenNodePtr {
41184    fn from(value: TerminalAndPtr) -> Self {
41185        Self(value.0)
41186    }
41187}
41188impl From<TerminalAndAndPtr> for TokenNodePtr {
41189    fn from(value: TerminalAndAndPtr) -> Self {
41190        Self(value.0)
41191    }
41192}
41193impl From<TerminalArrowPtr> for TokenNodePtr {
41194    fn from(value: TerminalArrowPtr) -> Self {
41195        Self(value.0)
41196    }
41197}
41198impl From<TerminalAtPtr> for TokenNodePtr {
41199    fn from(value: TerminalAtPtr) -> Self {
41200        Self(value.0)
41201    }
41202}
41203impl From<TerminalBadCharactersPtr> for TokenNodePtr {
41204    fn from(value: TerminalBadCharactersPtr) -> Self {
41205        Self(value.0)
41206    }
41207}
41208impl From<TerminalColonPtr> for TokenNodePtr {
41209    fn from(value: TerminalColonPtr) -> Self {
41210        Self(value.0)
41211    }
41212}
41213impl From<TerminalColonColonPtr> for TokenNodePtr {
41214    fn from(value: TerminalColonColonPtr) -> Self {
41215        Self(value.0)
41216    }
41217}
41218impl From<TerminalCommaPtr> for TokenNodePtr {
41219    fn from(value: TerminalCommaPtr) -> Self {
41220        Self(value.0)
41221    }
41222}
41223impl From<TerminalDivPtr> for TokenNodePtr {
41224    fn from(value: TerminalDivPtr) -> Self {
41225        Self(value.0)
41226    }
41227}
41228impl From<TerminalDivEqPtr> for TokenNodePtr {
41229    fn from(value: TerminalDivEqPtr) -> Self {
41230        Self(value.0)
41231    }
41232}
41233impl From<TerminalDollarPtr> for TokenNodePtr {
41234    fn from(value: TerminalDollarPtr) -> Self {
41235        Self(value.0)
41236    }
41237}
41238impl From<TerminalDotPtr> for TokenNodePtr {
41239    fn from(value: TerminalDotPtr) -> Self {
41240        Self(value.0)
41241    }
41242}
41243impl From<TerminalDotDotPtr> for TokenNodePtr {
41244    fn from(value: TerminalDotDotPtr) -> Self {
41245        Self(value.0)
41246    }
41247}
41248impl From<TerminalDotDotEqPtr> for TokenNodePtr {
41249    fn from(value: TerminalDotDotEqPtr) -> Self {
41250        Self(value.0)
41251    }
41252}
41253impl From<TerminalEndOfFilePtr> for TokenNodePtr {
41254    fn from(value: TerminalEndOfFilePtr) -> Self {
41255        Self(value.0)
41256    }
41257}
41258impl From<TerminalEqPtr> for TokenNodePtr {
41259    fn from(value: TerminalEqPtr) -> Self {
41260        Self(value.0)
41261    }
41262}
41263impl From<TerminalEqEqPtr> for TokenNodePtr {
41264    fn from(value: TerminalEqEqPtr) -> Self {
41265        Self(value.0)
41266    }
41267}
41268impl From<TerminalGEPtr> for TokenNodePtr {
41269    fn from(value: TerminalGEPtr) -> Self {
41270        Self(value.0)
41271    }
41272}
41273impl From<TerminalGTPtr> for TokenNodePtr {
41274    fn from(value: TerminalGTPtr) -> Self {
41275        Self(value.0)
41276    }
41277}
41278impl From<TerminalHashPtr> for TokenNodePtr {
41279    fn from(value: TerminalHashPtr) -> Self {
41280        Self(value.0)
41281    }
41282}
41283impl From<TerminalLBracePtr> for TokenNodePtr {
41284    fn from(value: TerminalLBracePtr) -> Self {
41285        Self(value.0)
41286    }
41287}
41288impl From<TerminalLBrackPtr> for TokenNodePtr {
41289    fn from(value: TerminalLBrackPtr) -> Self {
41290        Self(value.0)
41291    }
41292}
41293impl From<TerminalLEPtr> for TokenNodePtr {
41294    fn from(value: TerminalLEPtr) -> Self {
41295        Self(value.0)
41296    }
41297}
41298impl From<TerminalLParenPtr> for TokenNodePtr {
41299    fn from(value: TerminalLParenPtr) -> Self {
41300        Self(value.0)
41301    }
41302}
41303impl From<TerminalLTPtr> for TokenNodePtr {
41304    fn from(value: TerminalLTPtr) -> Self {
41305        Self(value.0)
41306    }
41307}
41308impl From<TerminalMatchArrowPtr> for TokenNodePtr {
41309    fn from(value: TerminalMatchArrowPtr) -> Self {
41310        Self(value.0)
41311    }
41312}
41313impl From<TerminalMinusPtr> for TokenNodePtr {
41314    fn from(value: TerminalMinusPtr) -> Self {
41315        Self(value.0)
41316    }
41317}
41318impl From<TerminalMinusEqPtr> for TokenNodePtr {
41319    fn from(value: TerminalMinusEqPtr) -> Self {
41320        Self(value.0)
41321    }
41322}
41323impl From<TerminalModPtr> for TokenNodePtr {
41324    fn from(value: TerminalModPtr) -> Self {
41325        Self(value.0)
41326    }
41327}
41328impl From<TerminalModEqPtr> for TokenNodePtr {
41329    fn from(value: TerminalModEqPtr) -> Self {
41330        Self(value.0)
41331    }
41332}
41333impl From<TerminalMulPtr> for TokenNodePtr {
41334    fn from(value: TerminalMulPtr) -> Self {
41335        Self(value.0)
41336    }
41337}
41338impl From<TerminalMulEqPtr> for TokenNodePtr {
41339    fn from(value: TerminalMulEqPtr) -> Self {
41340        Self(value.0)
41341    }
41342}
41343impl From<TerminalNeqPtr> for TokenNodePtr {
41344    fn from(value: TerminalNeqPtr) -> Self {
41345        Self(value.0)
41346    }
41347}
41348impl From<TerminalNotPtr> for TokenNodePtr {
41349    fn from(value: TerminalNotPtr) -> Self {
41350        Self(value.0)
41351    }
41352}
41353impl From<TerminalBitNotPtr> for TokenNodePtr {
41354    fn from(value: TerminalBitNotPtr) -> Self {
41355        Self(value.0)
41356    }
41357}
41358impl From<TerminalOrPtr> for TokenNodePtr {
41359    fn from(value: TerminalOrPtr) -> Self {
41360        Self(value.0)
41361    }
41362}
41363impl From<TerminalOrOrPtr> for TokenNodePtr {
41364    fn from(value: TerminalOrOrPtr) -> Self {
41365        Self(value.0)
41366    }
41367}
41368impl From<TerminalPlusPtr> for TokenNodePtr {
41369    fn from(value: TerminalPlusPtr) -> Self {
41370        Self(value.0)
41371    }
41372}
41373impl From<TerminalPlusEqPtr> for TokenNodePtr {
41374    fn from(value: TerminalPlusEqPtr) -> Self {
41375        Self(value.0)
41376    }
41377}
41378impl From<TerminalQuestionMarkPtr> for TokenNodePtr {
41379    fn from(value: TerminalQuestionMarkPtr) -> Self {
41380        Self(value.0)
41381    }
41382}
41383impl From<TerminalRBracePtr> for TokenNodePtr {
41384    fn from(value: TerminalRBracePtr) -> Self {
41385        Self(value.0)
41386    }
41387}
41388impl From<TerminalRBrackPtr> for TokenNodePtr {
41389    fn from(value: TerminalRBrackPtr) -> Self {
41390        Self(value.0)
41391    }
41392}
41393impl From<TerminalRParenPtr> for TokenNodePtr {
41394    fn from(value: TerminalRParenPtr) -> Self {
41395        Self(value.0)
41396    }
41397}
41398impl From<TerminalSemicolonPtr> for TokenNodePtr {
41399    fn from(value: TerminalSemicolonPtr) -> Self {
41400        Self(value.0)
41401    }
41402}
41403impl From<TerminalUnderscorePtr> for TokenNodePtr {
41404    fn from(value: TerminalUnderscorePtr) -> Self {
41405        Self(value.0)
41406    }
41407}
41408impl From<TerminalXorPtr> for TokenNodePtr {
41409    fn from(value: TerminalXorPtr) -> Self {
41410        Self(value.0)
41411    }
41412}
41413impl From<TerminalEmptyPtr> for TokenNodePtr {
41414    fn from(value: TerminalEmptyPtr) -> Self {
41415        Self(value.0)
41416    }
41417}
41418impl From<TerminalIdentifierGreen> for TokenNodeGreen {
41419    fn from(value: TerminalIdentifierGreen) -> Self {
41420        Self(value.0)
41421    }
41422}
41423impl From<TerminalLiteralNumberGreen> for TokenNodeGreen {
41424    fn from(value: TerminalLiteralNumberGreen) -> Self {
41425        Self(value.0)
41426    }
41427}
41428impl From<TerminalShortStringGreen> for TokenNodeGreen {
41429    fn from(value: TerminalShortStringGreen) -> Self {
41430        Self(value.0)
41431    }
41432}
41433impl From<TerminalStringGreen> for TokenNodeGreen {
41434    fn from(value: TerminalStringGreen) -> Self {
41435        Self(value.0)
41436    }
41437}
41438impl From<TerminalAsGreen> for TokenNodeGreen {
41439    fn from(value: TerminalAsGreen) -> Self {
41440        Self(value.0)
41441    }
41442}
41443impl From<TerminalConstGreen> for TokenNodeGreen {
41444    fn from(value: TerminalConstGreen) -> Self {
41445        Self(value.0)
41446    }
41447}
41448impl From<TerminalElseGreen> for TokenNodeGreen {
41449    fn from(value: TerminalElseGreen) -> Self {
41450        Self(value.0)
41451    }
41452}
41453impl From<TerminalEnumGreen> for TokenNodeGreen {
41454    fn from(value: TerminalEnumGreen) -> Self {
41455        Self(value.0)
41456    }
41457}
41458impl From<TerminalExternGreen> for TokenNodeGreen {
41459    fn from(value: TerminalExternGreen) -> Self {
41460        Self(value.0)
41461    }
41462}
41463impl From<TerminalFalseGreen> for TokenNodeGreen {
41464    fn from(value: TerminalFalseGreen) -> Self {
41465        Self(value.0)
41466    }
41467}
41468impl From<TerminalFunctionGreen> for TokenNodeGreen {
41469    fn from(value: TerminalFunctionGreen) -> Self {
41470        Self(value.0)
41471    }
41472}
41473impl From<TerminalIfGreen> for TokenNodeGreen {
41474    fn from(value: TerminalIfGreen) -> Self {
41475        Self(value.0)
41476    }
41477}
41478impl From<TerminalWhileGreen> for TokenNodeGreen {
41479    fn from(value: TerminalWhileGreen) -> Self {
41480        Self(value.0)
41481    }
41482}
41483impl From<TerminalForGreen> for TokenNodeGreen {
41484    fn from(value: TerminalForGreen) -> Self {
41485        Self(value.0)
41486    }
41487}
41488impl From<TerminalLoopGreen> for TokenNodeGreen {
41489    fn from(value: TerminalLoopGreen) -> Self {
41490        Self(value.0)
41491    }
41492}
41493impl From<TerminalImplGreen> for TokenNodeGreen {
41494    fn from(value: TerminalImplGreen) -> Self {
41495        Self(value.0)
41496    }
41497}
41498impl From<TerminalImplicitsGreen> for TokenNodeGreen {
41499    fn from(value: TerminalImplicitsGreen) -> Self {
41500        Self(value.0)
41501    }
41502}
41503impl From<TerminalLetGreen> for TokenNodeGreen {
41504    fn from(value: TerminalLetGreen) -> Self {
41505        Self(value.0)
41506    }
41507}
41508impl From<TerminalMacroGreen> for TokenNodeGreen {
41509    fn from(value: TerminalMacroGreen) -> Self {
41510        Self(value.0)
41511    }
41512}
41513impl From<TerminalMatchGreen> for TokenNodeGreen {
41514    fn from(value: TerminalMatchGreen) -> Self {
41515        Self(value.0)
41516    }
41517}
41518impl From<TerminalModuleGreen> for TokenNodeGreen {
41519    fn from(value: TerminalModuleGreen) -> Self {
41520        Self(value.0)
41521    }
41522}
41523impl From<TerminalMutGreen> for TokenNodeGreen {
41524    fn from(value: TerminalMutGreen) -> Self {
41525        Self(value.0)
41526    }
41527}
41528impl From<TerminalNoPanicGreen> for TokenNodeGreen {
41529    fn from(value: TerminalNoPanicGreen) -> Self {
41530        Self(value.0)
41531    }
41532}
41533impl From<TerminalOfGreen> for TokenNodeGreen {
41534    fn from(value: TerminalOfGreen) -> Self {
41535        Self(value.0)
41536    }
41537}
41538impl From<TerminalRefGreen> for TokenNodeGreen {
41539    fn from(value: TerminalRefGreen) -> Self {
41540        Self(value.0)
41541    }
41542}
41543impl From<TerminalContinueGreen> for TokenNodeGreen {
41544    fn from(value: TerminalContinueGreen) -> Self {
41545        Self(value.0)
41546    }
41547}
41548impl From<TerminalReturnGreen> for TokenNodeGreen {
41549    fn from(value: TerminalReturnGreen) -> Self {
41550        Self(value.0)
41551    }
41552}
41553impl From<TerminalBreakGreen> for TokenNodeGreen {
41554    fn from(value: TerminalBreakGreen) -> Self {
41555        Self(value.0)
41556    }
41557}
41558impl From<TerminalStructGreen> for TokenNodeGreen {
41559    fn from(value: TerminalStructGreen) -> Self {
41560        Self(value.0)
41561    }
41562}
41563impl From<TerminalTraitGreen> for TokenNodeGreen {
41564    fn from(value: TerminalTraitGreen) -> Self {
41565        Self(value.0)
41566    }
41567}
41568impl From<TerminalTrueGreen> for TokenNodeGreen {
41569    fn from(value: TerminalTrueGreen) -> Self {
41570        Self(value.0)
41571    }
41572}
41573impl From<TerminalTypeGreen> for TokenNodeGreen {
41574    fn from(value: TerminalTypeGreen) -> Self {
41575        Self(value.0)
41576    }
41577}
41578impl From<TerminalUseGreen> for TokenNodeGreen {
41579    fn from(value: TerminalUseGreen) -> Self {
41580        Self(value.0)
41581    }
41582}
41583impl From<TerminalPubGreen> for TokenNodeGreen {
41584    fn from(value: TerminalPubGreen) -> Self {
41585        Self(value.0)
41586    }
41587}
41588impl From<TerminalAndGreen> for TokenNodeGreen {
41589    fn from(value: TerminalAndGreen) -> Self {
41590        Self(value.0)
41591    }
41592}
41593impl From<TerminalAndAndGreen> for TokenNodeGreen {
41594    fn from(value: TerminalAndAndGreen) -> Self {
41595        Self(value.0)
41596    }
41597}
41598impl From<TerminalArrowGreen> for TokenNodeGreen {
41599    fn from(value: TerminalArrowGreen) -> Self {
41600        Self(value.0)
41601    }
41602}
41603impl From<TerminalAtGreen> for TokenNodeGreen {
41604    fn from(value: TerminalAtGreen) -> Self {
41605        Self(value.0)
41606    }
41607}
41608impl From<TerminalBadCharactersGreen> for TokenNodeGreen {
41609    fn from(value: TerminalBadCharactersGreen) -> Self {
41610        Self(value.0)
41611    }
41612}
41613impl From<TerminalColonGreen> for TokenNodeGreen {
41614    fn from(value: TerminalColonGreen) -> Self {
41615        Self(value.0)
41616    }
41617}
41618impl From<TerminalColonColonGreen> for TokenNodeGreen {
41619    fn from(value: TerminalColonColonGreen) -> Self {
41620        Self(value.0)
41621    }
41622}
41623impl From<TerminalCommaGreen> for TokenNodeGreen {
41624    fn from(value: TerminalCommaGreen) -> Self {
41625        Self(value.0)
41626    }
41627}
41628impl From<TerminalDivGreen> for TokenNodeGreen {
41629    fn from(value: TerminalDivGreen) -> Self {
41630        Self(value.0)
41631    }
41632}
41633impl From<TerminalDivEqGreen> for TokenNodeGreen {
41634    fn from(value: TerminalDivEqGreen) -> Self {
41635        Self(value.0)
41636    }
41637}
41638impl From<TerminalDollarGreen> for TokenNodeGreen {
41639    fn from(value: TerminalDollarGreen) -> Self {
41640        Self(value.0)
41641    }
41642}
41643impl From<TerminalDotGreen> for TokenNodeGreen {
41644    fn from(value: TerminalDotGreen) -> Self {
41645        Self(value.0)
41646    }
41647}
41648impl From<TerminalDotDotGreen> for TokenNodeGreen {
41649    fn from(value: TerminalDotDotGreen) -> Self {
41650        Self(value.0)
41651    }
41652}
41653impl From<TerminalDotDotEqGreen> for TokenNodeGreen {
41654    fn from(value: TerminalDotDotEqGreen) -> Self {
41655        Self(value.0)
41656    }
41657}
41658impl From<TerminalEndOfFileGreen> for TokenNodeGreen {
41659    fn from(value: TerminalEndOfFileGreen) -> Self {
41660        Self(value.0)
41661    }
41662}
41663impl From<TerminalEqGreen> for TokenNodeGreen {
41664    fn from(value: TerminalEqGreen) -> Self {
41665        Self(value.0)
41666    }
41667}
41668impl From<TerminalEqEqGreen> for TokenNodeGreen {
41669    fn from(value: TerminalEqEqGreen) -> Self {
41670        Self(value.0)
41671    }
41672}
41673impl From<TerminalGEGreen> for TokenNodeGreen {
41674    fn from(value: TerminalGEGreen) -> Self {
41675        Self(value.0)
41676    }
41677}
41678impl From<TerminalGTGreen> for TokenNodeGreen {
41679    fn from(value: TerminalGTGreen) -> Self {
41680        Self(value.0)
41681    }
41682}
41683impl From<TerminalHashGreen> for TokenNodeGreen {
41684    fn from(value: TerminalHashGreen) -> Self {
41685        Self(value.0)
41686    }
41687}
41688impl From<TerminalLBraceGreen> for TokenNodeGreen {
41689    fn from(value: TerminalLBraceGreen) -> Self {
41690        Self(value.0)
41691    }
41692}
41693impl From<TerminalLBrackGreen> for TokenNodeGreen {
41694    fn from(value: TerminalLBrackGreen) -> Self {
41695        Self(value.0)
41696    }
41697}
41698impl From<TerminalLEGreen> for TokenNodeGreen {
41699    fn from(value: TerminalLEGreen) -> Self {
41700        Self(value.0)
41701    }
41702}
41703impl From<TerminalLParenGreen> for TokenNodeGreen {
41704    fn from(value: TerminalLParenGreen) -> Self {
41705        Self(value.0)
41706    }
41707}
41708impl From<TerminalLTGreen> for TokenNodeGreen {
41709    fn from(value: TerminalLTGreen) -> Self {
41710        Self(value.0)
41711    }
41712}
41713impl From<TerminalMatchArrowGreen> for TokenNodeGreen {
41714    fn from(value: TerminalMatchArrowGreen) -> Self {
41715        Self(value.0)
41716    }
41717}
41718impl From<TerminalMinusGreen> for TokenNodeGreen {
41719    fn from(value: TerminalMinusGreen) -> Self {
41720        Self(value.0)
41721    }
41722}
41723impl From<TerminalMinusEqGreen> for TokenNodeGreen {
41724    fn from(value: TerminalMinusEqGreen) -> Self {
41725        Self(value.0)
41726    }
41727}
41728impl From<TerminalModGreen> for TokenNodeGreen {
41729    fn from(value: TerminalModGreen) -> Self {
41730        Self(value.0)
41731    }
41732}
41733impl From<TerminalModEqGreen> for TokenNodeGreen {
41734    fn from(value: TerminalModEqGreen) -> Self {
41735        Self(value.0)
41736    }
41737}
41738impl From<TerminalMulGreen> for TokenNodeGreen {
41739    fn from(value: TerminalMulGreen) -> Self {
41740        Self(value.0)
41741    }
41742}
41743impl From<TerminalMulEqGreen> for TokenNodeGreen {
41744    fn from(value: TerminalMulEqGreen) -> Self {
41745        Self(value.0)
41746    }
41747}
41748impl From<TerminalNeqGreen> for TokenNodeGreen {
41749    fn from(value: TerminalNeqGreen) -> Self {
41750        Self(value.0)
41751    }
41752}
41753impl From<TerminalNotGreen> for TokenNodeGreen {
41754    fn from(value: TerminalNotGreen) -> Self {
41755        Self(value.0)
41756    }
41757}
41758impl From<TerminalBitNotGreen> for TokenNodeGreen {
41759    fn from(value: TerminalBitNotGreen) -> Self {
41760        Self(value.0)
41761    }
41762}
41763impl From<TerminalOrGreen> for TokenNodeGreen {
41764    fn from(value: TerminalOrGreen) -> Self {
41765        Self(value.0)
41766    }
41767}
41768impl From<TerminalOrOrGreen> for TokenNodeGreen {
41769    fn from(value: TerminalOrOrGreen) -> Self {
41770        Self(value.0)
41771    }
41772}
41773impl From<TerminalPlusGreen> for TokenNodeGreen {
41774    fn from(value: TerminalPlusGreen) -> Self {
41775        Self(value.0)
41776    }
41777}
41778impl From<TerminalPlusEqGreen> for TokenNodeGreen {
41779    fn from(value: TerminalPlusEqGreen) -> Self {
41780        Self(value.0)
41781    }
41782}
41783impl From<TerminalQuestionMarkGreen> for TokenNodeGreen {
41784    fn from(value: TerminalQuestionMarkGreen) -> Self {
41785        Self(value.0)
41786    }
41787}
41788impl From<TerminalRBraceGreen> for TokenNodeGreen {
41789    fn from(value: TerminalRBraceGreen) -> Self {
41790        Self(value.0)
41791    }
41792}
41793impl From<TerminalRBrackGreen> for TokenNodeGreen {
41794    fn from(value: TerminalRBrackGreen) -> Self {
41795        Self(value.0)
41796    }
41797}
41798impl From<TerminalRParenGreen> for TokenNodeGreen {
41799    fn from(value: TerminalRParenGreen) -> Self {
41800        Self(value.0)
41801    }
41802}
41803impl From<TerminalSemicolonGreen> for TokenNodeGreen {
41804    fn from(value: TerminalSemicolonGreen) -> Self {
41805        Self(value.0)
41806    }
41807}
41808impl From<TerminalUnderscoreGreen> for TokenNodeGreen {
41809    fn from(value: TerminalUnderscoreGreen) -> Self {
41810        Self(value.0)
41811    }
41812}
41813impl From<TerminalXorGreen> for TokenNodeGreen {
41814    fn from(value: TerminalXorGreen) -> Self {
41815        Self(value.0)
41816    }
41817}
41818impl From<TerminalEmptyGreen> for TokenNodeGreen {
41819    fn from(value: TerminalEmptyGreen) -> Self {
41820        Self(value.0)
41821    }
41822}
41823#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
41824pub struct TokenNodeGreen(pub GreenId);
41825impl TypedSyntaxNode for TokenNode {
41826    const OPTIONAL_KIND: Option<SyntaxKind> = None;
41827    type StablePtr = TokenNodePtr;
41828    type Green = TokenNodeGreen;
41829    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
41830        panic!("No missing variant.");
41831    }
41832    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
41833        let kind = node.kind(db);
41834        match kind {
41835            SyntaxKind::TerminalIdentifier => {
41836                TokenNode::TerminalIdentifier(TerminalIdentifier::from_syntax_node(db, node))
41837            }
41838            SyntaxKind::TerminalLiteralNumber => {
41839                TokenNode::TerminalLiteralNumber(TerminalLiteralNumber::from_syntax_node(db, node))
41840            }
41841            SyntaxKind::TerminalShortString => {
41842                TokenNode::TerminalShortString(TerminalShortString::from_syntax_node(db, node))
41843            }
41844            SyntaxKind::TerminalString => {
41845                TokenNode::TerminalString(TerminalString::from_syntax_node(db, node))
41846            }
41847            SyntaxKind::TerminalAs => TokenNode::TerminalAs(TerminalAs::from_syntax_node(db, node)),
41848            SyntaxKind::TerminalConst => {
41849                TokenNode::TerminalConst(TerminalConst::from_syntax_node(db, node))
41850            }
41851            SyntaxKind::TerminalElse => {
41852                TokenNode::TerminalElse(TerminalElse::from_syntax_node(db, node))
41853            }
41854            SyntaxKind::TerminalEnum => {
41855                TokenNode::TerminalEnum(TerminalEnum::from_syntax_node(db, node))
41856            }
41857            SyntaxKind::TerminalExtern => {
41858                TokenNode::TerminalExtern(TerminalExtern::from_syntax_node(db, node))
41859            }
41860            SyntaxKind::TerminalFalse => {
41861                TokenNode::TerminalFalse(TerminalFalse::from_syntax_node(db, node))
41862            }
41863            SyntaxKind::TerminalFunction => {
41864                TokenNode::TerminalFunction(TerminalFunction::from_syntax_node(db, node))
41865            }
41866            SyntaxKind::TerminalIf => TokenNode::TerminalIf(TerminalIf::from_syntax_node(db, node)),
41867            SyntaxKind::TerminalWhile => {
41868                TokenNode::TerminalWhile(TerminalWhile::from_syntax_node(db, node))
41869            }
41870            SyntaxKind::TerminalFor => {
41871                TokenNode::TerminalFor(TerminalFor::from_syntax_node(db, node))
41872            }
41873            SyntaxKind::TerminalLoop => {
41874                TokenNode::TerminalLoop(TerminalLoop::from_syntax_node(db, node))
41875            }
41876            SyntaxKind::TerminalImpl => {
41877                TokenNode::TerminalImpl(TerminalImpl::from_syntax_node(db, node))
41878            }
41879            SyntaxKind::TerminalImplicits => {
41880                TokenNode::TerminalImplicits(TerminalImplicits::from_syntax_node(db, node))
41881            }
41882            SyntaxKind::TerminalLet => {
41883                TokenNode::TerminalLet(TerminalLet::from_syntax_node(db, node))
41884            }
41885            SyntaxKind::TerminalMacro => {
41886                TokenNode::TerminalMacro(TerminalMacro::from_syntax_node(db, node))
41887            }
41888            SyntaxKind::TerminalMatch => {
41889                TokenNode::TerminalMatch(TerminalMatch::from_syntax_node(db, node))
41890            }
41891            SyntaxKind::TerminalModule => {
41892                TokenNode::TerminalModule(TerminalModule::from_syntax_node(db, node))
41893            }
41894            SyntaxKind::TerminalMut => {
41895                TokenNode::TerminalMut(TerminalMut::from_syntax_node(db, node))
41896            }
41897            SyntaxKind::TerminalNoPanic => {
41898                TokenNode::TerminalNoPanic(TerminalNoPanic::from_syntax_node(db, node))
41899            }
41900            SyntaxKind::TerminalOf => TokenNode::TerminalOf(TerminalOf::from_syntax_node(db, node)),
41901            SyntaxKind::TerminalRef => {
41902                TokenNode::TerminalRef(TerminalRef::from_syntax_node(db, node))
41903            }
41904            SyntaxKind::TerminalContinue => {
41905                TokenNode::TerminalContinue(TerminalContinue::from_syntax_node(db, node))
41906            }
41907            SyntaxKind::TerminalReturn => {
41908                TokenNode::TerminalReturn(TerminalReturn::from_syntax_node(db, node))
41909            }
41910            SyntaxKind::TerminalBreak => {
41911                TokenNode::TerminalBreak(TerminalBreak::from_syntax_node(db, node))
41912            }
41913            SyntaxKind::TerminalStruct => {
41914                TokenNode::TerminalStruct(TerminalStruct::from_syntax_node(db, node))
41915            }
41916            SyntaxKind::TerminalTrait => {
41917                TokenNode::TerminalTrait(TerminalTrait::from_syntax_node(db, node))
41918            }
41919            SyntaxKind::TerminalTrue => {
41920                TokenNode::TerminalTrue(TerminalTrue::from_syntax_node(db, node))
41921            }
41922            SyntaxKind::TerminalType => {
41923                TokenNode::TerminalType(TerminalType::from_syntax_node(db, node))
41924            }
41925            SyntaxKind::TerminalUse => {
41926                TokenNode::TerminalUse(TerminalUse::from_syntax_node(db, node))
41927            }
41928            SyntaxKind::TerminalPub => {
41929                TokenNode::TerminalPub(TerminalPub::from_syntax_node(db, node))
41930            }
41931            SyntaxKind::TerminalAnd => {
41932                TokenNode::TerminalAnd(TerminalAnd::from_syntax_node(db, node))
41933            }
41934            SyntaxKind::TerminalAndAnd => {
41935                TokenNode::TerminalAndAnd(TerminalAndAnd::from_syntax_node(db, node))
41936            }
41937            SyntaxKind::TerminalArrow => {
41938                TokenNode::TerminalArrow(TerminalArrow::from_syntax_node(db, node))
41939            }
41940            SyntaxKind::TerminalAt => TokenNode::TerminalAt(TerminalAt::from_syntax_node(db, node)),
41941            SyntaxKind::TerminalBadCharacters => {
41942                TokenNode::TerminalBadCharacters(TerminalBadCharacters::from_syntax_node(db, node))
41943            }
41944            SyntaxKind::TerminalColon => {
41945                TokenNode::TerminalColon(TerminalColon::from_syntax_node(db, node))
41946            }
41947            SyntaxKind::TerminalColonColon => {
41948                TokenNode::TerminalColonColon(TerminalColonColon::from_syntax_node(db, node))
41949            }
41950            SyntaxKind::TerminalComma => {
41951                TokenNode::TerminalComma(TerminalComma::from_syntax_node(db, node))
41952            }
41953            SyntaxKind::TerminalDiv => {
41954                TokenNode::TerminalDiv(TerminalDiv::from_syntax_node(db, node))
41955            }
41956            SyntaxKind::TerminalDivEq => {
41957                TokenNode::TerminalDivEq(TerminalDivEq::from_syntax_node(db, node))
41958            }
41959            SyntaxKind::TerminalDollar => {
41960                TokenNode::TerminalDollar(TerminalDollar::from_syntax_node(db, node))
41961            }
41962            SyntaxKind::TerminalDot => {
41963                TokenNode::TerminalDot(TerminalDot::from_syntax_node(db, node))
41964            }
41965            SyntaxKind::TerminalDotDot => {
41966                TokenNode::TerminalDotDot(TerminalDotDot::from_syntax_node(db, node))
41967            }
41968            SyntaxKind::TerminalDotDotEq => {
41969                TokenNode::TerminalDotDotEq(TerminalDotDotEq::from_syntax_node(db, node))
41970            }
41971            SyntaxKind::TerminalEndOfFile => {
41972                TokenNode::TerminalEndOfFile(TerminalEndOfFile::from_syntax_node(db, node))
41973            }
41974            SyntaxKind::TerminalEq => TokenNode::TerminalEq(TerminalEq::from_syntax_node(db, node)),
41975            SyntaxKind::TerminalEqEq => {
41976                TokenNode::TerminalEqEq(TerminalEqEq::from_syntax_node(db, node))
41977            }
41978            SyntaxKind::TerminalGE => TokenNode::TerminalGE(TerminalGE::from_syntax_node(db, node)),
41979            SyntaxKind::TerminalGT => TokenNode::TerminalGT(TerminalGT::from_syntax_node(db, node)),
41980            SyntaxKind::TerminalHash => {
41981                TokenNode::TerminalHash(TerminalHash::from_syntax_node(db, node))
41982            }
41983            SyntaxKind::TerminalLBrace => {
41984                TokenNode::TerminalLBrace(TerminalLBrace::from_syntax_node(db, node))
41985            }
41986            SyntaxKind::TerminalLBrack => {
41987                TokenNode::TerminalLBrack(TerminalLBrack::from_syntax_node(db, node))
41988            }
41989            SyntaxKind::TerminalLE => TokenNode::TerminalLE(TerminalLE::from_syntax_node(db, node)),
41990            SyntaxKind::TerminalLParen => {
41991                TokenNode::TerminalLParen(TerminalLParen::from_syntax_node(db, node))
41992            }
41993            SyntaxKind::TerminalLT => TokenNode::TerminalLT(TerminalLT::from_syntax_node(db, node)),
41994            SyntaxKind::TerminalMatchArrow => {
41995                TokenNode::TerminalMatchArrow(TerminalMatchArrow::from_syntax_node(db, node))
41996            }
41997            SyntaxKind::TerminalMinus => {
41998                TokenNode::TerminalMinus(TerminalMinus::from_syntax_node(db, node))
41999            }
42000            SyntaxKind::TerminalMinusEq => {
42001                TokenNode::TerminalMinusEq(TerminalMinusEq::from_syntax_node(db, node))
42002            }
42003            SyntaxKind::TerminalMod => {
42004                TokenNode::TerminalMod(TerminalMod::from_syntax_node(db, node))
42005            }
42006            SyntaxKind::TerminalModEq => {
42007                TokenNode::TerminalModEq(TerminalModEq::from_syntax_node(db, node))
42008            }
42009            SyntaxKind::TerminalMul => {
42010                TokenNode::TerminalMul(TerminalMul::from_syntax_node(db, node))
42011            }
42012            SyntaxKind::TerminalMulEq => {
42013                TokenNode::TerminalMulEq(TerminalMulEq::from_syntax_node(db, node))
42014            }
42015            SyntaxKind::TerminalNeq => {
42016                TokenNode::TerminalNeq(TerminalNeq::from_syntax_node(db, node))
42017            }
42018            SyntaxKind::TerminalNot => {
42019                TokenNode::TerminalNot(TerminalNot::from_syntax_node(db, node))
42020            }
42021            SyntaxKind::TerminalBitNot => {
42022                TokenNode::TerminalBitNot(TerminalBitNot::from_syntax_node(db, node))
42023            }
42024            SyntaxKind::TerminalOr => TokenNode::TerminalOr(TerminalOr::from_syntax_node(db, node)),
42025            SyntaxKind::TerminalOrOr => {
42026                TokenNode::TerminalOrOr(TerminalOrOr::from_syntax_node(db, node))
42027            }
42028            SyntaxKind::TerminalPlus => {
42029                TokenNode::TerminalPlus(TerminalPlus::from_syntax_node(db, node))
42030            }
42031            SyntaxKind::TerminalPlusEq => {
42032                TokenNode::TerminalPlusEq(TerminalPlusEq::from_syntax_node(db, node))
42033            }
42034            SyntaxKind::TerminalQuestionMark => {
42035                TokenNode::TerminalQuestionMark(TerminalQuestionMark::from_syntax_node(db, node))
42036            }
42037            SyntaxKind::TerminalRBrace => {
42038                TokenNode::TerminalRBrace(TerminalRBrace::from_syntax_node(db, node))
42039            }
42040            SyntaxKind::TerminalRBrack => {
42041                TokenNode::TerminalRBrack(TerminalRBrack::from_syntax_node(db, node))
42042            }
42043            SyntaxKind::TerminalRParen => {
42044                TokenNode::TerminalRParen(TerminalRParen::from_syntax_node(db, node))
42045            }
42046            SyntaxKind::TerminalSemicolon => {
42047                TokenNode::TerminalSemicolon(TerminalSemicolon::from_syntax_node(db, node))
42048            }
42049            SyntaxKind::TerminalUnderscore => {
42050                TokenNode::TerminalUnderscore(TerminalUnderscore::from_syntax_node(db, node))
42051            }
42052            SyntaxKind::TerminalXor => {
42053                TokenNode::TerminalXor(TerminalXor::from_syntax_node(db, node))
42054            }
42055            SyntaxKind::TerminalEmpty => {
42056                TokenNode::TerminalEmpty(TerminalEmpty::from_syntax_node(db, node))
42057            }
42058            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "TokenNode"),
42059        }
42060    }
42061    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
42062        let kind = node.kind(db);
42063        match kind {
42064            SyntaxKind::TerminalIdentifier => {
42065                Some(TokenNode::TerminalIdentifier(TerminalIdentifier::from_syntax_node(db, node)))
42066            }
42067            SyntaxKind::TerminalLiteralNumber => Some(TokenNode::TerminalLiteralNumber(
42068                TerminalLiteralNumber::from_syntax_node(db, node),
42069            )),
42070            SyntaxKind::TerminalShortString => Some(TokenNode::TerminalShortString(
42071                TerminalShortString::from_syntax_node(db, node),
42072            )),
42073            SyntaxKind::TerminalString => {
42074                Some(TokenNode::TerminalString(TerminalString::from_syntax_node(db, node)))
42075            }
42076            SyntaxKind::TerminalAs => {
42077                Some(TokenNode::TerminalAs(TerminalAs::from_syntax_node(db, node)))
42078            }
42079            SyntaxKind::TerminalConst => {
42080                Some(TokenNode::TerminalConst(TerminalConst::from_syntax_node(db, node)))
42081            }
42082            SyntaxKind::TerminalElse => {
42083                Some(TokenNode::TerminalElse(TerminalElse::from_syntax_node(db, node)))
42084            }
42085            SyntaxKind::TerminalEnum => {
42086                Some(TokenNode::TerminalEnum(TerminalEnum::from_syntax_node(db, node)))
42087            }
42088            SyntaxKind::TerminalExtern => {
42089                Some(TokenNode::TerminalExtern(TerminalExtern::from_syntax_node(db, node)))
42090            }
42091            SyntaxKind::TerminalFalse => {
42092                Some(TokenNode::TerminalFalse(TerminalFalse::from_syntax_node(db, node)))
42093            }
42094            SyntaxKind::TerminalFunction => {
42095                Some(TokenNode::TerminalFunction(TerminalFunction::from_syntax_node(db, node)))
42096            }
42097            SyntaxKind::TerminalIf => {
42098                Some(TokenNode::TerminalIf(TerminalIf::from_syntax_node(db, node)))
42099            }
42100            SyntaxKind::TerminalWhile => {
42101                Some(TokenNode::TerminalWhile(TerminalWhile::from_syntax_node(db, node)))
42102            }
42103            SyntaxKind::TerminalFor => {
42104                Some(TokenNode::TerminalFor(TerminalFor::from_syntax_node(db, node)))
42105            }
42106            SyntaxKind::TerminalLoop => {
42107                Some(TokenNode::TerminalLoop(TerminalLoop::from_syntax_node(db, node)))
42108            }
42109            SyntaxKind::TerminalImpl => {
42110                Some(TokenNode::TerminalImpl(TerminalImpl::from_syntax_node(db, node)))
42111            }
42112            SyntaxKind::TerminalImplicits => {
42113                Some(TokenNode::TerminalImplicits(TerminalImplicits::from_syntax_node(db, node)))
42114            }
42115            SyntaxKind::TerminalLet => {
42116                Some(TokenNode::TerminalLet(TerminalLet::from_syntax_node(db, node)))
42117            }
42118            SyntaxKind::TerminalMacro => {
42119                Some(TokenNode::TerminalMacro(TerminalMacro::from_syntax_node(db, node)))
42120            }
42121            SyntaxKind::TerminalMatch => {
42122                Some(TokenNode::TerminalMatch(TerminalMatch::from_syntax_node(db, node)))
42123            }
42124            SyntaxKind::TerminalModule => {
42125                Some(TokenNode::TerminalModule(TerminalModule::from_syntax_node(db, node)))
42126            }
42127            SyntaxKind::TerminalMut => {
42128                Some(TokenNode::TerminalMut(TerminalMut::from_syntax_node(db, node)))
42129            }
42130            SyntaxKind::TerminalNoPanic => {
42131                Some(TokenNode::TerminalNoPanic(TerminalNoPanic::from_syntax_node(db, node)))
42132            }
42133            SyntaxKind::TerminalOf => {
42134                Some(TokenNode::TerminalOf(TerminalOf::from_syntax_node(db, node)))
42135            }
42136            SyntaxKind::TerminalRef => {
42137                Some(TokenNode::TerminalRef(TerminalRef::from_syntax_node(db, node)))
42138            }
42139            SyntaxKind::TerminalContinue => {
42140                Some(TokenNode::TerminalContinue(TerminalContinue::from_syntax_node(db, node)))
42141            }
42142            SyntaxKind::TerminalReturn => {
42143                Some(TokenNode::TerminalReturn(TerminalReturn::from_syntax_node(db, node)))
42144            }
42145            SyntaxKind::TerminalBreak => {
42146                Some(TokenNode::TerminalBreak(TerminalBreak::from_syntax_node(db, node)))
42147            }
42148            SyntaxKind::TerminalStruct => {
42149                Some(TokenNode::TerminalStruct(TerminalStruct::from_syntax_node(db, node)))
42150            }
42151            SyntaxKind::TerminalTrait => {
42152                Some(TokenNode::TerminalTrait(TerminalTrait::from_syntax_node(db, node)))
42153            }
42154            SyntaxKind::TerminalTrue => {
42155                Some(TokenNode::TerminalTrue(TerminalTrue::from_syntax_node(db, node)))
42156            }
42157            SyntaxKind::TerminalType => {
42158                Some(TokenNode::TerminalType(TerminalType::from_syntax_node(db, node)))
42159            }
42160            SyntaxKind::TerminalUse => {
42161                Some(TokenNode::TerminalUse(TerminalUse::from_syntax_node(db, node)))
42162            }
42163            SyntaxKind::TerminalPub => {
42164                Some(TokenNode::TerminalPub(TerminalPub::from_syntax_node(db, node)))
42165            }
42166            SyntaxKind::TerminalAnd => {
42167                Some(TokenNode::TerminalAnd(TerminalAnd::from_syntax_node(db, node)))
42168            }
42169            SyntaxKind::TerminalAndAnd => {
42170                Some(TokenNode::TerminalAndAnd(TerminalAndAnd::from_syntax_node(db, node)))
42171            }
42172            SyntaxKind::TerminalArrow => {
42173                Some(TokenNode::TerminalArrow(TerminalArrow::from_syntax_node(db, node)))
42174            }
42175            SyntaxKind::TerminalAt => {
42176                Some(TokenNode::TerminalAt(TerminalAt::from_syntax_node(db, node)))
42177            }
42178            SyntaxKind::TerminalBadCharacters => Some(TokenNode::TerminalBadCharacters(
42179                TerminalBadCharacters::from_syntax_node(db, node),
42180            )),
42181            SyntaxKind::TerminalColon => {
42182                Some(TokenNode::TerminalColon(TerminalColon::from_syntax_node(db, node)))
42183            }
42184            SyntaxKind::TerminalColonColon => {
42185                Some(TokenNode::TerminalColonColon(TerminalColonColon::from_syntax_node(db, node)))
42186            }
42187            SyntaxKind::TerminalComma => {
42188                Some(TokenNode::TerminalComma(TerminalComma::from_syntax_node(db, node)))
42189            }
42190            SyntaxKind::TerminalDiv => {
42191                Some(TokenNode::TerminalDiv(TerminalDiv::from_syntax_node(db, node)))
42192            }
42193            SyntaxKind::TerminalDivEq => {
42194                Some(TokenNode::TerminalDivEq(TerminalDivEq::from_syntax_node(db, node)))
42195            }
42196            SyntaxKind::TerminalDollar => {
42197                Some(TokenNode::TerminalDollar(TerminalDollar::from_syntax_node(db, node)))
42198            }
42199            SyntaxKind::TerminalDot => {
42200                Some(TokenNode::TerminalDot(TerminalDot::from_syntax_node(db, node)))
42201            }
42202            SyntaxKind::TerminalDotDot => {
42203                Some(TokenNode::TerminalDotDot(TerminalDotDot::from_syntax_node(db, node)))
42204            }
42205            SyntaxKind::TerminalDotDotEq => {
42206                Some(TokenNode::TerminalDotDotEq(TerminalDotDotEq::from_syntax_node(db, node)))
42207            }
42208            SyntaxKind::TerminalEndOfFile => {
42209                Some(TokenNode::TerminalEndOfFile(TerminalEndOfFile::from_syntax_node(db, node)))
42210            }
42211            SyntaxKind::TerminalEq => {
42212                Some(TokenNode::TerminalEq(TerminalEq::from_syntax_node(db, node)))
42213            }
42214            SyntaxKind::TerminalEqEq => {
42215                Some(TokenNode::TerminalEqEq(TerminalEqEq::from_syntax_node(db, node)))
42216            }
42217            SyntaxKind::TerminalGE => {
42218                Some(TokenNode::TerminalGE(TerminalGE::from_syntax_node(db, node)))
42219            }
42220            SyntaxKind::TerminalGT => {
42221                Some(TokenNode::TerminalGT(TerminalGT::from_syntax_node(db, node)))
42222            }
42223            SyntaxKind::TerminalHash => {
42224                Some(TokenNode::TerminalHash(TerminalHash::from_syntax_node(db, node)))
42225            }
42226            SyntaxKind::TerminalLBrace => {
42227                Some(TokenNode::TerminalLBrace(TerminalLBrace::from_syntax_node(db, node)))
42228            }
42229            SyntaxKind::TerminalLBrack => {
42230                Some(TokenNode::TerminalLBrack(TerminalLBrack::from_syntax_node(db, node)))
42231            }
42232            SyntaxKind::TerminalLE => {
42233                Some(TokenNode::TerminalLE(TerminalLE::from_syntax_node(db, node)))
42234            }
42235            SyntaxKind::TerminalLParen => {
42236                Some(TokenNode::TerminalLParen(TerminalLParen::from_syntax_node(db, node)))
42237            }
42238            SyntaxKind::TerminalLT => {
42239                Some(TokenNode::TerminalLT(TerminalLT::from_syntax_node(db, node)))
42240            }
42241            SyntaxKind::TerminalMatchArrow => {
42242                Some(TokenNode::TerminalMatchArrow(TerminalMatchArrow::from_syntax_node(db, node)))
42243            }
42244            SyntaxKind::TerminalMinus => {
42245                Some(TokenNode::TerminalMinus(TerminalMinus::from_syntax_node(db, node)))
42246            }
42247            SyntaxKind::TerminalMinusEq => {
42248                Some(TokenNode::TerminalMinusEq(TerminalMinusEq::from_syntax_node(db, node)))
42249            }
42250            SyntaxKind::TerminalMod => {
42251                Some(TokenNode::TerminalMod(TerminalMod::from_syntax_node(db, node)))
42252            }
42253            SyntaxKind::TerminalModEq => {
42254                Some(TokenNode::TerminalModEq(TerminalModEq::from_syntax_node(db, node)))
42255            }
42256            SyntaxKind::TerminalMul => {
42257                Some(TokenNode::TerminalMul(TerminalMul::from_syntax_node(db, node)))
42258            }
42259            SyntaxKind::TerminalMulEq => {
42260                Some(TokenNode::TerminalMulEq(TerminalMulEq::from_syntax_node(db, node)))
42261            }
42262            SyntaxKind::TerminalNeq => {
42263                Some(TokenNode::TerminalNeq(TerminalNeq::from_syntax_node(db, node)))
42264            }
42265            SyntaxKind::TerminalNot => {
42266                Some(TokenNode::TerminalNot(TerminalNot::from_syntax_node(db, node)))
42267            }
42268            SyntaxKind::TerminalBitNot => {
42269                Some(TokenNode::TerminalBitNot(TerminalBitNot::from_syntax_node(db, node)))
42270            }
42271            SyntaxKind::TerminalOr => {
42272                Some(TokenNode::TerminalOr(TerminalOr::from_syntax_node(db, node)))
42273            }
42274            SyntaxKind::TerminalOrOr => {
42275                Some(TokenNode::TerminalOrOr(TerminalOrOr::from_syntax_node(db, node)))
42276            }
42277            SyntaxKind::TerminalPlus => {
42278                Some(TokenNode::TerminalPlus(TerminalPlus::from_syntax_node(db, node)))
42279            }
42280            SyntaxKind::TerminalPlusEq => {
42281                Some(TokenNode::TerminalPlusEq(TerminalPlusEq::from_syntax_node(db, node)))
42282            }
42283            SyntaxKind::TerminalQuestionMark => Some(TokenNode::TerminalQuestionMark(
42284                TerminalQuestionMark::from_syntax_node(db, node),
42285            )),
42286            SyntaxKind::TerminalRBrace => {
42287                Some(TokenNode::TerminalRBrace(TerminalRBrace::from_syntax_node(db, node)))
42288            }
42289            SyntaxKind::TerminalRBrack => {
42290                Some(TokenNode::TerminalRBrack(TerminalRBrack::from_syntax_node(db, node)))
42291            }
42292            SyntaxKind::TerminalRParen => {
42293                Some(TokenNode::TerminalRParen(TerminalRParen::from_syntax_node(db, node)))
42294            }
42295            SyntaxKind::TerminalSemicolon => {
42296                Some(TokenNode::TerminalSemicolon(TerminalSemicolon::from_syntax_node(db, node)))
42297            }
42298            SyntaxKind::TerminalUnderscore => {
42299                Some(TokenNode::TerminalUnderscore(TerminalUnderscore::from_syntax_node(db, node)))
42300            }
42301            SyntaxKind::TerminalXor => {
42302                Some(TokenNode::TerminalXor(TerminalXor::from_syntax_node(db, node)))
42303            }
42304            SyntaxKind::TerminalEmpty => {
42305                Some(TokenNode::TerminalEmpty(TerminalEmpty::from_syntax_node(db, node)))
42306            }
42307            _ => None,
42308        }
42309    }
42310    fn as_syntax_node(&self) -> SyntaxNode {
42311        match self {
42312            TokenNode::TerminalIdentifier(x) => x.as_syntax_node(),
42313            TokenNode::TerminalLiteralNumber(x) => x.as_syntax_node(),
42314            TokenNode::TerminalShortString(x) => x.as_syntax_node(),
42315            TokenNode::TerminalString(x) => x.as_syntax_node(),
42316            TokenNode::TerminalAs(x) => x.as_syntax_node(),
42317            TokenNode::TerminalConst(x) => x.as_syntax_node(),
42318            TokenNode::TerminalElse(x) => x.as_syntax_node(),
42319            TokenNode::TerminalEnum(x) => x.as_syntax_node(),
42320            TokenNode::TerminalExtern(x) => x.as_syntax_node(),
42321            TokenNode::TerminalFalse(x) => x.as_syntax_node(),
42322            TokenNode::TerminalFunction(x) => x.as_syntax_node(),
42323            TokenNode::TerminalIf(x) => x.as_syntax_node(),
42324            TokenNode::TerminalWhile(x) => x.as_syntax_node(),
42325            TokenNode::TerminalFor(x) => x.as_syntax_node(),
42326            TokenNode::TerminalLoop(x) => x.as_syntax_node(),
42327            TokenNode::TerminalImpl(x) => x.as_syntax_node(),
42328            TokenNode::TerminalImplicits(x) => x.as_syntax_node(),
42329            TokenNode::TerminalLet(x) => x.as_syntax_node(),
42330            TokenNode::TerminalMacro(x) => x.as_syntax_node(),
42331            TokenNode::TerminalMatch(x) => x.as_syntax_node(),
42332            TokenNode::TerminalModule(x) => x.as_syntax_node(),
42333            TokenNode::TerminalMut(x) => x.as_syntax_node(),
42334            TokenNode::TerminalNoPanic(x) => x.as_syntax_node(),
42335            TokenNode::TerminalOf(x) => x.as_syntax_node(),
42336            TokenNode::TerminalRef(x) => x.as_syntax_node(),
42337            TokenNode::TerminalContinue(x) => x.as_syntax_node(),
42338            TokenNode::TerminalReturn(x) => x.as_syntax_node(),
42339            TokenNode::TerminalBreak(x) => x.as_syntax_node(),
42340            TokenNode::TerminalStruct(x) => x.as_syntax_node(),
42341            TokenNode::TerminalTrait(x) => x.as_syntax_node(),
42342            TokenNode::TerminalTrue(x) => x.as_syntax_node(),
42343            TokenNode::TerminalType(x) => x.as_syntax_node(),
42344            TokenNode::TerminalUse(x) => x.as_syntax_node(),
42345            TokenNode::TerminalPub(x) => x.as_syntax_node(),
42346            TokenNode::TerminalAnd(x) => x.as_syntax_node(),
42347            TokenNode::TerminalAndAnd(x) => x.as_syntax_node(),
42348            TokenNode::TerminalArrow(x) => x.as_syntax_node(),
42349            TokenNode::TerminalAt(x) => x.as_syntax_node(),
42350            TokenNode::TerminalBadCharacters(x) => x.as_syntax_node(),
42351            TokenNode::TerminalColon(x) => x.as_syntax_node(),
42352            TokenNode::TerminalColonColon(x) => x.as_syntax_node(),
42353            TokenNode::TerminalComma(x) => x.as_syntax_node(),
42354            TokenNode::TerminalDiv(x) => x.as_syntax_node(),
42355            TokenNode::TerminalDivEq(x) => x.as_syntax_node(),
42356            TokenNode::TerminalDollar(x) => x.as_syntax_node(),
42357            TokenNode::TerminalDot(x) => x.as_syntax_node(),
42358            TokenNode::TerminalDotDot(x) => x.as_syntax_node(),
42359            TokenNode::TerminalDotDotEq(x) => x.as_syntax_node(),
42360            TokenNode::TerminalEndOfFile(x) => x.as_syntax_node(),
42361            TokenNode::TerminalEq(x) => x.as_syntax_node(),
42362            TokenNode::TerminalEqEq(x) => x.as_syntax_node(),
42363            TokenNode::TerminalGE(x) => x.as_syntax_node(),
42364            TokenNode::TerminalGT(x) => x.as_syntax_node(),
42365            TokenNode::TerminalHash(x) => x.as_syntax_node(),
42366            TokenNode::TerminalLBrace(x) => x.as_syntax_node(),
42367            TokenNode::TerminalLBrack(x) => x.as_syntax_node(),
42368            TokenNode::TerminalLE(x) => x.as_syntax_node(),
42369            TokenNode::TerminalLParen(x) => x.as_syntax_node(),
42370            TokenNode::TerminalLT(x) => x.as_syntax_node(),
42371            TokenNode::TerminalMatchArrow(x) => x.as_syntax_node(),
42372            TokenNode::TerminalMinus(x) => x.as_syntax_node(),
42373            TokenNode::TerminalMinusEq(x) => x.as_syntax_node(),
42374            TokenNode::TerminalMod(x) => x.as_syntax_node(),
42375            TokenNode::TerminalModEq(x) => x.as_syntax_node(),
42376            TokenNode::TerminalMul(x) => x.as_syntax_node(),
42377            TokenNode::TerminalMulEq(x) => x.as_syntax_node(),
42378            TokenNode::TerminalNeq(x) => x.as_syntax_node(),
42379            TokenNode::TerminalNot(x) => x.as_syntax_node(),
42380            TokenNode::TerminalBitNot(x) => x.as_syntax_node(),
42381            TokenNode::TerminalOr(x) => x.as_syntax_node(),
42382            TokenNode::TerminalOrOr(x) => x.as_syntax_node(),
42383            TokenNode::TerminalPlus(x) => x.as_syntax_node(),
42384            TokenNode::TerminalPlusEq(x) => x.as_syntax_node(),
42385            TokenNode::TerminalQuestionMark(x) => x.as_syntax_node(),
42386            TokenNode::TerminalRBrace(x) => x.as_syntax_node(),
42387            TokenNode::TerminalRBrack(x) => x.as_syntax_node(),
42388            TokenNode::TerminalRParen(x) => x.as_syntax_node(),
42389            TokenNode::TerminalSemicolon(x) => x.as_syntax_node(),
42390            TokenNode::TerminalUnderscore(x) => x.as_syntax_node(),
42391            TokenNode::TerminalXor(x) => x.as_syntax_node(),
42392            TokenNode::TerminalEmpty(x) => x.as_syntax_node(),
42393        }
42394    }
42395    fn stable_ptr(&self, db: &dyn SyntaxGroup) -> Self::StablePtr {
42396        TokenNodePtr(self.as_syntax_node().lookup_intern(db).stable_ptr)
42397    }
42398}
42399impl TokenNode {
42400    /// Checks if a kind of a variant of [TokenNode].
42401    pub fn is_variant(kind: SyntaxKind) -> bool {
42402        matches!(
42403            kind,
42404            SyntaxKind::TerminalIdentifier
42405                | SyntaxKind::TerminalLiteralNumber
42406                | SyntaxKind::TerminalShortString
42407                | SyntaxKind::TerminalString
42408                | SyntaxKind::TerminalAs
42409                | SyntaxKind::TerminalConst
42410                | SyntaxKind::TerminalElse
42411                | SyntaxKind::TerminalEnum
42412                | SyntaxKind::TerminalExtern
42413                | SyntaxKind::TerminalFalse
42414                | SyntaxKind::TerminalFunction
42415                | SyntaxKind::TerminalIf
42416                | SyntaxKind::TerminalWhile
42417                | SyntaxKind::TerminalFor
42418                | SyntaxKind::TerminalLoop
42419                | SyntaxKind::TerminalImpl
42420                | SyntaxKind::TerminalImplicits
42421                | SyntaxKind::TerminalLet
42422                | SyntaxKind::TerminalMacro
42423                | SyntaxKind::TerminalMatch
42424                | SyntaxKind::TerminalModule
42425                | SyntaxKind::TerminalMut
42426                | SyntaxKind::TerminalNoPanic
42427                | SyntaxKind::TerminalOf
42428                | SyntaxKind::TerminalRef
42429                | SyntaxKind::TerminalContinue
42430                | SyntaxKind::TerminalReturn
42431                | SyntaxKind::TerminalBreak
42432                | SyntaxKind::TerminalStruct
42433                | SyntaxKind::TerminalTrait
42434                | SyntaxKind::TerminalTrue
42435                | SyntaxKind::TerminalType
42436                | SyntaxKind::TerminalUse
42437                | SyntaxKind::TerminalPub
42438                | SyntaxKind::TerminalAnd
42439                | SyntaxKind::TerminalAndAnd
42440                | SyntaxKind::TerminalArrow
42441                | SyntaxKind::TerminalAt
42442                | SyntaxKind::TerminalBadCharacters
42443                | SyntaxKind::TerminalColon
42444                | SyntaxKind::TerminalColonColon
42445                | SyntaxKind::TerminalComma
42446                | SyntaxKind::TerminalDiv
42447                | SyntaxKind::TerminalDivEq
42448                | SyntaxKind::TerminalDollar
42449                | SyntaxKind::TerminalDot
42450                | SyntaxKind::TerminalDotDot
42451                | SyntaxKind::TerminalDotDotEq
42452                | SyntaxKind::TerminalEndOfFile
42453                | SyntaxKind::TerminalEq
42454                | SyntaxKind::TerminalEqEq
42455                | SyntaxKind::TerminalGE
42456                | SyntaxKind::TerminalGT
42457                | SyntaxKind::TerminalHash
42458                | SyntaxKind::TerminalLBrace
42459                | SyntaxKind::TerminalLBrack
42460                | SyntaxKind::TerminalLE
42461                | SyntaxKind::TerminalLParen
42462                | SyntaxKind::TerminalLT
42463                | SyntaxKind::TerminalMatchArrow
42464                | SyntaxKind::TerminalMinus
42465                | SyntaxKind::TerminalMinusEq
42466                | SyntaxKind::TerminalMod
42467                | SyntaxKind::TerminalModEq
42468                | SyntaxKind::TerminalMul
42469                | SyntaxKind::TerminalMulEq
42470                | SyntaxKind::TerminalNeq
42471                | SyntaxKind::TerminalNot
42472                | SyntaxKind::TerminalBitNot
42473                | SyntaxKind::TerminalOr
42474                | SyntaxKind::TerminalOrOr
42475                | SyntaxKind::TerminalPlus
42476                | SyntaxKind::TerminalPlusEq
42477                | SyntaxKind::TerminalQuestionMark
42478                | SyntaxKind::TerminalRBrace
42479                | SyntaxKind::TerminalRBrack
42480                | SyntaxKind::TerminalRParen
42481                | SyntaxKind::TerminalSemicolon
42482                | SyntaxKind::TerminalUnderscore
42483                | SyntaxKind::TerminalXor
42484                | SyntaxKind::TerminalEmpty
42485        )
42486    }
42487}