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: Vec<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 { children: vec![], width: TextWidth::default() },
72            })
73            .intern(db),
74        )
75    }
76    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
77        Self(ElementList::new(node))
78    }
79    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
80        if node.kind(db) == SyntaxKind::Trivia { Some(Self(ElementList::new(node))) } else { None }
81    }
82    fn as_syntax_node(&self) -> SyntaxNode {
83        self.node.clone()
84    }
85    fn stable_ptr(&self) -> Self::StablePtr {
86        TriviaPtr(self.node.0.stable_ptr)
87    }
88}
89impl From<&Trivia> for SyntaxStablePtrId {
90    fn from(node: &Trivia) -> Self {
91        node.stable_ptr().untyped()
92    }
93}
94#[derive(Clone, Debug, Eq, Hash, PartialEq)]
95pub enum Trivium {
96    SingleLineComment(TokenSingleLineComment),
97    SingleLineDocComment(TokenSingleLineDocComment),
98    SingleLineInnerComment(TokenSingleLineInnerComment),
99    Whitespace(TokenWhitespace),
100    Newline(TokenNewline),
101    Skipped(TokenSkipped),
102    SkippedNode(TriviumSkippedNode),
103}
104#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
105pub struct TriviumPtr(pub SyntaxStablePtrId);
106impl TypedStablePtr for TriviumPtr {
107    type SyntaxNode = Trivium;
108    fn untyped(&self) -> SyntaxStablePtrId {
109        self.0
110    }
111    fn lookup(&self, db: &dyn SyntaxGroup) -> Trivium {
112        Trivium::from_syntax_node(db, self.0.lookup(db))
113    }
114}
115impl From<TriviumPtr> for SyntaxStablePtrId {
116    fn from(ptr: TriviumPtr) -> Self {
117        ptr.untyped()
118    }
119}
120impl From<TokenSingleLineCommentPtr> for TriviumPtr {
121    fn from(value: TokenSingleLineCommentPtr) -> Self {
122        Self(value.0)
123    }
124}
125impl From<TokenSingleLineDocCommentPtr> for TriviumPtr {
126    fn from(value: TokenSingleLineDocCommentPtr) -> Self {
127        Self(value.0)
128    }
129}
130impl From<TokenSingleLineInnerCommentPtr> for TriviumPtr {
131    fn from(value: TokenSingleLineInnerCommentPtr) -> Self {
132        Self(value.0)
133    }
134}
135impl From<TokenWhitespacePtr> for TriviumPtr {
136    fn from(value: TokenWhitespacePtr) -> Self {
137        Self(value.0)
138    }
139}
140impl From<TokenNewlinePtr> for TriviumPtr {
141    fn from(value: TokenNewlinePtr) -> Self {
142        Self(value.0)
143    }
144}
145impl From<TokenSkippedPtr> for TriviumPtr {
146    fn from(value: TokenSkippedPtr) -> Self {
147        Self(value.0)
148    }
149}
150impl From<TriviumSkippedNodePtr> for TriviumPtr {
151    fn from(value: TriviumSkippedNodePtr) -> Self {
152        Self(value.0)
153    }
154}
155impl From<TokenSingleLineCommentGreen> for TriviumGreen {
156    fn from(value: TokenSingleLineCommentGreen) -> Self {
157        Self(value.0)
158    }
159}
160impl From<TokenSingleLineDocCommentGreen> for TriviumGreen {
161    fn from(value: TokenSingleLineDocCommentGreen) -> Self {
162        Self(value.0)
163    }
164}
165impl From<TokenSingleLineInnerCommentGreen> for TriviumGreen {
166    fn from(value: TokenSingleLineInnerCommentGreen) -> Self {
167        Self(value.0)
168    }
169}
170impl From<TokenWhitespaceGreen> for TriviumGreen {
171    fn from(value: TokenWhitespaceGreen) -> Self {
172        Self(value.0)
173    }
174}
175impl From<TokenNewlineGreen> for TriviumGreen {
176    fn from(value: TokenNewlineGreen) -> Self {
177        Self(value.0)
178    }
179}
180impl From<TokenSkippedGreen> for TriviumGreen {
181    fn from(value: TokenSkippedGreen) -> Self {
182        Self(value.0)
183    }
184}
185impl From<TriviumSkippedNodeGreen> for TriviumGreen {
186    fn from(value: TriviumSkippedNodeGreen) -> Self {
187        Self(value.0)
188    }
189}
190#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
191pub struct TriviumGreen(pub GreenId);
192impl TypedSyntaxNode for Trivium {
193    const OPTIONAL_KIND: Option<SyntaxKind> = None;
194    type StablePtr = TriviumPtr;
195    type Green = TriviumGreen;
196    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
197        panic!("No missing variant.");
198    }
199    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
200        let kind = node.kind(db);
201        match kind {
202            SyntaxKind::TokenSingleLineComment => {
203                Trivium::SingleLineComment(TokenSingleLineComment::from_syntax_node(db, node))
204            }
205            SyntaxKind::TokenSingleLineDocComment => {
206                Trivium::SingleLineDocComment(TokenSingleLineDocComment::from_syntax_node(db, node))
207            }
208            SyntaxKind::TokenSingleLineInnerComment => Trivium::SingleLineInnerComment(
209                TokenSingleLineInnerComment::from_syntax_node(db, node),
210            ),
211            SyntaxKind::TokenWhitespace => {
212                Trivium::Whitespace(TokenWhitespace::from_syntax_node(db, node))
213            }
214            SyntaxKind::TokenNewline => Trivium::Newline(TokenNewline::from_syntax_node(db, node)),
215            SyntaxKind::TokenSkipped => Trivium::Skipped(TokenSkipped::from_syntax_node(db, node)),
216            SyntaxKind::TriviumSkippedNode => {
217                Trivium::SkippedNode(TriviumSkippedNode::from_syntax_node(db, node))
218            }
219            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "Trivium"),
220        }
221    }
222    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
223        let kind = node.kind(db);
224        match kind {
225            SyntaxKind::TokenSingleLineComment => {
226                Some(Trivium::SingleLineComment(TokenSingleLineComment::from_syntax_node(db, node)))
227            }
228            SyntaxKind::TokenSingleLineDocComment => Some(Trivium::SingleLineDocComment(
229                TokenSingleLineDocComment::from_syntax_node(db, node),
230            )),
231            SyntaxKind::TokenSingleLineInnerComment => Some(Trivium::SingleLineInnerComment(
232                TokenSingleLineInnerComment::from_syntax_node(db, node),
233            )),
234            SyntaxKind::TokenWhitespace => {
235                Some(Trivium::Whitespace(TokenWhitespace::from_syntax_node(db, node)))
236            }
237            SyntaxKind::TokenNewline => {
238                Some(Trivium::Newline(TokenNewline::from_syntax_node(db, node)))
239            }
240            SyntaxKind::TokenSkipped => {
241                Some(Trivium::Skipped(TokenSkipped::from_syntax_node(db, node)))
242            }
243            SyntaxKind::TriviumSkippedNode => {
244                Some(Trivium::SkippedNode(TriviumSkippedNode::from_syntax_node(db, node)))
245            }
246            _ => None,
247        }
248    }
249    fn as_syntax_node(&self) -> SyntaxNode {
250        match self {
251            Trivium::SingleLineComment(x) => x.as_syntax_node(),
252            Trivium::SingleLineDocComment(x) => x.as_syntax_node(),
253            Trivium::SingleLineInnerComment(x) => x.as_syntax_node(),
254            Trivium::Whitespace(x) => x.as_syntax_node(),
255            Trivium::Newline(x) => x.as_syntax_node(),
256            Trivium::Skipped(x) => x.as_syntax_node(),
257            Trivium::SkippedNode(x) => x.as_syntax_node(),
258        }
259    }
260    fn stable_ptr(&self) -> Self::StablePtr {
261        TriviumPtr(self.as_syntax_node().0.stable_ptr)
262    }
263}
264impl From<&Trivium> for SyntaxStablePtrId {
265    fn from(node: &Trivium) -> Self {
266        node.stable_ptr().untyped()
267    }
268}
269impl Trivium {
270    /// Checks if a kind of a variant of [Trivium].
271    pub fn is_variant(kind: SyntaxKind) -> bool {
272        matches!(
273            kind,
274            SyntaxKind::TokenSingleLineComment
275                | SyntaxKind::TokenSingleLineDocComment
276                | SyntaxKind::TokenSingleLineInnerComment
277                | SyntaxKind::TokenWhitespace
278                | SyntaxKind::TokenNewline
279                | SyntaxKind::TokenSkipped
280                | SyntaxKind::TriviumSkippedNode
281        )
282    }
283}
284#[derive(Clone, Debug, Eq, Hash, PartialEq)]
285pub enum Expr {
286    Path(ExprPath),
287    Literal(TerminalLiteralNumber),
288    ShortString(TerminalShortString),
289    String(TerminalString),
290    False(TerminalFalse),
291    True(TerminalTrue),
292    Parenthesized(ExprParenthesized),
293    Unary(ExprUnary),
294    Binary(ExprBinary),
295    Tuple(ExprListParenthesized),
296    FunctionCall(ExprFunctionCall),
297    StructCtorCall(ExprStructCtorCall),
298    Block(ExprBlock),
299    Match(ExprMatch),
300    If(ExprIf),
301    Loop(ExprLoop),
302    While(ExprWhile),
303    For(ExprFor),
304    Closure(ExprClosure),
305    ErrorPropagate(ExprErrorPropagate),
306    FieldInitShorthand(ExprFieldInitShorthand),
307    Indexed(ExprIndexed),
308    InlineMacro(ExprInlineMacro),
309    FixedSizeArray(ExprFixedSizeArray),
310    Missing(ExprMissing),
311}
312#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
313pub struct ExprPtr(pub SyntaxStablePtrId);
314impl TypedStablePtr for ExprPtr {
315    type SyntaxNode = Expr;
316    fn untyped(&self) -> SyntaxStablePtrId {
317        self.0
318    }
319    fn lookup(&self, db: &dyn SyntaxGroup) -> Expr {
320        Expr::from_syntax_node(db, self.0.lookup(db))
321    }
322}
323impl From<ExprPtr> for SyntaxStablePtrId {
324    fn from(ptr: ExprPtr) -> Self {
325        ptr.untyped()
326    }
327}
328impl From<ExprPathPtr> for ExprPtr {
329    fn from(value: ExprPathPtr) -> Self {
330        Self(value.0)
331    }
332}
333impl From<TerminalLiteralNumberPtr> for ExprPtr {
334    fn from(value: TerminalLiteralNumberPtr) -> Self {
335        Self(value.0)
336    }
337}
338impl From<TerminalShortStringPtr> for ExprPtr {
339    fn from(value: TerminalShortStringPtr) -> Self {
340        Self(value.0)
341    }
342}
343impl From<TerminalStringPtr> for ExprPtr {
344    fn from(value: TerminalStringPtr) -> Self {
345        Self(value.0)
346    }
347}
348impl From<TerminalFalsePtr> for ExprPtr {
349    fn from(value: TerminalFalsePtr) -> Self {
350        Self(value.0)
351    }
352}
353impl From<TerminalTruePtr> for ExprPtr {
354    fn from(value: TerminalTruePtr) -> Self {
355        Self(value.0)
356    }
357}
358impl From<ExprParenthesizedPtr> for ExprPtr {
359    fn from(value: ExprParenthesizedPtr) -> Self {
360        Self(value.0)
361    }
362}
363impl From<ExprUnaryPtr> for ExprPtr {
364    fn from(value: ExprUnaryPtr) -> Self {
365        Self(value.0)
366    }
367}
368impl From<ExprBinaryPtr> for ExprPtr {
369    fn from(value: ExprBinaryPtr) -> Self {
370        Self(value.0)
371    }
372}
373impl From<ExprListParenthesizedPtr> for ExprPtr {
374    fn from(value: ExprListParenthesizedPtr) -> Self {
375        Self(value.0)
376    }
377}
378impl From<ExprFunctionCallPtr> for ExprPtr {
379    fn from(value: ExprFunctionCallPtr) -> Self {
380        Self(value.0)
381    }
382}
383impl From<ExprStructCtorCallPtr> for ExprPtr {
384    fn from(value: ExprStructCtorCallPtr) -> Self {
385        Self(value.0)
386    }
387}
388impl From<ExprBlockPtr> for ExprPtr {
389    fn from(value: ExprBlockPtr) -> Self {
390        Self(value.0)
391    }
392}
393impl From<ExprMatchPtr> for ExprPtr {
394    fn from(value: ExprMatchPtr) -> Self {
395        Self(value.0)
396    }
397}
398impl From<ExprIfPtr> for ExprPtr {
399    fn from(value: ExprIfPtr) -> Self {
400        Self(value.0)
401    }
402}
403impl From<ExprLoopPtr> for ExprPtr {
404    fn from(value: ExprLoopPtr) -> Self {
405        Self(value.0)
406    }
407}
408impl From<ExprWhilePtr> for ExprPtr {
409    fn from(value: ExprWhilePtr) -> Self {
410        Self(value.0)
411    }
412}
413impl From<ExprForPtr> for ExprPtr {
414    fn from(value: ExprForPtr) -> Self {
415        Self(value.0)
416    }
417}
418impl From<ExprClosurePtr> for ExprPtr {
419    fn from(value: ExprClosurePtr) -> Self {
420        Self(value.0)
421    }
422}
423impl From<ExprErrorPropagatePtr> for ExprPtr {
424    fn from(value: ExprErrorPropagatePtr) -> Self {
425        Self(value.0)
426    }
427}
428impl From<ExprFieldInitShorthandPtr> for ExprPtr {
429    fn from(value: ExprFieldInitShorthandPtr) -> Self {
430        Self(value.0)
431    }
432}
433impl From<ExprIndexedPtr> for ExprPtr {
434    fn from(value: ExprIndexedPtr) -> Self {
435        Self(value.0)
436    }
437}
438impl From<ExprInlineMacroPtr> for ExprPtr {
439    fn from(value: ExprInlineMacroPtr) -> Self {
440        Self(value.0)
441    }
442}
443impl From<ExprFixedSizeArrayPtr> for ExprPtr {
444    fn from(value: ExprFixedSizeArrayPtr) -> Self {
445        Self(value.0)
446    }
447}
448impl From<ExprMissingPtr> for ExprPtr {
449    fn from(value: ExprMissingPtr) -> Self {
450        Self(value.0)
451    }
452}
453impl From<ExprPathGreen> for ExprGreen {
454    fn from(value: ExprPathGreen) -> Self {
455        Self(value.0)
456    }
457}
458impl From<TerminalLiteralNumberGreen> for ExprGreen {
459    fn from(value: TerminalLiteralNumberGreen) -> Self {
460        Self(value.0)
461    }
462}
463impl From<TerminalShortStringGreen> for ExprGreen {
464    fn from(value: TerminalShortStringGreen) -> Self {
465        Self(value.0)
466    }
467}
468impl From<TerminalStringGreen> for ExprGreen {
469    fn from(value: TerminalStringGreen) -> Self {
470        Self(value.0)
471    }
472}
473impl From<TerminalFalseGreen> for ExprGreen {
474    fn from(value: TerminalFalseGreen) -> Self {
475        Self(value.0)
476    }
477}
478impl From<TerminalTrueGreen> for ExprGreen {
479    fn from(value: TerminalTrueGreen) -> Self {
480        Self(value.0)
481    }
482}
483impl From<ExprParenthesizedGreen> for ExprGreen {
484    fn from(value: ExprParenthesizedGreen) -> Self {
485        Self(value.0)
486    }
487}
488impl From<ExprUnaryGreen> for ExprGreen {
489    fn from(value: ExprUnaryGreen) -> Self {
490        Self(value.0)
491    }
492}
493impl From<ExprBinaryGreen> for ExprGreen {
494    fn from(value: ExprBinaryGreen) -> Self {
495        Self(value.0)
496    }
497}
498impl From<ExprListParenthesizedGreen> for ExprGreen {
499    fn from(value: ExprListParenthesizedGreen) -> Self {
500        Self(value.0)
501    }
502}
503impl From<ExprFunctionCallGreen> for ExprGreen {
504    fn from(value: ExprFunctionCallGreen) -> Self {
505        Self(value.0)
506    }
507}
508impl From<ExprStructCtorCallGreen> for ExprGreen {
509    fn from(value: ExprStructCtorCallGreen) -> Self {
510        Self(value.0)
511    }
512}
513impl From<ExprBlockGreen> for ExprGreen {
514    fn from(value: ExprBlockGreen) -> Self {
515        Self(value.0)
516    }
517}
518impl From<ExprMatchGreen> for ExprGreen {
519    fn from(value: ExprMatchGreen) -> Self {
520        Self(value.0)
521    }
522}
523impl From<ExprIfGreen> for ExprGreen {
524    fn from(value: ExprIfGreen) -> Self {
525        Self(value.0)
526    }
527}
528impl From<ExprLoopGreen> for ExprGreen {
529    fn from(value: ExprLoopGreen) -> Self {
530        Self(value.0)
531    }
532}
533impl From<ExprWhileGreen> for ExprGreen {
534    fn from(value: ExprWhileGreen) -> Self {
535        Self(value.0)
536    }
537}
538impl From<ExprForGreen> for ExprGreen {
539    fn from(value: ExprForGreen) -> Self {
540        Self(value.0)
541    }
542}
543impl From<ExprClosureGreen> for ExprGreen {
544    fn from(value: ExprClosureGreen) -> Self {
545        Self(value.0)
546    }
547}
548impl From<ExprErrorPropagateGreen> for ExprGreen {
549    fn from(value: ExprErrorPropagateGreen) -> Self {
550        Self(value.0)
551    }
552}
553impl From<ExprFieldInitShorthandGreen> for ExprGreen {
554    fn from(value: ExprFieldInitShorthandGreen) -> Self {
555        Self(value.0)
556    }
557}
558impl From<ExprIndexedGreen> for ExprGreen {
559    fn from(value: ExprIndexedGreen) -> Self {
560        Self(value.0)
561    }
562}
563impl From<ExprInlineMacroGreen> for ExprGreen {
564    fn from(value: ExprInlineMacroGreen) -> Self {
565        Self(value.0)
566    }
567}
568impl From<ExprFixedSizeArrayGreen> for ExprGreen {
569    fn from(value: ExprFixedSizeArrayGreen) -> Self {
570        Self(value.0)
571    }
572}
573impl From<ExprMissingGreen> for ExprGreen {
574    fn from(value: ExprMissingGreen) -> Self {
575        Self(value.0)
576    }
577}
578#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
579pub struct ExprGreen(pub GreenId);
580impl TypedSyntaxNode for Expr {
581    const OPTIONAL_KIND: Option<SyntaxKind> = None;
582    type StablePtr = ExprPtr;
583    type Green = ExprGreen;
584    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
585        ExprGreen(ExprMissing::missing(db).0)
586    }
587    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
588        let kind = node.kind(db);
589        match kind {
590            SyntaxKind::ExprPath => Expr::Path(ExprPath::from_syntax_node(db, node)),
591            SyntaxKind::TerminalLiteralNumber => {
592                Expr::Literal(TerminalLiteralNumber::from_syntax_node(db, node))
593            }
594            SyntaxKind::TerminalShortString => {
595                Expr::ShortString(TerminalShortString::from_syntax_node(db, node))
596            }
597            SyntaxKind::TerminalString => Expr::String(TerminalString::from_syntax_node(db, node)),
598            SyntaxKind::TerminalFalse => Expr::False(TerminalFalse::from_syntax_node(db, node)),
599            SyntaxKind::TerminalTrue => Expr::True(TerminalTrue::from_syntax_node(db, node)),
600            SyntaxKind::ExprParenthesized => {
601                Expr::Parenthesized(ExprParenthesized::from_syntax_node(db, node))
602            }
603            SyntaxKind::ExprUnary => Expr::Unary(ExprUnary::from_syntax_node(db, node)),
604            SyntaxKind::ExprBinary => Expr::Binary(ExprBinary::from_syntax_node(db, node)),
605            SyntaxKind::ExprListParenthesized => {
606                Expr::Tuple(ExprListParenthesized::from_syntax_node(db, node))
607            }
608            SyntaxKind::ExprFunctionCall => {
609                Expr::FunctionCall(ExprFunctionCall::from_syntax_node(db, node))
610            }
611            SyntaxKind::ExprStructCtorCall => {
612                Expr::StructCtorCall(ExprStructCtorCall::from_syntax_node(db, node))
613            }
614            SyntaxKind::ExprBlock => Expr::Block(ExprBlock::from_syntax_node(db, node)),
615            SyntaxKind::ExprMatch => Expr::Match(ExprMatch::from_syntax_node(db, node)),
616            SyntaxKind::ExprIf => Expr::If(ExprIf::from_syntax_node(db, node)),
617            SyntaxKind::ExprLoop => Expr::Loop(ExprLoop::from_syntax_node(db, node)),
618            SyntaxKind::ExprWhile => Expr::While(ExprWhile::from_syntax_node(db, node)),
619            SyntaxKind::ExprFor => Expr::For(ExprFor::from_syntax_node(db, node)),
620            SyntaxKind::ExprClosure => Expr::Closure(ExprClosure::from_syntax_node(db, node)),
621            SyntaxKind::ExprErrorPropagate => {
622                Expr::ErrorPropagate(ExprErrorPropagate::from_syntax_node(db, node))
623            }
624            SyntaxKind::ExprFieldInitShorthand => {
625                Expr::FieldInitShorthand(ExprFieldInitShorthand::from_syntax_node(db, node))
626            }
627            SyntaxKind::ExprIndexed => Expr::Indexed(ExprIndexed::from_syntax_node(db, node)),
628            SyntaxKind::ExprInlineMacro => {
629                Expr::InlineMacro(ExprInlineMacro::from_syntax_node(db, node))
630            }
631            SyntaxKind::ExprFixedSizeArray => {
632                Expr::FixedSizeArray(ExprFixedSizeArray::from_syntax_node(db, node))
633            }
634            SyntaxKind::ExprMissing => Expr::Missing(ExprMissing::from_syntax_node(db, node)),
635            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "Expr"),
636        }
637    }
638    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
639        let kind = node.kind(db);
640        match kind {
641            SyntaxKind::ExprPath => Some(Expr::Path(ExprPath::from_syntax_node(db, node))),
642            SyntaxKind::TerminalLiteralNumber => {
643                Some(Expr::Literal(TerminalLiteralNumber::from_syntax_node(db, node)))
644            }
645            SyntaxKind::TerminalShortString => {
646                Some(Expr::ShortString(TerminalShortString::from_syntax_node(db, node)))
647            }
648            SyntaxKind::TerminalString => {
649                Some(Expr::String(TerminalString::from_syntax_node(db, node)))
650            }
651            SyntaxKind::TerminalFalse => {
652                Some(Expr::False(TerminalFalse::from_syntax_node(db, node)))
653            }
654            SyntaxKind::TerminalTrue => Some(Expr::True(TerminalTrue::from_syntax_node(db, node))),
655            SyntaxKind::ExprParenthesized => {
656                Some(Expr::Parenthesized(ExprParenthesized::from_syntax_node(db, node)))
657            }
658            SyntaxKind::ExprUnary => Some(Expr::Unary(ExprUnary::from_syntax_node(db, node))),
659            SyntaxKind::ExprBinary => Some(Expr::Binary(ExprBinary::from_syntax_node(db, node))),
660            SyntaxKind::ExprListParenthesized => {
661                Some(Expr::Tuple(ExprListParenthesized::from_syntax_node(db, node)))
662            }
663            SyntaxKind::ExprFunctionCall => {
664                Some(Expr::FunctionCall(ExprFunctionCall::from_syntax_node(db, node)))
665            }
666            SyntaxKind::ExprStructCtorCall => {
667                Some(Expr::StructCtorCall(ExprStructCtorCall::from_syntax_node(db, node)))
668            }
669            SyntaxKind::ExprBlock => Some(Expr::Block(ExprBlock::from_syntax_node(db, node))),
670            SyntaxKind::ExprMatch => Some(Expr::Match(ExprMatch::from_syntax_node(db, node))),
671            SyntaxKind::ExprIf => Some(Expr::If(ExprIf::from_syntax_node(db, node))),
672            SyntaxKind::ExprLoop => Some(Expr::Loop(ExprLoop::from_syntax_node(db, node))),
673            SyntaxKind::ExprWhile => Some(Expr::While(ExprWhile::from_syntax_node(db, node))),
674            SyntaxKind::ExprFor => Some(Expr::For(ExprFor::from_syntax_node(db, node))),
675            SyntaxKind::ExprClosure => Some(Expr::Closure(ExprClosure::from_syntax_node(db, node))),
676            SyntaxKind::ExprErrorPropagate => {
677                Some(Expr::ErrorPropagate(ExprErrorPropagate::from_syntax_node(db, node)))
678            }
679            SyntaxKind::ExprFieldInitShorthand => {
680                Some(Expr::FieldInitShorthand(ExprFieldInitShorthand::from_syntax_node(db, node)))
681            }
682            SyntaxKind::ExprIndexed => Some(Expr::Indexed(ExprIndexed::from_syntax_node(db, node))),
683            SyntaxKind::ExprInlineMacro => {
684                Some(Expr::InlineMacro(ExprInlineMacro::from_syntax_node(db, node)))
685            }
686            SyntaxKind::ExprFixedSizeArray => {
687                Some(Expr::FixedSizeArray(ExprFixedSizeArray::from_syntax_node(db, node)))
688            }
689            SyntaxKind::ExprMissing => Some(Expr::Missing(ExprMissing::from_syntax_node(db, node))),
690            _ => None,
691        }
692    }
693    fn as_syntax_node(&self) -> SyntaxNode {
694        match self {
695            Expr::Path(x) => x.as_syntax_node(),
696            Expr::Literal(x) => x.as_syntax_node(),
697            Expr::ShortString(x) => x.as_syntax_node(),
698            Expr::String(x) => x.as_syntax_node(),
699            Expr::False(x) => x.as_syntax_node(),
700            Expr::True(x) => x.as_syntax_node(),
701            Expr::Parenthesized(x) => x.as_syntax_node(),
702            Expr::Unary(x) => x.as_syntax_node(),
703            Expr::Binary(x) => x.as_syntax_node(),
704            Expr::Tuple(x) => x.as_syntax_node(),
705            Expr::FunctionCall(x) => x.as_syntax_node(),
706            Expr::StructCtorCall(x) => x.as_syntax_node(),
707            Expr::Block(x) => x.as_syntax_node(),
708            Expr::Match(x) => x.as_syntax_node(),
709            Expr::If(x) => x.as_syntax_node(),
710            Expr::Loop(x) => x.as_syntax_node(),
711            Expr::While(x) => x.as_syntax_node(),
712            Expr::For(x) => x.as_syntax_node(),
713            Expr::Closure(x) => x.as_syntax_node(),
714            Expr::ErrorPropagate(x) => x.as_syntax_node(),
715            Expr::FieldInitShorthand(x) => x.as_syntax_node(),
716            Expr::Indexed(x) => x.as_syntax_node(),
717            Expr::InlineMacro(x) => x.as_syntax_node(),
718            Expr::FixedSizeArray(x) => x.as_syntax_node(),
719            Expr::Missing(x) => x.as_syntax_node(),
720        }
721    }
722    fn stable_ptr(&self) -> Self::StablePtr {
723        ExprPtr(self.as_syntax_node().0.stable_ptr)
724    }
725}
726impl From<&Expr> for SyntaxStablePtrId {
727    fn from(node: &Expr) -> Self {
728        node.stable_ptr().untyped()
729    }
730}
731impl Expr {
732    /// Checks if a kind of a variant of [Expr].
733    pub fn is_variant(kind: SyntaxKind) -> bool {
734        matches!(
735            kind,
736            SyntaxKind::ExprPath
737                | SyntaxKind::TerminalLiteralNumber
738                | SyntaxKind::TerminalShortString
739                | SyntaxKind::TerminalString
740                | SyntaxKind::TerminalFalse
741                | SyntaxKind::TerminalTrue
742                | SyntaxKind::ExprParenthesized
743                | SyntaxKind::ExprUnary
744                | SyntaxKind::ExprBinary
745                | SyntaxKind::ExprListParenthesized
746                | SyntaxKind::ExprFunctionCall
747                | SyntaxKind::ExprStructCtorCall
748                | SyntaxKind::ExprBlock
749                | SyntaxKind::ExprMatch
750                | SyntaxKind::ExprIf
751                | SyntaxKind::ExprLoop
752                | SyntaxKind::ExprWhile
753                | SyntaxKind::ExprFor
754                | SyntaxKind::ExprClosure
755                | SyntaxKind::ExprErrorPropagate
756                | SyntaxKind::ExprFieldInitShorthand
757                | SyntaxKind::ExprIndexed
758                | SyntaxKind::ExprInlineMacro
759                | SyntaxKind::ExprFixedSizeArray
760                | SyntaxKind::ExprMissing
761        )
762    }
763}
764#[derive(Clone, Debug, Eq, Hash, PartialEq)]
765pub struct ExprList(ElementList<Expr, 2>);
766impl Deref for ExprList {
767    type Target = ElementList<Expr, 2>;
768    fn deref(&self) -> &Self::Target {
769        &self.0
770    }
771}
772impl ExprList {
773    pub fn new_green(
774        db: &dyn SyntaxGroup,
775        children: Vec<ExprListElementOrSeparatorGreen>,
776    ) -> ExprListGreen {
777        let width = children.iter().map(|id| id.id().lookup_intern(db).width()).sum();
778        ExprListGreen(
779            Arc::new(GreenNode {
780                kind: SyntaxKind::ExprList,
781                details: GreenNodeDetails::Node {
782                    children: children.iter().map(|x| x.id()).collect(),
783                    width,
784                },
785            })
786            .intern(db),
787        )
788    }
789}
790#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
791pub struct ExprListPtr(pub SyntaxStablePtrId);
792impl TypedStablePtr for ExprListPtr {
793    type SyntaxNode = ExprList;
794    fn untyped(&self) -> SyntaxStablePtrId {
795        self.0
796    }
797    fn lookup(&self, db: &dyn SyntaxGroup) -> ExprList {
798        ExprList::from_syntax_node(db, self.0.lookup(db))
799    }
800}
801impl From<ExprListPtr> for SyntaxStablePtrId {
802    fn from(ptr: ExprListPtr) -> Self {
803        ptr.untyped()
804    }
805}
806#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
807pub enum ExprListElementOrSeparatorGreen {
808    Separator(TerminalCommaGreen),
809    Element(ExprGreen),
810}
811impl From<TerminalCommaGreen> for ExprListElementOrSeparatorGreen {
812    fn from(value: TerminalCommaGreen) -> Self {
813        ExprListElementOrSeparatorGreen::Separator(value)
814    }
815}
816impl From<ExprGreen> for ExprListElementOrSeparatorGreen {
817    fn from(value: ExprGreen) -> Self {
818        ExprListElementOrSeparatorGreen::Element(value)
819    }
820}
821impl ExprListElementOrSeparatorGreen {
822    fn id(&self) -> GreenId {
823        match self {
824            ExprListElementOrSeparatorGreen::Separator(green) => green.0,
825            ExprListElementOrSeparatorGreen::Element(green) => green.0,
826        }
827    }
828}
829#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
830pub struct ExprListGreen(pub GreenId);
831impl TypedSyntaxNode for ExprList {
832    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprList);
833    type StablePtr = ExprListPtr;
834    type Green = ExprListGreen;
835    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
836        ExprListGreen(
837            Arc::new(GreenNode {
838                kind: SyntaxKind::ExprList,
839                details: GreenNodeDetails::Node { children: vec![], width: TextWidth::default() },
840            })
841            .intern(db),
842        )
843    }
844    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
845        Self(ElementList::new(node))
846    }
847    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
848        if node.kind(db) == SyntaxKind::ExprList {
849            Some(Self(ElementList::new(node)))
850        } else {
851            None
852        }
853    }
854    fn as_syntax_node(&self) -> SyntaxNode {
855        self.node.clone()
856    }
857    fn stable_ptr(&self) -> Self::StablePtr {
858        ExprListPtr(self.node.0.stable_ptr)
859    }
860}
861impl From<&ExprList> for SyntaxStablePtrId {
862    fn from(node: &ExprList) -> Self {
863        node.stable_ptr().untyped()
864    }
865}
866#[derive(Clone, Debug, Eq, Hash, PartialEq)]
867pub struct Arg {
868    node: SyntaxNode,
869    children: Arc<[SyntaxNode]>,
870}
871impl Arg {
872    pub const INDEX_MODIFIERS: usize = 0;
873    pub const INDEX_ARG_CLAUSE: usize = 1;
874    pub fn new_green(
875        db: &dyn SyntaxGroup,
876        modifiers: ModifierListGreen,
877        arg_clause: ArgClauseGreen,
878    ) -> ArgGreen {
879        let children: Vec<GreenId> = vec![modifiers.0, arg_clause.0];
880        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
881        ArgGreen(
882            Arc::new(GreenNode {
883                kind: SyntaxKind::Arg,
884                details: GreenNodeDetails::Node { children, width },
885            })
886            .intern(db),
887        )
888    }
889}
890impl Arg {
891    pub fn modifiers(&self, db: &dyn SyntaxGroup) -> ModifierList {
892        ModifierList::from_syntax_node(db, self.children[0].clone())
893    }
894    pub fn arg_clause(&self, db: &dyn SyntaxGroup) -> ArgClause {
895        ArgClause::from_syntax_node(db, self.children[1].clone())
896    }
897}
898#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
899pub struct ArgPtr(pub SyntaxStablePtrId);
900impl ArgPtr {}
901impl TypedStablePtr for ArgPtr {
902    type SyntaxNode = Arg;
903    fn untyped(&self) -> SyntaxStablePtrId {
904        self.0
905    }
906    fn lookup(&self, db: &dyn SyntaxGroup) -> Arg {
907        Arg::from_syntax_node(db, self.0.lookup(db))
908    }
909}
910impl From<ArgPtr> for SyntaxStablePtrId {
911    fn from(ptr: ArgPtr) -> Self {
912        ptr.untyped()
913    }
914}
915#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
916pub struct ArgGreen(pub GreenId);
917impl TypedSyntaxNode for Arg {
918    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::Arg);
919    type StablePtr = ArgPtr;
920    type Green = ArgGreen;
921    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
922        ArgGreen(
923            Arc::new(GreenNode {
924                kind: SyntaxKind::Arg,
925                details: GreenNodeDetails::Node {
926                    children: vec![ModifierList::missing(db).0, ArgClause::missing(db).0],
927                    width: TextWidth::default(),
928                },
929            })
930            .intern(db),
931        )
932    }
933    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
934        let kind = node.kind(db);
935        assert_eq!(
936            kind,
937            SyntaxKind::Arg,
938            "Unexpected SyntaxKind {:?}. Expected {:?}.",
939            kind,
940            SyntaxKind::Arg
941        );
942        let children = db.get_children(node.clone());
943        Self { node, children }
944    }
945    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
946        let kind = node.kind(db);
947        if kind == SyntaxKind::Arg { Some(Self::from_syntax_node(db, node)) } else { None }
948    }
949    fn as_syntax_node(&self) -> SyntaxNode {
950        self.node.clone()
951    }
952    fn stable_ptr(&self) -> Self::StablePtr {
953        ArgPtr(self.node.0.stable_ptr)
954    }
955}
956impl From<&Arg> for SyntaxStablePtrId {
957    fn from(node: &Arg) -> Self {
958        node.stable_ptr().untyped()
959    }
960}
961#[derive(Clone, Debug, Eq, Hash, PartialEq)]
962pub enum ArgClause {
963    Unnamed(ArgClauseUnnamed),
964    Named(ArgClauseNamed),
965    FieldInitShorthand(ArgClauseFieldInitShorthand),
966}
967#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
968pub struct ArgClausePtr(pub SyntaxStablePtrId);
969impl TypedStablePtr for ArgClausePtr {
970    type SyntaxNode = ArgClause;
971    fn untyped(&self) -> SyntaxStablePtrId {
972        self.0
973    }
974    fn lookup(&self, db: &dyn SyntaxGroup) -> ArgClause {
975        ArgClause::from_syntax_node(db, self.0.lookup(db))
976    }
977}
978impl From<ArgClausePtr> for SyntaxStablePtrId {
979    fn from(ptr: ArgClausePtr) -> Self {
980        ptr.untyped()
981    }
982}
983impl From<ArgClauseUnnamedPtr> for ArgClausePtr {
984    fn from(value: ArgClauseUnnamedPtr) -> Self {
985        Self(value.0)
986    }
987}
988impl From<ArgClauseNamedPtr> for ArgClausePtr {
989    fn from(value: ArgClauseNamedPtr) -> Self {
990        Self(value.0)
991    }
992}
993impl From<ArgClauseFieldInitShorthandPtr> for ArgClausePtr {
994    fn from(value: ArgClauseFieldInitShorthandPtr) -> Self {
995        Self(value.0)
996    }
997}
998impl From<ArgClauseUnnamedGreen> for ArgClauseGreen {
999    fn from(value: ArgClauseUnnamedGreen) -> Self {
1000        Self(value.0)
1001    }
1002}
1003impl From<ArgClauseNamedGreen> for ArgClauseGreen {
1004    fn from(value: ArgClauseNamedGreen) -> Self {
1005        Self(value.0)
1006    }
1007}
1008impl From<ArgClauseFieldInitShorthandGreen> for ArgClauseGreen {
1009    fn from(value: ArgClauseFieldInitShorthandGreen) -> Self {
1010        Self(value.0)
1011    }
1012}
1013#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
1014pub struct ArgClauseGreen(pub GreenId);
1015impl TypedSyntaxNode for ArgClause {
1016    const OPTIONAL_KIND: Option<SyntaxKind> = None;
1017    type StablePtr = ArgClausePtr;
1018    type Green = ArgClauseGreen;
1019    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
1020        panic!("No missing variant.");
1021    }
1022    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
1023        let kind = node.kind(db);
1024        match kind {
1025            SyntaxKind::ArgClauseUnnamed => {
1026                ArgClause::Unnamed(ArgClauseUnnamed::from_syntax_node(db, node))
1027            }
1028            SyntaxKind::ArgClauseNamed => {
1029                ArgClause::Named(ArgClauseNamed::from_syntax_node(db, node))
1030            }
1031            SyntaxKind::ArgClauseFieldInitShorthand => ArgClause::FieldInitShorthand(
1032                ArgClauseFieldInitShorthand::from_syntax_node(db, node),
1033            ),
1034            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "ArgClause"),
1035        }
1036    }
1037    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
1038        let kind = node.kind(db);
1039        match kind {
1040            SyntaxKind::ArgClauseUnnamed => {
1041                Some(ArgClause::Unnamed(ArgClauseUnnamed::from_syntax_node(db, node)))
1042            }
1043            SyntaxKind::ArgClauseNamed => {
1044                Some(ArgClause::Named(ArgClauseNamed::from_syntax_node(db, node)))
1045            }
1046            SyntaxKind::ArgClauseFieldInitShorthand => Some(ArgClause::FieldInitShorthand(
1047                ArgClauseFieldInitShorthand::from_syntax_node(db, node),
1048            )),
1049            _ => None,
1050        }
1051    }
1052    fn as_syntax_node(&self) -> SyntaxNode {
1053        match self {
1054            ArgClause::Unnamed(x) => x.as_syntax_node(),
1055            ArgClause::Named(x) => x.as_syntax_node(),
1056            ArgClause::FieldInitShorthand(x) => x.as_syntax_node(),
1057        }
1058    }
1059    fn stable_ptr(&self) -> Self::StablePtr {
1060        ArgClausePtr(self.as_syntax_node().0.stable_ptr)
1061    }
1062}
1063impl From<&ArgClause> for SyntaxStablePtrId {
1064    fn from(node: &ArgClause) -> Self {
1065        node.stable_ptr().untyped()
1066    }
1067}
1068impl ArgClause {
1069    /// Checks if a kind of a variant of [ArgClause].
1070    pub fn is_variant(kind: SyntaxKind) -> bool {
1071        matches!(
1072            kind,
1073            SyntaxKind::ArgClauseUnnamed
1074                | SyntaxKind::ArgClauseNamed
1075                | SyntaxKind::ArgClauseFieldInitShorthand
1076        )
1077    }
1078}
1079#[derive(Clone, Debug, Eq, Hash, PartialEq)]
1080pub struct ArgClauseNamed {
1081    node: SyntaxNode,
1082    children: Arc<[SyntaxNode]>,
1083}
1084impl ArgClauseNamed {
1085    pub const INDEX_NAME: usize = 0;
1086    pub const INDEX_COLON: usize = 1;
1087    pub const INDEX_VALUE: usize = 2;
1088    pub fn new_green(
1089        db: &dyn SyntaxGroup,
1090        name: TerminalIdentifierGreen,
1091        colon: TerminalColonGreen,
1092        value: ExprGreen,
1093    ) -> ArgClauseNamedGreen {
1094        let children: Vec<GreenId> = vec![name.0, colon.0, value.0];
1095        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
1096        ArgClauseNamedGreen(
1097            Arc::new(GreenNode {
1098                kind: SyntaxKind::ArgClauseNamed,
1099                details: GreenNodeDetails::Node { children, width },
1100            })
1101            .intern(db),
1102        )
1103    }
1104}
1105impl ArgClauseNamed {
1106    pub fn name(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier {
1107        TerminalIdentifier::from_syntax_node(db, self.children[0].clone())
1108    }
1109    pub fn colon(&self, db: &dyn SyntaxGroup) -> TerminalColon {
1110        TerminalColon::from_syntax_node(db, self.children[1].clone())
1111    }
1112    pub fn value(&self, db: &dyn SyntaxGroup) -> Expr {
1113        Expr::from_syntax_node(db, self.children[2].clone())
1114    }
1115}
1116#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
1117pub struct ArgClauseNamedPtr(pub SyntaxStablePtrId);
1118impl ArgClauseNamedPtr {}
1119impl TypedStablePtr for ArgClauseNamedPtr {
1120    type SyntaxNode = ArgClauseNamed;
1121    fn untyped(&self) -> SyntaxStablePtrId {
1122        self.0
1123    }
1124    fn lookup(&self, db: &dyn SyntaxGroup) -> ArgClauseNamed {
1125        ArgClauseNamed::from_syntax_node(db, self.0.lookup(db))
1126    }
1127}
1128impl From<ArgClauseNamedPtr> for SyntaxStablePtrId {
1129    fn from(ptr: ArgClauseNamedPtr) -> Self {
1130        ptr.untyped()
1131    }
1132}
1133#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
1134pub struct ArgClauseNamedGreen(pub GreenId);
1135impl TypedSyntaxNode for ArgClauseNamed {
1136    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ArgClauseNamed);
1137    type StablePtr = ArgClauseNamedPtr;
1138    type Green = ArgClauseNamedGreen;
1139    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
1140        ArgClauseNamedGreen(
1141            Arc::new(GreenNode {
1142                kind: SyntaxKind::ArgClauseNamed,
1143                details: GreenNodeDetails::Node {
1144                    children: vec![
1145                        TerminalIdentifier::missing(db).0,
1146                        TerminalColon::missing(db).0,
1147                        Expr::missing(db).0,
1148                    ],
1149                    width: TextWidth::default(),
1150                },
1151            })
1152            .intern(db),
1153        )
1154    }
1155    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
1156        let kind = node.kind(db);
1157        assert_eq!(
1158            kind,
1159            SyntaxKind::ArgClauseNamed,
1160            "Unexpected SyntaxKind {:?}. Expected {:?}.",
1161            kind,
1162            SyntaxKind::ArgClauseNamed
1163        );
1164        let children = db.get_children(node.clone());
1165        Self { node, children }
1166    }
1167    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
1168        let kind = node.kind(db);
1169        if kind == SyntaxKind::ArgClauseNamed {
1170            Some(Self::from_syntax_node(db, node))
1171        } else {
1172            None
1173        }
1174    }
1175    fn as_syntax_node(&self) -> SyntaxNode {
1176        self.node.clone()
1177    }
1178    fn stable_ptr(&self) -> Self::StablePtr {
1179        ArgClauseNamedPtr(self.node.0.stable_ptr)
1180    }
1181}
1182impl From<&ArgClauseNamed> for SyntaxStablePtrId {
1183    fn from(node: &ArgClauseNamed) -> Self {
1184        node.stable_ptr().untyped()
1185    }
1186}
1187#[derive(Clone, Debug, Eq, Hash, PartialEq)]
1188pub struct ArgClauseUnnamed {
1189    node: SyntaxNode,
1190    children: Arc<[SyntaxNode]>,
1191}
1192impl ArgClauseUnnamed {
1193    pub const INDEX_VALUE: usize = 0;
1194    pub fn new_green(db: &dyn SyntaxGroup, value: ExprGreen) -> ArgClauseUnnamedGreen {
1195        let children: Vec<GreenId> = vec![value.0];
1196        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
1197        ArgClauseUnnamedGreen(
1198            Arc::new(GreenNode {
1199                kind: SyntaxKind::ArgClauseUnnamed,
1200                details: GreenNodeDetails::Node { children, width },
1201            })
1202            .intern(db),
1203        )
1204    }
1205}
1206impl ArgClauseUnnamed {
1207    pub fn value(&self, db: &dyn SyntaxGroup) -> Expr {
1208        Expr::from_syntax_node(db, self.children[0].clone())
1209    }
1210}
1211#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
1212pub struct ArgClauseUnnamedPtr(pub SyntaxStablePtrId);
1213impl ArgClauseUnnamedPtr {}
1214impl TypedStablePtr for ArgClauseUnnamedPtr {
1215    type SyntaxNode = ArgClauseUnnamed;
1216    fn untyped(&self) -> SyntaxStablePtrId {
1217        self.0
1218    }
1219    fn lookup(&self, db: &dyn SyntaxGroup) -> ArgClauseUnnamed {
1220        ArgClauseUnnamed::from_syntax_node(db, self.0.lookup(db))
1221    }
1222}
1223impl From<ArgClauseUnnamedPtr> for SyntaxStablePtrId {
1224    fn from(ptr: ArgClauseUnnamedPtr) -> Self {
1225        ptr.untyped()
1226    }
1227}
1228#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
1229pub struct ArgClauseUnnamedGreen(pub GreenId);
1230impl TypedSyntaxNode for ArgClauseUnnamed {
1231    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ArgClauseUnnamed);
1232    type StablePtr = ArgClauseUnnamedPtr;
1233    type Green = ArgClauseUnnamedGreen;
1234    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
1235        ArgClauseUnnamedGreen(
1236            Arc::new(GreenNode {
1237                kind: SyntaxKind::ArgClauseUnnamed,
1238                details: GreenNodeDetails::Node {
1239                    children: vec![Expr::missing(db).0],
1240                    width: TextWidth::default(),
1241                },
1242            })
1243            .intern(db),
1244        )
1245    }
1246    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
1247        let kind = node.kind(db);
1248        assert_eq!(
1249            kind,
1250            SyntaxKind::ArgClauseUnnamed,
1251            "Unexpected SyntaxKind {:?}. Expected {:?}.",
1252            kind,
1253            SyntaxKind::ArgClauseUnnamed
1254        );
1255        let children = db.get_children(node.clone());
1256        Self { node, children }
1257    }
1258    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
1259        let kind = node.kind(db);
1260        if kind == SyntaxKind::ArgClauseUnnamed {
1261            Some(Self::from_syntax_node(db, node))
1262        } else {
1263            None
1264        }
1265    }
1266    fn as_syntax_node(&self) -> SyntaxNode {
1267        self.node.clone()
1268    }
1269    fn stable_ptr(&self) -> Self::StablePtr {
1270        ArgClauseUnnamedPtr(self.node.0.stable_ptr)
1271    }
1272}
1273impl From<&ArgClauseUnnamed> for SyntaxStablePtrId {
1274    fn from(node: &ArgClauseUnnamed) -> Self {
1275        node.stable_ptr().untyped()
1276    }
1277}
1278#[derive(Clone, Debug, Eq, Hash, PartialEq)]
1279pub struct ArgClauseFieldInitShorthand {
1280    node: SyntaxNode,
1281    children: Arc<[SyntaxNode]>,
1282}
1283impl ArgClauseFieldInitShorthand {
1284    pub const INDEX_COLON: usize = 0;
1285    pub const INDEX_NAME: usize = 1;
1286    pub fn new_green(
1287        db: &dyn SyntaxGroup,
1288        colon: TerminalColonGreen,
1289        name: ExprFieldInitShorthandGreen,
1290    ) -> ArgClauseFieldInitShorthandGreen {
1291        let children: Vec<GreenId> = vec![colon.0, name.0];
1292        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
1293        ArgClauseFieldInitShorthandGreen(
1294            Arc::new(GreenNode {
1295                kind: SyntaxKind::ArgClauseFieldInitShorthand,
1296                details: GreenNodeDetails::Node { children, width },
1297            })
1298            .intern(db),
1299        )
1300    }
1301}
1302impl ArgClauseFieldInitShorthand {
1303    pub fn colon(&self, db: &dyn SyntaxGroup) -> TerminalColon {
1304        TerminalColon::from_syntax_node(db, self.children[0].clone())
1305    }
1306    pub fn name(&self, db: &dyn SyntaxGroup) -> ExprFieldInitShorthand {
1307        ExprFieldInitShorthand::from_syntax_node(db, self.children[1].clone())
1308    }
1309}
1310#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
1311pub struct ArgClauseFieldInitShorthandPtr(pub SyntaxStablePtrId);
1312impl ArgClauseFieldInitShorthandPtr {}
1313impl TypedStablePtr for ArgClauseFieldInitShorthandPtr {
1314    type SyntaxNode = ArgClauseFieldInitShorthand;
1315    fn untyped(&self) -> SyntaxStablePtrId {
1316        self.0
1317    }
1318    fn lookup(&self, db: &dyn SyntaxGroup) -> ArgClauseFieldInitShorthand {
1319        ArgClauseFieldInitShorthand::from_syntax_node(db, self.0.lookup(db))
1320    }
1321}
1322impl From<ArgClauseFieldInitShorthandPtr> for SyntaxStablePtrId {
1323    fn from(ptr: ArgClauseFieldInitShorthandPtr) -> Self {
1324        ptr.untyped()
1325    }
1326}
1327#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
1328pub struct ArgClauseFieldInitShorthandGreen(pub GreenId);
1329impl TypedSyntaxNode for ArgClauseFieldInitShorthand {
1330    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ArgClauseFieldInitShorthand);
1331    type StablePtr = ArgClauseFieldInitShorthandPtr;
1332    type Green = ArgClauseFieldInitShorthandGreen;
1333    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
1334        ArgClauseFieldInitShorthandGreen(
1335            Arc::new(GreenNode {
1336                kind: SyntaxKind::ArgClauseFieldInitShorthand,
1337                details: GreenNodeDetails::Node {
1338                    children: vec![
1339                        TerminalColon::missing(db).0,
1340                        ExprFieldInitShorthand::missing(db).0,
1341                    ],
1342                    width: TextWidth::default(),
1343                },
1344            })
1345            .intern(db),
1346        )
1347    }
1348    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
1349        let kind = node.kind(db);
1350        assert_eq!(
1351            kind,
1352            SyntaxKind::ArgClauseFieldInitShorthand,
1353            "Unexpected SyntaxKind {:?}. Expected {:?}.",
1354            kind,
1355            SyntaxKind::ArgClauseFieldInitShorthand
1356        );
1357        let children = db.get_children(node.clone());
1358        Self { node, children }
1359    }
1360    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
1361        let kind = node.kind(db);
1362        if kind == SyntaxKind::ArgClauseFieldInitShorthand {
1363            Some(Self::from_syntax_node(db, node))
1364        } else {
1365            None
1366        }
1367    }
1368    fn as_syntax_node(&self) -> SyntaxNode {
1369        self.node.clone()
1370    }
1371    fn stable_ptr(&self) -> Self::StablePtr {
1372        ArgClauseFieldInitShorthandPtr(self.node.0.stable_ptr)
1373    }
1374}
1375impl From<&ArgClauseFieldInitShorthand> for SyntaxStablePtrId {
1376    fn from(node: &ArgClauseFieldInitShorthand) -> Self {
1377        node.stable_ptr().untyped()
1378    }
1379}
1380#[derive(Clone, Debug, Eq, Hash, PartialEq)]
1381pub struct ExprFieldInitShorthand {
1382    node: SyntaxNode,
1383    children: Arc<[SyntaxNode]>,
1384}
1385impl ExprFieldInitShorthand {
1386    pub const INDEX_NAME: usize = 0;
1387    pub fn new_green(
1388        db: &dyn SyntaxGroup,
1389        name: TerminalIdentifierGreen,
1390    ) -> ExprFieldInitShorthandGreen {
1391        let children: Vec<GreenId> = vec![name.0];
1392        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
1393        ExprFieldInitShorthandGreen(
1394            Arc::new(GreenNode {
1395                kind: SyntaxKind::ExprFieldInitShorthand,
1396                details: GreenNodeDetails::Node { children, width },
1397            })
1398            .intern(db),
1399        )
1400    }
1401}
1402impl ExprFieldInitShorthand {
1403    pub fn name(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier {
1404        TerminalIdentifier::from_syntax_node(db, self.children[0].clone())
1405    }
1406}
1407#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
1408pub struct ExprFieldInitShorthandPtr(pub SyntaxStablePtrId);
1409impl ExprFieldInitShorthandPtr {}
1410impl TypedStablePtr for ExprFieldInitShorthandPtr {
1411    type SyntaxNode = ExprFieldInitShorthand;
1412    fn untyped(&self) -> SyntaxStablePtrId {
1413        self.0
1414    }
1415    fn lookup(&self, db: &dyn SyntaxGroup) -> ExprFieldInitShorthand {
1416        ExprFieldInitShorthand::from_syntax_node(db, self.0.lookup(db))
1417    }
1418}
1419impl From<ExprFieldInitShorthandPtr> for SyntaxStablePtrId {
1420    fn from(ptr: ExprFieldInitShorthandPtr) -> Self {
1421        ptr.untyped()
1422    }
1423}
1424#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
1425pub struct ExprFieldInitShorthandGreen(pub GreenId);
1426impl TypedSyntaxNode for ExprFieldInitShorthand {
1427    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprFieldInitShorthand);
1428    type StablePtr = ExprFieldInitShorthandPtr;
1429    type Green = ExprFieldInitShorthandGreen;
1430    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
1431        ExprFieldInitShorthandGreen(
1432            Arc::new(GreenNode {
1433                kind: SyntaxKind::ExprFieldInitShorthand,
1434                details: GreenNodeDetails::Node {
1435                    children: vec![TerminalIdentifier::missing(db).0],
1436                    width: TextWidth::default(),
1437                },
1438            })
1439            .intern(db),
1440        )
1441    }
1442    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
1443        let kind = node.kind(db);
1444        assert_eq!(
1445            kind,
1446            SyntaxKind::ExprFieldInitShorthand,
1447            "Unexpected SyntaxKind {:?}. Expected {:?}.",
1448            kind,
1449            SyntaxKind::ExprFieldInitShorthand
1450        );
1451        let children = db.get_children(node.clone());
1452        Self { node, children }
1453    }
1454    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
1455        let kind = node.kind(db);
1456        if kind == SyntaxKind::ExprFieldInitShorthand {
1457            Some(Self::from_syntax_node(db, node))
1458        } else {
1459            None
1460        }
1461    }
1462    fn as_syntax_node(&self) -> SyntaxNode {
1463        self.node.clone()
1464    }
1465    fn stable_ptr(&self) -> Self::StablePtr {
1466        ExprFieldInitShorthandPtr(self.node.0.stable_ptr)
1467    }
1468}
1469impl From<&ExprFieldInitShorthand> for SyntaxStablePtrId {
1470    fn from(node: &ExprFieldInitShorthand) -> Self {
1471        node.stable_ptr().untyped()
1472    }
1473}
1474#[derive(Clone, Debug, Eq, Hash, PartialEq)]
1475pub struct ArgList(ElementList<Arg, 2>);
1476impl Deref for ArgList {
1477    type Target = ElementList<Arg, 2>;
1478    fn deref(&self) -> &Self::Target {
1479        &self.0
1480    }
1481}
1482impl ArgList {
1483    pub fn new_green(
1484        db: &dyn SyntaxGroup,
1485        children: Vec<ArgListElementOrSeparatorGreen>,
1486    ) -> ArgListGreen {
1487        let width = children.iter().map(|id| id.id().lookup_intern(db).width()).sum();
1488        ArgListGreen(
1489            Arc::new(GreenNode {
1490                kind: SyntaxKind::ArgList,
1491                details: GreenNodeDetails::Node {
1492                    children: children.iter().map(|x| x.id()).collect(),
1493                    width,
1494                },
1495            })
1496            .intern(db),
1497        )
1498    }
1499}
1500#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
1501pub struct ArgListPtr(pub SyntaxStablePtrId);
1502impl TypedStablePtr for ArgListPtr {
1503    type SyntaxNode = ArgList;
1504    fn untyped(&self) -> SyntaxStablePtrId {
1505        self.0
1506    }
1507    fn lookup(&self, db: &dyn SyntaxGroup) -> ArgList {
1508        ArgList::from_syntax_node(db, self.0.lookup(db))
1509    }
1510}
1511impl From<ArgListPtr> for SyntaxStablePtrId {
1512    fn from(ptr: ArgListPtr) -> Self {
1513        ptr.untyped()
1514    }
1515}
1516#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
1517pub enum ArgListElementOrSeparatorGreen {
1518    Separator(TerminalCommaGreen),
1519    Element(ArgGreen),
1520}
1521impl From<TerminalCommaGreen> for ArgListElementOrSeparatorGreen {
1522    fn from(value: TerminalCommaGreen) -> Self {
1523        ArgListElementOrSeparatorGreen::Separator(value)
1524    }
1525}
1526impl From<ArgGreen> for ArgListElementOrSeparatorGreen {
1527    fn from(value: ArgGreen) -> Self {
1528        ArgListElementOrSeparatorGreen::Element(value)
1529    }
1530}
1531impl ArgListElementOrSeparatorGreen {
1532    fn id(&self) -> GreenId {
1533        match self {
1534            ArgListElementOrSeparatorGreen::Separator(green) => green.0,
1535            ArgListElementOrSeparatorGreen::Element(green) => green.0,
1536        }
1537    }
1538}
1539#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
1540pub struct ArgListGreen(pub GreenId);
1541impl TypedSyntaxNode for ArgList {
1542    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ArgList);
1543    type StablePtr = ArgListPtr;
1544    type Green = ArgListGreen;
1545    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
1546        ArgListGreen(
1547            Arc::new(GreenNode {
1548                kind: SyntaxKind::ArgList,
1549                details: GreenNodeDetails::Node { children: vec![], width: TextWidth::default() },
1550            })
1551            .intern(db),
1552        )
1553    }
1554    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
1555        Self(ElementList::new(node))
1556    }
1557    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
1558        if node.kind(db) == SyntaxKind::ArgList { Some(Self(ElementList::new(node))) } else { None }
1559    }
1560    fn as_syntax_node(&self) -> SyntaxNode {
1561        self.node.clone()
1562    }
1563    fn stable_ptr(&self) -> Self::StablePtr {
1564        ArgListPtr(self.node.0.stable_ptr)
1565    }
1566}
1567impl From<&ArgList> for SyntaxStablePtrId {
1568    fn from(node: &ArgList) -> Self {
1569        node.stable_ptr().untyped()
1570    }
1571}
1572#[derive(Clone, Debug, Eq, Hash, PartialEq)]
1573pub struct ExprMissing {
1574    node: SyntaxNode,
1575    children: Arc<[SyntaxNode]>,
1576}
1577impl ExprMissing {
1578    pub fn new_green(db: &dyn SyntaxGroup) -> ExprMissingGreen {
1579        let children: Vec<GreenId> = vec![];
1580        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
1581        ExprMissingGreen(
1582            Arc::new(GreenNode {
1583                kind: SyntaxKind::ExprMissing,
1584                details: GreenNodeDetails::Node { children, width },
1585            })
1586            .intern(db),
1587        )
1588    }
1589}
1590impl ExprMissing {}
1591#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
1592pub struct ExprMissingPtr(pub SyntaxStablePtrId);
1593impl ExprMissingPtr {}
1594impl TypedStablePtr for ExprMissingPtr {
1595    type SyntaxNode = ExprMissing;
1596    fn untyped(&self) -> SyntaxStablePtrId {
1597        self.0
1598    }
1599    fn lookup(&self, db: &dyn SyntaxGroup) -> ExprMissing {
1600        ExprMissing::from_syntax_node(db, self.0.lookup(db))
1601    }
1602}
1603impl From<ExprMissingPtr> for SyntaxStablePtrId {
1604    fn from(ptr: ExprMissingPtr) -> Self {
1605        ptr.untyped()
1606    }
1607}
1608#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
1609pub struct ExprMissingGreen(pub GreenId);
1610impl TypedSyntaxNode for ExprMissing {
1611    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprMissing);
1612    type StablePtr = ExprMissingPtr;
1613    type Green = ExprMissingGreen;
1614    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
1615        ExprMissingGreen(
1616            Arc::new(GreenNode {
1617                kind: SyntaxKind::ExprMissing,
1618                details: GreenNodeDetails::Node { children: vec![], width: TextWidth::default() },
1619            })
1620            .intern(db),
1621        )
1622    }
1623    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
1624        let kind = node.kind(db);
1625        assert_eq!(
1626            kind,
1627            SyntaxKind::ExprMissing,
1628            "Unexpected SyntaxKind {:?}. Expected {:?}.",
1629            kind,
1630            SyntaxKind::ExprMissing
1631        );
1632        let children = db.get_children(node.clone());
1633        Self { node, children }
1634    }
1635    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
1636        let kind = node.kind(db);
1637        if kind == SyntaxKind::ExprMissing { Some(Self::from_syntax_node(db, node)) } else { None }
1638    }
1639    fn as_syntax_node(&self) -> SyntaxNode {
1640        self.node.clone()
1641    }
1642    fn stable_ptr(&self) -> Self::StablePtr {
1643        ExprMissingPtr(self.node.0.stable_ptr)
1644    }
1645}
1646impl From<&ExprMissing> for SyntaxStablePtrId {
1647    fn from(node: &ExprMissing) -> Self {
1648        node.stable_ptr().untyped()
1649    }
1650}
1651#[derive(Clone, Debug, Eq, Hash, PartialEq)]
1652pub enum PathSegment {
1653    WithGenericArgs(PathSegmentWithGenericArgs),
1654    Simple(PathSegmentSimple),
1655}
1656#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
1657pub struct PathSegmentPtr(pub SyntaxStablePtrId);
1658impl TypedStablePtr for PathSegmentPtr {
1659    type SyntaxNode = PathSegment;
1660    fn untyped(&self) -> SyntaxStablePtrId {
1661        self.0
1662    }
1663    fn lookup(&self, db: &dyn SyntaxGroup) -> PathSegment {
1664        PathSegment::from_syntax_node(db, self.0.lookup(db))
1665    }
1666}
1667impl From<PathSegmentPtr> for SyntaxStablePtrId {
1668    fn from(ptr: PathSegmentPtr) -> Self {
1669        ptr.untyped()
1670    }
1671}
1672impl From<PathSegmentWithGenericArgsPtr> for PathSegmentPtr {
1673    fn from(value: PathSegmentWithGenericArgsPtr) -> Self {
1674        Self(value.0)
1675    }
1676}
1677impl From<PathSegmentSimplePtr> for PathSegmentPtr {
1678    fn from(value: PathSegmentSimplePtr) -> Self {
1679        Self(value.0)
1680    }
1681}
1682impl From<PathSegmentWithGenericArgsGreen> for PathSegmentGreen {
1683    fn from(value: PathSegmentWithGenericArgsGreen) -> Self {
1684        Self(value.0)
1685    }
1686}
1687impl From<PathSegmentSimpleGreen> for PathSegmentGreen {
1688    fn from(value: PathSegmentSimpleGreen) -> Self {
1689        Self(value.0)
1690    }
1691}
1692#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
1693pub struct PathSegmentGreen(pub GreenId);
1694impl TypedSyntaxNode for PathSegment {
1695    const OPTIONAL_KIND: Option<SyntaxKind> = None;
1696    type StablePtr = PathSegmentPtr;
1697    type Green = PathSegmentGreen;
1698    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
1699        PathSegmentGreen(PathSegmentSimple::missing(db).0)
1700    }
1701    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
1702        let kind = node.kind(db);
1703        match kind {
1704            SyntaxKind::PathSegmentWithGenericArgs => {
1705                PathSegment::WithGenericArgs(PathSegmentWithGenericArgs::from_syntax_node(db, node))
1706            }
1707            SyntaxKind::PathSegmentSimple => {
1708                PathSegment::Simple(PathSegmentSimple::from_syntax_node(db, node))
1709            }
1710            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "PathSegment"),
1711        }
1712    }
1713    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
1714        let kind = node.kind(db);
1715        match kind {
1716            SyntaxKind::PathSegmentWithGenericArgs => Some(PathSegment::WithGenericArgs(
1717                PathSegmentWithGenericArgs::from_syntax_node(db, node),
1718            )),
1719            SyntaxKind::PathSegmentSimple => {
1720                Some(PathSegment::Simple(PathSegmentSimple::from_syntax_node(db, node)))
1721            }
1722            _ => None,
1723        }
1724    }
1725    fn as_syntax_node(&self) -> SyntaxNode {
1726        match self {
1727            PathSegment::WithGenericArgs(x) => x.as_syntax_node(),
1728            PathSegment::Simple(x) => x.as_syntax_node(),
1729        }
1730    }
1731    fn stable_ptr(&self) -> Self::StablePtr {
1732        PathSegmentPtr(self.as_syntax_node().0.stable_ptr)
1733    }
1734}
1735impl From<&PathSegment> for SyntaxStablePtrId {
1736    fn from(node: &PathSegment) -> Self {
1737        node.stable_ptr().untyped()
1738    }
1739}
1740impl PathSegment {
1741    /// Checks if a kind of a variant of [PathSegment].
1742    pub fn is_variant(kind: SyntaxKind) -> bool {
1743        matches!(kind, SyntaxKind::PathSegmentWithGenericArgs | SyntaxKind::PathSegmentSimple)
1744    }
1745}
1746#[derive(Clone, Debug, Eq, Hash, PartialEq)]
1747pub struct PathSegmentSimple {
1748    node: SyntaxNode,
1749    children: Arc<[SyntaxNode]>,
1750}
1751impl PathSegmentSimple {
1752    pub const INDEX_IDENT: usize = 0;
1753    pub fn new_green(
1754        db: &dyn SyntaxGroup,
1755        ident: TerminalIdentifierGreen,
1756    ) -> PathSegmentSimpleGreen {
1757        let children: Vec<GreenId> = vec![ident.0];
1758        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
1759        PathSegmentSimpleGreen(
1760            Arc::new(GreenNode {
1761                kind: SyntaxKind::PathSegmentSimple,
1762                details: GreenNodeDetails::Node { children, width },
1763            })
1764            .intern(db),
1765        )
1766    }
1767}
1768impl PathSegmentSimple {
1769    pub fn ident(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier {
1770        TerminalIdentifier::from_syntax_node(db, self.children[0].clone())
1771    }
1772}
1773#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
1774pub struct PathSegmentSimplePtr(pub SyntaxStablePtrId);
1775impl PathSegmentSimplePtr {}
1776impl TypedStablePtr for PathSegmentSimplePtr {
1777    type SyntaxNode = PathSegmentSimple;
1778    fn untyped(&self) -> SyntaxStablePtrId {
1779        self.0
1780    }
1781    fn lookup(&self, db: &dyn SyntaxGroup) -> PathSegmentSimple {
1782        PathSegmentSimple::from_syntax_node(db, self.0.lookup(db))
1783    }
1784}
1785impl From<PathSegmentSimplePtr> for SyntaxStablePtrId {
1786    fn from(ptr: PathSegmentSimplePtr) -> Self {
1787        ptr.untyped()
1788    }
1789}
1790#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
1791pub struct PathSegmentSimpleGreen(pub GreenId);
1792impl TypedSyntaxNode for PathSegmentSimple {
1793    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PathSegmentSimple);
1794    type StablePtr = PathSegmentSimplePtr;
1795    type Green = PathSegmentSimpleGreen;
1796    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
1797        PathSegmentSimpleGreen(
1798            Arc::new(GreenNode {
1799                kind: SyntaxKind::PathSegmentSimple,
1800                details: GreenNodeDetails::Node {
1801                    children: vec![TerminalIdentifier::missing(db).0],
1802                    width: TextWidth::default(),
1803                },
1804            })
1805            .intern(db),
1806        )
1807    }
1808    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
1809        let kind = node.kind(db);
1810        assert_eq!(
1811            kind,
1812            SyntaxKind::PathSegmentSimple,
1813            "Unexpected SyntaxKind {:?}. Expected {:?}.",
1814            kind,
1815            SyntaxKind::PathSegmentSimple
1816        );
1817        let children = db.get_children(node.clone());
1818        Self { node, children }
1819    }
1820    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
1821        let kind = node.kind(db);
1822        if kind == SyntaxKind::PathSegmentSimple {
1823            Some(Self::from_syntax_node(db, node))
1824        } else {
1825            None
1826        }
1827    }
1828    fn as_syntax_node(&self) -> SyntaxNode {
1829        self.node.clone()
1830    }
1831    fn stable_ptr(&self) -> Self::StablePtr {
1832        PathSegmentSimplePtr(self.node.0.stable_ptr)
1833    }
1834}
1835impl From<&PathSegmentSimple> for SyntaxStablePtrId {
1836    fn from(node: &PathSegmentSimple) -> Self {
1837        node.stable_ptr().untyped()
1838    }
1839}
1840#[derive(Clone, Debug, Eq, Hash, PartialEq)]
1841pub enum OptionTerminalColonColon {
1842    Empty(OptionTerminalColonColonEmpty),
1843    TerminalColonColon(TerminalColonColon),
1844}
1845#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
1846pub struct OptionTerminalColonColonPtr(pub SyntaxStablePtrId);
1847impl TypedStablePtr for OptionTerminalColonColonPtr {
1848    type SyntaxNode = OptionTerminalColonColon;
1849    fn untyped(&self) -> SyntaxStablePtrId {
1850        self.0
1851    }
1852    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionTerminalColonColon {
1853        OptionTerminalColonColon::from_syntax_node(db, self.0.lookup(db))
1854    }
1855}
1856impl From<OptionTerminalColonColonPtr> for SyntaxStablePtrId {
1857    fn from(ptr: OptionTerminalColonColonPtr) -> Self {
1858        ptr.untyped()
1859    }
1860}
1861impl From<OptionTerminalColonColonEmptyPtr> for OptionTerminalColonColonPtr {
1862    fn from(value: OptionTerminalColonColonEmptyPtr) -> Self {
1863        Self(value.0)
1864    }
1865}
1866impl From<TerminalColonColonPtr> for OptionTerminalColonColonPtr {
1867    fn from(value: TerminalColonColonPtr) -> Self {
1868        Self(value.0)
1869    }
1870}
1871impl From<OptionTerminalColonColonEmptyGreen> for OptionTerminalColonColonGreen {
1872    fn from(value: OptionTerminalColonColonEmptyGreen) -> Self {
1873        Self(value.0)
1874    }
1875}
1876impl From<TerminalColonColonGreen> for OptionTerminalColonColonGreen {
1877    fn from(value: TerminalColonColonGreen) -> Self {
1878        Self(value.0)
1879    }
1880}
1881#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
1882pub struct OptionTerminalColonColonGreen(pub GreenId);
1883impl TypedSyntaxNode for OptionTerminalColonColon {
1884    const OPTIONAL_KIND: Option<SyntaxKind> = None;
1885    type StablePtr = OptionTerminalColonColonPtr;
1886    type Green = OptionTerminalColonColonGreen;
1887    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
1888        panic!("No missing variant.");
1889    }
1890    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
1891        let kind = node.kind(db);
1892        match kind {
1893            SyntaxKind::OptionTerminalColonColonEmpty => OptionTerminalColonColon::Empty(
1894                OptionTerminalColonColonEmpty::from_syntax_node(db, node),
1895            ),
1896            SyntaxKind::TerminalColonColon => OptionTerminalColonColon::TerminalColonColon(
1897                TerminalColonColon::from_syntax_node(db, node),
1898            ),
1899            _ => panic!(
1900                "Unexpected syntax kind {:?} when constructing {}.",
1901                kind, "OptionTerminalColonColon"
1902            ),
1903        }
1904    }
1905    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
1906        let kind = node.kind(db);
1907        match kind {
1908            SyntaxKind::OptionTerminalColonColonEmpty => Some(OptionTerminalColonColon::Empty(
1909                OptionTerminalColonColonEmpty::from_syntax_node(db, node),
1910            )),
1911            SyntaxKind::TerminalColonColon => Some(OptionTerminalColonColon::TerminalColonColon(
1912                TerminalColonColon::from_syntax_node(db, node),
1913            )),
1914            _ => None,
1915        }
1916    }
1917    fn as_syntax_node(&self) -> SyntaxNode {
1918        match self {
1919            OptionTerminalColonColon::Empty(x) => x.as_syntax_node(),
1920            OptionTerminalColonColon::TerminalColonColon(x) => x.as_syntax_node(),
1921        }
1922    }
1923    fn stable_ptr(&self) -> Self::StablePtr {
1924        OptionTerminalColonColonPtr(self.as_syntax_node().0.stable_ptr)
1925    }
1926}
1927impl From<&OptionTerminalColonColon> for SyntaxStablePtrId {
1928    fn from(node: &OptionTerminalColonColon) -> Self {
1929        node.stable_ptr().untyped()
1930    }
1931}
1932impl OptionTerminalColonColon {
1933    /// Checks if a kind of a variant of [OptionTerminalColonColon].
1934    pub fn is_variant(kind: SyntaxKind) -> bool {
1935        matches!(kind, SyntaxKind::OptionTerminalColonColonEmpty | SyntaxKind::TerminalColonColon)
1936    }
1937}
1938#[derive(Clone, Debug, Eq, Hash, PartialEq)]
1939pub struct OptionTerminalColonColonEmpty {
1940    node: SyntaxNode,
1941    children: Arc<[SyntaxNode]>,
1942}
1943impl OptionTerminalColonColonEmpty {
1944    pub fn new_green(db: &dyn SyntaxGroup) -> OptionTerminalColonColonEmptyGreen {
1945        let children: Vec<GreenId> = vec![];
1946        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
1947        OptionTerminalColonColonEmptyGreen(
1948            Arc::new(GreenNode {
1949                kind: SyntaxKind::OptionTerminalColonColonEmpty,
1950                details: GreenNodeDetails::Node { children, width },
1951            })
1952            .intern(db),
1953        )
1954    }
1955}
1956impl OptionTerminalColonColonEmpty {}
1957#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
1958pub struct OptionTerminalColonColonEmptyPtr(pub SyntaxStablePtrId);
1959impl OptionTerminalColonColonEmptyPtr {}
1960impl TypedStablePtr for OptionTerminalColonColonEmptyPtr {
1961    type SyntaxNode = OptionTerminalColonColonEmpty;
1962    fn untyped(&self) -> SyntaxStablePtrId {
1963        self.0
1964    }
1965    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionTerminalColonColonEmpty {
1966        OptionTerminalColonColonEmpty::from_syntax_node(db, self.0.lookup(db))
1967    }
1968}
1969impl From<OptionTerminalColonColonEmptyPtr> for SyntaxStablePtrId {
1970    fn from(ptr: OptionTerminalColonColonEmptyPtr) -> Self {
1971        ptr.untyped()
1972    }
1973}
1974#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
1975pub struct OptionTerminalColonColonEmptyGreen(pub GreenId);
1976impl TypedSyntaxNode for OptionTerminalColonColonEmpty {
1977    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionTerminalColonColonEmpty);
1978    type StablePtr = OptionTerminalColonColonEmptyPtr;
1979    type Green = OptionTerminalColonColonEmptyGreen;
1980    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
1981        OptionTerminalColonColonEmptyGreen(
1982            Arc::new(GreenNode {
1983                kind: SyntaxKind::OptionTerminalColonColonEmpty,
1984                details: GreenNodeDetails::Node { children: vec![], width: TextWidth::default() },
1985            })
1986            .intern(db),
1987        )
1988    }
1989    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
1990        let kind = node.kind(db);
1991        assert_eq!(
1992            kind,
1993            SyntaxKind::OptionTerminalColonColonEmpty,
1994            "Unexpected SyntaxKind {:?}. Expected {:?}.",
1995            kind,
1996            SyntaxKind::OptionTerminalColonColonEmpty
1997        );
1998        let children = db.get_children(node.clone());
1999        Self { node, children }
2000    }
2001    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
2002        let kind = node.kind(db);
2003        if kind == SyntaxKind::OptionTerminalColonColonEmpty {
2004            Some(Self::from_syntax_node(db, node))
2005        } else {
2006            None
2007        }
2008    }
2009    fn as_syntax_node(&self) -> SyntaxNode {
2010        self.node.clone()
2011    }
2012    fn stable_ptr(&self) -> Self::StablePtr {
2013        OptionTerminalColonColonEmptyPtr(self.node.0.stable_ptr)
2014    }
2015}
2016impl From<&OptionTerminalColonColonEmpty> for SyntaxStablePtrId {
2017    fn from(node: &OptionTerminalColonColonEmpty) -> Self {
2018        node.stable_ptr().untyped()
2019    }
2020}
2021#[derive(Clone, Debug, Eq, Hash, PartialEq)]
2022pub struct PathSegmentWithGenericArgs {
2023    node: SyntaxNode,
2024    children: Arc<[SyntaxNode]>,
2025}
2026impl PathSegmentWithGenericArgs {
2027    pub const INDEX_IDENT: usize = 0;
2028    pub const INDEX_SEPARATOR: usize = 1;
2029    pub const INDEX_GENERIC_ARGS: usize = 2;
2030    pub fn new_green(
2031        db: &dyn SyntaxGroup,
2032        ident: TerminalIdentifierGreen,
2033        separator: OptionTerminalColonColonGreen,
2034        generic_args: GenericArgsGreen,
2035    ) -> PathSegmentWithGenericArgsGreen {
2036        let children: Vec<GreenId> = vec![ident.0, separator.0, generic_args.0];
2037        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
2038        PathSegmentWithGenericArgsGreen(
2039            Arc::new(GreenNode {
2040                kind: SyntaxKind::PathSegmentWithGenericArgs,
2041                details: GreenNodeDetails::Node { children, width },
2042            })
2043            .intern(db),
2044        )
2045    }
2046}
2047impl PathSegmentWithGenericArgs {
2048    pub fn ident(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier {
2049        TerminalIdentifier::from_syntax_node(db, self.children[0].clone())
2050    }
2051    pub fn separator(&self, db: &dyn SyntaxGroup) -> OptionTerminalColonColon {
2052        OptionTerminalColonColon::from_syntax_node(db, self.children[1].clone())
2053    }
2054    pub fn generic_args(&self, db: &dyn SyntaxGroup) -> GenericArgs {
2055        GenericArgs::from_syntax_node(db, self.children[2].clone())
2056    }
2057}
2058#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
2059pub struct PathSegmentWithGenericArgsPtr(pub SyntaxStablePtrId);
2060impl PathSegmentWithGenericArgsPtr {}
2061impl TypedStablePtr for PathSegmentWithGenericArgsPtr {
2062    type SyntaxNode = PathSegmentWithGenericArgs;
2063    fn untyped(&self) -> SyntaxStablePtrId {
2064        self.0
2065    }
2066    fn lookup(&self, db: &dyn SyntaxGroup) -> PathSegmentWithGenericArgs {
2067        PathSegmentWithGenericArgs::from_syntax_node(db, self.0.lookup(db))
2068    }
2069}
2070impl From<PathSegmentWithGenericArgsPtr> for SyntaxStablePtrId {
2071    fn from(ptr: PathSegmentWithGenericArgsPtr) -> Self {
2072        ptr.untyped()
2073    }
2074}
2075#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
2076pub struct PathSegmentWithGenericArgsGreen(pub GreenId);
2077impl TypedSyntaxNode for PathSegmentWithGenericArgs {
2078    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PathSegmentWithGenericArgs);
2079    type StablePtr = PathSegmentWithGenericArgsPtr;
2080    type Green = PathSegmentWithGenericArgsGreen;
2081    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
2082        PathSegmentWithGenericArgsGreen(
2083            Arc::new(GreenNode {
2084                kind: SyntaxKind::PathSegmentWithGenericArgs,
2085                details: GreenNodeDetails::Node {
2086                    children: vec![
2087                        TerminalIdentifier::missing(db).0,
2088                        OptionTerminalColonColon::missing(db).0,
2089                        GenericArgs::missing(db).0,
2090                    ],
2091                    width: TextWidth::default(),
2092                },
2093            })
2094            .intern(db),
2095        )
2096    }
2097    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
2098        let kind = node.kind(db);
2099        assert_eq!(
2100            kind,
2101            SyntaxKind::PathSegmentWithGenericArgs,
2102            "Unexpected SyntaxKind {:?}. Expected {:?}.",
2103            kind,
2104            SyntaxKind::PathSegmentWithGenericArgs
2105        );
2106        let children = db.get_children(node.clone());
2107        Self { node, children }
2108    }
2109    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
2110        let kind = node.kind(db);
2111        if kind == SyntaxKind::PathSegmentWithGenericArgs {
2112            Some(Self::from_syntax_node(db, node))
2113        } else {
2114            None
2115        }
2116    }
2117    fn as_syntax_node(&self) -> SyntaxNode {
2118        self.node.clone()
2119    }
2120    fn stable_ptr(&self) -> Self::StablePtr {
2121        PathSegmentWithGenericArgsPtr(self.node.0.stable_ptr)
2122    }
2123}
2124impl From<&PathSegmentWithGenericArgs> for SyntaxStablePtrId {
2125    fn from(node: &PathSegmentWithGenericArgs) -> Self {
2126        node.stable_ptr().untyped()
2127    }
2128}
2129#[derive(Clone, Debug, Eq, Hash, PartialEq)]
2130pub struct ExprPath(ElementList<PathSegment, 2>);
2131impl Deref for ExprPath {
2132    type Target = ElementList<PathSegment, 2>;
2133    fn deref(&self) -> &Self::Target {
2134        &self.0
2135    }
2136}
2137impl ExprPath {
2138    pub fn new_green(
2139        db: &dyn SyntaxGroup,
2140        children: Vec<ExprPathElementOrSeparatorGreen>,
2141    ) -> ExprPathGreen {
2142        let width = children.iter().map(|id| id.id().lookup_intern(db).width()).sum();
2143        ExprPathGreen(
2144            Arc::new(GreenNode {
2145                kind: SyntaxKind::ExprPath,
2146                details: GreenNodeDetails::Node {
2147                    children: children.iter().map(|x| x.id()).collect(),
2148                    width,
2149                },
2150            })
2151            .intern(db),
2152        )
2153    }
2154}
2155#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
2156pub struct ExprPathPtr(pub SyntaxStablePtrId);
2157impl TypedStablePtr for ExprPathPtr {
2158    type SyntaxNode = ExprPath;
2159    fn untyped(&self) -> SyntaxStablePtrId {
2160        self.0
2161    }
2162    fn lookup(&self, db: &dyn SyntaxGroup) -> ExprPath {
2163        ExprPath::from_syntax_node(db, self.0.lookup(db))
2164    }
2165}
2166impl From<ExprPathPtr> for SyntaxStablePtrId {
2167    fn from(ptr: ExprPathPtr) -> Self {
2168        ptr.untyped()
2169    }
2170}
2171#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
2172pub enum ExprPathElementOrSeparatorGreen {
2173    Separator(TerminalColonColonGreen),
2174    Element(PathSegmentGreen),
2175}
2176impl From<TerminalColonColonGreen> for ExprPathElementOrSeparatorGreen {
2177    fn from(value: TerminalColonColonGreen) -> Self {
2178        ExprPathElementOrSeparatorGreen::Separator(value)
2179    }
2180}
2181impl From<PathSegmentGreen> for ExprPathElementOrSeparatorGreen {
2182    fn from(value: PathSegmentGreen) -> Self {
2183        ExprPathElementOrSeparatorGreen::Element(value)
2184    }
2185}
2186impl ExprPathElementOrSeparatorGreen {
2187    fn id(&self) -> GreenId {
2188        match self {
2189            ExprPathElementOrSeparatorGreen::Separator(green) => green.0,
2190            ExprPathElementOrSeparatorGreen::Element(green) => green.0,
2191        }
2192    }
2193}
2194#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
2195pub struct ExprPathGreen(pub GreenId);
2196impl TypedSyntaxNode for ExprPath {
2197    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprPath);
2198    type StablePtr = ExprPathPtr;
2199    type Green = ExprPathGreen;
2200    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
2201        ExprPathGreen(
2202            Arc::new(GreenNode {
2203                kind: SyntaxKind::ExprPath,
2204                details: GreenNodeDetails::Node { children: vec![], width: TextWidth::default() },
2205            })
2206            .intern(db),
2207        )
2208    }
2209    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
2210        Self(ElementList::new(node))
2211    }
2212    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
2213        if node.kind(db) == SyntaxKind::ExprPath {
2214            Some(Self(ElementList::new(node)))
2215        } else {
2216            None
2217        }
2218    }
2219    fn as_syntax_node(&self) -> SyntaxNode {
2220        self.node.clone()
2221    }
2222    fn stable_ptr(&self) -> Self::StablePtr {
2223        ExprPathPtr(self.node.0.stable_ptr)
2224    }
2225}
2226impl From<&ExprPath> for SyntaxStablePtrId {
2227    fn from(node: &ExprPath) -> Self {
2228        node.stable_ptr().untyped()
2229    }
2230}
2231#[derive(Clone, Debug, Eq, Hash, PartialEq)]
2232pub struct ExprParenthesized {
2233    node: SyntaxNode,
2234    children: Arc<[SyntaxNode]>,
2235}
2236impl ExprParenthesized {
2237    pub const INDEX_LPAREN: usize = 0;
2238    pub const INDEX_EXPR: usize = 1;
2239    pub const INDEX_RPAREN: usize = 2;
2240    pub fn new_green(
2241        db: &dyn SyntaxGroup,
2242        lparen: TerminalLParenGreen,
2243        expr: ExprGreen,
2244        rparen: TerminalRParenGreen,
2245    ) -> ExprParenthesizedGreen {
2246        let children: Vec<GreenId> = vec![lparen.0, expr.0, rparen.0];
2247        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
2248        ExprParenthesizedGreen(
2249            Arc::new(GreenNode {
2250                kind: SyntaxKind::ExprParenthesized,
2251                details: GreenNodeDetails::Node { children, width },
2252            })
2253            .intern(db),
2254        )
2255    }
2256}
2257impl ExprParenthesized {
2258    pub fn lparen(&self, db: &dyn SyntaxGroup) -> TerminalLParen {
2259        TerminalLParen::from_syntax_node(db, self.children[0].clone())
2260    }
2261    pub fn expr(&self, db: &dyn SyntaxGroup) -> Expr {
2262        Expr::from_syntax_node(db, self.children[1].clone())
2263    }
2264    pub fn rparen(&self, db: &dyn SyntaxGroup) -> TerminalRParen {
2265        TerminalRParen::from_syntax_node(db, self.children[2].clone())
2266    }
2267}
2268#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
2269pub struct ExprParenthesizedPtr(pub SyntaxStablePtrId);
2270impl ExprParenthesizedPtr {}
2271impl TypedStablePtr for ExprParenthesizedPtr {
2272    type SyntaxNode = ExprParenthesized;
2273    fn untyped(&self) -> SyntaxStablePtrId {
2274        self.0
2275    }
2276    fn lookup(&self, db: &dyn SyntaxGroup) -> ExprParenthesized {
2277        ExprParenthesized::from_syntax_node(db, self.0.lookup(db))
2278    }
2279}
2280impl From<ExprParenthesizedPtr> for SyntaxStablePtrId {
2281    fn from(ptr: ExprParenthesizedPtr) -> Self {
2282        ptr.untyped()
2283    }
2284}
2285#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
2286pub struct ExprParenthesizedGreen(pub GreenId);
2287impl TypedSyntaxNode for ExprParenthesized {
2288    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprParenthesized);
2289    type StablePtr = ExprParenthesizedPtr;
2290    type Green = ExprParenthesizedGreen;
2291    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
2292        ExprParenthesizedGreen(
2293            Arc::new(GreenNode {
2294                kind: SyntaxKind::ExprParenthesized,
2295                details: GreenNodeDetails::Node {
2296                    children: vec![
2297                        TerminalLParen::missing(db).0,
2298                        Expr::missing(db).0,
2299                        TerminalRParen::missing(db).0,
2300                    ],
2301                    width: TextWidth::default(),
2302                },
2303            })
2304            .intern(db),
2305        )
2306    }
2307    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
2308        let kind = node.kind(db);
2309        assert_eq!(
2310            kind,
2311            SyntaxKind::ExprParenthesized,
2312            "Unexpected SyntaxKind {:?}. Expected {:?}.",
2313            kind,
2314            SyntaxKind::ExprParenthesized
2315        );
2316        let children = db.get_children(node.clone());
2317        Self { node, children }
2318    }
2319    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
2320        let kind = node.kind(db);
2321        if kind == SyntaxKind::ExprParenthesized {
2322            Some(Self::from_syntax_node(db, node))
2323        } else {
2324            None
2325        }
2326    }
2327    fn as_syntax_node(&self) -> SyntaxNode {
2328        self.node.clone()
2329    }
2330    fn stable_ptr(&self) -> Self::StablePtr {
2331        ExprParenthesizedPtr(self.node.0.stable_ptr)
2332    }
2333}
2334impl From<&ExprParenthesized> for SyntaxStablePtrId {
2335    fn from(node: &ExprParenthesized) -> Self {
2336        node.stable_ptr().untyped()
2337    }
2338}
2339#[derive(Clone, Debug, Eq, Hash, PartialEq)]
2340pub struct ExprUnary {
2341    node: SyntaxNode,
2342    children: Arc<[SyntaxNode]>,
2343}
2344impl ExprUnary {
2345    pub const INDEX_OP: usize = 0;
2346    pub const INDEX_EXPR: usize = 1;
2347    pub fn new_green(
2348        db: &dyn SyntaxGroup,
2349        op: UnaryOperatorGreen,
2350        expr: ExprGreen,
2351    ) -> ExprUnaryGreen {
2352        let children: Vec<GreenId> = vec![op.0, expr.0];
2353        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
2354        ExprUnaryGreen(
2355            Arc::new(GreenNode {
2356                kind: SyntaxKind::ExprUnary,
2357                details: GreenNodeDetails::Node { children, width },
2358            })
2359            .intern(db),
2360        )
2361    }
2362}
2363impl ExprUnary {
2364    pub fn op(&self, db: &dyn SyntaxGroup) -> UnaryOperator {
2365        UnaryOperator::from_syntax_node(db, self.children[0].clone())
2366    }
2367    pub fn expr(&self, db: &dyn SyntaxGroup) -> Expr {
2368        Expr::from_syntax_node(db, self.children[1].clone())
2369    }
2370}
2371#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
2372pub struct ExprUnaryPtr(pub SyntaxStablePtrId);
2373impl ExprUnaryPtr {}
2374impl TypedStablePtr for ExprUnaryPtr {
2375    type SyntaxNode = ExprUnary;
2376    fn untyped(&self) -> SyntaxStablePtrId {
2377        self.0
2378    }
2379    fn lookup(&self, db: &dyn SyntaxGroup) -> ExprUnary {
2380        ExprUnary::from_syntax_node(db, self.0.lookup(db))
2381    }
2382}
2383impl From<ExprUnaryPtr> for SyntaxStablePtrId {
2384    fn from(ptr: ExprUnaryPtr) -> Self {
2385        ptr.untyped()
2386    }
2387}
2388#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
2389pub struct ExprUnaryGreen(pub GreenId);
2390impl TypedSyntaxNode for ExprUnary {
2391    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprUnary);
2392    type StablePtr = ExprUnaryPtr;
2393    type Green = ExprUnaryGreen;
2394    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
2395        ExprUnaryGreen(
2396            Arc::new(GreenNode {
2397                kind: SyntaxKind::ExprUnary,
2398                details: GreenNodeDetails::Node {
2399                    children: vec![UnaryOperator::missing(db).0, Expr::missing(db).0],
2400                    width: TextWidth::default(),
2401                },
2402            })
2403            .intern(db),
2404        )
2405    }
2406    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
2407        let kind = node.kind(db);
2408        assert_eq!(
2409            kind,
2410            SyntaxKind::ExprUnary,
2411            "Unexpected SyntaxKind {:?}. Expected {:?}.",
2412            kind,
2413            SyntaxKind::ExprUnary
2414        );
2415        let children = db.get_children(node.clone());
2416        Self { node, children }
2417    }
2418    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
2419        let kind = node.kind(db);
2420        if kind == SyntaxKind::ExprUnary { Some(Self::from_syntax_node(db, node)) } else { None }
2421    }
2422    fn as_syntax_node(&self) -> SyntaxNode {
2423        self.node.clone()
2424    }
2425    fn stable_ptr(&self) -> Self::StablePtr {
2426        ExprUnaryPtr(self.node.0.stable_ptr)
2427    }
2428}
2429impl From<&ExprUnary> for SyntaxStablePtrId {
2430    fn from(node: &ExprUnary) -> Self {
2431        node.stable_ptr().untyped()
2432    }
2433}
2434#[derive(Clone, Debug, Eq, Hash, PartialEq)]
2435pub enum UnaryOperator {
2436    Not(TerminalNot),
2437    BitNot(TerminalBitNot),
2438    Minus(TerminalMinus),
2439    At(TerminalAt),
2440    Desnap(TerminalMul),
2441}
2442#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
2443pub struct UnaryOperatorPtr(pub SyntaxStablePtrId);
2444impl TypedStablePtr for UnaryOperatorPtr {
2445    type SyntaxNode = UnaryOperator;
2446    fn untyped(&self) -> SyntaxStablePtrId {
2447        self.0
2448    }
2449    fn lookup(&self, db: &dyn SyntaxGroup) -> UnaryOperator {
2450        UnaryOperator::from_syntax_node(db, self.0.lookup(db))
2451    }
2452}
2453impl From<UnaryOperatorPtr> for SyntaxStablePtrId {
2454    fn from(ptr: UnaryOperatorPtr) -> Self {
2455        ptr.untyped()
2456    }
2457}
2458impl From<TerminalNotPtr> for UnaryOperatorPtr {
2459    fn from(value: TerminalNotPtr) -> Self {
2460        Self(value.0)
2461    }
2462}
2463impl From<TerminalBitNotPtr> for UnaryOperatorPtr {
2464    fn from(value: TerminalBitNotPtr) -> Self {
2465        Self(value.0)
2466    }
2467}
2468impl From<TerminalMinusPtr> for UnaryOperatorPtr {
2469    fn from(value: TerminalMinusPtr) -> Self {
2470        Self(value.0)
2471    }
2472}
2473impl From<TerminalAtPtr> for UnaryOperatorPtr {
2474    fn from(value: TerminalAtPtr) -> Self {
2475        Self(value.0)
2476    }
2477}
2478impl From<TerminalMulPtr> for UnaryOperatorPtr {
2479    fn from(value: TerminalMulPtr) -> Self {
2480        Self(value.0)
2481    }
2482}
2483impl From<TerminalNotGreen> for UnaryOperatorGreen {
2484    fn from(value: TerminalNotGreen) -> Self {
2485        Self(value.0)
2486    }
2487}
2488impl From<TerminalBitNotGreen> for UnaryOperatorGreen {
2489    fn from(value: TerminalBitNotGreen) -> Self {
2490        Self(value.0)
2491    }
2492}
2493impl From<TerminalMinusGreen> for UnaryOperatorGreen {
2494    fn from(value: TerminalMinusGreen) -> Self {
2495        Self(value.0)
2496    }
2497}
2498impl From<TerminalAtGreen> for UnaryOperatorGreen {
2499    fn from(value: TerminalAtGreen) -> Self {
2500        Self(value.0)
2501    }
2502}
2503impl From<TerminalMulGreen> for UnaryOperatorGreen {
2504    fn from(value: TerminalMulGreen) -> Self {
2505        Self(value.0)
2506    }
2507}
2508#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
2509pub struct UnaryOperatorGreen(pub GreenId);
2510impl TypedSyntaxNode for UnaryOperator {
2511    const OPTIONAL_KIND: Option<SyntaxKind> = None;
2512    type StablePtr = UnaryOperatorPtr;
2513    type Green = UnaryOperatorGreen;
2514    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
2515        panic!("No missing variant.");
2516    }
2517    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
2518        let kind = node.kind(db);
2519        match kind {
2520            SyntaxKind::TerminalNot => UnaryOperator::Not(TerminalNot::from_syntax_node(db, node)),
2521            SyntaxKind::TerminalBitNot => {
2522                UnaryOperator::BitNot(TerminalBitNot::from_syntax_node(db, node))
2523            }
2524            SyntaxKind::TerminalMinus => {
2525                UnaryOperator::Minus(TerminalMinus::from_syntax_node(db, node))
2526            }
2527            SyntaxKind::TerminalAt => UnaryOperator::At(TerminalAt::from_syntax_node(db, node)),
2528            SyntaxKind::TerminalMul => {
2529                UnaryOperator::Desnap(TerminalMul::from_syntax_node(db, node))
2530            }
2531            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "UnaryOperator"),
2532        }
2533    }
2534    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
2535        let kind = node.kind(db);
2536        match kind {
2537            SyntaxKind::TerminalNot => {
2538                Some(UnaryOperator::Not(TerminalNot::from_syntax_node(db, node)))
2539            }
2540            SyntaxKind::TerminalBitNot => {
2541                Some(UnaryOperator::BitNot(TerminalBitNot::from_syntax_node(db, node)))
2542            }
2543            SyntaxKind::TerminalMinus => {
2544                Some(UnaryOperator::Minus(TerminalMinus::from_syntax_node(db, node)))
2545            }
2546            SyntaxKind::TerminalAt => {
2547                Some(UnaryOperator::At(TerminalAt::from_syntax_node(db, node)))
2548            }
2549            SyntaxKind::TerminalMul => {
2550                Some(UnaryOperator::Desnap(TerminalMul::from_syntax_node(db, node)))
2551            }
2552            _ => None,
2553        }
2554    }
2555    fn as_syntax_node(&self) -> SyntaxNode {
2556        match self {
2557            UnaryOperator::Not(x) => x.as_syntax_node(),
2558            UnaryOperator::BitNot(x) => x.as_syntax_node(),
2559            UnaryOperator::Minus(x) => x.as_syntax_node(),
2560            UnaryOperator::At(x) => x.as_syntax_node(),
2561            UnaryOperator::Desnap(x) => x.as_syntax_node(),
2562        }
2563    }
2564    fn stable_ptr(&self) -> Self::StablePtr {
2565        UnaryOperatorPtr(self.as_syntax_node().0.stable_ptr)
2566    }
2567}
2568impl From<&UnaryOperator> for SyntaxStablePtrId {
2569    fn from(node: &UnaryOperator) -> Self {
2570        node.stable_ptr().untyped()
2571    }
2572}
2573impl UnaryOperator {
2574    /// Checks if a kind of a variant of [UnaryOperator].
2575    pub fn is_variant(kind: SyntaxKind) -> bool {
2576        matches!(
2577            kind,
2578            SyntaxKind::TerminalNot
2579                | SyntaxKind::TerminalBitNot
2580                | SyntaxKind::TerminalMinus
2581                | SyntaxKind::TerminalAt
2582                | SyntaxKind::TerminalMul
2583        )
2584    }
2585}
2586#[derive(Clone, Debug, Eq, Hash, PartialEq)]
2587pub struct ExprBinary {
2588    node: SyntaxNode,
2589    children: Arc<[SyntaxNode]>,
2590}
2591impl ExprBinary {
2592    pub const INDEX_LHS: usize = 0;
2593    pub const INDEX_OP: usize = 1;
2594    pub const INDEX_RHS: usize = 2;
2595    pub fn new_green(
2596        db: &dyn SyntaxGroup,
2597        lhs: ExprGreen,
2598        op: BinaryOperatorGreen,
2599        rhs: ExprGreen,
2600    ) -> ExprBinaryGreen {
2601        let children: Vec<GreenId> = vec![lhs.0, op.0, rhs.0];
2602        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
2603        ExprBinaryGreen(
2604            Arc::new(GreenNode {
2605                kind: SyntaxKind::ExprBinary,
2606                details: GreenNodeDetails::Node { children, width },
2607            })
2608            .intern(db),
2609        )
2610    }
2611}
2612impl ExprBinary {
2613    pub fn lhs(&self, db: &dyn SyntaxGroup) -> Expr {
2614        Expr::from_syntax_node(db, self.children[0].clone())
2615    }
2616    pub fn op(&self, db: &dyn SyntaxGroup) -> BinaryOperator {
2617        BinaryOperator::from_syntax_node(db, self.children[1].clone())
2618    }
2619    pub fn rhs(&self, db: &dyn SyntaxGroup) -> Expr {
2620        Expr::from_syntax_node(db, self.children[2].clone())
2621    }
2622}
2623#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
2624pub struct ExprBinaryPtr(pub SyntaxStablePtrId);
2625impl ExprBinaryPtr {}
2626impl TypedStablePtr for ExprBinaryPtr {
2627    type SyntaxNode = ExprBinary;
2628    fn untyped(&self) -> SyntaxStablePtrId {
2629        self.0
2630    }
2631    fn lookup(&self, db: &dyn SyntaxGroup) -> ExprBinary {
2632        ExprBinary::from_syntax_node(db, self.0.lookup(db))
2633    }
2634}
2635impl From<ExprBinaryPtr> for SyntaxStablePtrId {
2636    fn from(ptr: ExprBinaryPtr) -> Self {
2637        ptr.untyped()
2638    }
2639}
2640#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
2641pub struct ExprBinaryGreen(pub GreenId);
2642impl TypedSyntaxNode for ExprBinary {
2643    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprBinary);
2644    type StablePtr = ExprBinaryPtr;
2645    type Green = ExprBinaryGreen;
2646    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
2647        ExprBinaryGreen(
2648            Arc::new(GreenNode {
2649                kind: SyntaxKind::ExprBinary,
2650                details: GreenNodeDetails::Node {
2651                    children: vec![
2652                        Expr::missing(db).0,
2653                        BinaryOperator::missing(db).0,
2654                        Expr::missing(db).0,
2655                    ],
2656                    width: TextWidth::default(),
2657                },
2658            })
2659            .intern(db),
2660        )
2661    }
2662    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
2663        let kind = node.kind(db);
2664        assert_eq!(
2665            kind,
2666            SyntaxKind::ExprBinary,
2667            "Unexpected SyntaxKind {:?}. Expected {:?}.",
2668            kind,
2669            SyntaxKind::ExprBinary
2670        );
2671        let children = db.get_children(node.clone());
2672        Self { node, children }
2673    }
2674    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
2675        let kind = node.kind(db);
2676        if kind == SyntaxKind::ExprBinary { Some(Self::from_syntax_node(db, node)) } else { None }
2677    }
2678    fn as_syntax_node(&self) -> SyntaxNode {
2679        self.node.clone()
2680    }
2681    fn stable_ptr(&self) -> Self::StablePtr {
2682        ExprBinaryPtr(self.node.0.stable_ptr)
2683    }
2684}
2685impl From<&ExprBinary> for SyntaxStablePtrId {
2686    fn from(node: &ExprBinary) -> Self {
2687        node.stable_ptr().untyped()
2688    }
2689}
2690#[derive(Clone, Debug, Eq, Hash, PartialEq)]
2691pub enum BinaryOperator {
2692    Dot(TerminalDot),
2693    Not(TerminalNot),
2694    Mul(TerminalMul),
2695    MulEq(TerminalMulEq),
2696    Div(TerminalDiv),
2697    DivEq(TerminalDivEq),
2698    Mod(TerminalMod),
2699    ModEq(TerminalModEq),
2700    Plus(TerminalPlus),
2701    PlusEq(TerminalPlusEq),
2702    Minus(TerminalMinus),
2703    MinusEq(TerminalMinusEq),
2704    EqEq(TerminalEqEq),
2705    Neq(TerminalNeq),
2706    Eq(TerminalEq),
2707    And(TerminalAnd),
2708    AndAnd(TerminalAndAnd),
2709    Or(TerminalOr),
2710    OrOr(TerminalOrOr),
2711    Xor(TerminalXor),
2712    LE(TerminalLE),
2713    GE(TerminalGE),
2714    LT(TerminalLT),
2715    GT(TerminalGT),
2716    DotDot(TerminalDotDot),
2717    DotDotEq(TerminalDotDotEq),
2718}
2719#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
2720pub struct BinaryOperatorPtr(pub SyntaxStablePtrId);
2721impl TypedStablePtr for BinaryOperatorPtr {
2722    type SyntaxNode = BinaryOperator;
2723    fn untyped(&self) -> SyntaxStablePtrId {
2724        self.0
2725    }
2726    fn lookup(&self, db: &dyn SyntaxGroup) -> BinaryOperator {
2727        BinaryOperator::from_syntax_node(db, self.0.lookup(db))
2728    }
2729}
2730impl From<BinaryOperatorPtr> for SyntaxStablePtrId {
2731    fn from(ptr: BinaryOperatorPtr) -> Self {
2732        ptr.untyped()
2733    }
2734}
2735impl From<TerminalDotPtr> for BinaryOperatorPtr {
2736    fn from(value: TerminalDotPtr) -> Self {
2737        Self(value.0)
2738    }
2739}
2740impl From<TerminalNotPtr> for BinaryOperatorPtr {
2741    fn from(value: TerminalNotPtr) -> Self {
2742        Self(value.0)
2743    }
2744}
2745impl From<TerminalMulPtr> for BinaryOperatorPtr {
2746    fn from(value: TerminalMulPtr) -> Self {
2747        Self(value.0)
2748    }
2749}
2750impl From<TerminalMulEqPtr> for BinaryOperatorPtr {
2751    fn from(value: TerminalMulEqPtr) -> Self {
2752        Self(value.0)
2753    }
2754}
2755impl From<TerminalDivPtr> for BinaryOperatorPtr {
2756    fn from(value: TerminalDivPtr) -> Self {
2757        Self(value.0)
2758    }
2759}
2760impl From<TerminalDivEqPtr> for BinaryOperatorPtr {
2761    fn from(value: TerminalDivEqPtr) -> Self {
2762        Self(value.0)
2763    }
2764}
2765impl From<TerminalModPtr> for BinaryOperatorPtr {
2766    fn from(value: TerminalModPtr) -> Self {
2767        Self(value.0)
2768    }
2769}
2770impl From<TerminalModEqPtr> for BinaryOperatorPtr {
2771    fn from(value: TerminalModEqPtr) -> Self {
2772        Self(value.0)
2773    }
2774}
2775impl From<TerminalPlusPtr> for BinaryOperatorPtr {
2776    fn from(value: TerminalPlusPtr) -> Self {
2777        Self(value.0)
2778    }
2779}
2780impl From<TerminalPlusEqPtr> for BinaryOperatorPtr {
2781    fn from(value: TerminalPlusEqPtr) -> Self {
2782        Self(value.0)
2783    }
2784}
2785impl From<TerminalMinusPtr> for BinaryOperatorPtr {
2786    fn from(value: TerminalMinusPtr) -> Self {
2787        Self(value.0)
2788    }
2789}
2790impl From<TerminalMinusEqPtr> for BinaryOperatorPtr {
2791    fn from(value: TerminalMinusEqPtr) -> Self {
2792        Self(value.0)
2793    }
2794}
2795impl From<TerminalEqEqPtr> for BinaryOperatorPtr {
2796    fn from(value: TerminalEqEqPtr) -> Self {
2797        Self(value.0)
2798    }
2799}
2800impl From<TerminalNeqPtr> for BinaryOperatorPtr {
2801    fn from(value: TerminalNeqPtr) -> Self {
2802        Self(value.0)
2803    }
2804}
2805impl From<TerminalEqPtr> for BinaryOperatorPtr {
2806    fn from(value: TerminalEqPtr) -> Self {
2807        Self(value.0)
2808    }
2809}
2810impl From<TerminalAndPtr> for BinaryOperatorPtr {
2811    fn from(value: TerminalAndPtr) -> Self {
2812        Self(value.0)
2813    }
2814}
2815impl From<TerminalAndAndPtr> for BinaryOperatorPtr {
2816    fn from(value: TerminalAndAndPtr) -> Self {
2817        Self(value.0)
2818    }
2819}
2820impl From<TerminalOrPtr> for BinaryOperatorPtr {
2821    fn from(value: TerminalOrPtr) -> Self {
2822        Self(value.0)
2823    }
2824}
2825impl From<TerminalOrOrPtr> for BinaryOperatorPtr {
2826    fn from(value: TerminalOrOrPtr) -> Self {
2827        Self(value.0)
2828    }
2829}
2830impl From<TerminalXorPtr> for BinaryOperatorPtr {
2831    fn from(value: TerminalXorPtr) -> Self {
2832        Self(value.0)
2833    }
2834}
2835impl From<TerminalLEPtr> for BinaryOperatorPtr {
2836    fn from(value: TerminalLEPtr) -> Self {
2837        Self(value.0)
2838    }
2839}
2840impl From<TerminalGEPtr> for BinaryOperatorPtr {
2841    fn from(value: TerminalGEPtr) -> Self {
2842        Self(value.0)
2843    }
2844}
2845impl From<TerminalLTPtr> for BinaryOperatorPtr {
2846    fn from(value: TerminalLTPtr) -> Self {
2847        Self(value.0)
2848    }
2849}
2850impl From<TerminalGTPtr> for BinaryOperatorPtr {
2851    fn from(value: TerminalGTPtr) -> Self {
2852        Self(value.0)
2853    }
2854}
2855impl From<TerminalDotDotPtr> for BinaryOperatorPtr {
2856    fn from(value: TerminalDotDotPtr) -> Self {
2857        Self(value.0)
2858    }
2859}
2860impl From<TerminalDotDotEqPtr> for BinaryOperatorPtr {
2861    fn from(value: TerminalDotDotEqPtr) -> Self {
2862        Self(value.0)
2863    }
2864}
2865impl From<TerminalDotGreen> for BinaryOperatorGreen {
2866    fn from(value: TerminalDotGreen) -> Self {
2867        Self(value.0)
2868    }
2869}
2870impl From<TerminalNotGreen> for BinaryOperatorGreen {
2871    fn from(value: TerminalNotGreen) -> Self {
2872        Self(value.0)
2873    }
2874}
2875impl From<TerminalMulGreen> for BinaryOperatorGreen {
2876    fn from(value: TerminalMulGreen) -> Self {
2877        Self(value.0)
2878    }
2879}
2880impl From<TerminalMulEqGreen> for BinaryOperatorGreen {
2881    fn from(value: TerminalMulEqGreen) -> Self {
2882        Self(value.0)
2883    }
2884}
2885impl From<TerminalDivGreen> for BinaryOperatorGreen {
2886    fn from(value: TerminalDivGreen) -> Self {
2887        Self(value.0)
2888    }
2889}
2890impl From<TerminalDivEqGreen> for BinaryOperatorGreen {
2891    fn from(value: TerminalDivEqGreen) -> Self {
2892        Self(value.0)
2893    }
2894}
2895impl From<TerminalModGreen> for BinaryOperatorGreen {
2896    fn from(value: TerminalModGreen) -> Self {
2897        Self(value.0)
2898    }
2899}
2900impl From<TerminalModEqGreen> for BinaryOperatorGreen {
2901    fn from(value: TerminalModEqGreen) -> Self {
2902        Self(value.0)
2903    }
2904}
2905impl From<TerminalPlusGreen> for BinaryOperatorGreen {
2906    fn from(value: TerminalPlusGreen) -> Self {
2907        Self(value.0)
2908    }
2909}
2910impl From<TerminalPlusEqGreen> for BinaryOperatorGreen {
2911    fn from(value: TerminalPlusEqGreen) -> Self {
2912        Self(value.0)
2913    }
2914}
2915impl From<TerminalMinusGreen> for BinaryOperatorGreen {
2916    fn from(value: TerminalMinusGreen) -> Self {
2917        Self(value.0)
2918    }
2919}
2920impl From<TerminalMinusEqGreen> for BinaryOperatorGreen {
2921    fn from(value: TerminalMinusEqGreen) -> Self {
2922        Self(value.0)
2923    }
2924}
2925impl From<TerminalEqEqGreen> for BinaryOperatorGreen {
2926    fn from(value: TerminalEqEqGreen) -> Self {
2927        Self(value.0)
2928    }
2929}
2930impl From<TerminalNeqGreen> for BinaryOperatorGreen {
2931    fn from(value: TerminalNeqGreen) -> Self {
2932        Self(value.0)
2933    }
2934}
2935impl From<TerminalEqGreen> for BinaryOperatorGreen {
2936    fn from(value: TerminalEqGreen) -> Self {
2937        Self(value.0)
2938    }
2939}
2940impl From<TerminalAndGreen> for BinaryOperatorGreen {
2941    fn from(value: TerminalAndGreen) -> Self {
2942        Self(value.0)
2943    }
2944}
2945impl From<TerminalAndAndGreen> for BinaryOperatorGreen {
2946    fn from(value: TerminalAndAndGreen) -> Self {
2947        Self(value.0)
2948    }
2949}
2950impl From<TerminalOrGreen> for BinaryOperatorGreen {
2951    fn from(value: TerminalOrGreen) -> Self {
2952        Self(value.0)
2953    }
2954}
2955impl From<TerminalOrOrGreen> for BinaryOperatorGreen {
2956    fn from(value: TerminalOrOrGreen) -> Self {
2957        Self(value.0)
2958    }
2959}
2960impl From<TerminalXorGreen> for BinaryOperatorGreen {
2961    fn from(value: TerminalXorGreen) -> Self {
2962        Self(value.0)
2963    }
2964}
2965impl From<TerminalLEGreen> for BinaryOperatorGreen {
2966    fn from(value: TerminalLEGreen) -> Self {
2967        Self(value.0)
2968    }
2969}
2970impl From<TerminalGEGreen> for BinaryOperatorGreen {
2971    fn from(value: TerminalGEGreen) -> Self {
2972        Self(value.0)
2973    }
2974}
2975impl From<TerminalLTGreen> for BinaryOperatorGreen {
2976    fn from(value: TerminalLTGreen) -> Self {
2977        Self(value.0)
2978    }
2979}
2980impl From<TerminalGTGreen> for BinaryOperatorGreen {
2981    fn from(value: TerminalGTGreen) -> Self {
2982        Self(value.0)
2983    }
2984}
2985impl From<TerminalDotDotGreen> for BinaryOperatorGreen {
2986    fn from(value: TerminalDotDotGreen) -> Self {
2987        Self(value.0)
2988    }
2989}
2990impl From<TerminalDotDotEqGreen> for BinaryOperatorGreen {
2991    fn from(value: TerminalDotDotEqGreen) -> Self {
2992        Self(value.0)
2993    }
2994}
2995#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
2996pub struct BinaryOperatorGreen(pub GreenId);
2997impl TypedSyntaxNode for BinaryOperator {
2998    const OPTIONAL_KIND: Option<SyntaxKind> = None;
2999    type StablePtr = BinaryOperatorPtr;
3000    type Green = BinaryOperatorGreen;
3001    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
3002        panic!("No missing variant.");
3003    }
3004    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
3005        let kind = node.kind(db);
3006        match kind {
3007            SyntaxKind::TerminalDot => BinaryOperator::Dot(TerminalDot::from_syntax_node(db, node)),
3008            SyntaxKind::TerminalNot => BinaryOperator::Not(TerminalNot::from_syntax_node(db, node)),
3009            SyntaxKind::TerminalMul => BinaryOperator::Mul(TerminalMul::from_syntax_node(db, node)),
3010            SyntaxKind::TerminalMulEq => {
3011                BinaryOperator::MulEq(TerminalMulEq::from_syntax_node(db, node))
3012            }
3013            SyntaxKind::TerminalDiv => BinaryOperator::Div(TerminalDiv::from_syntax_node(db, node)),
3014            SyntaxKind::TerminalDivEq => {
3015                BinaryOperator::DivEq(TerminalDivEq::from_syntax_node(db, node))
3016            }
3017            SyntaxKind::TerminalMod => BinaryOperator::Mod(TerminalMod::from_syntax_node(db, node)),
3018            SyntaxKind::TerminalModEq => {
3019                BinaryOperator::ModEq(TerminalModEq::from_syntax_node(db, node))
3020            }
3021            SyntaxKind::TerminalPlus => {
3022                BinaryOperator::Plus(TerminalPlus::from_syntax_node(db, node))
3023            }
3024            SyntaxKind::TerminalPlusEq => {
3025                BinaryOperator::PlusEq(TerminalPlusEq::from_syntax_node(db, node))
3026            }
3027            SyntaxKind::TerminalMinus => {
3028                BinaryOperator::Minus(TerminalMinus::from_syntax_node(db, node))
3029            }
3030            SyntaxKind::TerminalMinusEq => {
3031                BinaryOperator::MinusEq(TerminalMinusEq::from_syntax_node(db, node))
3032            }
3033            SyntaxKind::TerminalEqEq => {
3034                BinaryOperator::EqEq(TerminalEqEq::from_syntax_node(db, node))
3035            }
3036            SyntaxKind::TerminalNeq => BinaryOperator::Neq(TerminalNeq::from_syntax_node(db, node)),
3037            SyntaxKind::TerminalEq => BinaryOperator::Eq(TerminalEq::from_syntax_node(db, node)),
3038            SyntaxKind::TerminalAnd => BinaryOperator::And(TerminalAnd::from_syntax_node(db, node)),
3039            SyntaxKind::TerminalAndAnd => {
3040                BinaryOperator::AndAnd(TerminalAndAnd::from_syntax_node(db, node))
3041            }
3042            SyntaxKind::TerminalOr => BinaryOperator::Or(TerminalOr::from_syntax_node(db, node)),
3043            SyntaxKind::TerminalOrOr => {
3044                BinaryOperator::OrOr(TerminalOrOr::from_syntax_node(db, node))
3045            }
3046            SyntaxKind::TerminalXor => BinaryOperator::Xor(TerminalXor::from_syntax_node(db, node)),
3047            SyntaxKind::TerminalLE => BinaryOperator::LE(TerminalLE::from_syntax_node(db, node)),
3048            SyntaxKind::TerminalGE => BinaryOperator::GE(TerminalGE::from_syntax_node(db, node)),
3049            SyntaxKind::TerminalLT => BinaryOperator::LT(TerminalLT::from_syntax_node(db, node)),
3050            SyntaxKind::TerminalGT => BinaryOperator::GT(TerminalGT::from_syntax_node(db, node)),
3051            SyntaxKind::TerminalDotDot => {
3052                BinaryOperator::DotDot(TerminalDotDot::from_syntax_node(db, node))
3053            }
3054            SyntaxKind::TerminalDotDotEq => {
3055                BinaryOperator::DotDotEq(TerminalDotDotEq::from_syntax_node(db, node))
3056            }
3057            _ => {
3058                panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "BinaryOperator")
3059            }
3060        }
3061    }
3062    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
3063        let kind = node.kind(db);
3064        match kind {
3065            SyntaxKind::TerminalDot => {
3066                Some(BinaryOperator::Dot(TerminalDot::from_syntax_node(db, node)))
3067            }
3068            SyntaxKind::TerminalNot => {
3069                Some(BinaryOperator::Not(TerminalNot::from_syntax_node(db, node)))
3070            }
3071            SyntaxKind::TerminalMul => {
3072                Some(BinaryOperator::Mul(TerminalMul::from_syntax_node(db, node)))
3073            }
3074            SyntaxKind::TerminalMulEq => {
3075                Some(BinaryOperator::MulEq(TerminalMulEq::from_syntax_node(db, node)))
3076            }
3077            SyntaxKind::TerminalDiv => {
3078                Some(BinaryOperator::Div(TerminalDiv::from_syntax_node(db, node)))
3079            }
3080            SyntaxKind::TerminalDivEq => {
3081                Some(BinaryOperator::DivEq(TerminalDivEq::from_syntax_node(db, node)))
3082            }
3083            SyntaxKind::TerminalMod => {
3084                Some(BinaryOperator::Mod(TerminalMod::from_syntax_node(db, node)))
3085            }
3086            SyntaxKind::TerminalModEq => {
3087                Some(BinaryOperator::ModEq(TerminalModEq::from_syntax_node(db, node)))
3088            }
3089            SyntaxKind::TerminalPlus => {
3090                Some(BinaryOperator::Plus(TerminalPlus::from_syntax_node(db, node)))
3091            }
3092            SyntaxKind::TerminalPlusEq => {
3093                Some(BinaryOperator::PlusEq(TerminalPlusEq::from_syntax_node(db, node)))
3094            }
3095            SyntaxKind::TerminalMinus => {
3096                Some(BinaryOperator::Minus(TerminalMinus::from_syntax_node(db, node)))
3097            }
3098            SyntaxKind::TerminalMinusEq => {
3099                Some(BinaryOperator::MinusEq(TerminalMinusEq::from_syntax_node(db, node)))
3100            }
3101            SyntaxKind::TerminalEqEq => {
3102                Some(BinaryOperator::EqEq(TerminalEqEq::from_syntax_node(db, node)))
3103            }
3104            SyntaxKind::TerminalNeq => {
3105                Some(BinaryOperator::Neq(TerminalNeq::from_syntax_node(db, node)))
3106            }
3107            SyntaxKind::TerminalEq => {
3108                Some(BinaryOperator::Eq(TerminalEq::from_syntax_node(db, node)))
3109            }
3110            SyntaxKind::TerminalAnd => {
3111                Some(BinaryOperator::And(TerminalAnd::from_syntax_node(db, node)))
3112            }
3113            SyntaxKind::TerminalAndAnd => {
3114                Some(BinaryOperator::AndAnd(TerminalAndAnd::from_syntax_node(db, node)))
3115            }
3116            SyntaxKind::TerminalOr => {
3117                Some(BinaryOperator::Or(TerminalOr::from_syntax_node(db, node)))
3118            }
3119            SyntaxKind::TerminalOrOr => {
3120                Some(BinaryOperator::OrOr(TerminalOrOr::from_syntax_node(db, node)))
3121            }
3122            SyntaxKind::TerminalXor => {
3123                Some(BinaryOperator::Xor(TerminalXor::from_syntax_node(db, node)))
3124            }
3125            SyntaxKind::TerminalLE => {
3126                Some(BinaryOperator::LE(TerminalLE::from_syntax_node(db, node)))
3127            }
3128            SyntaxKind::TerminalGE => {
3129                Some(BinaryOperator::GE(TerminalGE::from_syntax_node(db, node)))
3130            }
3131            SyntaxKind::TerminalLT => {
3132                Some(BinaryOperator::LT(TerminalLT::from_syntax_node(db, node)))
3133            }
3134            SyntaxKind::TerminalGT => {
3135                Some(BinaryOperator::GT(TerminalGT::from_syntax_node(db, node)))
3136            }
3137            SyntaxKind::TerminalDotDot => {
3138                Some(BinaryOperator::DotDot(TerminalDotDot::from_syntax_node(db, node)))
3139            }
3140            SyntaxKind::TerminalDotDotEq => {
3141                Some(BinaryOperator::DotDotEq(TerminalDotDotEq::from_syntax_node(db, node)))
3142            }
3143            _ => None,
3144        }
3145    }
3146    fn as_syntax_node(&self) -> SyntaxNode {
3147        match self {
3148            BinaryOperator::Dot(x) => x.as_syntax_node(),
3149            BinaryOperator::Not(x) => x.as_syntax_node(),
3150            BinaryOperator::Mul(x) => x.as_syntax_node(),
3151            BinaryOperator::MulEq(x) => x.as_syntax_node(),
3152            BinaryOperator::Div(x) => x.as_syntax_node(),
3153            BinaryOperator::DivEq(x) => x.as_syntax_node(),
3154            BinaryOperator::Mod(x) => x.as_syntax_node(),
3155            BinaryOperator::ModEq(x) => x.as_syntax_node(),
3156            BinaryOperator::Plus(x) => x.as_syntax_node(),
3157            BinaryOperator::PlusEq(x) => x.as_syntax_node(),
3158            BinaryOperator::Minus(x) => x.as_syntax_node(),
3159            BinaryOperator::MinusEq(x) => x.as_syntax_node(),
3160            BinaryOperator::EqEq(x) => x.as_syntax_node(),
3161            BinaryOperator::Neq(x) => x.as_syntax_node(),
3162            BinaryOperator::Eq(x) => x.as_syntax_node(),
3163            BinaryOperator::And(x) => x.as_syntax_node(),
3164            BinaryOperator::AndAnd(x) => x.as_syntax_node(),
3165            BinaryOperator::Or(x) => x.as_syntax_node(),
3166            BinaryOperator::OrOr(x) => x.as_syntax_node(),
3167            BinaryOperator::Xor(x) => x.as_syntax_node(),
3168            BinaryOperator::LE(x) => x.as_syntax_node(),
3169            BinaryOperator::GE(x) => x.as_syntax_node(),
3170            BinaryOperator::LT(x) => x.as_syntax_node(),
3171            BinaryOperator::GT(x) => x.as_syntax_node(),
3172            BinaryOperator::DotDot(x) => x.as_syntax_node(),
3173            BinaryOperator::DotDotEq(x) => x.as_syntax_node(),
3174        }
3175    }
3176    fn stable_ptr(&self) -> Self::StablePtr {
3177        BinaryOperatorPtr(self.as_syntax_node().0.stable_ptr)
3178    }
3179}
3180impl From<&BinaryOperator> for SyntaxStablePtrId {
3181    fn from(node: &BinaryOperator) -> Self {
3182        node.stable_ptr().untyped()
3183    }
3184}
3185impl BinaryOperator {
3186    /// Checks if a kind of a variant of [BinaryOperator].
3187    pub fn is_variant(kind: SyntaxKind) -> bool {
3188        matches!(
3189            kind,
3190            SyntaxKind::TerminalDot
3191                | SyntaxKind::TerminalNot
3192                | SyntaxKind::TerminalMul
3193                | SyntaxKind::TerminalMulEq
3194                | SyntaxKind::TerminalDiv
3195                | SyntaxKind::TerminalDivEq
3196                | SyntaxKind::TerminalMod
3197                | SyntaxKind::TerminalModEq
3198                | SyntaxKind::TerminalPlus
3199                | SyntaxKind::TerminalPlusEq
3200                | SyntaxKind::TerminalMinus
3201                | SyntaxKind::TerminalMinusEq
3202                | SyntaxKind::TerminalEqEq
3203                | SyntaxKind::TerminalNeq
3204                | SyntaxKind::TerminalEq
3205                | SyntaxKind::TerminalAnd
3206                | SyntaxKind::TerminalAndAnd
3207                | SyntaxKind::TerminalOr
3208                | SyntaxKind::TerminalOrOr
3209                | SyntaxKind::TerminalXor
3210                | SyntaxKind::TerminalLE
3211                | SyntaxKind::TerminalGE
3212                | SyntaxKind::TerminalLT
3213                | SyntaxKind::TerminalGT
3214                | SyntaxKind::TerminalDotDot
3215                | SyntaxKind::TerminalDotDotEq
3216        )
3217    }
3218}
3219#[derive(Clone, Debug, Eq, Hash, PartialEq)]
3220pub struct ExprListParenthesized {
3221    node: SyntaxNode,
3222    children: Arc<[SyntaxNode]>,
3223}
3224impl ExprListParenthesized {
3225    pub const INDEX_LPAREN: usize = 0;
3226    pub const INDEX_EXPRESSIONS: usize = 1;
3227    pub const INDEX_RPAREN: usize = 2;
3228    pub fn new_green(
3229        db: &dyn SyntaxGroup,
3230        lparen: TerminalLParenGreen,
3231        expressions: ExprListGreen,
3232        rparen: TerminalRParenGreen,
3233    ) -> ExprListParenthesizedGreen {
3234        let children: Vec<GreenId> = vec![lparen.0, expressions.0, rparen.0];
3235        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
3236        ExprListParenthesizedGreen(
3237            Arc::new(GreenNode {
3238                kind: SyntaxKind::ExprListParenthesized,
3239                details: GreenNodeDetails::Node { children, width },
3240            })
3241            .intern(db),
3242        )
3243    }
3244}
3245impl ExprListParenthesized {
3246    pub fn lparen(&self, db: &dyn SyntaxGroup) -> TerminalLParen {
3247        TerminalLParen::from_syntax_node(db, self.children[0].clone())
3248    }
3249    pub fn expressions(&self, db: &dyn SyntaxGroup) -> ExprList {
3250        ExprList::from_syntax_node(db, self.children[1].clone())
3251    }
3252    pub fn rparen(&self, db: &dyn SyntaxGroup) -> TerminalRParen {
3253        TerminalRParen::from_syntax_node(db, self.children[2].clone())
3254    }
3255}
3256#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
3257pub struct ExprListParenthesizedPtr(pub SyntaxStablePtrId);
3258impl ExprListParenthesizedPtr {}
3259impl TypedStablePtr for ExprListParenthesizedPtr {
3260    type SyntaxNode = ExprListParenthesized;
3261    fn untyped(&self) -> SyntaxStablePtrId {
3262        self.0
3263    }
3264    fn lookup(&self, db: &dyn SyntaxGroup) -> ExprListParenthesized {
3265        ExprListParenthesized::from_syntax_node(db, self.0.lookup(db))
3266    }
3267}
3268impl From<ExprListParenthesizedPtr> for SyntaxStablePtrId {
3269    fn from(ptr: ExprListParenthesizedPtr) -> Self {
3270        ptr.untyped()
3271    }
3272}
3273#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
3274pub struct ExprListParenthesizedGreen(pub GreenId);
3275impl TypedSyntaxNode for ExprListParenthesized {
3276    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprListParenthesized);
3277    type StablePtr = ExprListParenthesizedPtr;
3278    type Green = ExprListParenthesizedGreen;
3279    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
3280        ExprListParenthesizedGreen(
3281            Arc::new(GreenNode {
3282                kind: SyntaxKind::ExprListParenthesized,
3283                details: GreenNodeDetails::Node {
3284                    children: vec![
3285                        TerminalLParen::missing(db).0,
3286                        ExprList::missing(db).0,
3287                        TerminalRParen::missing(db).0,
3288                    ],
3289                    width: TextWidth::default(),
3290                },
3291            })
3292            .intern(db),
3293        )
3294    }
3295    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
3296        let kind = node.kind(db);
3297        assert_eq!(
3298            kind,
3299            SyntaxKind::ExprListParenthesized,
3300            "Unexpected SyntaxKind {:?}. Expected {:?}.",
3301            kind,
3302            SyntaxKind::ExprListParenthesized
3303        );
3304        let children = db.get_children(node.clone());
3305        Self { node, children }
3306    }
3307    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
3308        let kind = node.kind(db);
3309        if kind == SyntaxKind::ExprListParenthesized {
3310            Some(Self::from_syntax_node(db, node))
3311        } else {
3312            None
3313        }
3314    }
3315    fn as_syntax_node(&self) -> SyntaxNode {
3316        self.node.clone()
3317    }
3318    fn stable_ptr(&self) -> Self::StablePtr {
3319        ExprListParenthesizedPtr(self.node.0.stable_ptr)
3320    }
3321}
3322impl From<&ExprListParenthesized> for SyntaxStablePtrId {
3323    fn from(node: &ExprListParenthesized) -> Self {
3324        node.stable_ptr().untyped()
3325    }
3326}
3327#[derive(Clone, Debug, Eq, Hash, PartialEq)]
3328pub struct ExprFunctionCall {
3329    node: SyntaxNode,
3330    children: Arc<[SyntaxNode]>,
3331}
3332impl ExprFunctionCall {
3333    pub const INDEX_PATH: usize = 0;
3334    pub const INDEX_ARGUMENTS: usize = 1;
3335    pub fn new_green(
3336        db: &dyn SyntaxGroup,
3337        path: ExprPathGreen,
3338        arguments: ArgListParenthesizedGreen,
3339    ) -> ExprFunctionCallGreen {
3340        let children: Vec<GreenId> = vec![path.0, arguments.0];
3341        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
3342        ExprFunctionCallGreen(
3343            Arc::new(GreenNode {
3344                kind: SyntaxKind::ExprFunctionCall,
3345                details: GreenNodeDetails::Node { children, width },
3346            })
3347            .intern(db),
3348        )
3349    }
3350}
3351impl ExprFunctionCall {
3352    pub fn path(&self, db: &dyn SyntaxGroup) -> ExprPath {
3353        ExprPath::from_syntax_node(db, self.children[0].clone())
3354    }
3355    pub fn arguments(&self, db: &dyn SyntaxGroup) -> ArgListParenthesized {
3356        ArgListParenthesized::from_syntax_node(db, self.children[1].clone())
3357    }
3358}
3359#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
3360pub struct ExprFunctionCallPtr(pub SyntaxStablePtrId);
3361impl ExprFunctionCallPtr {}
3362impl TypedStablePtr for ExprFunctionCallPtr {
3363    type SyntaxNode = ExprFunctionCall;
3364    fn untyped(&self) -> SyntaxStablePtrId {
3365        self.0
3366    }
3367    fn lookup(&self, db: &dyn SyntaxGroup) -> ExprFunctionCall {
3368        ExprFunctionCall::from_syntax_node(db, self.0.lookup(db))
3369    }
3370}
3371impl From<ExprFunctionCallPtr> for SyntaxStablePtrId {
3372    fn from(ptr: ExprFunctionCallPtr) -> Self {
3373        ptr.untyped()
3374    }
3375}
3376#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
3377pub struct ExprFunctionCallGreen(pub GreenId);
3378impl TypedSyntaxNode for ExprFunctionCall {
3379    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprFunctionCall);
3380    type StablePtr = ExprFunctionCallPtr;
3381    type Green = ExprFunctionCallGreen;
3382    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
3383        ExprFunctionCallGreen(
3384            Arc::new(GreenNode {
3385                kind: SyntaxKind::ExprFunctionCall,
3386                details: GreenNodeDetails::Node {
3387                    children: vec![ExprPath::missing(db).0, ArgListParenthesized::missing(db).0],
3388                    width: TextWidth::default(),
3389                },
3390            })
3391            .intern(db),
3392        )
3393    }
3394    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
3395        let kind = node.kind(db);
3396        assert_eq!(
3397            kind,
3398            SyntaxKind::ExprFunctionCall,
3399            "Unexpected SyntaxKind {:?}. Expected {:?}.",
3400            kind,
3401            SyntaxKind::ExprFunctionCall
3402        );
3403        let children = db.get_children(node.clone());
3404        Self { node, children }
3405    }
3406    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
3407        let kind = node.kind(db);
3408        if kind == SyntaxKind::ExprFunctionCall {
3409            Some(Self::from_syntax_node(db, node))
3410        } else {
3411            None
3412        }
3413    }
3414    fn as_syntax_node(&self) -> SyntaxNode {
3415        self.node.clone()
3416    }
3417    fn stable_ptr(&self) -> Self::StablePtr {
3418        ExprFunctionCallPtr(self.node.0.stable_ptr)
3419    }
3420}
3421impl From<&ExprFunctionCall> for SyntaxStablePtrId {
3422    fn from(node: &ExprFunctionCall) -> Self {
3423        node.stable_ptr().untyped()
3424    }
3425}
3426#[derive(Clone, Debug, Eq, Hash, PartialEq)]
3427pub struct ArgListParenthesized {
3428    node: SyntaxNode,
3429    children: Arc<[SyntaxNode]>,
3430}
3431impl ArgListParenthesized {
3432    pub const INDEX_LPAREN: usize = 0;
3433    pub const INDEX_ARGUMENTS: usize = 1;
3434    pub const INDEX_RPAREN: usize = 2;
3435    pub fn new_green(
3436        db: &dyn SyntaxGroup,
3437        lparen: TerminalLParenGreen,
3438        arguments: ArgListGreen,
3439        rparen: TerminalRParenGreen,
3440    ) -> ArgListParenthesizedGreen {
3441        let children: Vec<GreenId> = vec![lparen.0, arguments.0, rparen.0];
3442        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
3443        ArgListParenthesizedGreen(
3444            Arc::new(GreenNode {
3445                kind: SyntaxKind::ArgListParenthesized,
3446                details: GreenNodeDetails::Node { children, width },
3447            })
3448            .intern(db),
3449        )
3450    }
3451}
3452impl ArgListParenthesized {
3453    pub fn lparen(&self, db: &dyn SyntaxGroup) -> TerminalLParen {
3454        TerminalLParen::from_syntax_node(db, self.children[0].clone())
3455    }
3456    pub fn arguments(&self, db: &dyn SyntaxGroup) -> ArgList {
3457        ArgList::from_syntax_node(db, self.children[1].clone())
3458    }
3459    pub fn rparen(&self, db: &dyn SyntaxGroup) -> TerminalRParen {
3460        TerminalRParen::from_syntax_node(db, self.children[2].clone())
3461    }
3462}
3463#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
3464pub struct ArgListParenthesizedPtr(pub SyntaxStablePtrId);
3465impl ArgListParenthesizedPtr {}
3466impl TypedStablePtr for ArgListParenthesizedPtr {
3467    type SyntaxNode = ArgListParenthesized;
3468    fn untyped(&self) -> SyntaxStablePtrId {
3469        self.0
3470    }
3471    fn lookup(&self, db: &dyn SyntaxGroup) -> ArgListParenthesized {
3472        ArgListParenthesized::from_syntax_node(db, self.0.lookup(db))
3473    }
3474}
3475impl From<ArgListParenthesizedPtr> for SyntaxStablePtrId {
3476    fn from(ptr: ArgListParenthesizedPtr) -> Self {
3477        ptr.untyped()
3478    }
3479}
3480#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
3481pub struct ArgListParenthesizedGreen(pub GreenId);
3482impl TypedSyntaxNode for ArgListParenthesized {
3483    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ArgListParenthesized);
3484    type StablePtr = ArgListParenthesizedPtr;
3485    type Green = ArgListParenthesizedGreen;
3486    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
3487        ArgListParenthesizedGreen(
3488            Arc::new(GreenNode {
3489                kind: SyntaxKind::ArgListParenthesized,
3490                details: GreenNodeDetails::Node {
3491                    children: vec![
3492                        TerminalLParen::missing(db).0,
3493                        ArgList::missing(db).0,
3494                        TerminalRParen::missing(db).0,
3495                    ],
3496                    width: TextWidth::default(),
3497                },
3498            })
3499            .intern(db),
3500        )
3501    }
3502    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
3503        let kind = node.kind(db);
3504        assert_eq!(
3505            kind,
3506            SyntaxKind::ArgListParenthesized,
3507            "Unexpected SyntaxKind {:?}. Expected {:?}.",
3508            kind,
3509            SyntaxKind::ArgListParenthesized
3510        );
3511        let children = db.get_children(node.clone());
3512        Self { node, children }
3513    }
3514    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
3515        let kind = node.kind(db);
3516        if kind == SyntaxKind::ArgListParenthesized {
3517            Some(Self::from_syntax_node(db, node))
3518        } else {
3519            None
3520        }
3521    }
3522    fn as_syntax_node(&self) -> SyntaxNode {
3523        self.node.clone()
3524    }
3525    fn stable_ptr(&self) -> Self::StablePtr {
3526        ArgListParenthesizedPtr(self.node.0.stable_ptr)
3527    }
3528}
3529impl From<&ArgListParenthesized> for SyntaxStablePtrId {
3530    fn from(node: &ArgListParenthesized) -> Self {
3531        node.stable_ptr().untyped()
3532    }
3533}
3534#[derive(Clone, Debug, Eq, Hash, PartialEq)]
3535pub enum OptionArgListParenthesized {
3536    Empty(OptionArgListParenthesizedEmpty),
3537    ArgListParenthesized(ArgListParenthesized),
3538}
3539#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
3540pub struct OptionArgListParenthesizedPtr(pub SyntaxStablePtrId);
3541impl TypedStablePtr for OptionArgListParenthesizedPtr {
3542    type SyntaxNode = OptionArgListParenthesized;
3543    fn untyped(&self) -> SyntaxStablePtrId {
3544        self.0
3545    }
3546    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionArgListParenthesized {
3547        OptionArgListParenthesized::from_syntax_node(db, self.0.lookup(db))
3548    }
3549}
3550impl From<OptionArgListParenthesizedPtr> for SyntaxStablePtrId {
3551    fn from(ptr: OptionArgListParenthesizedPtr) -> Self {
3552        ptr.untyped()
3553    }
3554}
3555impl From<OptionArgListParenthesizedEmptyPtr> for OptionArgListParenthesizedPtr {
3556    fn from(value: OptionArgListParenthesizedEmptyPtr) -> Self {
3557        Self(value.0)
3558    }
3559}
3560impl From<ArgListParenthesizedPtr> for OptionArgListParenthesizedPtr {
3561    fn from(value: ArgListParenthesizedPtr) -> Self {
3562        Self(value.0)
3563    }
3564}
3565impl From<OptionArgListParenthesizedEmptyGreen> for OptionArgListParenthesizedGreen {
3566    fn from(value: OptionArgListParenthesizedEmptyGreen) -> Self {
3567        Self(value.0)
3568    }
3569}
3570impl From<ArgListParenthesizedGreen> for OptionArgListParenthesizedGreen {
3571    fn from(value: ArgListParenthesizedGreen) -> Self {
3572        Self(value.0)
3573    }
3574}
3575#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
3576pub struct OptionArgListParenthesizedGreen(pub GreenId);
3577impl TypedSyntaxNode for OptionArgListParenthesized {
3578    const OPTIONAL_KIND: Option<SyntaxKind> = None;
3579    type StablePtr = OptionArgListParenthesizedPtr;
3580    type Green = OptionArgListParenthesizedGreen;
3581    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
3582        panic!("No missing variant.");
3583    }
3584    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
3585        let kind = node.kind(db);
3586        match kind {
3587            SyntaxKind::OptionArgListParenthesizedEmpty => OptionArgListParenthesized::Empty(
3588                OptionArgListParenthesizedEmpty::from_syntax_node(db, node),
3589            ),
3590            SyntaxKind::ArgListParenthesized => OptionArgListParenthesized::ArgListParenthesized(
3591                ArgListParenthesized::from_syntax_node(db, node),
3592            ),
3593            _ => panic!(
3594                "Unexpected syntax kind {:?} when constructing {}.",
3595                kind, "OptionArgListParenthesized"
3596            ),
3597        }
3598    }
3599    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
3600        let kind = node.kind(db);
3601        match kind {
3602            SyntaxKind::OptionArgListParenthesizedEmpty => Some(OptionArgListParenthesized::Empty(
3603                OptionArgListParenthesizedEmpty::from_syntax_node(db, node),
3604            )),
3605            SyntaxKind::ArgListParenthesized => {
3606                Some(OptionArgListParenthesized::ArgListParenthesized(
3607                    ArgListParenthesized::from_syntax_node(db, node),
3608                ))
3609            }
3610            _ => None,
3611        }
3612    }
3613    fn as_syntax_node(&self) -> SyntaxNode {
3614        match self {
3615            OptionArgListParenthesized::Empty(x) => x.as_syntax_node(),
3616            OptionArgListParenthesized::ArgListParenthesized(x) => x.as_syntax_node(),
3617        }
3618    }
3619    fn stable_ptr(&self) -> Self::StablePtr {
3620        OptionArgListParenthesizedPtr(self.as_syntax_node().0.stable_ptr)
3621    }
3622}
3623impl From<&OptionArgListParenthesized> for SyntaxStablePtrId {
3624    fn from(node: &OptionArgListParenthesized) -> Self {
3625        node.stable_ptr().untyped()
3626    }
3627}
3628impl OptionArgListParenthesized {
3629    /// Checks if a kind of a variant of [OptionArgListParenthesized].
3630    pub fn is_variant(kind: SyntaxKind) -> bool {
3631        matches!(
3632            kind,
3633            SyntaxKind::OptionArgListParenthesizedEmpty | SyntaxKind::ArgListParenthesized
3634        )
3635    }
3636}
3637#[derive(Clone, Debug, Eq, Hash, PartialEq)]
3638pub struct OptionArgListParenthesizedEmpty {
3639    node: SyntaxNode,
3640    children: Arc<[SyntaxNode]>,
3641}
3642impl OptionArgListParenthesizedEmpty {
3643    pub fn new_green(db: &dyn SyntaxGroup) -> OptionArgListParenthesizedEmptyGreen {
3644        let children: Vec<GreenId> = vec![];
3645        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
3646        OptionArgListParenthesizedEmptyGreen(
3647            Arc::new(GreenNode {
3648                kind: SyntaxKind::OptionArgListParenthesizedEmpty,
3649                details: GreenNodeDetails::Node { children, width },
3650            })
3651            .intern(db),
3652        )
3653    }
3654}
3655impl OptionArgListParenthesizedEmpty {}
3656#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
3657pub struct OptionArgListParenthesizedEmptyPtr(pub SyntaxStablePtrId);
3658impl OptionArgListParenthesizedEmptyPtr {}
3659impl TypedStablePtr for OptionArgListParenthesizedEmptyPtr {
3660    type SyntaxNode = OptionArgListParenthesizedEmpty;
3661    fn untyped(&self) -> SyntaxStablePtrId {
3662        self.0
3663    }
3664    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionArgListParenthesizedEmpty {
3665        OptionArgListParenthesizedEmpty::from_syntax_node(db, self.0.lookup(db))
3666    }
3667}
3668impl From<OptionArgListParenthesizedEmptyPtr> for SyntaxStablePtrId {
3669    fn from(ptr: OptionArgListParenthesizedEmptyPtr) -> Self {
3670        ptr.untyped()
3671    }
3672}
3673#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
3674pub struct OptionArgListParenthesizedEmptyGreen(pub GreenId);
3675impl TypedSyntaxNode for OptionArgListParenthesizedEmpty {
3676    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionArgListParenthesizedEmpty);
3677    type StablePtr = OptionArgListParenthesizedEmptyPtr;
3678    type Green = OptionArgListParenthesizedEmptyGreen;
3679    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
3680        OptionArgListParenthesizedEmptyGreen(
3681            Arc::new(GreenNode {
3682                kind: SyntaxKind::OptionArgListParenthesizedEmpty,
3683                details: GreenNodeDetails::Node { children: vec![], width: TextWidth::default() },
3684            })
3685            .intern(db),
3686        )
3687    }
3688    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
3689        let kind = node.kind(db);
3690        assert_eq!(
3691            kind,
3692            SyntaxKind::OptionArgListParenthesizedEmpty,
3693            "Unexpected SyntaxKind {:?}. Expected {:?}.",
3694            kind,
3695            SyntaxKind::OptionArgListParenthesizedEmpty
3696        );
3697        let children = db.get_children(node.clone());
3698        Self { node, children }
3699    }
3700    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
3701        let kind = node.kind(db);
3702        if kind == SyntaxKind::OptionArgListParenthesizedEmpty {
3703            Some(Self::from_syntax_node(db, node))
3704        } else {
3705            None
3706        }
3707    }
3708    fn as_syntax_node(&self) -> SyntaxNode {
3709        self.node.clone()
3710    }
3711    fn stable_ptr(&self) -> Self::StablePtr {
3712        OptionArgListParenthesizedEmptyPtr(self.node.0.stable_ptr)
3713    }
3714}
3715impl From<&OptionArgListParenthesizedEmpty> for SyntaxStablePtrId {
3716    fn from(node: &OptionArgListParenthesizedEmpty) -> Self {
3717        node.stable_ptr().untyped()
3718    }
3719}
3720#[derive(Clone, Debug, Eq, Hash, PartialEq)]
3721pub struct ExprStructCtorCall {
3722    node: SyntaxNode,
3723    children: Arc<[SyntaxNode]>,
3724}
3725impl ExprStructCtorCall {
3726    pub const INDEX_PATH: usize = 0;
3727    pub const INDEX_ARGUMENTS: usize = 1;
3728    pub fn new_green(
3729        db: &dyn SyntaxGroup,
3730        path: ExprPathGreen,
3731        arguments: StructArgListBracedGreen,
3732    ) -> ExprStructCtorCallGreen {
3733        let children: Vec<GreenId> = vec![path.0, arguments.0];
3734        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
3735        ExprStructCtorCallGreen(
3736            Arc::new(GreenNode {
3737                kind: SyntaxKind::ExprStructCtorCall,
3738                details: GreenNodeDetails::Node { children, width },
3739            })
3740            .intern(db),
3741        )
3742    }
3743}
3744impl ExprStructCtorCall {
3745    pub fn path(&self, db: &dyn SyntaxGroup) -> ExprPath {
3746        ExprPath::from_syntax_node(db, self.children[0].clone())
3747    }
3748    pub fn arguments(&self, db: &dyn SyntaxGroup) -> StructArgListBraced {
3749        StructArgListBraced::from_syntax_node(db, self.children[1].clone())
3750    }
3751}
3752#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
3753pub struct ExprStructCtorCallPtr(pub SyntaxStablePtrId);
3754impl ExprStructCtorCallPtr {}
3755impl TypedStablePtr for ExprStructCtorCallPtr {
3756    type SyntaxNode = ExprStructCtorCall;
3757    fn untyped(&self) -> SyntaxStablePtrId {
3758        self.0
3759    }
3760    fn lookup(&self, db: &dyn SyntaxGroup) -> ExprStructCtorCall {
3761        ExprStructCtorCall::from_syntax_node(db, self.0.lookup(db))
3762    }
3763}
3764impl From<ExprStructCtorCallPtr> for SyntaxStablePtrId {
3765    fn from(ptr: ExprStructCtorCallPtr) -> Self {
3766        ptr.untyped()
3767    }
3768}
3769#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
3770pub struct ExprStructCtorCallGreen(pub GreenId);
3771impl TypedSyntaxNode for ExprStructCtorCall {
3772    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprStructCtorCall);
3773    type StablePtr = ExprStructCtorCallPtr;
3774    type Green = ExprStructCtorCallGreen;
3775    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
3776        ExprStructCtorCallGreen(
3777            Arc::new(GreenNode {
3778                kind: SyntaxKind::ExprStructCtorCall,
3779                details: GreenNodeDetails::Node {
3780                    children: vec![ExprPath::missing(db).0, StructArgListBraced::missing(db).0],
3781                    width: TextWidth::default(),
3782                },
3783            })
3784            .intern(db),
3785        )
3786    }
3787    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
3788        let kind = node.kind(db);
3789        assert_eq!(
3790            kind,
3791            SyntaxKind::ExprStructCtorCall,
3792            "Unexpected SyntaxKind {:?}. Expected {:?}.",
3793            kind,
3794            SyntaxKind::ExprStructCtorCall
3795        );
3796        let children = db.get_children(node.clone());
3797        Self { node, children }
3798    }
3799    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
3800        let kind = node.kind(db);
3801        if kind == SyntaxKind::ExprStructCtorCall {
3802            Some(Self::from_syntax_node(db, node))
3803        } else {
3804            None
3805        }
3806    }
3807    fn as_syntax_node(&self) -> SyntaxNode {
3808        self.node.clone()
3809    }
3810    fn stable_ptr(&self) -> Self::StablePtr {
3811        ExprStructCtorCallPtr(self.node.0.stable_ptr)
3812    }
3813}
3814impl From<&ExprStructCtorCall> for SyntaxStablePtrId {
3815    fn from(node: &ExprStructCtorCall) -> Self {
3816        node.stable_ptr().untyped()
3817    }
3818}
3819#[derive(Clone, Debug, Eq, Hash, PartialEq)]
3820pub struct StructArgListBraced {
3821    node: SyntaxNode,
3822    children: Arc<[SyntaxNode]>,
3823}
3824impl StructArgListBraced {
3825    pub const INDEX_LBRACE: usize = 0;
3826    pub const INDEX_ARGUMENTS: usize = 1;
3827    pub const INDEX_RBRACE: usize = 2;
3828    pub fn new_green(
3829        db: &dyn SyntaxGroup,
3830        lbrace: TerminalLBraceGreen,
3831        arguments: StructArgListGreen,
3832        rbrace: TerminalRBraceGreen,
3833    ) -> StructArgListBracedGreen {
3834        let children: Vec<GreenId> = vec![lbrace.0, arguments.0, rbrace.0];
3835        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
3836        StructArgListBracedGreen(
3837            Arc::new(GreenNode {
3838                kind: SyntaxKind::StructArgListBraced,
3839                details: GreenNodeDetails::Node { children, width },
3840            })
3841            .intern(db),
3842        )
3843    }
3844}
3845impl StructArgListBraced {
3846    pub fn lbrace(&self, db: &dyn SyntaxGroup) -> TerminalLBrace {
3847        TerminalLBrace::from_syntax_node(db, self.children[0].clone())
3848    }
3849    pub fn arguments(&self, db: &dyn SyntaxGroup) -> StructArgList {
3850        StructArgList::from_syntax_node(db, self.children[1].clone())
3851    }
3852    pub fn rbrace(&self, db: &dyn SyntaxGroup) -> TerminalRBrace {
3853        TerminalRBrace::from_syntax_node(db, self.children[2].clone())
3854    }
3855}
3856#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
3857pub struct StructArgListBracedPtr(pub SyntaxStablePtrId);
3858impl StructArgListBracedPtr {}
3859impl TypedStablePtr for StructArgListBracedPtr {
3860    type SyntaxNode = StructArgListBraced;
3861    fn untyped(&self) -> SyntaxStablePtrId {
3862        self.0
3863    }
3864    fn lookup(&self, db: &dyn SyntaxGroup) -> StructArgListBraced {
3865        StructArgListBraced::from_syntax_node(db, self.0.lookup(db))
3866    }
3867}
3868impl From<StructArgListBracedPtr> for SyntaxStablePtrId {
3869    fn from(ptr: StructArgListBracedPtr) -> Self {
3870        ptr.untyped()
3871    }
3872}
3873#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
3874pub struct StructArgListBracedGreen(pub GreenId);
3875impl TypedSyntaxNode for StructArgListBraced {
3876    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StructArgListBraced);
3877    type StablePtr = StructArgListBracedPtr;
3878    type Green = StructArgListBracedGreen;
3879    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
3880        StructArgListBracedGreen(
3881            Arc::new(GreenNode {
3882                kind: SyntaxKind::StructArgListBraced,
3883                details: GreenNodeDetails::Node {
3884                    children: vec![
3885                        TerminalLBrace::missing(db).0,
3886                        StructArgList::missing(db).0,
3887                        TerminalRBrace::missing(db).0,
3888                    ],
3889                    width: TextWidth::default(),
3890                },
3891            })
3892            .intern(db),
3893        )
3894    }
3895    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
3896        let kind = node.kind(db);
3897        assert_eq!(
3898            kind,
3899            SyntaxKind::StructArgListBraced,
3900            "Unexpected SyntaxKind {:?}. Expected {:?}.",
3901            kind,
3902            SyntaxKind::StructArgListBraced
3903        );
3904        let children = db.get_children(node.clone());
3905        Self { node, children }
3906    }
3907    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
3908        let kind = node.kind(db);
3909        if kind == SyntaxKind::StructArgListBraced {
3910            Some(Self::from_syntax_node(db, node))
3911        } else {
3912            None
3913        }
3914    }
3915    fn as_syntax_node(&self) -> SyntaxNode {
3916        self.node.clone()
3917    }
3918    fn stable_ptr(&self) -> Self::StablePtr {
3919        StructArgListBracedPtr(self.node.0.stable_ptr)
3920    }
3921}
3922impl From<&StructArgListBraced> for SyntaxStablePtrId {
3923    fn from(node: &StructArgListBraced) -> Self {
3924        node.stable_ptr().untyped()
3925    }
3926}
3927#[derive(Clone, Debug, Eq, Hash, PartialEq)]
3928pub struct ExprBlock {
3929    node: SyntaxNode,
3930    children: Arc<[SyntaxNode]>,
3931}
3932impl ExprBlock {
3933    pub const INDEX_LBRACE: usize = 0;
3934    pub const INDEX_STATEMENTS: usize = 1;
3935    pub const INDEX_RBRACE: usize = 2;
3936    pub fn new_green(
3937        db: &dyn SyntaxGroup,
3938        lbrace: TerminalLBraceGreen,
3939        statements: StatementListGreen,
3940        rbrace: TerminalRBraceGreen,
3941    ) -> ExprBlockGreen {
3942        let children: Vec<GreenId> = vec![lbrace.0, statements.0, rbrace.0];
3943        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
3944        ExprBlockGreen(
3945            Arc::new(GreenNode {
3946                kind: SyntaxKind::ExprBlock,
3947                details: GreenNodeDetails::Node { children, width },
3948            })
3949            .intern(db),
3950        )
3951    }
3952}
3953impl ExprBlock {
3954    pub fn lbrace(&self, db: &dyn SyntaxGroup) -> TerminalLBrace {
3955        TerminalLBrace::from_syntax_node(db, self.children[0].clone())
3956    }
3957    pub fn statements(&self, db: &dyn SyntaxGroup) -> StatementList {
3958        StatementList::from_syntax_node(db, self.children[1].clone())
3959    }
3960    pub fn rbrace(&self, db: &dyn SyntaxGroup) -> TerminalRBrace {
3961        TerminalRBrace::from_syntax_node(db, self.children[2].clone())
3962    }
3963}
3964#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
3965pub struct ExprBlockPtr(pub SyntaxStablePtrId);
3966impl ExprBlockPtr {}
3967impl TypedStablePtr for ExprBlockPtr {
3968    type SyntaxNode = ExprBlock;
3969    fn untyped(&self) -> SyntaxStablePtrId {
3970        self.0
3971    }
3972    fn lookup(&self, db: &dyn SyntaxGroup) -> ExprBlock {
3973        ExprBlock::from_syntax_node(db, self.0.lookup(db))
3974    }
3975}
3976impl From<ExprBlockPtr> for SyntaxStablePtrId {
3977    fn from(ptr: ExprBlockPtr) -> Self {
3978        ptr.untyped()
3979    }
3980}
3981#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
3982pub struct ExprBlockGreen(pub GreenId);
3983impl TypedSyntaxNode for ExprBlock {
3984    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprBlock);
3985    type StablePtr = ExprBlockPtr;
3986    type Green = ExprBlockGreen;
3987    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
3988        ExprBlockGreen(
3989            Arc::new(GreenNode {
3990                kind: SyntaxKind::ExprBlock,
3991                details: GreenNodeDetails::Node {
3992                    children: vec![
3993                        TerminalLBrace::missing(db).0,
3994                        StatementList::missing(db).0,
3995                        TerminalRBrace::missing(db).0,
3996                    ],
3997                    width: TextWidth::default(),
3998                },
3999            })
4000            .intern(db),
4001        )
4002    }
4003    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
4004        let kind = node.kind(db);
4005        assert_eq!(
4006            kind,
4007            SyntaxKind::ExprBlock,
4008            "Unexpected SyntaxKind {:?}. Expected {:?}.",
4009            kind,
4010            SyntaxKind::ExprBlock
4011        );
4012        let children = db.get_children(node.clone());
4013        Self { node, children }
4014    }
4015    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
4016        let kind = node.kind(db);
4017        if kind == SyntaxKind::ExprBlock { Some(Self::from_syntax_node(db, node)) } else { None }
4018    }
4019    fn as_syntax_node(&self) -> SyntaxNode {
4020        self.node.clone()
4021    }
4022    fn stable_ptr(&self) -> Self::StablePtr {
4023        ExprBlockPtr(self.node.0.stable_ptr)
4024    }
4025}
4026impl From<&ExprBlock> for SyntaxStablePtrId {
4027    fn from(node: &ExprBlock) -> Self {
4028        node.stable_ptr().untyped()
4029    }
4030}
4031#[derive(Clone, Debug, Eq, Hash, PartialEq)]
4032pub struct ExprMatch {
4033    node: SyntaxNode,
4034    children: Arc<[SyntaxNode]>,
4035}
4036impl ExprMatch {
4037    pub const INDEX_MATCH_KW: usize = 0;
4038    pub const INDEX_EXPR: usize = 1;
4039    pub const INDEX_LBRACE: usize = 2;
4040    pub const INDEX_ARMS: usize = 3;
4041    pub const INDEX_RBRACE: usize = 4;
4042    pub fn new_green(
4043        db: &dyn SyntaxGroup,
4044        match_kw: TerminalMatchGreen,
4045        expr: ExprGreen,
4046        lbrace: TerminalLBraceGreen,
4047        arms: MatchArmsGreen,
4048        rbrace: TerminalRBraceGreen,
4049    ) -> ExprMatchGreen {
4050        let children: Vec<GreenId> = vec![match_kw.0, expr.0, lbrace.0, arms.0, rbrace.0];
4051        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
4052        ExprMatchGreen(
4053            Arc::new(GreenNode {
4054                kind: SyntaxKind::ExprMatch,
4055                details: GreenNodeDetails::Node { children, width },
4056            })
4057            .intern(db),
4058        )
4059    }
4060}
4061impl ExprMatch {
4062    pub fn match_kw(&self, db: &dyn SyntaxGroup) -> TerminalMatch {
4063        TerminalMatch::from_syntax_node(db, self.children[0].clone())
4064    }
4065    pub fn expr(&self, db: &dyn SyntaxGroup) -> Expr {
4066        Expr::from_syntax_node(db, self.children[1].clone())
4067    }
4068    pub fn lbrace(&self, db: &dyn SyntaxGroup) -> TerminalLBrace {
4069        TerminalLBrace::from_syntax_node(db, self.children[2].clone())
4070    }
4071    pub fn arms(&self, db: &dyn SyntaxGroup) -> MatchArms {
4072        MatchArms::from_syntax_node(db, self.children[3].clone())
4073    }
4074    pub fn rbrace(&self, db: &dyn SyntaxGroup) -> TerminalRBrace {
4075        TerminalRBrace::from_syntax_node(db, self.children[4].clone())
4076    }
4077}
4078#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
4079pub struct ExprMatchPtr(pub SyntaxStablePtrId);
4080impl ExprMatchPtr {}
4081impl TypedStablePtr for ExprMatchPtr {
4082    type SyntaxNode = ExprMatch;
4083    fn untyped(&self) -> SyntaxStablePtrId {
4084        self.0
4085    }
4086    fn lookup(&self, db: &dyn SyntaxGroup) -> ExprMatch {
4087        ExprMatch::from_syntax_node(db, self.0.lookup(db))
4088    }
4089}
4090impl From<ExprMatchPtr> for SyntaxStablePtrId {
4091    fn from(ptr: ExprMatchPtr) -> Self {
4092        ptr.untyped()
4093    }
4094}
4095#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
4096pub struct ExprMatchGreen(pub GreenId);
4097impl TypedSyntaxNode for ExprMatch {
4098    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprMatch);
4099    type StablePtr = ExprMatchPtr;
4100    type Green = ExprMatchGreen;
4101    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
4102        ExprMatchGreen(
4103            Arc::new(GreenNode {
4104                kind: SyntaxKind::ExprMatch,
4105                details: GreenNodeDetails::Node {
4106                    children: vec![
4107                        TerminalMatch::missing(db).0,
4108                        Expr::missing(db).0,
4109                        TerminalLBrace::missing(db).0,
4110                        MatchArms::missing(db).0,
4111                        TerminalRBrace::missing(db).0,
4112                    ],
4113                    width: TextWidth::default(),
4114                },
4115            })
4116            .intern(db),
4117        )
4118    }
4119    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
4120        let kind = node.kind(db);
4121        assert_eq!(
4122            kind,
4123            SyntaxKind::ExprMatch,
4124            "Unexpected SyntaxKind {:?}. Expected {:?}.",
4125            kind,
4126            SyntaxKind::ExprMatch
4127        );
4128        let children = db.get_children(node.clone());
4129        Self { node, children }
4130    }
4131    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
4132        let kind = node.kind(db);
4133        if kind == SyntaxKind::ExprMatch { Some(Self::from_syntax_node(db, node)) } else { None }
4134    }
4135    fn as_syntax_node(&self) -> SyntaxNode {
4136        self.node.clone()
4137    }
4138    fn stable_ptr(&self) -> Self::StablePtr {
4139        ExprMatchPtr(self.node.0.stable_ptr)
4140    }
4141}
4142impl From<&ExprMatch> for SyntaxStablePtrId {
4143    fn from(node: &ExprMatch) -> Self {
4144        node.stable_ptr().untyped()
4145    }
4146}
4147#[derive(Clone, Debug, Eq, Hash, PartialEq)]
4148pub struct MatchArms(ElementList<MatchArm, 2>);
4149impl Deref for MatchArms {
4150    type Target = ElementList<MatchArm, 2>;
4151    fn deref(&self) -> &Self::Target {
4152        &self.0
4153    }
4154}
4155impl MatchArms {
4156    pub fn new_green(
4157        db: &dyn SyntaxGroup,
4158        children: Vec<MatchArmsElementOrSeparatorGreen>,
4159    ) -> MatchArmsGreen {
4160        let width = children.iter().map(|id| id.id().lookup_intern(db).width()).sum();
4161        MatchArmsGreen(
4162            Arc::new(GreenNode {
4163                kind: SyntaxKind::MatchArms,
4164                details: GreenNodeDetails::Node {
4165                    children: children.iter().map(|x| x.id()).collect(),
4166                    width,
4167                },
4168            })
4169            .intern(db),
4170        )
4171    }
4172}
4173#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
4174pub struct MatchArmsPtr(pub SyntaxStablePtrId);
4175impl TypedStablePtr for MatchArmsPtr {
4176    type SyntaxNode = MatchArms;
4177    fn untyped(&self) -> SyntaxStablePtrId {
4178        self.0
4179    }
4180    fn lookup(&self, db: &dyn SyntaxGroup) -> MatchArms {
4181        MatchArms::from_syntax_node(db, self.0.lookup(db))
4182    }
4183}
4184impl From<MatchArmsPtr> for SyntaxStablePtrId {
4185    fn from(ptr: MatchArmsPtr) -> Self {
4186        ptr.untyped()
4187    }
4188}
4189#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
4190pub enum MatchArmsElementOrSeparatorGreen {
4191    Separator(TerminalCommaGreen),
4192    Element(MatchArmGreen),
4193}
4194impl From<TerminalCommaGreen> for MatchArmsElementOrSeparatorGreen {
4195    fn from(value: TerminalCommaGreen) -> Self {
4196        MatchArmsElementOrSeparatorGreen::Separator(value)
4197    }
4198}
4199impl From<MatchArmGreen> for MatchArmsElementOrSeparatorGreen {
4200    fn from(value: MatchArmGreen) -> Self {
4201        MatchArmsElementOrSeparatorGreen::Element(value)
4202    }
4203}
4204impl MatchArmsElementOrSeparatorGreen {
4205    fn id(&self) -> GreenId {
4206        match self {
4207            MatchArmsElementOrSeparatorGreen::Separator(green) => green.0,
4208            MatchArmsElementOrSeparatorGreen::Element(green) => green.0,
4209        }
4210    }
4211}
4212#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
4213pub struct MatchArmsGreen(pub GreenId);
4214impl TypedSyntaxNode for MatchArms {
4215    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::MatchArms);
4216    type StablePtr = MatchArmsPtr;
4217    type Green = MatchArmsGreen;
4218    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
4219        MatchArmsGreen(
4220            Arc::new(GreenNode {
4221                kind: SyntaxKind::MatchArms,
4222                details: GreenNodeDetails::Node { children: vec![], width: TextWidth::default() },
4223            })
4224            .intern(db),
4225        )
4226    }
4227    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
4228        Self(ElementList::new(node))
4229    }
4230    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
4231        if node.kind(db) == SyntaxKind::MatchArms {
4232            Some(Self(ElementList::new(node)))
4233        } else {
4234            None
4235        }
4236    }
4237    fn as_syntax_node(&self) -> SyntaxNode {
4238        self.node.clone()
4239    }
4240    fn stable_ptr(&self) -> Self::StablePtr {
4241        MatchArmsPtr(self.node.0.stable_ptr)
4242    }
4243}
4244impl From<&MatchArms> for SyntaxStablePtrId {
4245    fn from(node: &MatchArms) -> Self {
4246        node.stable_ptr().untyped()
4247    }
4248}
4249#[derive(Clone, Debug, Eq, Hash, PartialEq)]
4250pub struct MatchArm {
4251    node: SyntaxNode,
4252    children: Arc<[SyntaxNode]>,
4253}
4254impl MatchArm {
4255    pub const INDEX_PATTERNS: usize = 0;
4256    pub const INDEX_ARROW: usize = 1;
4257    pub const INDEX_EXPRESSION: usize = 2;
4258    pub fn new_green(
4259        db: &dyn SyntaxGroup,
4260        patterns: PatternListOrGreen,
4261        arrow: TerminalMatchArrowGreen,
4262        expression: ExprGreen,
4263    ) -> MatchArmGreen {
4264        let children: Vec<GreenId> = vec![patterns.0, arrow.0, expression.0];
4265        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
4266        MatchArmGreen(
4267            Arc::new(GreenNode {
4268                kind: SyntaxKind::MatchArm,
4269                details: GreenNodeDetails::Node { children, width },
4270            })
4271            .intern(db),
4272        )
4273    }
4274}
4275impl MatchArm {
4276    pub fn patterns(&self, db: &dyn SyntaxGroup) -> PatternListOr {
4277        PatternListOr::from_syntax_node(db, self.children[0].clone())
4278    }
4279    pub fn arrow(&self, db: &dyn SyntaxGroup) -> TerminalMatchArrow {
4280        TerminalMatchArrow::from_syntax_node(db, self.children[1].clone())
4281    }
4282    pub fn expression(&self, db: &dyn SyntaxGroup) -> Expr {
4283        Expr::from_syntax_node(db, self.children[2].clone())
4284    }
4285}
4286#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
4287pub struct MatchArmPtr(pub SyntaxStablePtrId);
4288impl MatchArmPtr {}
4289impl TypedStablePtr for MatchArmPtr {
4290    type SyntaxNode = MatchArm;
4291    fn untyped(&self) -> SyntaxStablePtrId {
4292        self.0
4293    }
4294    fn lookup(&self, db: &dyn SyntaxGroup) -> MatchArm {
4295        MatchArm::from_syntax_node(db, self.0.lookup(db))
4296    }
4297}
4298impl From<MatchArmPtr> for SyntaxStablePtrId {
4299    fn from(ptr: MatchArmPtr) -> Self {
4300        ptr.untyped()
4301    }
4302}
4303#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
4304pub struct MatchArmGreen(pub GreenId);
4305impl TypedSyntaxNode for MatchArm {
4306    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::MatchArm);
4307    type StablePtr = MatchArmPtr;
4308    type Green = MatchArmGreen;
4309    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
4310        MatchArmGreen(
4311            Arc::new(GreenNode {
4312                kind: SyntaxKind::MatchArm,
4313                details: GreenNodeDetails::Node {
4314                    children: vec![
4315                        PatternListOr::missing(db).0,
4316                        TerminalMatchArrow::missing(db).0,
4317                        Expr::missing(db).0,
4318                    ],
4319                    width: TextWidth::default(),
4320                },
4321            })
4322            .intern(db),
4323        )
4324    }
4325    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
4326        let kind = node.kind(db);
4327        assert_eq!(
4328            kind,
4329            SyntaxKind::MatchArm,
4330            "Unexpected SyntaxKind {:?}. Expected {:?}.",
4331            kind,
4332            SyntaxKind::MatchArm
4333        );
4334        let children = db.get_children(node.clone());
4335        Self { node, children }
4336    }
4337    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
4338        let kind = node.kind(db);
4339        if kind == SyntaxKind::MatchArm { Some(Self::from_syntax_node(db, node)) } else { None }
4340    }
4341    fn as_syntax_node(&self) -> SyntaxNode {
4342        self.node.clone()
4343    }
4344    fn stable_ptr(&self) -> Self::StablePtr {
4345        MatchArmPtr(self.node.0.stable_ptr)
4346    }
4347}
4348impl From<&MatchArm> for SyntaxStablePtrId {
4349    fn from(node: &MatchArm) -> Self {
4350        node.stable_ptr().untyped()
4351    }
4352}
4353#[derive(Clone, Debug, Eq, Hash, PartialEq)]
4354pub struct ExprIf {
4355    node: SyntaxNode,
4356    children: Arc<[SyntaxNode]>,
4357}
4358impl ExprIf {
4359    pub const INDEX_IF_KW: usize = 0;
4360    pub const INDEX_CONDITION: usize = 1;
4361    pub const INDEX_IF_BLOCK: usize = 2;
4362    pub const INDEX_ELSE_CLAUSE: usize = 3;
4363    pub fn new_green(
4364        db: &dyn SyntaxGroup,
4365        if_kw: TerminalIfGreen,
4366        condition: ConditionGreen,
4367        if_block: ExprBlockGreen,
4368        else_clause: OptionElseClauseGreen,
4369    ) -> ExprIfGreen {
4370        let children: Vec<GreenId> = vec![if_kw.0, condition.0, if_block.0, else_clause.0];
4371        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
4372        ExprIfGreen(
4373            Arc::new(GreenNode {
4374                kind: SyntaxKind::ExprIf,
4375                details: GreenNodeDetails::Node { children, width },
4376            })
4377            .intern(db),
4378        )
4379    }
4380}
4381impl ExprIf {
4382    pub fn if_kw(&self, db: &dyn SyntaxGroup) -> TerminalIf {
4383        TerminalIf::from_syntax_node(db, self.children[0].clone())
4384    }
4385    pub fn condition(&self, db: &dyn SyntaxGroup) -> Condition {
4386        Condition::from_syntax_node(db, self.children[1].clone())
4387    }
4388    pub fn if_block(&self, db: &dyn SyntaxGroup) -> ExprBlock {
4389        ExprBlock::from_syntax_node(db, self.children[2].clone())
4390    }
4391    pub fn else_clause(&self, db: &dyn SyntaxGroup) -> OptionElseClause {
4392        OptionElseClause::from_syntax_node(db, self.children[3].clone())
4393    }
4394}
4395#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
4396pub struct ExprIfPtr(pub SyntaxStablePtrId);
4397impl ExprIfPtr {}
4398impl TypedStablePtr for ExprIfPtr {
4399    type SyntaxNode = ExprIf;
4400    fn untyped(&self) -> SyntaxStablePtrId {
4401        self.0
4402    }
4403    fn lookup(&self, db: &dyn SyntaxGroup) -> ExprIf {
4404        ExprIf::from_syntax_node(db, self.0.lookup(db))
4405    }
4406}
4407impl From<ExprIfPtr> for SyntaxStablePtrId {
4408    fn from(ptr: ExprIfPtr) -> Self {
4409        ptr.untyped()
4410    }
4411}
4412#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
4413pub struct ExprIfGreen(pub GreenId);
4414impl TypedSyntaxNode for ExprIf {
4415    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprIf);
4416    type StablePtr = ExprIfPtr;
4417    type Green = ExprIfGreen;
4418    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
4419        ExprIfGreen(
4420            Arc::new(GreenNode {
4421                kind: SyntaxKind::ExprIf,
4422                details: GreenNodeDetails::Node {
4423                    children: vec![
4424                        TerminalIf::missing(db).0,
4425                        Condition::missing(db).0,
4426                        ExprBlock::missing(db).0,
4427                        OptionElseClause::missing(db).0,
4428                    ],
4429                    width: TextWidth::default(),
4430                },
4431            })
4432            .intern(db),
4433        )
4434    }
4435    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
4436        let kind = node.kind(db);
4437        assert_eq!(
4438            kind,
4439            SyntaxKind::ExprIf,
4440            "Unexpected SyntaxKind {:?}. Expected {:?}.",
4441            kind,
4442            SyntaxKind::ExprIf
4443        );
4444        let children = db.get_children(node.clone());
4445        Self { node, children }
4446    }
4447    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
4448        let kind = node.kind(db);
4449        if kind == SyntaxKind::ExprIf { Some(Self::from_syntax_node(db, node)) } else { None }
4450    }
4451    fn as_syntax_node(&self) -> SyntaxNode {
4452        self.node.clone()
4453    }
4454    fn stable_ptr(&self) -> Self::StablePtr {
4455        ExprIfPtr(self.node.0.stable_ptr)
4456    }
4457}
4458impl From<&ExprIf> for SyntaxStablePtrId {
4459    fn from(node: &ExprIf) -> Self {
4460        node.stable_ptr().untyped()
4461    }
4462}
4463#[derive(Clone, Debug, Eq, Hash, PartialEq)]
4464pub enum Condition {
4465    Let(ConditionLet),
4466    Expr(ConditionExpr),
4467}
4468#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
4469pub struct ConditionPtr(pub SyntaxStablePtrId);
4470impl TypedStablePtr for ConditionPtr {
4471    type SyntaxNode = Condition;
4472    fn untyped(&self) -> SyntaxStablePtrId {
4473        self.0
4474    }
4475    fn lookup(&self, db: &dyn SyntaxGroup) -> Condition {
4476        Condition::from_syntax_node(db, self.0.lookup(db))
4477    }
4478}
4479impl From<ConditionPtr> for SyntaxStablePtrId {
4480    fn from(ptr: ConditionPtr) -> Self {
4481        ptr.untyped()
4482    }
4483}
4484impl From<ConditionLetPtr> for ConditionPtr {
4485    fn from(value: ConditionLetPtr) -> Self {
4486        Self(value.0)
4487    }
4488}
4489impl From<ConditionExprPtr> for ConditionPtr {
4490    fn from(value: ConditionExprPtr) -> Self {
4491        Self(value.0)
4492    }
4493}
4494impl From<ConditionLetGreen> for ConditionGreen {
4495    fn from(value: ConditionLetGreen) -> Self {
4496        Self(value.0)
4497    }
4498}
4499impl From<ConditionExprGreen> for ConditionGreen {
4500    fn from(value: ConditionExprGreen) -> Self {
4501        Self(value.0)
4502    }
4503}
4504#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
4505pub struct ConditionGreen(pub GreenId);
4506impl TypedSyntaxNode for Condition {
4507    const OPTIONAL_KIND: Option<SyntaxKind> = None;
4508    type StablePtr = ConditionPtr;
4509    type Green = ConditionGreen;
4510    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
4511        panic!("No missing variant.");
4512    }
4513    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
4514        let kind = node.kind(db);
4515        match kind {
4516            SyntaxKind::ConditionLet => Condition::Let(ConditionLet::from_syntax_node(db, node)),
4517            SyntaxKind::ConditionExpr => Condition::Expr(ConditionExpr::from_syntax_node(db, node)),
4518            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "Condition"),
4519        }
4520    }
4521    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
4522        let kind = node.kind(db);
4523        match kind {
4524            SyntaxKind::ConditionLet => {
4525                Some(Condition::Let(ConditionLet::from_syntax_node(db, node)))
4526            }
4527            SyntaxKind::ConditionExpr => {
4528                Some(Condition::Expr(ConditionExpr::from_syntax_node(db, node)))
4529            }
4530            _ => None,
4531        }
4532    }
4533    fn as_syntax_node(&self) -> SyntaxNode {
4534        match self {
4535            Condition::Let(x) => x.as_syntax_node(),
4536            Condition::Expr(x) => x.as_syntax_node(),
4537        }
4538    }
4539    fn stable_ptr(&self) -> Self::StablePtr {
4540        ConditionPtr(self.as_syntax_node().0.stable_ptr)
4541    }
4542}
4543impl From<&Condition> for SyntaxStablePtrId {
4544    fn from(node: &Condition) -> Self {
4545        node.stable_ptr().untyped()
4546    }
4547}
4548impl Condition {
4549    /// Checks if a kind of a variant of [Condition].
4550    pub fn is_variant(kind: SyntaxKind) -> bool {
4551        matches!(kind, SyntaxKind::ConditionLet | SyntaxKind::ConditionExpr)
4552    }
4553}
4554#[derive(Clone, Debug, Eq, Hash, PartialEq)]
4555pub struct ConditionLet {
4556    node: SyntaxNode,
4557    children: Arc<[SyntaxNode]>,
4558}
4559impl ConditionLet {
4560    pub const INDEX_LET_KW: usize = 0;
4561    pub const INDEX_PATTERNS: usize = 1;
4562    pub const INDEX_EQ: usize = 2;
4563    pub const INDEX_EXPR: usize = 3;
4564    pub fn new_green(
4565        db: &dyn SyntaxGroup,
4566        let_kw: TerminalLetGreen,
4567        patterns: PatternListOrGreen,
4568        eq: TerminalEqGreen,
4569        expr: ExprGreen,
4570    ) -> ConditionLetGreen {
4571        let children: Vec<GreenId> = vec![let_kw.0, patterns.0, eq.0, expr.0];
4572        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
4573        ConditionLetGreen(
4574            Arc::new(GreenNode {
4575                kind: SyntaxKind::ConditionLet,
4576                details: GreenNodeDetails::Node { children, width },
4577            })
4578            .intern(db),
4579        )
4580    }
4581}
4582impl ConditionLet {
4583    pub fn let_kw(&self, db: &dyn SyntaxGroup) -> TerminalLet {
4584        TerminalLet::from_syntax_node(db, self.children[0].clone())
4585    }
4586    pub fn patterns(&self, db: &dyn SyntaxGroup) -> PatternListOr {
4587        PatternListOr::from_syntax_node(db, self.children[1].clone())
4588    }
4589    pub fn eq(&self, db: &dyn SyntaxGroup) -> TerminalEq {
4590        TerminalEq::from_syntax_node(db, self.children[2].clone())
4591    }
4592    pub fn expr(&self, db: &dyn SyntaxGroup) -> Expr {
4593        Expr::from_syntax_node(db, self.children[3].clone())
4594    }
4595}
4596#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
4597pub struct ConditionLetPtr(pub SyntaxStablePtrId);
4598impl ConditionLetPtr {}
4599impl TypedStablePtr for ConditionLetPtr {
4600    type SyntaxNode = ConditionLet;
4601    fn untyped(&self) -> SyntaxStablePtrId {
4602        self.0
4603    }
4604    fn lookup(&self, db: &dyn SyntaxGroup) -> ConditionLet {
4605        ConditionLet::from_syntax_node(db, self.0.lookup(db))
4606    }
4607}
4608impl From<ConditionLetPtr> for SyntaxStablePtrId {
4609    fn from(ptr: ConditionLetPtr) -> Self {
4610        ptr.untyped()
4611    }
4612}
4613#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
4614pub struct ConditionLetGreen(pub GreenId);
4615impl TypedSyntaxNode for ConditionLet {
4616    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ConditionLet);
4617    type StablePtr = ConditionLetPtr;
4618    type Green = ConditionLetGreen;
4619    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
4620        ConditionLetGreen(
4621            Arc::new(GreenNode {
4622                kind: SyntaxKind::ConditionLet,
4623                details: GreenNodeDetails::Node {
4624                    children: vec![
4625                        TerminalLet::missing(db).0,
4626                        PatternListOr::missing(db).0,
4627                        TerminalEq::missing(db).0,
4628                        Expr::missing(db).0,
4629                    ],
4630                    width: TextWidth::default(),
4631                },
4632            })
4633            .intern(db),
4634        )
4635    }
4636    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
4637        let kind = node.kind(db);
4638        assert_eq!(
4639            kind,
4640            SyntaxKind::ConditionLet,
4641            "Unexpected SyntaxKind {:?}. Expected {:?}.",
4642            kind,
4643            SyntaxKind::ConditionLet
4644        );
4645        let children = db.get_children(node.clone());
4646        Self { node, children }
4647    }
4648    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
4649        let kind = node.kind(db);
4650        if kind == SyntaxKind::ConditionLet { Some(Self::from_syntax_node(db, node)) } else { None }
4651    }
4652    fn as_syntax_node(&self) -> SyntaxNode {
4653        self.node.clone()
4654    }
4655    fn stable_ptr(&self) -> Self::StablePtr {
4656        ConditionLetPtr(self.node.0.stable_ptr)
4657    }
4658}
4659impl From<&ConditionLet> for SyntaxStablePtrId {
4660    fn from(node: &ConditionLet) -> Self {
4661        node.stable_ptr().untyped()
4662    }
4663}
4664#[derive(Clone, Debug, Eq, Hash, PartialEq)]
4665pub struct ConditionExpr {
4666    node: SyntaxNode,
4667    children: Arc<[SyntaxNode]>,
4668}
4669impl ConditionExpr {
4670    pub const INDEX_EXPR: usize = 0;
4671    pub fn new_green(db: &dyn SyntaxGroup, expr: ExprGreen) -> ConditionExprGreen {
4672        let children: Vec<GreenId> = vec![expr.0];
4673        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
4674        ConditionExprGreen(
4675            Arc::new(GreenNode {
4676                kind: SyntaxKind::ConditionExpr,
4677                details: GreenNodeDetails::Node { children, width },
4678            })
4679            .intern(db),
4680        )
4681    }
4682}
4683impl ConditionExpr {
4684    pub fn expr(&self, db: &dyn SyntaxGroup) -> Expr {
4685        Expr::from_syntax_node(db, self.children[0].clone())
4686    }
4687}
4688#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
4689pub struct ConditionExprPtr(pub SyntaxStablePtrId);
4690impl ConditionExprPtr {}
4691impl TypedStablePtr for ConditionExprPtr {
4692    type SyntaxNode = ConditionExpr;
4693    fn untyped(&self) -> SyntaxStablePtrId {
4694        self.0
4695    }
4696    fn lookup(&self, db: &dyn SyntaxGroup) -> ConditionExpr {
4697        ConditionExpr::from_syntax_node(db, self.0.lookup(db))
4698    }
4699}
4700impl From<ConditionExprPtr> for SyntaxStablePtrId {
4701    fn from(ptr: ConditionExprPtr) -> Self {
4702        ptr.untyped()
4703    }
4704}
4705#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
4706pub struct ConditionExprGreen(pub GreenId);
4707impl TypedSyntaxNode for ConditionExpr {
4708    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ConditionExpr);
4709    type StablePtr = ConditionExprPtr;
4710    type Green = ConditionExprGreen;
4711    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
4712        ConditionExprGreen(
4713            Arc::new(GreenNode {
4714                kind: SyntaxKind::ConditionExpr,
4715                details: GreenNodeDetails::Node {
4716                    children: vec![Expr::missing(db).0],
4717                    width: TextWidth::default(),
4718                },
4719            })
4720            .intern(db),
4721        )
4722    }
4723    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
4724        let kind = node.kind(db);
4725        assert_eq!(
4726            kind,
4727            SyntaxKind::ConditionExpr,
4728            "Unexpected SyntaxKind {:?}. Expected {:?}.",
4729            kind,
4730            SyntaxKind::ConditionExpr
4731        );
4732        let children = db.get_children(node.clone());
4733        Self { node, children }
4734    }
4735    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
4736        let kind = node.kind(db);
4737        if kind == SyntaxKind::ConditionExpr {
4738            Some(Self::from_syntax_node(db, node))
4739        } else {
4740            None
4741        }
4742    }
4743    fn as_syntax_node(&self) -> SyntaxNode {
4744        self.node.clone()
4745    }
4746    fn stable_ptr(&self) -> Self::StablePtr {
4747        ConditionExprPtr(self.node.0.stable_ptr)
4748    }
4749}
4750impl From<&ConditionExpr> for SyntaxStablePtrId {
4751    fn from(node: &ConditionExpr) -> Self {
4752        node.stable_ptr().untyped()
4753    }
4754}
4755#[derive(Clone, Debug, Eq, Hash, PartialEq)]
4756pub enum BlockOrIf {
4757    Block(ExprBlock),
4758    If(ExprIf),
4759}
4760#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
4761pub struct BlockOrIfPtr(pub SyntaxStablePtrId);
4762impl TypedStablePtr for BlockOrIfPtr {
4763    type SyntaxNode = BlockOrIf;
4764    fn untyped(&self) -> SyntaxStablePtrId {
4765        self.0
4766    }
4767    fn lookup(&self, db: &dyn SyntaxGroup) -> BlockOrIf {
4768        BlockOrIf::from_syntax_node(db, self.0.lookup(db))
4769    }
4770}
4771impl From<BlockOrIfPtr> for SyntaxStablePtrId {
4772    fn from(ptr: BlockOrIfPtr) -> Self {
4773        ptr.untyped()
4774    }
4775}
4776impl From<ExprBlockPtr> for BlockOrIfPtr {
4777    fn from(value: ExprBlockPtr) -> Self {
4778        Self(value.0)
4779    }
4780}
4781impl From<ExprIfPtr> for BlockOrIfPtr {
4782    fn from(value: ExprIfPtr) -> Self {
4783        Self(value.0)
4784    }
4785}
4786impl From<ExprBlockGreen> for BlockOrIfGreen {
4787    fn from(value: ExprBlockGreen) -> Self {
4788        Self(value.0)
4789    }
4790}
4791impl From<ExprIfGreen> for BlockOrIfGreen {
4792    fn from(value: ExprIfGreen) -> Self {
4793        Self(value.0)
4794    }
4795}
4796#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
4797pub struct BlockOrIfGreen(pub GreenId);
4798impl TypedSyntaxNode for BlockOrIf {
4799    const OPTIONAL_KIND: Option<SyntaxKind> = None;
4800    type StablePtr = BlockOrIfPtr;
4801    type Green = BlockOrIfGreen;
4802    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
4803        panic!("No missing variant.");
4804    }
4805    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
4806        let kind = node.kind(db);
4807        match kind {
4808            SyntaxKind::ExprBlock => BlockOrIf::Block(ExprBlock::from_syntax_node(db, node)),
4809            SyntaxKind::ExprIf => BlockOrIf::If(ExprIf::from_syntax_node(db, node)),
4810            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "BlockOrIf"),
4811        }
4812    }
4813    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
4814        let kind = node.kind(db);
4815        match kind {
4816            SyntaxKind::ExprBlock => Some(BlockOrIf::Block(ExprBlock::from_syntax_node(db, node))),
4817            SyntaxKind::ExprIf => Some(BlockOrIf::If(ExprIf::from_syntax_node(db, node))),
4818            _ => None,
4819        }
4820    }
4821    fn as_syntax_node(&self) -> SyntaxNode {
4822        match self {
4823            BlockOrIf::Block(x) => x.as_syntax_node(),
4824            BlockOrIf::If(x) => x.as_syntax_node(),
4825        }
4826    }
4827    fn stable_ptr(&self) -> Self::StablePtr {
4828        BlockOrIfPtr(self.as_syntax_node().0.stable_ptr)
4829    }
4830}
4831impl From<&BlockOrIf> for SyntaxStablePtrId {
4832    fn from(node: &BlockOrIf) -> Self {
4833        node.stable_ptr().untyped()
4834    }
4835}
4836impl BlockOrIf {
4837    /// Checks if a kind of a variant of [BlockOrIf].
4838    pub fn is_variant(kind: SyntaxKind) -> bool {
4839        matches!(kind, SyntaxKind::ExprBlock | SyntaxKind::ExprIf)
4840    }
4841}
4842#[derive(Clone, Debug, Eq, Hash, PartialEq)]
4843pub struct ExprLoop {
4844    node: SyntaxNode,
4845    children: Arc<[SyntaxNode]>,
4846}
4847impl ExprLoop {
4848    pub const INDEX_LOOP_KW: usize = 0;
4849    pub const INDEX_BODY: usize = 1;
4850    pub fn new_green(
4851        db: &dyn SyntaxGroup,
4852        loop_kw: TerminalLoopGreen,
4853        body: ExprBlockGreen,
4854    ) -> ExprLoopGreen {
4855        let children: Vec<GreenId> = vec![loop_kw.0, body.0];
4856        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
4857        ExprLoopGreen(
4858            Arc::new(GreenNode {
4859                kind: SyntaxKind::ExprLoop,
4860                details: GreenNodeDetails::Node { children, width },
4861            })
4862            .intern(db),
4863        )
4864    }
4865}
4866impl ExprLoop {
4867    pub fn loop_kw(&self, db: &dyn SyntaxGroup) -> TerminalLoop {
4868        TerminalLoop::from_syntax_node(db, self.children[0].clone())
4869    }
4870    pub fn body(&self, db: &dyn SyntaxGroup) -> ExprBlock {
4871        ExprBlock::from_syntax_node(db, self.children[1].clone())
4872    }
4873}
4874#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
4875pub struct ExprLoopPtr(pub SyntaxStablePtrId);
4876impl ExprLoopPtr {}
4877impl TypedStablePtr for ExprLoopPtr {
4878    type SyntaxNode = ExprLoop;
4879    fn untyped(&self) -> SyntaxStablePtrId {
4880        self.0
4881    }
4882    fn lookup(&self, db: &dyn SyntaxGroup) -> ExprLoop {
4883        ExprLoop::from_syntax_node(db, self.0.lookup(db))
4884    }
4885}
4886impl From<ExprLoopPtr> for SyntaxStablePtrId {
4887    fn from(ptr: ExprLoopPtr) -> Self {
4888        ptr.untyped()
4889    }
4890}
4891#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
4892pub struct ExprLoopGreen(pub GreenId);
4893impl TypedSyntaxNode for ExprLoop {
4894    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprLoop);
4895    type StablePtr = ExprLoopPtr;
4896    type Green = ExprLoopGreen;
4897    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
4898        ExprLoopGreen(
4899            Arc::new(GreenNode {
4900                kind: SyntaxKind::ExprLoop,
4901                details: GreenNodeDetails::Node {
4902                    children: vec![TerminalLoop::missing(db).0, ExprBlock::missing(db).0],
4903                    width: TextWidth::default(),
4904                },
4905            })
4906            .intern(db),
4907        )
4908    }
4909    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
4910        let kind = node.kind(db);
4911        assert_eq!(
4912            kind,
4913            SyntaxKind::ExprLoop,
4914            "Unexpected SyntaxKind {:?}. Expected {:?}.",
4915            kind,
4916            SyntaxKind::ExprLoop
4917        );
4918        let children = db.get_children(node.clone());
4919        Self { node, children }
4920    }
4921    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
4922        let kind = node.kind(db);
4923        if kind == SyntaxKind::ExprLoop { Some(Self::from_syntax_node(db, node)) } else { None }
4924    }
4925    fn as_syntax_node(&self) -> SyntaxNode {
4926        self.node.clone()
4927    }
4928    fn stable_ptr(&self) -> Self::StablePtr {
4929        ExprLoopPtr(self.node.0.stable_ptr)
4930    }
4931}
4932impl From<&ExprLoop> for SyntaxStablePtrId {
4933    fn from(node: &ExprLoop) -> Self {
4934        node.stable_ptr().untyped()
4935    }
4936}
4937#[derive(Clone, Debug, Eq, Hash, PartialEq)]
4938pub struct ExprWhile {
4939    node: SyntaxNode,
4940    children: Arc<[SyntaxNode]>,
4941}
4942impl ExprWhile {
4943    pub const INDEX_WHILE_KW: usize = 0;
4944    pub const INDEX_CONDITION: usize = 1;
4945    pub const INDEX_BODY: usize = 2;
4946    pub fn new_green(
4947        db: &dyn SyntaxGroup,
4948        while_kw: TerminalWhileGreen,
4949        condition: ConditionGreen,
4950        body: ExprBlockGreen,
4951    ) -> ExprWhileGreen {
4952        let children: Vec<GreenId> = vec![while_kw.0, condition.0, body.0];
4953        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
4954        ExprWhileGreen(
4955            Arc::new(GreenNode {
4956                kind: SyntaxKind::ExprWhile,
4957                details: GreenNodeDetails::Node { children, width },
4958            })
4959            .intern(db),
4960        )
4961    }
4962}
4963impl ExprWhile {
4964    pub fn while_kw(&self, db: &dyn SyntaxGroup) -> TerminalWhile {
4965        TerminalWhile::from_syntax_node(db, self.children[0].clone())
4966    }
4967    pub fn condition(&self, db: &dyn SyntaxGroup) -> Condition {
4968        Condition::from_syntax_node(db, self.children[1].clone())
4969    }
4970    pub fn body(&self, db: &dyn SyntaxGroup) -> ExprBlock {
4971        ExprBlock::from_syntax_node(db, self.children[2].clone())
4972    }
4973}
4974#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
4975pub struct ExprWhilePtr(pub SyntaxStablePtrId);
4976impl ExprWhilePtr {}
4977impl TypedStablePtr for ExprWhilePtr {
4978    type SyntaxNode = ExprWhile;
4979    fn untyped(&self) -> SyntaxStablePtrId {
4980        self.0
4981    }
4982    fn lookup(&self, db: &dyn SyntaxGroup) -> ExprWhile {
4983        ExprWhile::from_syntax_node(db, self.0.lookup(db))
4984    }
4985}
4986impl From<ExprWhilePtr> for SyntaxStablePtrId {
4987    fn from(ptr: ExprWhilePtr) -> Self {
4988        ptr.untyped()
4989    }
4990}
4991#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
4992pub struct ExprWhileGreen(pub GreenId);
4993impl TypedSyntaxNode for ExprWhile {
4994    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprWhile);
4995    type StablePtr = ExprWhilePtr;
4996    type Green = ExprWhileGreen;
4997    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
4998        ExprWhileGreen(
4999            Arc::new(GreenNode {
5000                kind: SyntaxKind::ExprWhile,
5001                details: GreenNodeDetails::Node {
5002                    children: vec![
5003                        TerminalWhile::missing(db).0,
5004                        Condition::missing(db).0,
5005                        ExprBlock::missing(db).0,
5006                    ],
5007                    width: TextWidth::default(),
5008                },
5009            })
5010            .intern(db),
5011        )
5012    }
5013    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
5014        let kind = node.kind(db);
5015        assert_eq!(
5016            kind,
5017            SyntaxKind::ExprWhile,
5018            "Unexpected SyntaxKind {:?}. Expected {:?}.",
5019            kind,
5020            SyntaxKind::ExprWhile
5021        );
5022        let children = db.get_children(node.clone());
5023        Self { node, children }
5024    }
5025    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
5026        let kind = node.kind(db);
5027        if kind == SyntaxKind::ExprWhile { Some(Self::from_syntax_node(db, node)) } else { None }
5028    }
5029    fn as_syntax_node(&self) -> SyntaxNode {
5030        self.node.clone()
5031    }
5032    fn stable_ptr(&self) -> Self::StablePtr {
5033        ExprWhilePtr(self.node.0.stable_ptr)
5034    }
5035}
5036impl From<&ExprWhile> for SyntaxStablePtrId {
5037    fn from(node: &ExprWhile) -> Self {
5038        node.stable_ptr().untyped()
5039    }
5040}
5041#[derive(Clone, Debug, Eq, Hash, PartialEq)]
5042pub struct ExprFor {
5043    node: SyntaxNode,
5044    children: Arc<[SyntaxNode]>,
5045}
5046impl ExprFor {
5047    pub const INDEX_FOR_KW: usize = 0;
5048    pub const INDEX_PATTERN: usize = 1;
5049    pub const INDEX_IDENTIFIER: usize = 2;
5050    pub const INDEX_EXPR: usize = 3;
5051    pub const INDEX_BODY: usize = 4;
5052    pub fn new_green(
5053        db: &dyn SyntaxGroup,
5054        for_kw: TerminalForGreen,
5055        pattern: PatternGreen,
5056        identifier: TerminalIdentifierGreen,
5057        expr: ExprGreen,
5058        body: ExprBlockGreen,
5059    ) -> ExprForGreen {
5060        let children: Vec<GreenId> = vec![for_kw.0, pattern.0, identifier.0, expr.0, body.0];
5061        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
5062        ExprForGreen(
5063            Arc::new(GreenNode {
5064                kind: SyntaxKind::ExprFor,
5065                details: GreenNodeDetails::Node { children, width },
5066            })
5067            .intern(db),
5068        )
5069    }
5070}
5071impl ExprFor {
5072    pub fn for_kw(&self, db: &dyn SyntaxGroup) -> TerminalFor {
5073        TerminalFor::from_syntax_node(db, self.children[0].clone())
5074    }
5075    pub fn pattern(&self, db: &dyn SyntaxGroup) -> Pattern {
5076        Pattern::from_syntax_node(db, self.children[1].clone())
5077    }
5078    pub fn identifier(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier {
5079        TerminalIdentifier::from_syntax_node(db, self.children[2].clone())
5080    }
5081    pub fn expr(&self, db: &dyn SyntaxGroup) -> Expr {
5082        Expr::from_syntax_node(db, self.children[3].clone())
5083    }
5084    pub fn body(&self, db: &dyn SyntaxGroup) -> ExprBlock {
5085        ExprBlock::from_syntax_node(db, self.children[4].clone())
5086    }
5087}
5088#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
5089pub struct ExprForPtr(pub SyntaxStablePtrId);
5090impl ExprForPtr {
5091    pub fn pattern_green(self, db: &dyn SyntaxGroup) -> PatternGreen {
5092        let ptr = self.0.lookup_intern(db);
5093        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
5094            PatternGreen(key_fields[0])
5095        } else {
5096            panic!("Unexpected key field query on root.");
5097        }
5098    }
5099    pub fn identifier_green(self, db: &dyn SyntaxGroup) -> TerminalIdentifierGreen {
5100        let ptr = self.0.lookup_intern(db);
5101        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
5102            TerminalIdentifierGreen(key_fields[1])
5103        } else {
5104            panic!("Unexpected key field query on root.");
5105        }
5106    }
5107}
5108impl TypedStablePtr for ExprForPtr {
5109    type SyntaxNode = ExprFor;
5110    fn untyped(&self) -> SyntaxStablePtrId {
5111        self.0
5112    }
5113    fn lookup(&self, db: &dyn SyntaxGroup) -> ExprFor {
5114        ExprFor::from_syntax_node(db, self.0.lookup(db))
5115    }
5116}
5117impl From<ExprForPtr> for SyntaxStablePtrId {
5118    fn from(ptr: ExprForPtr) -> Self {
5119        ptr.untyped()
5120    }
5121}
5122#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
5123pub struct ExprForGreen(pub GreenId);
5124impl TypedSyntaxNode for ExprFor {
5125    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprFor);
5126    type StablePtr = ExprForPtr;
5127    type Green = ExprForGreen;
5128    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
5129        ExprForGreen(
5130            Arc::new(GreenNode {
5131                kind: SyntaxKind::ExprFor,
5132                details: GreenNodeDetails::Node {
5133                    children: vec![
5134                        TerminalFor::missing(db).0,
5135                        Pattern::missing(db).0,
5136                        TerminalIdentifier::missing(db).0,
5137                        Expr::missing(db).0,
5138                        ExprBlock::missing(db).0,
5139                    ],
5140                    width: TextWidth::default(),
5141                },
5142            })
5143            .intern(db),
5144        )
5145    }
5146    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
5147        let kind = node.kind(db);
5148        assert_eq!(
5149            kind,
5150            SyntaxKind::ExprFor,
5151            "Unexpected SyntaxKind {:?}. Expected {:?}.",
5152            kind,
5153            SyntaxKind::ExprFor
5154        );
5155        let children = db.get_children(node.clone());
5156        Self { node, children }
5157    }
5158    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
5159        let kind = node.kind(db);
5160        if kind == SyntaxKind::ExprFor { Some(Self::from_syntax_node(db, node)) } else { None }
5161    }
5162    fn as_syntax_node(&self) -> SyntaxNode {
5163        self.node.clone()
5164    }
5165    fn stable_ptr(&self) -> Self::StablePtr {
5166        ExprForPtr(self.node.0.stable_ptr)
5167    }
5168}
5169impl From<&ExprFor> for SyntaxStablePtrId {
5170    fn from(node: &ExprFor) -> Self {
5171        node.stable_ptr().untyped()
5172    }
5173}
5174#[derive(Clone, Debug, Eq, Hash, PartialEq)]
5175pub struct ElseClause {
5176    node: SyntaxNode,
5177    children: Arc<[SyntaxNode]>,
5178}
5179impl ElseClause {
5180    pub const INDEX_ELSE_KW: usize = 0;
5181    pub const INDEX_ELSE_BLOCK_OR_IF: usize = 1;
5182    pub fn new_green(
5183        db: &dyn SyntaxGroup,
5184        else_kw: TerminalElseGreen,
5185        else_block_or_if: BlockOrIfGreen,
5186    ) -> ElseClauseGreen {
5187        let children: Vec<GreenId> = vec![else_kw.0, else_block_or_if.0];
5188        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
5189        ElseClauseGreen(
5190            Arc::new(GreenNode {
5191                kind: SyntaxKind::ElseClause,
5192                details: GreenNodeDetails::Node { children, width },
5193            })
5194            .intern(db),
5195        )
5196    }
5197}
5198impl ElseClause {
5199    pub fn else_kw(&self, db: &dyn SyntaxGroup) -> TerminalElse {
5200        TerminalElse::from_syntax_node(db, self.children[0].clone())
5201    }
5202    pub fn else_block_or_if(&self, db: &dyn SyntaxGroup) -> BlockOrIf {
5203        BlockOrIf::from_syntax_node(db, self.children[1].clone())
5204    }
5205}
5206#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
5207pub struct ElseClausePtr(pub SyntaxStablePtrId);
5208impl ElseClausePtr {}
5209impl TypedStablePtr for ElseClausePtr {
5210    type SyntaxNode = ElseClause;
5211    fn untyped(&self) -> SyntaxStablePtrId {
5212        self.0
5213    }
5214    fn lookup(&self, db: &dyn SyntaxGroup) -> ElseClause {
5215        ElseClause::from_syntax_node(db, self.0.lookup(db))
5216    }
5217}
5218impl From<ElseClausePtr> for SyntaxStablePtrId {
5219    fn from(ptr: ElseClausePtr) -> Self {
5220        ptr.untyped()
5221    }
5222}
5223#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
5224pub struct ElseClauseGreen(pub GreenId);
5225impl TypedSyntaxNode for ElseClause {
5226    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ElseClause);
5227    type StablePtr = ElseClausePtr;
5228    type Green = ElseClauseGreen;
5229    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
5230        ElseClauseGreen(
5231            Arc::new(GreenNode {
5232                kind: SyntaxKind::ElseClause,
5233                details: GreenNodeDetails::Node {
5234                    children: vec![TerminalElse::missing(db).0, BlockOrIf::missing(db).0],
5235                    width: TextWidth::default(),
5236                },
5237            })
5238            .intern(db),
5239        )
5240    }
5241    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
5242        let kind = node.kind(db);
5243        assert_eq!(
5244            kind,
5245            SyntaxKind::ElseClause,
5246            "Unexpected SyntaxKind {:?}. Expected {:?}.",
5247            kind,
5248            SyntaxKind::ElseClause
5249        );
5250        let children = db.get_children(node.clone());
5251        Self { node, children }
5252    }
5253    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
5254        let kind = node.kind(db);
5255        if kind == SyntaxKind::ElseClause { Some(Self::from_syntax_node(db, node)) } else { None }
5256    }
5257    fn as_syntax_node(&self) -> SyntaxNode {
5258        self.node.clone()
5259    }
5260    fn stable_ptr(&self) -> Self::StablePtr {
5261        ElseClausePtr(self.node.0.stable_ptr)
5262    }
5263}
5264impl From<&ElseClause> for SyntaxStablePtrId {
5265    fn from(node: &ElseClause) -> Self {
5266        node.stable_ptr().untyped()
5267    }
5268}
5269#[derive(Clone, Debug, Eq, Hash, PartialEq)]
5270pub enum OptionElseClause {
5271    Empty(OptionElseClauseEmpty),
5272    ElseClause(ElseClause),
5273}
5274#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
5275pub struct OptionElseClausePtr(pub SyntaxStablePtrId);
5276impl TypedStablePtr for OptionElseClausePtr {
5277    type SyntaxNode = OptionElseClause;
5278    fn untyped(&self) -> SyntaxStablePtrId {
5279        self.0
5280    }
5281    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionElseClause {
5282        OptionElseClause::from_syntax_node(db, self.0.lookup(db))
5283    }
5284}
5285impl From<OptionElseClausePtr> for SyntaxStablePtrId {
5286    fn from(ptr: OptionElseClausePtr) -> Self {
5287        ptr.untyped()
5288    }
5289}
5290impl From<OptionElseClauseEmptyPtr> for OptionElseClausePtr {
5291    fn from(value: OptionElseClauseEmptyPtr) -> Self {
5292        Self(value.0)
5293    }
5294}
5295impl From<ElseClausePtr> for OptionElseClausePtr {
5296    fn from(value: ElseClausePtr) -> Self {
5297        Self(value.0)
5298    }
5299}
5300impl From<OptionElseClauseEmptyGreen> for OptionElseClauseGreen {
5301    fn from(value: OptionElseClauseEmptyGreen) -> Self {
5302        Self(value.0)
5303    }
5304}
5305impl From<ElseClauseGreen> for OptionElseClauseGreen {
5306    fn from(value: ElseClauseGreen) -> Self {
5307        Self(value.0)
5308    }
5309}
5310#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
5311pub struct OptionElseClauseGreen(pub GreenId);
5312impl TypedSyntaxNode for OptionElseClause {
5313    const OPTIONAL_KIND: Option<SyntaxKind> = None;
5314    type StablePtr = OptionElseClausePtr;
5315    type Green = OptionElseClauseGreen;
5316    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
5317        panic!("No missing variant.");
5318    }
5319    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
5320        let kind = node.kind(db);
5321        match kind {
5322            SyntaxKind::OptionElseClauseEmpty => {
5323                OptionElseClause::Empty(OptionElseClauseEmpty::from_syntax_node(db, node))
5324            }
5325            SyntaxKind::ElseClause => {
5326                OptionElseClause::ElseClause(ElseClause::from_syntax_node(db, node))
5327            }
5328            _ => panic!(
5329                "Unexpected syntax kind {:?} when constructing {}.",
5330                kind, "OptionElseClause"
5331            ),
5332        }
5333    }
5334    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
5335        let kind = node.kind(db);
5336        match kind {
5337            SyntaxKind::OptionElseClauseEmpty => {
5338                Some(OptionElseClause::Empty(OptionElseClauseEmpty::from_syntax_node(db, node)))
5339            }
5340            SyntaxKind::ElseClause => {
5341                Some(OptionElseClause::ElseClause(ElseClause::from_syntax_node(db, node)))
5342            }
5343            _ => None,
5344        }
5345    }
5346    fn as_syntax_node(&self) -> SyntaxNode {
5347        match self {
5348            OptionElseClause::Empty(x) => x.as_syntax_node(),
5349            OptionElseClause::ElseClause(x) => x.as_syntax_node(),
5350        }
5351    }
5352    fn stable_ptr(&self) -> Self::StablePtr {
5353        OptionElseClausePtr(self.as_syntax_node().0.stable_ptr)
5354    }
5355}
5356impl From<&OptionElseClause> for SyntaxStablePtrId {
5357    fn from(node: &OptionElseClause) -> Self {
5358        node.stable_ptr().untyped()
5359    }
5360}
5361impl OptionElseClause {
5362    /// Checks if a kind of a variant of [OptionElseClause].
5363    pub fn is_variant(kind: SyntaxKind) -> bool {
5364        matches!(kind, SyntaxKind::OptionElseClauseEmpty | SyntaxKind::ElseClause)
5365    }
5366}
5367#[derive(Clone, Debug, Eq, Hash, PartialEq)]
5368pub struct OptionElseClauseEmpty {
5369    node: SyntaxNode,
5370    children: Arc<[SyntaxNode]>,
5371}
5372impl OptionElseClauseEmpty {
5373    pub fn new_green(db: &dyn SyntaxGroup) -> OptionElseClauseEmptyGreen {
5374        let children: Vec<GreenId> = vec![];
5375        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
5376        OptionElseClauseEmptyGreen(
5377            Arc::new(GreenNode {
5378                kind: SyntaxKind::OptionElseClauseEmpty,
5379                details: GreenNodeDetails::Node { children, width },
5380            })
5381            .intern(db),
5382        )
5383    }
5384}
5385impl OptionElseClauseEmpty {}
5386#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
5387pub struct OptionElseClauseEmptyPtr(pub SyntaxStablePtrId);
5388impl OptionElseClauseEmptyPtr {}
5389impl TypedStablePtr for OptionElseClauseEmptyPtr {
5390    type SyntaxNode = OptionElseClauseEmpty;
5391    fn untyped(&self) -> SyntaxStablePtrId {
5392        self.0
5393    }
5394    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionElseClauseEmpty {
5395        OptionElseClauseEmpty::from_syntax_node(db, self.0.lookup(db))
5396    }
5397}
5398impl From<OptionElseClauseEmptyPtr> for SyntaxStablePtrId {
5399    fn from(ptr: OptionElseClauseEmptyPtr) -> Self {
5400        ptr.untyped()
5401    }
5402}
5403#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
5404pub struct OptionElseClauseEmptyGreen(pub GreenId);
5405impl TypedSyntaxNode for OptionElseClauseEmpty {
5406    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionElseClauseEmpty);
5407    type StablePtr = OptionElseClauseEmptyPtr;
5408    type Green = OptionElseClauseEmptyGreen;
5409    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
5410        OptionElseClauseEmptyGreen(
5411            Arc::new(GreenNode {
5412                kind: SyntaxKind::OptionElseClauseEmpty,
5413                details: GreenNodeDetails::Node { children: vec![], width: TextWidth::default() },
5414            })
5415            .intern(db),
5416        )
5417    }
5418    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
5419        let kind = node.kind(db);
5420        assert_eq!(
5421            kind,
5422            SyntaxKind::OptionElseClauseEmpty,
5423            "Unexpected SyntaxKind {:?}. Expected {:?}.",
5424            kind,
5425            SyntaxKind::OptionElseClauseEmpty
5426        );
5427        let children = db.get_children(node.clone());
5428        Self { node, children }
5429    }
5430    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
5431        let kind = node.kind(db);
5432        if kind == SyntaxKind::OptionElseClauseEmpty {
5433            Some(Self::from_syntax_node(db, node))
5434        } else {
5435            None
5436        }
5437    }
5438    fn as_syntax_node(&self) -> SyntaxNode {
5439        self.node.clone()
5440    }
5441    fn stable_ptr(&self) -> Self::StablePtr {
5442        OptionElseClauseEmptyPtr(self.node.0.stable_ptr)
5443    }
5444}
5445impl From<&OptionElseClauseEmpty> for SyntaxStablePtrId {
5446    fn from(node: &OptionElseClauseEmpty) -> Self {
5447        node.stable_ptr().untyped()
5448    }
5449}
5450#[derive(Clone, Debug, Eq, Hash, PartialEq)]
5451pub struct ExprErrorPropagate {
5452    node: SyntaxNode,
5453    children: Arc<[SyntaxNode]>,
5454}
5455impl ExprErrorPropagate {
5456    pub const INDEX_EXPR: usize = 0;
5457    pub const INDEX_OP: usize = 1;
5458    pub fn new_green(
5459        db: &dyn SyntaxGroup,
5460        expr: ExprGreen,
5461        op: TerminalQuestionMarkGreen,
5462    ) -> ExprErrorPropagateGreen {
5463        let children: Vec<GreenId> = vec![expr.0, op.0];
5464        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
5465        ExprErrorPropagateGreen(
5466            Arc::new(GreenNode {
5467                kind: SyntaxKind::ExprErrorPropagate,
5468                details: GreenNodeDetails::Node { children, width },
5469            })
5470            .intern(db),
5471        )
5472    }
5473}
5474impl ExprErrorPropagate {
5475    pub fn expr(&self, db: &dyn SyntaxGroup) -> Expr {
5476        Expr::from_syntax_node(db, self.children[0].clone())
5477    }
5478    pub fn op(&self, db: &dyn SyntaxGroup) -> TerminalQuestionMark {
5479        TerminalQuestionMark::from_syntax_node(db, self.children[1].clone())
5480    }
5481}
5482#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
5483pub struct ExprErrorPropagatePtr(pub SyntaxStablePtrId);
5484impl ExprErrorPropagatePtr {}
5485impl TypedStablePtr for ExprErrorPropagatePtr {
5486    type SyntaxNode = ExprErrorPropagate;
5487    fn untyped(&self) -> SyntaxStablePtrId {
5488        self.0
5489    }
5490    fn lookup(&self, db: &dyn SyntaxGroup) -> ExprErrorPropagate {
5491        ExprErrorPropagate::from_syntax_node(db, self.0.lookup(db))
5492    }
5493}
5494impl From<ExprErrorPropagatePtr> for SyntaxStablePtrId {
5495    fn from(ptr: ExprErrorPropagatePtr) -> Self {
5496        ptr.untyped()
5497    }
5498}
5499#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
5500pub struct ExprErrorPropagateGreen(pub GreenId);
5501impl TypedSyntaxNode for ExprErrorPropagate {
5502    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprErrorPropagate);
5503    type StablePtr = ExprErrorPropagatePtr;
5504    type Green = ExprErrorPropagateGreen;
5505    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
5506        ExprErrorPropagateGreen(
5507            Arc::new(GreenNode {
5508                kind: SyntaxKind::ExprErrorPropagate,
5509                details: GreenNodeDetails::Node {
5510                    children: vec![Expr::missing(db).0, TerminalQuestionMark::missing(db).0],
5511                    width: TextWidth::default(),
5512                },
5513            })
5514            .intern(db),
5515        )
5516    }
5517    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
5518        let kind = node.kind(db);
5519        assert_eq!(
5520            kind,
5521            SyntaxKind::ExprErrorPropagate,
5522            "Unexpected SyntaxKind {:?}. Expected {:?}.",
5523            kind,
5524            SyntaxKind::ExprErrorPropagate
5525        );
5526        let children = db.get_children(node.clone());
5527        Self { node, children }
5528    }
5529    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
5530        let kind = node.kind(db);
5531        if kind == SyntaxKind::ExprErrorPropagate {
5532            Some(Self::from_syntax_node(db, node))
5533        } else {
5534            None
5535        }
5536    }
5537    fn as_syntax_node(&self) -> SyntaxNode {
5538        self.node.clone()
5539    }
5540    fn stable_ptr(&self) -> Self::StablePtr {
5541        ExprErrorPropagatePtr(self.node.0.stable_ptr)
5542    }
5543}
5544impl From<&ExprErrorPropagate> for SyntaxStablePtrId {
5545    fn from(node: &ExprErrorPropagate) -> Self {
5546        node.stable_ptr().untyped()
5547    }
5548}
5549#[derive(Clone, Debug, Eq, Hash, PartialEq)]
5550pub struct ExprIndexed {
5551    node: SyntaxNode,
5552    children: Arc<[SyntaxNode]>,
5553}
5554impl ExprIndexed {
5555    pub const INDEX_EXPR: usize = 0;
5556    pub const INDEX_LBRACK: usize = 1;
5557    pub const INDEX_INDEX_EXPR: usize = 2;
5558    pub const INDEX_RBRACK: usize = 3;
5559    pub fn new_green(
5560        db: &dyn SyntaxGroup,
5561        expr: ExprGreen,
5562        lbrack: TerminalLBrackGreen,
5563        index_expr: ExprGreen,
5564        rbrack: TerminalRBrackGreen,
5565    ) -> ExprIndexedGreen {
5566        let children: Vec<GreenId> = vec![expr.0, lbrack.0, index_expr.0, rbrack.0];
5567        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
5568        ExprIndexedGreen(
5569            Arc::new(GreenNode {
5570                kind: SyntaxKind::ExprIndexed,
5571                details: GreenNodeDetails::Node { children, width },
5572            })
5573            .intern(db),
5574        )
5575    }
5576}
5577impl ExprIndexed {
5578    pub fn expr(&self, db: &dyn SyntaxGroup) -> Expr {
5579        Expr::from_syntax_node(db, self.children[0].clone())
5580    }
5581    pub fn lbrack(&self, db: &dyn SyntaxGroup) -> TerminalLBrack {
5582        TerminalLBrack::from_syntax_node(db, self.children[1].clone())
5583    }
5584    pub fn index_expr(&self, db: &dyn SyntaxGroup) -> Expr {
5585        Expr::from_syntax_node(db, self.children[2].clone())
5586    }
5587    pub fn rbrack(&self, db: &dyn SyntaxGroup) -> TerminalRBrack {
5588        TerminalRBrack::from_syntax_node(db, self.children[3].clone())
5589    }
5590}
5591#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
5592pub struct ExprIndexedPtr(pub SyntaxStablePtrId);
5593impl ExprIndexedPtr {}
5594impl TypedStablePtr for ExprIndexedPtr {
5595    type SyntaxNode = ExprIndexed;
5596    fn untyped(&self) -> SyntaxStablePtrId {
5597        self.0
5598    }
5599    fn lookup(&self, db: &dyn SyntaxGroup) -> ExprIndexed {
5600        ExprIndexed::from_syntax_node(db, self.0.lookup(db))
5601    }
5602}
5603impl From<ExprIndexedPtr> for SyntaxStablePtrId {
5604    fn from(ptr: ExprIndexedPtr) -> Self {
5605        ptr.untyped()
5606    }
5607}
5608#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
5609pub struct ExprIndexedGreen(pub GreenId);
5610impl TypedSyntaxNode for ExprIndexed {
5611    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprIndexed);
5612    type StablePtr = ExprIndexedPtr;
5613    type Green = ExprIndexedGreen;
5614    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
5615        ExprIndexedGreen(
5616            Arc::new(GreenNode {
5617                kind: SyntaxKind::ExprIndexed,
5618                details: GreenNodeDetails::Node {
5619                    children: vec![
5620                        Expr::missing(db).0,
5621                        TerminalLBrack::missing(db).0,
5622                        Expr::missing(db).0,
5623                        TerminalRBrack::missing(db).0,
5624                    ],
5625                    width: TextWidth::default(),
5626                },
5627            })
5628            .intern(db),
5629        )
5630    }
5631    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
5632        let kind = node.kind(db);
5633        assert_eq!(
5634            kind,
5635            SyntaxKind::ExprIndexed,
5636            "Unexpected SyntaxKind {:?}. Expected {:?}.",
5637            kind,
5638            SyntaxKind::ExprIndexed
5639        );
5640        let children = db.get_children(node.clone());
5641        Self { node, children }
5642    }
5643    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
5644        let kind = node.kind(db);
5645        if kind == SyntaxKind::ExprIndexed { Some(Self::from_syntax_node(db, node)) } else { None }
5646    }
5647    fn as_syntax_node(&self) -> SyntaxNode {
5648        self.node.clone()
5649    }
5650    fn stable_ptr(&self) -> Self::StablePtr {
5651        ExprIndexedPtr(self.node.0.stable_ptr)
5652    }
5653}
5654impl From<&ExprIndexed> for SyntaxStablePtrId {
5655    fn from(node: &ExprIndexed) -> Self {
5656        node.stable_ptr().untyped()
5657    }
5658}
5659#[derive(Clone, Debug, Eq, Hash, PartialEq)]
5660pub struct ExprInlineMacro {
5661    node: SyntaxNode,
5662    children: Arc<[SyntaxNode]>,
5663}
5664impl ExprInlineMacro {
5665    pub const INDEX_PATH: usize = 0;
5666    pub const INDEX_BANG: usize = 1;
5667    pub const INDEX_ARGUMENTS: usize = 2;
5668    pub fn new_green(
5669        db: &dyn SyntaxGroup,
5670        path: ExprPathGreen,
5671        bang: TerminalNotGreen,
5672        arguments: WrappedArgListGreen,
5673    ) -> ExprInlineMacroGreen {
5674        let children: Vec<GreenId> = vec![path.0, bang.0, arguments.0];
5675        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
5676        ExprInlineMacroGreen(
5677            Arc::new(GreenNode {
5678                kind: SyntaxKind::ExprInlineMacro,
5679                details: GreenNodeDetails::Node { children, width },
5680            })
5681            .intern(db),
5682        )
5683    }
5684}
5685impl ExprInlineMacro {
5686    pub fn path(&self, db: &dyn SyntaxGroup) -> ExprPath {
5687        ExprPath::from_syntax_node(db, self.children[0].clone())
5688    }
5689    pub fn bang(&self, db: &dyn SyntaxGroup) -> TerminalNot {
5690        TerminalNot::from_syntax_node(db, self.children[1].clone())
5691    }
5692    pub fn arguments(&self, db: &dyn SyntaxGroup) -> WrappedArgList {
5693        WrappedArgList::from_syntax_node(db, self.children[2].clone())
5694    }
5695}
5696#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
5697pub struct ExprInlineMacroPtr(pub SyntaxStablePtrId);
5698impl ExprInlineMacroPtr {}
5699impl TypedStablePtr for ExprInlineMacroPtr {
5700    type SyntaxNode = ExprInlineMacro;
5701    fn untyped(&self) -> SyntaxStablePtrId {
5702        self.0
5703    }
5704    fn lookup(&self, db: &dyn SyntaxGroup) -> ExprInlineMacro {
5705        ExprInlineMacro::from_syntax_node(db, self.0.lookup(db))
5706    }
5707}
5708impl From<ExprInlineMacroPtr> for SyntaxStablePtrId {
5709    fn from(ptr: ExprInlineMacroPtr) -> Self {
5710        ptr.untyped()
5711    }
5712}
5713#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
5714pub struct ExprInlineMacroGreen(pub GreenId);
5715impl TypedSyntaxNode for ExprInlineMacro {
5716    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprInlineMacro);
5717    type StablePtr = ExprInlineMacroPtr;
5718    type Green = ExprInlineMacroGreen;
5719    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
5720        ExprInlineMacroGreen(
5721            Arc::new(GreenNode {
5722                kind: SyntaxKind::ExprInlineMacro,
5723                details: GreenNodeDetails::Node {
5724                    children: vec![
5725                        ExprPath::missing(db).0,
5726                        TerminalNot::missing(db).0,
5727                        WrappedArgList::missing(db).0,
5728                    ],
5729                    width: TextWidth::default(),
5730                },
5731            })
5732            .intern(db),
5733        )
5734    }
5735    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
5736        let kind = node.kind(db);
5737        assert_eq!(
5738            kind,
5739            SyntaxKind::ExprInlineMacro,
5740            "Unexpected SyntaxKind {:?}. Expected {:?}.",
5741            kind,
5742            SyntaxKind::ExprInlineMacro
5743        );
5744        let children = db.get_children(node.clone());
5745        Self { node, children }
5746    }
5747    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
5748        let kind = node.kind(db);
5749        if kind == SyntaxKind::ExprInlineMacro {
5750            Some(Self::from_syntax_node(db, node))
5751        } else {
5752            None
5753        }
5754    }
5755    fn as_syntax_node(&self) -> SyntaxNode {
5756        self.node.clone()
5757    }
5758    fn stable_ptr(&self) -> Self::StablePtr {
5759        ExprInlineMacroPtr(self.node.0.stable_ptr)
5760    }
5761}
5762impl From<&ExprInlineMacro> for SyntaxStablePtrId {
5763    fn from(node: &ExprInlineMacro) -> Self {
5764        node.stable_ptr().untyped()
5765    }
5766}
5767#[derive(Clone, Debug, Eq, Hash, PartialEq)]
5768pub struct ExprFixedSizeArray {
5769    node: SyntaxNode,
5770    children: Arc<[SyntaxNode]>,
5771}
5772impl ExprFixedSizeArray {
5773    pub const INDEX_LBRACK: usize = 0;
5774    pub const INDEX_EXPRS: usize = 1;
5775    pub const INDEX_SIZE: usize = 2;
5776    pub const INDEX_RBRACK: usize = 3;
5777    pub fn new_green(
5778        db: &dyn SyntaxGroup,
5779        lbrack: TerminalLBrackGreen,
5780        exprs: ExprListGreen,
5781        size: OptionFixedSizeArraySizeGreen,
5782        rbrack: TerminalRBrackGreen,
5783    ) -> ExprFixedSizeArrayGreen {
5784        let children: Vec<GreenId> = vec![lbrack.0, exprs.0, size.0, rbrack.0];
5785        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
5786        ExprFixedSizeArrayGreen(
5787            Arc::new(GreenNode {
5788                kind: SyntaxKind::ExprFixedSizeArray,
5789                details: GreenNodeDetails::Node { children, width },
5790            })
5791            .intern(db),
5792        )
5793    }
5794}
5795impl ExprFixedSizeArray {
5796    pub fn lbrack(&self, db: &dyn SyntaxGroup) -> TerminalLBrack {
5797        TerminalLBrack::from_syntax_node(db, self.children[0].clone())
5798    }
5799    pub fn exprs(&self, db: &dyn SyntaxGroup) -> ExprList {
5800        ExprList::from_syntax_node(db, self.children[1].clone())
5801    }
5802    pub fn size(&self, db: &dyn SyntaxGroup) -> OptionFixedSizeArraySize {
5803        OptionFixedSizeArraySize::from_syntax_node(db, self.children[2].clone())
5804    }
5805    pub fn rbrack(&self, db: &dyn SyntaxGroup) -> TerminalRBrack {
5806        TerminalRBrack::from_syntax_node(db, self.children[3].clone())
5807    }
5808}
5809#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
5810pub struct ExprFixedSizeArrayPtr(pub SyntaxStablePtrId);
5811impl ExprFixedSizeArrayPtr {}
5812impl TypedStablePtr for ExprFixedSizeArrayPtr {
5813    type SyntaxNode = ExprFixedSizeArray;
5814    fn untyped(&self) -> SyntaxStablePtrId {
5815        self.0
5816    }
5817    fn lookup(&self, db: &dyn SyntaxGroup) -> ExprFixedSizeArray {
5818        ExprFixedSizeArray::from_syntax_node(db, self.0.lookup(db))
5819    }
5820}
5821impl From<ExprFixedSizeArrayPtr> for SyntaxStablePtrId {
5822    fn from(ptr: ExprFixedSizeArrayPtr) -> Self {
5823        ptr.untyped()
5824    }
5825}
5826#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
5827pub struct ExprFixedSizeArrayGreen(pub GreenId);
5828impl TypedSyntaxNode for ExprFixedSizeArray {
5829    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprFixedSizeArray);
5830    type StablePtr = ExprFixedSizeArrayPtr;
5831    type Green = ExprFixedSizeArrayGreen;
5832    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
5833        ExprFixedSizeArrayGreen(
5834            Arc::new(GreenNode {
5835                kind: SyntaxKind::ExprFixedSizeArray,
5836                details: GreenNodeDetails::Node {
5837                    children: vec![
5838                        TerminalLBrack::missing(db).0,
5839                        ExprList::missing(db).0,
5840                        OptionFixedSizeArraySize::missing(db).0,
5841                        TerminalRBrack::missing(db).0,
5842                    ],
5843                    width: TextWidth::default(),
5844                },
5845            })
5846            .intern(db),
5847        )
5848    }
5849    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
5850        let kind = node.kind(db);
5851        assert_eq!(
5852            kind,
5853            SyntaxKind::ExprFixedSizeArray,
5854            "Unexpected SyntaxKind {:?}. Expected {:?}.",
5855            kind,
5856            SyntaxKind::ExprFixedSizeArray
5857        );
5858        let children = db.get_children(node.clone());
5859        Self { node, children }
5860    }
5861    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
5862        let kind = node.kind(db);
5863        if kind == SyntaxKind::ExprFixedSizeArray {
5864            Some(Self::from_syntax_node(db, node))
5865        } else {
5866            None
5867        }
5868    }
5869    fn as_syntax_node(&self) -> SyntaxNode {
5870        self.node.clone()
5871    }
5872    fn stable_ptr(&self) -> Self::StablePtr {
5873        ExprFixedSizeArrayPtr(self.node.0.stable_ptr)
5874    }
5875}
5876impl From<&ExprFixedSizeArray> for SyntaxStablePtrId {
5877    fn from(node: &ExprFixedSizeArray) -> Self {
5878        node.stable_ptr().untyped()
5879    }
5880}
5881#[derive(Clone, Debug, Eq, Hash, PartialEq)]
5882pub struct FixedSizeArraySize {
5883    node: SyntaxNode,
5884    children: Arc<[SyntaxNode]>,
5885}
5886impl FixedSizeArraySize {
5887    pub const INDEX_SEMICOLON: usize = 0;
5888    pub const INDEX_SIZE: usize = 1;
5889    pub fn new_green(
5890        db: &dyn SyntaxGroup,
5891        semicolon: TerminalSemicolonGreen,
5892        size: ExprGreen,
5893    ) -> FixedSizeArraySizeGreen {
5894        let children: Vec<GreenId> = vec![semicolon.0, size.0];
5895        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
5896        FixedSizeArraySizeGreen(
5897            Arc::new(GreenNode {
5898                kind: SyntaxKind::FixedSizeArraySize,
5899                details: GreenNodeDetails::Node { children, width },
5900            })
5901            .intern(db),
5902        )
5903    }
5904}
5905impl FixedSizeArraySize {
5906    pub fn semicolon(&self, db: &dyn SyntaxGroup) -> TerminalSemicolon {
5907        TerminalSemicolon::from_syntax_node(db, self.children[0].clone())
5908    }
5909    pub fn size(&self, db: &dyn SyntaxGroup) -> Expr {
5910        Expr::from_syntax_node(db, self.children[1].clone())
5911    }
5912}
5913#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
5914pub struct FixedSizeArraySizePtr(pub SyntaxStablePtrId);
5915impl FixedSizeArraySizePtr {}
5916impl TypedStablePtr for FixedSizeArraySizePtr {
5917    type SyntaxNode = FixedSizeArraySize;
5918    fn untyped(&self) -> SyntaxStablePtrId {
5919        self.0
5920    }
5921    fn lookup(&self, db: &dyn SyntaxGroup) -> FixedSizeArraySize {
5922        FixedSizeArraySize::from_syntax_node(db, self.0.lookup(db))
5923    }
5924}
5925impl From<FixedSizeArraySizePtr> for SyntaxStablePtrId {
5926    fn from(ptr: FixedSizeArraySizePtr) -> Self {
5927        ptr.untyped()
5928    }
5929}
5930#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
5931pub struct FixedSizeArraySizeGreen(pub GreenId);
5932impl TypedSyntaxNode for FixedSizeArraySize {
5933    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::FixedSizeArraySize);
5934    type StablePtr = FixedSizeArraySizePtr;
5935    type Green = FixedSizeArraySizeGreen;
5936    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
5937        FixedSizeArraySizeGreen(
5938            Arc::new(GreenNode {
5939                kind: SyntaxKind::FixedSizeArraySize,
5940                details: GreenNodeDetails::Node {
5941                    children: vec![TerminalSemicolon::missing(db).0, Expr::missing(db).0],
5942                    width: TextWidth::default(),
5943                },
5944            })
5945            .intern(db),
5946        )
5947    }
5948    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
5949        let kind = node.kind(db);
5950        assert_eq!(
5951            kind,
5952            SyntaxKind::FixedSizeArraySize,
5953            "Unexpected SyntaxKind {:?}. Expected {:?}.",
5954            kind,
5955            SyntaxKind::FixedSizeArraySize
5956        );
5957        let children = db.get_children(node.clone());
5958        Self { node, children }
5959    }
5960    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
5961        let kind = node.kind(db);
5962        if kind == SyntaxKind::FixedSizeArraySize {
5963            Some(Self::from_syntax_node(db, node))
5964        } else {
5965            None
5966        }
5967    }
5968    fn as_syntax_node(&self) -> SyntaxNode {
5969        self.node.clone()
5970    }
5971    fn stable_ptr(&self) -> Self::StablePtr {
5972        FixedSizeArraySizePtr(self.node.0.stable_ptr)
5973    }
5974}
5975impl From<&FixedSizeArraySize> for SyntaxStablePtrId {
5976    fn from(node: &FixedSizeArraySize) -> Self {
5977        node.stable_ptr().untyped()
5978    }
5979}
5980#[derive(Clone, Debug, Eq, Hash, PartialEq)]
5981pub enum OptionFixedSizeArraySize {
5982    Empty(OptionFixedSizeArraySizeEmpty),
5983    FixedSizeArraySize(FixedSizeArraySize),
5984}
5985#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
5986pub struct OptionFixedSizeArraySizePtr(pub SyntaxStablePtrId);
5987impl TypedStablePtr for OptionFixedSizeArraySizePtr {
5988    type SyntaxNode = OptionFixedSizeArraySize;
5989    fn untyped(&self) -> SyntaxStablePtrId {
5990        self.0
5991    }
5992    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionFixedSizeArraySize {
5993        OptionFixedSizeArraySize::from_syntax_node(db, self.0.lookup(db))
5994    }
5995}
5996impl From<OptionFixedSizeArraySizePtr> for SyntaxStablePtrId {
5997    fn from(ptr: OptionFixedSizeArraySizePtr) -> Self {
5998        ptr.untyped()
5999    }
6000}
6001impl From<OptionFixedSizeArraySizeEmptyPtr> for OptionFixedSizeArraySizePtr {
6002    fn from(value: OptionFixedSizeArraySizeEmptyPtr) -> Self {
6003        Self(value.0)
6004    }
6005}
6006impl From<FixedSizeArraySizePtr> for OptionFixedSizeArraySizePtr {
6007    fn from(value: FixedSizeArraySizePtr) -> Self {
6008        Self(value.0)
6009    }
6010}
6011impl From<OptionFixedSizeArraySizeEmptyGreen> for OptionFixedSizeArraySizeGreen {
6012    fn from(value: OptionFixedSizeArraySizeEmptyGreen) -> Self {
6013        Self(value.0)
6014    }
6015}
6016impl From<FixedSizeArraySizeGreen> for OptionFixedSizeArraySizeGreen {
6017    fn from(value: FixedSizeArraySizeGreen) -> Self {
6018        Self(value.0)
6019    }
6020}
6021#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
6022pub struct OptionFixedSizeArraySizeGreen(pub GreenId);
6023impl TypedSyntaxNode for OptionFixedSizeArraySize {
6024    const OPTIONAL_KIND: Option<SyntaxKind> = None;
6025    type StablePtr = OptionFixedSizeArraySizePtr;
6026    type Green = OptionFixedSizeArraySizeGreen;
6027    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
6028        panic!("No missing variant.");
6029    }
6030    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
6031        let kind = node.kind(db);
6032        match kind {
6033            SyntaxKind::OptionFixedSizeArraySizeEmpty => OptionFixedSizeArraySize::Empty(
6034                OptionFixedSizeArraySizeEmpty::from_syntax_node(db, node),
6035            ),
6036            SyntaxKind::FixedSizeArraySize => OptionFixedSizeArraySize::FixedSizeArraySize(
6037                FixedSizeArraySize::from_syntax_node(db, node),
6038            ),
6039            _ => panic!(
6040                "Unexpected syntax kind {:?} when constructing {}.",
6041                kind, "OptionFixedSizeArraySize"
6042            ),
6043        }
6044    }
6045    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
6046        let kind = node.kind(db);
6047        match kind {
6048            SyntaxKind::OptionFixedSizeArraySizeEmpty => Some(OptionFixedSizeArraySize::Empty(
6049                OptionFixedSizeArraySizeEmpty::from_syntax_node(db, node),
6050            )),
6051            SyntaxKind::FixedSizeArraySize => Some(OptionFixedSizeArraySize::FixedSizeArraySize(
6052                FixedSizeArraySize::from_syntax_node(db, node),
6053            )),
6054            _ => None,
6055        }
6056    }
6057    fn as_syntax_node(&self) -> SyntaxNode {
6058        match self {
6059            OptionFixedSizeArraySize::Empty(x) => x.as_syntax_node(),
6060            OptionFixedSizeArraySize::FixedSizeArraySize(x) => x.as_syntax_node(),
6061        }
6062    }
6063    fn stable_ptr(&self) -> Self::StablePtr {
6064        OptionFixedSizeArraySizePtr(self.as_syntax_node().0.stable_ptr)
6065    }
6066}
6067impl From<&OptionFixedSizeArraySize> for SyntaxStablePtrId {
6068    fn from(node: &OptionFixedSizeArraySize) -> Self {
6069        node.stable_ptr().untyped()
6070    }
6071}
6072impl OptionFixedSizeArraySize {
6073    /// Checks if a kind of a variant of [OptionFixedSizeArraySize].
6074    pub fn is_variant(kind: SyntaxKind) -> bool {
6075        matches!(kind, SyntaxKind::OptionFixedSizeArraySizeEmpty | SyntaxKind::FixedSizeArraySize)
6076    }
6077}
6078#[derive(Clone, Debug, Eq, Hash, PartialEq)]
6079pub struct OptionFixedSizeArraySizeEmpty {
6080    node: SyntaxNode,
6081    children: Arc<[SyntaxNode]>,
6082}
6083impl OptionFixedSizeArraySizeEmpty {
6084    pub fn new_green(db: &dyn SyntaxGroup) -> OptionFixedSizeArraySizeEmptyGreen {
6085        let children: Vec<GreenId> = vec![];
6086        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
6087        OptionFixedSizeArraySizeEmptyGreen(
6088            Arc::new(GreenNode {
6089                kind: SyntaxKind::OptionFixedSizeArraySizeEmpty,
6090                details: GreenNodeDetails::Node { children, width },
6091            })
6092            .intern(db),
6093        )
6094    }
6095}
6096impl OptionFixedSizeArraySizeEmpty {}
6097#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
6098pub struct OptionFixedSizeArraySizeEmptyPtr(pub SyntaxStablePtrId);
6099impl OptionFixedSizeArraySizeEmptyPtr {}
6100impl TypedStablePtr for OptionFixedSizeArraySizeEmptyPtr {
6101    type SyntaxNode = OptionFixedSizeArraySizeEmpty;
6102    fn untyped(&self) -> SyntaxStablePtrId {
6103        self.0
6104    }
6105    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionFixedSizeArraySizeEmpty {
6106        OptionFixedSizeArraySizeEmpty::from_syntax_node(db, self.0.lookup(db))
6107    }
6108}
6109impl From<OptionFixedSizeArraySizeEmptyPtr> for SyntaxStablePtrId {
6110    fn from(ptr: OptionFixedSizeArraySizeEmptyPtr) -> Self {
6111        ptr.untyped()
6112    }
6113}
6114#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
6115pub struct OptionFixedSizeArraySizeEmptyGreen(pub GreenId);
6116impl TypedSyntaxNode for OptionFixedSizeArraySizeEmpty {
6117    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionFixedSizeArraySizeEmpty);
6118    type StablePtr = OptionFixedSizeArraySizeEmptyPtr;
6119    type Green = OptionFixedSizeArraySizeEmptyGreen;
6120    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
6121        OptionFixedSizeArraySizeEmptyGreen(
6122            Arc::new(GreenNode {
6123                kind: SyntaxKind::OptionFixedSizeArraySizeEmpty,
6124                details: GreenNodeDetails::Node { children: vec![], width: TextWidth::default() },
6125            })
6126            .intern(db),
6127        )
6128    }
6129    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
6130        let kind = node.kind(db);
6131        assert_eq!(
6132            kind,
6133            SyntaxKind::OptionFixedSizeArraySizeEmpty,
6134            "Unexpected SyntaxKind {:?}. Expected {:?}.",
6135            kind,
6136            SyntaxKind::OptionFixedSizeArraySizeEmpty
6137        );
6138        let children = db.get_children(node.clone());
6139        Self { node, children }
6140    }
6141    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
6142        let kind = node.kind(db);
6143        if kind == SyntaxKind::OptionFixedSizeArraySizeEmpty {
6144            Some(Self::from_syntax_node(db, node))
6145        } else {
6146            None
6147        }
6148    }
6149    fn as_syntax_node(&self) -> SyntaxNode {
6150        self.node.clone()
6151    }
6152    fn stable_ptr(&self) -> Self::StablePtr {
6153        OptionFixedSizeArraySizeEmptyPtr(self.node.0.stable_ptr)
6154    }
6155}
6156impl From<&OptionFixedSizeArraySizeEmpty> for SyntaxStablePtrId {
6157    fn from(node: &OptionFixedSizeArraySizeEmpty) -> Self {
6158        node.stable_ptr().untyped()
6159    }
6160}
6161#[derive(Clone, Debug, Eq, Hash, PartialEq)]
6162pub struct ExprClosure {
6163    node: SyntaxNode,
6164    children: Arc<[SyntaxNode]>,
6165}
6166impl ExprClosure {
6167    pub const INDEX_WRAPPER: usize = 0;
6168    pub const INDEX_RET_TY: usize = 1;
6169    pub const INDEX_OPTIONAL_NO_PANIC: usize = 2;
6170    pub const INDEX_EXPR: usize = 3;
6171    pub fn new_green(
6172        db: &dyn SyntaxGroup,
6173        wrapper: ClosureParamWrapperGreen,
6174        ret_ty: OptionReturnTypeClauseGreen,
6175        optional_no_panic: OptionTerminalNoPanicGreen,
6176        expr: ExprGreen,
6177    ) -> ExprClosureGreen {
6178        let children: Vec<GreenId> = vec![wrapper.0, ret_ty.0, optional_no_panic.0, expr.0];
6179        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
6180        ExprClosureGreen(
6181            Arc::new(GreenNode {
6182                kind: SyntaxKind::ExprClosure,
6183                details: GreenNodeDetails::Node { children, width },
6184            })
6185            .intern(db),
6186        )
6187    }
6188}
6189impl ExprClosure {
6190    pub fn wrapper(&self, db: &dyn SyntaxGroup) -> ClosureParamWrapper {
6191        ClosureParamWrapper::from_syntax_node(db, self.children[0].clone())
6192    }
6193    pub fn ret_ty(&self, db: &dyn SyntaxGroup) -> OptionReturnTypeClause {
6194        OptionReturnTypeClause::from_syntax_node(db, self.children[1].clone())
6195    }
6196    pub fn optional_no_panic(&self, db: &dyn SyntaxGroup) -> OptionTerminalNoPanic {
6197        OptionTerminalNoPanic::from_syntax_node(db, self.children[2].clone())
6198    }
6199    pub fn expr(&self, db: &dyn SyntaxGroup) -> Expr {
6200        Expr::from_syntax_node(db, self.children[3].clone())
6201    }
6202}
6203#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
6204pub struct ExprClosurePtr(pub SyntaxStablePtrId);
6205impl ExprClosurePtr {}
6206impl TypedStablePtr for ExprClosurePtr {
6207    type SyntaxNode = ExprClosure;
6208    fn untyped(&self) -> SyntaxStablePtrId {
6209        self.0
6210    }
6211    fn lookup(&self, db: &dyn SyntaxGroup) -> ExprClosure {
6212        ExprClosure::from_syntax_node(db, self.0.lookup(db))
6213    }
6214}
6215impl From<ExprClosurePtr> for SyntaxStablePtrId {
6216    fn from(ptr: ExprClosurePtr) -> Self {
6217        ptr.untyped()
6218    }
6219}
6220#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
6221pub struct ExprClosureGreen(pub GreenId);
6222impl TypedSyntaxNode for ExprClosure {
6223    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprClosure);
6224    type StablePtr = ExprClosurePtr;
6225    type Green = ExprClosureGreen;
6226    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
6227        ExprClosureGreen(
6228            Arc::new(GreenNode {
6229                kind: SyntaxKind::ExprClosure,
6230                details: GreenNodeDetails::Node {
6231                    children: vec![
6232                        ClosureParamWrapper::missing(db).0,
6233                        OptionReturnTypeClause::missing(db).0,
6234                        OptionTerminalNoPanic::missing(db).0,
6235                        Expr::missing(db).0,
6236                    ],
6237                    width: TextWidth::default(),
6238                },
6239            })
6240            .intern(db),
6241        )
6242    }
6243    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
6244        let kind = node.kind(db);
6245        assert_eq!(
6246            kind,
6247            SyntaxKind::ExprClosure,
6248            "Unexpected SyntaxKind {:?}. Expected {:?}.",
6249            kind,
6250            SyntaxKind::ExprClosure
6251        );
6252        let children = db.get_children(node.clone());
6253        Self { node, children }
6254    }
6255    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
6256        let kind = node.kind(db);
6257        if kind == SyntaxKind::ExprClosure { Some(Self::from_syntax_node(db, node)) } else { None }
6258    }
6259    fn as_syntax_node(&self) -> SyntaxNode {
6260        self.node.clone()
6261    }
6262    fn stable_ptr(&self) -> Self::StablePtr {
6263        ExprClosurePtr(self.node.0.stable_ptr)
6264    }
6265}
6266impl From<&ExprClosure> for SyntaxStablePtrId {
6267    fn from(node: &ExprClosure) -> Self {
6268        node.stable_ptr().untyped()
6269    }
6270}
6271#[derive(Clone, Debug, Eq, Hash, PartialEq)]
6272pub enum ClosureParamWrapper {
6273    Nullary(TerminalOrOr),
6274    NAry(ClosureParamWrapperNAry),
6275}
6276#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
6277pub struct ClosureParamWrapperPtr(pub SyntaxStablePtrId);
6278impl TypedStablePtr for ClosureParamWrapperPtr {
6279    type SyntaxNode = ClosureParamWrapper;
6280    fn untyped(&self) -> SyntaxStablePtrId {
6281        self.0
6282    }
6283    fn lookup(&self, db: &dyn SyntaxGroup) -> ClosureParamWrapper {
6284        ClosureParamWrapper::from_syntax_node(db, self.0.lookup(db))
6285    }
6286}
6287impl From<ClosureParamWrapperPtr> for SyntaxStablePtrId {
6288    fn from(ptr: ClosureParamWrapperPtr) -> Self {
6289        ptr.untyped()
6290    }
6291}
6292impl From<TerminalOrOrPtr> for ClosureParamWrapperPtr {
6293    fn from(value: TerminalOrOrPtr) -> Self {
6294        Self(value.0)
6295    }
6296}
6297impl From<ClosureParamWrapperNAryPtr> for ClosureParamWrapperPtr {
6298    fn from(value: ClosureParamWrapperNAryPtr) -> Self {
6299        Self(value.0)
6300    }
6301}
6302impl From<TerminalOrOrGreen> for ClosureParamWrapperGreen {
6303    fn from(value: TerminalOrOrGreen) -> Self {
6304        Self(value.0)
6305    }
6306}
6307impl From<ClosureParamWrapperNAryGreen> for ClosureParamWrapperGreen {
6308    fn from(value: ClosureParamWrapperNAryGreen) -> Self {
6309        Self(value.0)
6310    }
6311}
6312#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
6313pub struct ClosureParamWrapperGreen(pub GreenId);
6314impl TypedSyntaxNode for ClosureParamWrapper {
6315    const OPTIONAL_KIND: Option<SyntaxKind> = None;
6316    type StablePtr = ClosureParamWrapperPtr;
6317    type Green = ClosureParamWrapperGreen;
6318    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
6319        panic!("No missing variant.");
6320    }
6321    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
6322        let kind = node.kind(db);
6323        match kind {
6324            SyntaxKind::TerminalOrOr => {
6325                ClosureParamWrapper::Nullary(TerminalOrOr::from_syntax_node(db, node))
6326            }
6327            SyntaxKind::ClosureParamWrapperNAry => {
6328                ClosureParamWrapper::NAry(ClosureParamWrapperNAry::from_syntax_node(db, node))
6329            }
6330            _ => panic!(
6331                "Unexpected syntax kind {:?} when constructing {}.",
6332                kind, "ClosureParamWrapper"
6333            ),
6334        }
6335    }
6336    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
6337        let kind = node.kind(db);
6338        match kind {
6339            SyntaxKind::TerminalOrOr => {
6340                Some(ClosureParamWrapper::Nullary(TerminalOrOr::from_syntax_node(db, node)))
6341            }
6342            SyntaxKind::ClosureParamWrapperNAry => {
6343                Some(ClosureParamWrapper::NAry(ClosureParamWrapperNAry::from_syntax_node(db, node)))
6344            }
6345            _ => None,
6346        }
6347    }
6348    fn as_syntax_node(&self) -> SyntaxNode {
6349        match self {
6350            ClosureParamWrapper::Nullary(x) => x.as_syntax_node(),
6351            ClosureParamWrapper::NAry(x) => x.as_syntax_node(),
6352        }
6353    }
6354    fn stable_ptr(&self) -> Self::StablePtr {
6355        ClosureParamWrapperPtr(self.as_syntax_node().0.stable_ptr)
6356    }
6357}
6358impl From<&ClosureParamWrapper> for SyntaxStablePtrId {
6359    fn from(node: &ClosureParamWrapper) -> Self {
6360        node.stable_ptr().untyped()
6361    }
6362}
6363impl ClosureParamWrapper {
6364    /// Checks if a kind of a variant of [ClosureParamWrapper].
6365    pub fn is_variant(kind: SyntaxKind) -> bool {
6366        matches!(kind, SyntaxKind::TerminalOrOr | SyntaxKind::ClosureParamWrapperNAry)
6367    }
6368}
6369#[derive(Clone, Debug, Eq, Hash, PartialEq)]
6370pub struct ClosureParamWrapperNAry {
6371    node: SyntaxNode,
6372    children: Arc<[SyntaxNode]>,
6373}
6374impl ClosureParamWrapperNAry {
6375    pub const INDEX_LEFTOR: usize = 0;
6376    pub const INDEX_PARAMS: usize = 1;
6377    pub const INDEX_RIGHTOR: usize = 2;
6378    pub fn new_green(
6379        db: &dyn SyntaxGroup,
6380        leftor: TerminalOrGreen,
6381        params: ParamListGreen,
6382        rightor: TerminalOrGreen,
6383    ) -> ClosureParamWrapperNAryGreen {
6384        let children: Vec<GreenId> = vec![leftor.0, params.0, rightor.0];
6385        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
6386        ClosureParamWrapperNAryGreen(
6387            Arc::new(GreenNode {
6388                kind: SyntaxKind::ClosureParamWrapperNAry,
6389                details: GreenNodeDetails::Node { children, width },
6390            })
6391            .intern(db),
6392        )
6393    }
6394}
6395impl ClosureParamWrapperNAry {
6396    pub fn leftor(&self, db: &dyn SyntaxGroup) -> TerminalOr {
6397        TerminalOr::from_syntax_node(db, self.children[0].clone())
6398    }
6399    pub fn params(&self, db: &dyn SyntaxGroup) -> ParamList {
6400        ParamList::from_syntax_node(db, self.children[1].clone())
6401    }
6402    pub fn rightor(&self, db: &dyn SyntaxGroup) -> TerminalOr {
6403        TerminalOr::from_syntax_node(db, self.children[2].clone())
6404    }
6405}
6406#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
6407pub struct ClosureParamWrapperNAryPtr(pub SyntaxStablePtrId);
6408impl ClosureParamWrapperNAryPtr {}
6409impl TypedStablePtr for ClosureParamWrapperNAryPtr {
6410    type SyntaxNode = ClosureParamWrapperNAry;
6411    fn untyped(&self) -> SyntaxStablePtrId {
6412        self.0
6413    }
6414    fn lookup(&self, db: &dyn SyntaxGroup) -> ClosureParamWrapperNAry {
6415        ClosureParamWrapperNAry::from_syntax_node(db, self.0.lookup(db))
6416    }
6417}
6418impl From<ClosureParamWrapperNAryPtr> for SyntaxStablePtrId {
6419    fn from(ptr: ClosureParamWrapperNAryPtr) -> Self {
6420        ptr.untyped()
6421    }
6422}
6423#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
6424pub struct ClosureParamWrapperNAryGreen(pub GreenId);
6425impl TypedSyntaxNode for ClosureParamWrapperNAry {
6426    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ClosureParamWrapperNAry);
6427    type StablePtr = ClosureParamWrapperNAryPtr;
6428    type Green = ClosureParamWrapperNAryGreen;
6429    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
6430        ClosureParamWrapperNAryGreen(
6431            Arc::new(GreenNode {
6432                kind: SyntaxKind::ClosureParamWrapperNAry,
6433                details: GreenNodeDetails::Node {
6434                    children: vec![
6435                        TerminalOr::missing(db).0,
6436                        ParamList::missing(db).0,
6437                        TerminalOr::missing(db).0,
6438                    ],
6439                    width: TextWidth::default(),
6440                },
6441            })
6442            .intern(db),
6443        )
6444    }
6445    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
6446        let kind = node.kind(db);
6447        assert_eq!(
6448            kind,
6449            SyntaxKind::ClosureParamWrapperNAry,
6450            "Unexpected SyntaxKind {:?}. Expected {:?}.",
6451            kind,
6452            SyntaxKind::ClosureParamWrapperNAry
6453        );
6454        let children = db.get_children(node.clone());
6455        Self { node, children }
6456    }
6457    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
6458        let kind = node.kind(db);
6459        if kind == SyntaxKind::ClosureParamWrapperNAry {
6460            Some(Self::from_syntax_node(db, node))
6461        } else {
6462            None
6463        }
6464    }
6465    fn as_syntax_node(&self) -> SyntaxNode {
6466        self.node.clone()
6467    }
6468    fn stable_ptr(&self) -> Self::StablePtr {
6469        ClosureParamWrapperNAryPtr(self.node.0.stable_ptr)
6470    }
6471}
6472impl From<&ClosureParamWrapperNAry> for SyntaxStablePtrId {
6473    fn from(node: &ClosureParamWrapperNAry) -> Self {
6474        node.stable_ptr().untyped()
6475    }
6476}
6477#[derive(Clone, Debug, Eq, Hash, PartialEq)]
6478pub struct StructArgExpr {
6479    node: SyntaxNode,
6480    children: Arc<[SyntaxNode]>,
6481}
6482impl StructArgExpr {
6483    pub const INDEX_COLON: usize = 0;
6484    pub const INDEX_EXPR: usize = 1;
6485    pub fn new_green(
6486        db: &dyn SyntaxGroup,
6487        colon: TerminalColonGreen,
6488        expr: ExprGreen,
6489    ) -> StructArgExprGreen {
6490        let children: Vec<GreenId> = vec![colon.0, expr.0];
6491        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
6492        StructArgExprGreen(
6493            Arc::new(GreenNode {
6494                kind: SyntaxKind::StructArgExpr,
6495                details: GreenNodeDetails::Node { children, width },
6496            })
6497            .intern(db),
6498        )
6499    }
6500}
6501impl StructArgExpr {
6502    pub fn colon(&self, db: &dyn SyntaxGroup) -> TerminalColon {
6503        TerminalColon::from_syntax_node(db, self.children[0].clone())
6504    }
6505    pub fn expr(&self, db: &dyn SyntaxGroup) -> Expr {
6506        Expr::from_syntax_node(db, self.children[1].clone())
6507    }
6508}
6509#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
6510pub struct StructArgExprPtr(pub SyntaxStablePtrId);
6511impl StructArgExprPtr {}
6512impl TypedStablePtr for StructArgExprPtr {
6513    type SyntaxNode = StructArgExpr;
6514    fn untyped(&self) -> SyntaxStablePtrId {
6515        self.0
6516    }
6517    fn lookup(&self, db: &dyn SyntaxGroup) -> StructArgExpr {
6518        StructArgExpr::from_syntax_node(db, self.0.lookup(db))
6519    }
6520}
6521impl From<StructArgExprPtr> for SyntaxStablePtrId {
6522    fn from(ptr: StructArgExprPtr) -> Self {
6523        ptr.untyped()
6524    }
6525}
6526#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
6527pub struct StructArgExprGreen(pub GreenId);
6528impl TypedSyntaxNode for StructArgExpr {
6529    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StructArgExpr);
6530    type StablePtr = StructArgExprPtr;
6531    type Green = StructArgExprGreen;
6532    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
6533        StructArgExprGreen(
6534            Arc::new(GreenNode {
6535                kind: SyntaxKind::StructArgExpr,
6536                details: GreenNodeDetails::Node {
6537                    children: vec![TerminalColon::missing(db).0, Expr::missing(db).0],
6538                    width: TextWidth::default(),
6539                },
6540            })
6541            .intern(db),
6542        )
6543    }
6544    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
6545        let kind = node.kind(db);
6546        assert_eq!(
6547            kind,
6548            SyntaxKind::StructArgExpr,
6549            "Unexpected SyntaxKind {:?}. Expected {:?}.",
6550            kind,
6551            SyntaxKind::StructArgExpr
6552        );
6553        let children = db.get_children(node.clone());
6554        Self { node, children }
6555    }
6556    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
6557        let kind = node.kind(db);
6558        if kind == SyntaxKind::StructArgExpr {
6559            Some(Self::from_syntax_node(db, node))
6560        } else {
6561            None
6562        }
6563    }
6564    fn as_syntax_node(&self) -> SyntaxNode {
6565        self.node.clone()
6566    }
6567    fn stable_ptr(&self) -> Self::StablePtr {
6568        StructArgExprPtr(self.node.0.stable_ptr)
6569    }
6570}
6571impl From<&StructArgExpr> for SyntaxStablePtrId {
6572    fn from(node: &StructArgExpr) -> Self {
6573        node.stable_ptr().untyped()
6574    }
6575}
6576#[derive(Clone, Debug, Eq, Hash, PartialEq)]
6577pub enum OptionStructArgExpr {
6578    Empty(OptionStructArgExprEmpty),
6579    StructArgExpr(StructArgExpr),
6580}
6581#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
6582pub struct OptionStructArgExprPtr(pub SyntaxStablePtrId);
6583impl TypedStablePtr for OptionStructArgExprPtr {
6584    type SyntaxNode = OptionStructArgExpr;
6585    fn untyped(&self) -> SyntaxStablePtrId {
6586        self.0
6587    }
6588    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionStructArgExpr {
6589        OptionStructArgExpr::from_syntax_node(db, self.0.lookup(db))
6590    }
6591}
6592impl From<OptionStructArgExprPtr> for SyntaxStablePtrId {
6593    fn from(ptr: OptionStructArgExprPtr) -> Self {
6594        ptr.untyped()
6595    }
6596}
6597impl From<OptionStructArgExprEmptyPtr> for OptionStructArgExprPtr {
6598    fn from(value: OptionStructArgExprEmptyPtr) -> Self {
6599        Self(value.0)
6600    }
6601}
6602impl From<StructArgExprPtr> for OptionStructArgExprPtr {
6603    fn from(value: StructArgExprPtr) -> Self {
6604        Self(value.0)
6605    }
6606}
6607impl From<OptionStructArgExprEmptyGreen> for OptionStructArgExprGreen {
6608    fn from(value: OptionStructArgExprEmptyGreen) -> Self {
6609        Self(value.0)
6610    }
6611}
6612impl From<StructArgExprGreen> for OptionStructArgExprGreen {
6613    fn from(value: StructArgExprGreen) -> Self {
6614        Self(value.0)
6615    }
6616}
6617#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
6618pub struct OptionStructArgExprGreen(pub GreenId);
6619impl TypedSyntaxNode for OptionStructArgExpr {
6620    const OPTIONAL_KIND: Option<SyntaxKind> = None;
6621    type StablePtr = OptionStructArgExprPtr;
6622    type Green = OptionStructArgExprGreen;
6623    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
6624        panic!("No missing variant.");
6625    }
6626    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
6627        let kind = node.kind(db);
6628        match kind {
6629            SyntaxKind::OptionStructArgExprEmpty => {
6630                OptionStructArgExpr::Empty(OptionStructArgExprEmpty::from_syntax_node(db, node))
6631            }
6632            SyntaxKind::StructArgExpr => {
6633                OptionStructArgExpr::StructArgExpr(StructArgExpr::from_syntax_node(db, node))
6634            }
6635            _ => panic!(
6636                "Unexpected syntax kind {:?} when constructing {}.",
6637                kind, "OptionStructArgExpr"
6638            ),
6639        }
6640    }
6641    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
6642        let kind = node.kind(db);
6643        match kind {
6644            SyntaxKind::OptionStructArgExprEmpty => Some(OptionStructArgExpr::Empty(
6645                OptionStructArgExprEmpty::from_syntax_node(db, node),
6646            )),
6647            SyntaxKind::StructArgExpr => {
6648                Some(OptionStructArgExpr::StructArgExpr(StructArgExpr::from_syntax_node(db, node)))
6649            }
6650            _ => None,
6651        }
6652    }
6653    fn as_syntax_node(&self) -> SyntaxNode {
6654        match self {
6655            OptionStructArgExpr::Empty(x) => x.as_syntax_node(),
6656            OptionStructArgExpr::StructArgExpr(x) => x.as_syntax_node(),
6657        }
6658    }
6659    fn stable_ptr(&self) -> Self::StablePtr {
6660        OptionStructArgExprPtr(self.as_syntax_node().0.stable_ptr)
6661    }
6662}
6663impl From<&OptionStructArgExpr> for SyntaxStablePtrId {
6664    fn from(node: &OptionStructArgExpr) -> Self {
6665        node.stable_ptr().untyped()
6666    }
6667}
6668impl OptionStructArgExpr {
6669    /// Checks if a kind of a variant of [OptionStructArgExpr].
6670    pub fn is_variant(kind: SyntaxKind) -> bool {
6671        matches!(kind, SyntaxKind::OptionStructArgExprEmpty | SyntaxKind::StructArgExpr)
6672    }
6673}
6674#[derive(Clone, Debug, Eq, Hash, PartialEq)]
6675pub struct OptionStructArgExprEmpty {
6676    node: SyntaxNode,
6677    children: Arc<[SyntaxNode]>,
6678}
6679impl OptionStructArgExprEmpty {
6680    pub fn new_green(db: &dyn SyntaxGroup) -> OptionStructArgExprEmptyGreen {
6681        let children: Vec<GreenId> = vec![];
6682        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
6683        OptionStructArgExprEmptyGreen(
6684            Arc::new(GreenNode {
6685                kind: SyntaxKind::OptionStructArgExprEmpty,
6686                details: GreenNodeDetails::Node { children, width },
6687            })
6688            .intern(db),
6689        )
6690    }
6691}
6692impl OptionStructArgExprEmpty {}
6693#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
6694pub struct OptionStructArgExprEmptyPtr(pub SyntaxStablePtrId);
6695impl OptionStructArgExprEmptyPtr {}
6696impl TypedStablePtr for OptionStructArgExprEmptyPtr {
6697    type SyntaxNode = OptionStructArgExprEmpty;
6698    fn untyped(&self) -> SyntaxStablePtrId {
6699        self.0
6700    }
6701    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionStructArgExprEmpty {
6702        OptionStructArgExprEmpty::from_syntax_node(db, self.0.lookup(db))
6703    }
6704}
6705impl From<OptionStructArgExprEmptyPtr> for SyntaxStablePtrId {
6706    fn from(ptr: OptionStructArgExprEmptyPtr) -> Self {
6707        ptr.untyped()
6708    }
6709}
6710#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
6711pub struct OptionStructArgExprEmptyGreen(pub GreenId);
6712impl TypedSyntaxNode for OptionStructArgExprEmpty {
6713    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionStructArgExprEmpty);
6714    type StablePtr = OptionStructArgExprEmptyPtr;
6715    type Green = OptionStructArgExprEmptyGreen;
6716    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
6717        OptionStructArgExprEmptyGreen(
6718            Arc::new(GreenNode {
6719                kind: SyntaxKind::OptionStructArgExprEmpty,
6720                details: GreenNodeDetails::Node { children: vec![], width: TextWidth::default() },
6721            })
6722            .intern(db),
6723        )
6724    }
6725    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
6726        let kind = node.kind(db);
6727        assert_eq!(
6728            kind,
6729            SyntaxKind::OptionStructArgExprEmpty,
6730            "Unexpected SyntaxKind {:?}. Expected {:?}.",
6731            kind,
6732            SyntaxKind::OptionStructArgExprEmpty
6733        );
6734        let children = db.get_children(node.clone());
6735        Self { node, children }
6736    }
6737    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
6738        let kind = node.kind(db);
6739        if kind == SyntaxKind::OptionStructArgExprEmpty {
6740            Some(Self::from_syntax_node(db, node))
6741        } else {
6742            None
6743        }
6744    }
6745    fn as_syntax_node(&self) -> SyntaxNode {
6746        self.node.clone()
6747    }
6748    fn stable_ptr(&self) -> Self::StablePtr {
6749        OptionStructArgExprEmptyPtr(self.node.0.stable_ptr)
6750    }
6751}
6752impl From<&OptionStructArgExprEmpty> for SyntaxStablePtrId {
6753    fn from(node: &OptionStructArgExprEmpty) -> Self {
6754        node.stable_ptr().untyped()
6755    }
6756}
6757#[derive(Clone, Debug, Eq, Hash, PartialEq)]
6758pub struct StructArgSingle {
6759    node: SyntaxNode,
6760    children: Arc<[SyntaxNode]>,
6761}
6762impl StructArgSingle {
6763    pub const INDEX_IDENTIFIER: usize = 0;
6764    pub const INDEX_ARG_EXPR: usize = 1;
6765    pub fn new_green(
6766        db: &dyn SyntaxGroup,
6767        identifier: TerminalIdentifierGreen,
6768        arg_expr: OptionStructArgExprGreen,
6769    ) -> StructArgSingleGreen {
6770        let children: Vec<GreenId> = vec![identifier.0, arg_expr.0];
6771        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
6772        StructArgSingleGreen(
6773            Arc::new(GreenNode {
6774                kind: SyntaxKind::StructArgSingle,
6775                details: GreenNodeDetails::Node { children, width },
6776            })
6777            .intern(db),
6778        )
6779    }
6780}
6781impl StructArgSingle {
6782    pub fn identifier(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier {
6783        TerminalIdentifier::from_syntax_node(db, self.children[0].clone())
6784    }
6785    pub fn arg_expr(&self, db: &dyn SyntaxGroup) -> OptionStructArgExpr {
6786        OptionStructArgExpr::from_syntax_node(db, self.children[1].clone())
6787    }
6788}
6789#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
6790pub struct StructArgSinglePtr(pub SyntaxStablePtrId);
6791impl StructArgSinglePtr {
6792    pub fn identifier_green(self, db: &dyn SyntaxGroup) -> TerminalIdentifierGreen {
6793        let ptr = self.0.lookup_intern(db);
6794        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
6795            TerminalIdentifierGreen(key_fields[0])
6796        } else {
6797            panic!("Unexpected key field query on root.");
6798        }
6799    }
6800}
6801impl TypedStablePtr for StructArgSinglePtr {
6802    type SyntaxNode = StructArgSingle;
6803    fn untyped(&self) -> SyntaxStablePtrId {
6804        self.0
6805    }
6806    fn lookup(&self, db: &dyn SyntaxGroup) -> StructArgSingle {
6807        StructArgSingle::from_syntax_node(db, self.0.lookup(db))
6808    }
6809}
6810impl From<StructArgSinglePtr> for SyntaxStablePtrId {
6811    fn from(ptr: StructArgSinglePtr) -> Self {
6812        ptr.untyped()
6813    }
6814}
6815#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
6816pub struct StructArgSingleGreen(pub GreenId);
6817impl TypedSyntaxNode for StructArgSingle {
6818    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StructArgSingle);
6819    type StablePtr = StructArgSinglePtr;
6820    type Green = StructArgSingleGreen;
6821    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
6822        StructArgSingleGreen(
6823            Arc::new(GreenNode {
6824                kind: SyntaxKind::StructArgSingle,
6825                details: GreenNodeDetails::Node {
6826                    children: vec![
6827                        TerminalIdentifier::missing(db).0,
6828                        OptionStructArgExpr::missing(db).0,
6829                    ],
6830                    width: TextWidth::default(),
6831                },
6832            })
6833            .intern(db),
6834        )
6835    }
6836    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
6837        let kind = node.kind(db);
6838        assert_eq!(
6839            kind,
6840            SyntaxKind::StructArgSingle,
6841            "Unexpected SyntaxKind {:?}. Expected {:?}.",
6842            kind,
6843            SyntaxKind::StructArgSingle
6844        );
6845        let children = db.get_children(node.clone());
6846        Self { node, children }
6847    }
6848    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
6849        let kind = node.kind(db);
6850        if kind == SyntaxKind::StructArgSingle {
6851            Some(Self::from_syntax_node(db, node))
6852        } else {
6853            None
6854        }
6855    }
6856    fn as_syntax_node(&self) -> SyntaxNode {
6857        self.node.clone()
6858    }
6859    fn stable_ptr(&self) -> Self::StablePtr {
6860        StructArgSinglePtr(self.node.0.stable_ptr)
6861    }
6862}
6863impl From<&StructArgSingle> for SyntaxStablePtrId {
6864    fn from(node: &StructArgSingle) -> Self {
6865        node.stable_ptr().untyped()
6866    }
6867}
6868#[derive(Clone, Debug, Eq, Hash, PartialEq)]
6869pub struct StructArgTail {
6870    node: SyntaxNode,
6871    children: Arc<[SyntaxNode]>,
6872}
6873impl StructArgTail {
6874    pub const INDEX_DOTDOT: usize = 0;
6875    pub const INDEX_EXPRESSION: usize = 1;
6876    pub fn new_green(
6877        db: &dyn SyntaxGroup,
6878        dotdot: TerminalDotDotGreen,
6879        expression: ExprGreen,
6880    ) -> StructArgTailGreen {
6881        let children: Vec<GreenId> = vec![dotdot.0, expression.0];
6882        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
6883        StructArgTailGreen(
6884            Arc::new(GreenNode {
6885                kind: SyntaxKind::StructArgTail,
6886                details: GreenNodeDetails::Node { children, width },
6887            })
6888            .intern(db),
6889        )
6890    }
6891}
6892impl StructArgTail {
6893    pub fn dotdot(&self, db: &dyn SyntaxGroup) -> TerminalDotDot {
6894        TerminalDotDot::from_syntax_node(db, self.children[0].clone())
6895    }
6896    pub fn expression(&self, db: &dyn SyntaxGroup) -> Expr {
6897        Expr::from_syntax_node(db, self.children[1].clone())
6898    }
6899}
6900#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
6901pub struct StructArgTailPtr(pub SyntaxStablePtrId);
6902impl StructArgTailPtr {}
6903impl TypedStablePtr for StructArgTailPtr {
6904    type SyntaxNode = StructArgTail;
6905    fn untyped(&self) -> SyntaxStablePtrId {
6906        self.0
6907    }
6908    fn lookup(&self, db: &dyn SyntaxGroup) -> StructArgTail {
6909        StructArgTail::from_syntax_node(db, self.0.lookup(db))
6910    }
6911}
6912impl From<StructArgTailPtr> for SyntaxStablePtrId {
6913    fn from(ptr: StructArgTailPtr) -> Self {
6914        ptr.untyped()
6915    }
6916}
6917#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
6918pub struct StructArgTailGreen(pub GreenId);
6919impl TypedSyntaxNode for StructArgTail {
6920    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StructArgTail);
6921    type StablePtr = StructArgTailPtr;
6922    type Green = StructArgTailGreen;
6923    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
6924        StructArgTailGreen(
6925            Arc::new(GreenNode {
6926                kind: SyntaxKind::StructArgTail,
6927                details: GreenNodeDetails::Node {
6928                    children: vec![TerminalDotDot::missing(db).0, Expr::missing(db).0],
6929                    width: TextWidth::default(),
6930                },
6931            })
6932            .intern(db),
6933        )
6934    }
6935    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
6936        let kind = node.kind(db);
6937        assert_eq!(
6938            kind,
6939            SyntaxKind::StructArgTail,
6940            "Unexpected SyntaxKind {:?}. Expected {:?}.",
6941            kind,
6942            SyntaxKind::StructArgTail
6943        );
6944        let children = db.get_children(node.clone());
6945        Self { node, children }
6946    }
6947    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
6948        let kind = node.kind(db);
6949        if kind == SyntaxKind::StructArgTail {
6950            Some(Self::from_syntax_node(db, node))
6951        } else {
6952            None
6953        }
6954    }
6955    fn as_syntax_node(&self) -> SyntaxNode {
6956        self.node.clone()
6957    }
6958    fn stable_ptr(&self) -> Self::StablePtr {
6959        StructArgTailPtr(self.node.0.stable_ptr)
6960    }
6961}
6962impl From<&StructArgTail> for SyntaxStablePtrId {
6963    fn from(node: &StructArgTail) -> Self {
6964        node.stable_ptr().untyped()
6965    }
6966}
6967#[derive(Clone, Debug, Eq, Hash, PartialEq)]
6968pub enum StructArg {
6969    StructArgSingle(StructArgSingle),
6970    StructArgTail(StructArgTail),
6971}
6972#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
6973pub struct StructArgPtr(pub SyntaxStablePtrId);
6974impl TypedStablePtr for StructArgPtr {
6975    type SyntaxNode = StructArg;
6976    fn untyped(&self) -> SyntaxStablePtrId {
6977        self.0
6978    }
6979    fn lookup(&self, db: &dyn SyntaxGroup) -> StructArg {
6980        StructArg::from_syntax_node(db, self.0.lookup(db))
6981    }
6982}
6983impl From<StructArgPtr> for SyntaxStablePtrId {
6984    fn from(ptr: StructArgPtr) -> Self {
6985        ptr.untyped()
6986    }
6987}
6988impl From<StructArgSinglePtr> for StructArgPtr {
6989    fn from(value: StructArgSinglePtr) -> Self {
6990        Self(value.0)
6991    }
6992}
6993impl From<StructArgTailPtr> for StructArgPtr {
6994    fn from(value: StructArgTailPtr) -> Self {
6995        Self(value.0)
6996    }
6997}
6998impl From<StructArgSingleGreen> for StructArgGreen {
6999    fn from(value: StructArgSingleGreen) -> Self {
7000        Self(value.0)
7001    }
7002}
7003impl From<StructArgTailGreen> for StructArgGreen {
7004    fn from(value: StructArgTailGreen) -> Self {
7005        Self(value.0)
7006    }
7007}
7008#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
7009pub struct StructArgGreen(pub GreenId);
7010impl TypedSyntaxNode for StructArg {
7011    const OPTIONAL_KIND: Option<SyntaxKind> = None;
7012    type StablePtr = StructArgPtr;
7013    type Green = StructArgGreen;
7014    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
7015        panic!("No missing variant.");
7016    }
7017    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
7018        let kind = node.kind(db);
7019        match kind {
7020            SyntaxKind::StructArgSingle => {
7021                StructArg::StructArgSingle(StructArgSingle::from_syntax_node(db, node))
7022            }
7023            SyntaxKind::StructArgTail => {
7024                StructArg::StructArgTail(StructArgTail::from_syntax_node(db, node))
7025            }
7026            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "StructArg"),
7027        }
7028    }
7029    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
7030        let kind = node.kind(db);
7031        match kind {
7032            SyntaxKind::StructArgSingle => {
7033                Some(StructArg::StructArgSingle(StructArgSingle::from_syntax_node(db, node)))
7034            }
7035            SyntaxKind::StructArgTail => {
7036                Some(StructArg::StructArgTail(StructArgTail::from_syntax_node(db, node)))
7037            }
7038            _ => None,
7039        }
7040    }
7041    fn as_syntax_node(&self) -> SyntaxNode {
7042        match self {
7043            StructArg::StructArgSingle(x) => x.as_syntax_node(),
7044            StructArg::StructArgTail(x) => x.as_syntax_node(),
7045        }
7046    }
7047    fn stable_ptr(&self) -> Self::StablePtr {
7048        StructArgPtr(self.as_syntax_node().0.stable_ptr)
7049    }
7050}
7051impl From<&StructArg> for SyntaxStablePtrId {
7052    fn from(node: &StructArg) -> Self {
7053        node.stable_ptr().untyped()
7054    }
7055}
7056impl StructArg {
7057    /// Checks if a kind of a variant of [StructArg].
7058    pub fn is_variant(kind: SyntaxKind) -> bool {
7059        matches!(kind, SyntaxKind::StructArgSingle | SyntaxKind::StructArgTail)
7060    }
7061}
7062#[derive(Clone, Debug, Eq, Hash, PartialEq)]
7063pub struct StructArgList(ElementList<StructArg, 2>);
7064impl Deref for StructArgList {
7065    type Target = ElementList<StructArg, 2>;
7066    fn deref(&self) -> &Self::Target {
7067        &self.0
7068    }
7069}
7070impl StructArgList {
7071    pub fn new_green(
7072        db: &dyn SyntaxGroup,
7073        children: Vec<StructArgListElementOrSeparatorGreen>,
7074    ) -> StructArgListGreen {
7075        let width = children.iter().map(|id| id.id().lookup_intern(db).width()).sum();
7076        StructArgListGreen(
7077            Arc::new(GreenNode {
7078                kind: SyntaxKind::StructArgList,
7079                details: GreenNodeDetails::Node {
7080                    children: children.iter().map(|x| x.id()).collect(),
7081                    width,
7082                },
7083            })
7084            .intern(db),
7085        )
7086    }
7087}
7088#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
7089pub struct StructArgListPtr(pub SyntaxStablePtrId);
7090impl TypedStablePtr for StructArgListPtr {
7091    type SyntaxNode = StructArgList;
7092    fn untyped(&self) -> SyntaxStablePtrId {
7093        self.0
7094    }
7095    fn lookup(&self, db: &dyn SyntaxGroup) -> StructArgList {
7096        StructArgList::from_syntax_node(db, self.0.lookup(db))
7097    }
7098}
7099impl From<StructArgListPtr> for SyntaxStablePtrId {
7100    fn from(ptr: StructArgListPtr) -> Self {
7101        ptr.untyped()
7102    }
7103}
7104#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
7105pub enum StructArgListElementOrSeparatorGreen {
7106    Separator(TerminalCommaGreen),
7107    Element(StructArgGreen),
7108}
7109impl From<TerminalCommaGreen> for StructArgListElementOrSeparatorGreen {
7110    fn from(value: TerminalCommaGreen) -> Self {
7111        StructArgListElementOrSeparatorGreen::Separator(value)
7112    }
7113}
7114impl From<StructArgGreen> for StructArgListElementOrSeparatorGreen {
7115    fn from(value: StructArgGreen) -> Self {
7116        StructArgListElementOrSeparatorGreen::Element(value)
7117    }
7118}
7119impl StructArgListElementOrSeparatorGreen {
7120    fn id(&self) -> GreenId {
7121        match self {
7122            StructArgListElementOrSeparatorGreen::Separator(green) => green.0,
7123            StructArgListElementOrSeparatorGreen::Element(green) => green.0,
7124        }
7125    }
7126}
7127#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
7128pub struct StructArgListGreen(pub GreenId);
7129impl TypedSyntaxNode for StructArgList {
7130    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StructArgList);
7131    type StablePtr = StructArgListPtr;
7132    type Green = StructArgListGreen;
7133    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
7134        StructArgListGreen(
7135            Arc::new(GreenNode {
7136                kind: SyntaxKind::StructArgList,
7137                details: GreenNodeDetails::Node { children: vec![], width: TextWidth::default() },
7138            })
7139            .intern(db),
7140        )
7141    }
7142    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
7143        Self(ElementList::new(node))
7144    }
7145    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
7146        if node.kind(db) == SyntaxKind::StructArgList {
7147            Some(Self(ElementList::new(node)))
7148        } else {
7149            None
7150        }
7151    }
7152    fn as_syntax_node(&self) -> SyntaxNode {
7153        self.node.clone()
7154    }
7155    fn stable_ptr(&self) -> Self::StablePtr {
7156        StructArgListPtr(self.node.0.stable_ptr)
7157    }
7158}
7159impl From<&StructArgList> for SyntaxStablePtrId {
7160    fn from(node: &StructArgList) -> Self {
7161        node.stable_ptr().untyped()
7162    }
7163}
7164#[derive(Clone, Debug, Eq, Hash, PartialEq)]
7165pub struct ArgListBraced {
7166    node: SyntaxNode,
7167    children: Arc<[SyntaxNode]>,
7168}
7169impl ArgListBraced {
7170    pub const INDEX_LBRACE: usize = 0;
7171    pub const INDEX_ARGUMENTS: usize = 1;
7172    pub const INDEX_RBRACE: usize = 2;
7173    pub fn new_green(
7174        db: &dyn SyntaxGroup,
7175        lbrace: TerminalLBraceGreen,
7176        arguments: ArgListGreen,
7177        rbrace: TerminalRBraceGreen,
7178    ) -> ArgListBracedGreen {
7179        let children: Vec<GreenId> = vec![lbrace.0, arguments.0, rbrace.0];
7180        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
7181        ArgListBracedGreen(
7182            Arc::new(GreenNode {
7183                kind: SyntaxKind::ArgListBraced,
7184                details: GreenNodeDetails::Node { children, width },
7185            })
7186            .intern(db),
7187        )
7188    }
7189}
7190impl ArgListBraced {
7191    pub fn lbrace(&self, db: &dyn SyntaxGroup) -> TerminalLBrace {
7192        TerminalLBrace::from_syntax_node(db, self.children[0].clone())
7193    }
7194    pub fn arguments(&self, db: &dyn SyntaxGroup) -> ArgList {
7195        ArgList::from_syntax_node(db, self.children[1].clone())
7196    }
7197    pub fn rbrace(&self, db: &dyn SyntaxGroup) -> TerminalRBrace {
7198        TerminalRBrace::from_syntax_node(db, self.children[2].clone())
7199    }
7200}
7201#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
7202pub struct ArgListBracedPtr(pub SyntaxStablePtrId);
7203impl ArgListBracedPtr {}
7204impl TypedStablePtr for ArgListBracedPtr {
7205    type SyntaxNode = ArgListBraced;
7206    fn untyped(&self) -> SyntaxStablePtrId {
7207        self.0
7208    }
7209    fn lookup(&self, db: &dyn SyntaxGroup) -> ArgListBraced {
7210        ArgListBraced::from_syntax_node(db, self.0.lookup(db))
7211    }
7212}
7213impl From<ArgListBracedPtr> for SyntaxStablePtrId {
7214    fn from(ptr: ArgListBracedPtr) -> Self {
7215        ptr.untyped()
7216    }
7217}
7218#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
7219pub struct ArgListBracedGreen(pub GreenId);
7220impl TypedSyntaxNode for ArgListBraced {
7221    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ArgListBraced);
7222    type StablePtr = ArgListBracedPtr;
7223    type Green = ArgListBracedGreen;
7224    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
7225        ArgListBracedGreen(
7226            Arc::new(GreenNode {
7227                kind: SyntaxKind::ArgListBraced,
7228                details: GreenNodeDetails::Node {
7229                    children: vec![
7230                        TerminalLBrace::missing(db).0,
7231                        ArgList::missing(db).0,
7232                        TerminalRBrace::missing(db).0,
7233                    ],
7234                    width: TextWidth::default(),
7235                },
7236            })
7237            .intern(db),
7238        )
7239    }
7240    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
7241        let kind = node.kind(db);
7242        assert_eq!(
7243            kind,
7244            SyntaxKind::ArgListBraced,
7245            "Unexpected SyntaxKind {:?}. Expected {:?}.",
7246            kind,
7247            SyntaxKind::ArgListBraced
7248        );
7249        let children = db.get_children(node.clone());
7250        Self { node, children }
7251    }
7252    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
7253        let kind = node.kind(db);
7254        if kind == SyntaxKind::ArgListBraced {
7255            Some(Self::from_syntax_node(db, node))
7256        } else {
7257            None
7258        }
7259    }
7260    fn as_syntax_node(&self) -> SyntaxNode {
7261        self.node.clone()
7262    }
7263    fn stable_ptr(&self) -> Self::StablePtr {
7264        ArgListBracedPtr(self.node.0.stable_ptr)
7265    }
7266}
7267impl From<&ArgListBraced> for SyntaxStablePtrId {
7268    fn from(node: &ArgListBraced) -> Self {
7269        node.stable_ptr().untyped()
7270    }
7271}
7272#[derive(Clone, Debug, Eq, Hash, PartialEq)]
7273pub struct ArgListBracketed {
7274    node: SyntaxNode,
7275    children: Arc<[SyntaxNode]>,
7276}
7277impl ArgListBracketed {
7278    pub const INDEX_LBRACK: usize = 0;
7279    pub const INDEX_ARGUMENTS: usize = 1;
7280    pub const INDEX_RBRACK: usize = 2;
7281    pub fn new_green(
7282        db: &dyn SyntaxGroup,
7283        lbrack: TerminalLBrackGreen,
7284        arguments: ArgListGreen,
7285        rbrack: TerminalRBrackGreen,
7286    ) -> ArgListBracketedGreen {
7287        let children: Vec<GreenId> = vec![lbrack.0, arguments.0, rbrack.0];
7288        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
7289        ArgListBracketedGreen(
7290            Arc::new(GreenNode {
7291                kind: SyntaxKind::ArgListBracketed,
7292                details: GreenNodeDetails::Node { children, width },
7293            })
7294            .intern(db),
7295        )
7296    }
7297}
7298impl ArgListBracketed {
7299    pub fn lbrack(&self, db: &dyn SyntaxGroup) -> TerminalLBrack {
7300        TerminalLBrack::from_syntax_node(db, self.children[0].clone())
7301    }
7302    pub fn arguments(&self, db: &dyn SyntaxGroup) -> ArgList {
7303        ArgList::from_syntax_node(db, self.children[1].clone())
7304    }
7305    pub fn rbrack(&self, db: &dyn SyntaxGroup) -> TerminalRBrack {
7306        TerminalRBrack::from_syntax_node(db, self.children[2].clone())
7307    }
7308}
7309#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
7310pub struct ArgListBracketedPtr(pub SyntaxStablePtrId);
7311impl ArgListBracketedPtr {}
7312impl TypedStablePtr for ArgListBracketedPtr {
7313    type SyntaxNode = ArgListBracketed;
7314    fn untyped(&self) -> SyntaxStablePtrId {
7315        self.0
7316    }
7317    fn lookup(&self, db: &dyn SyntaxGroup) -> ArgListBracketed {
7318        ArgListBracketed::from_syntax_node(db, self.0.lookup(db))
7319    }
7320}
7321impl From<ArgListBracketedPtr> for SyntaxStablePtrId {
7322    fn from(ptr: ArgListBracketedPtr) -> Self {
7323        ptr.untyped()
7324    }
7325}
7326#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
7327pub struct ArgListBracketedGreen(pub GreenId);
7328impl TypedSyntaxNode for ArgListBracketed {
7329    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ArgListBracketed);
7330    type StablePtr = ArgListBracketedPtr;
7331    type Green = ArgListBracketedGreen;
7332    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
7333        ArgListBracketedGreen(
7334            Arc::new(GreenNode {
7335                kind: SyntaxKind::ArgListBracketed,
7336                details: GreenNodeDetails::Node {
7337                    children: vec![
7338                        TerminalLBrack::missing(db).0,
7339                        ArgList::missing(db).0,
7340                        TerminalRBrack::missing(db).0,
7341                    ],
7342                    width: TextWidth::default(),
7343                },
7344            })
7345            .intern(db),
7346        )
7347    }
7348    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
7349        let kind = node.kind(db);
7350        assert_eq!(
7351            kind,
7352            SyntaxKind::ArgListBracketed,
7353            "Unexpected SyntaxKind {:?}. Expected {:?}.",
7354            kind,
7355            SyntaxKind::ArgListBracketed
7356        );
7357        let children = db.get_children(node.clone());
7358        Self { node, children }
7359    }
7360    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
7361        let kind = node.kind(db);
7362        if kind == SyntaxKind::ArgListBracketed {
7363            Some(Self::from_syntax_node(db, node))
7364        } else {
7365            None
7366        }
7367    }
7368    fn as_syntax_node(&self) -> SyntaxNode {
7369        self.node.clone()
7370    }
7371    fn stable_ptr(&self) -> Self::StablePtr {
7372        ArgListBracketedPtr(self.node.0.stable_ptr)
7373    }
7374}
7375impl From<&ArgListBracketed> for SyntaxStablePtrId {
7376    fn from(node: &ArgListBracketed) -> Self {
7377        node.stable_ptr().untyped()
7378    }
7379}
7380#[derive(Clone, Debug, Eq, Hash, PartialEq)]
7381pub enum WrappedArgList {
7382    BracketedArgList(ArgListBracketed),
7383    ParenthesizedArgList(ArgListParenthesized),
7384    BracedArgList(ArgListBraced),
7385    Missing(WrappedArgListMissing),
7386}
7387#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
7388pub struct WrappedArgListPtr(pub SyntaxStablePtrId);
7389impl TypedStablePtr for WrappedArgListPtr {
7390    type SyntaxNode = WrappedArgList;
7391    fn untyped(&self) -> SyntaxStablePtrId {
7392        self.0
7393    }
7394    fn lookup(&self, db: &dyn SyntaxGroup) -> WrappedArgList {
7395        WrappedArgList::from_syntax_node(db, self.0.lookup(db))
7396    }
7397}
7398impl From<WrappedArgListPtr> for SyntaxStablePtrId {
7399    fn from(ptr: WrappedArgListPtr) -> Self {
7400        ptr.untyped()
7401    }
7402}
7403impl From<ArgListBracketedPtr> for WrappedArgListPtr {
7404    fn from(value: ArgListBracketedPtr) -> Self {
7405        Self(value.0)
7406    }
7407}
7408impl From<ArgListParenthesizedPtr> for WrappedArgListPtr {
7409    fn from(value: ArgListParenthesizedPtr) -> Self {
7410        Self(value.0)
7411    }
7412}
7413impl From<ArgListBracedPtr> for WrappedArgListPtr {
7414    fn from(value: ArgListBracedPtr) -> Self {
7415        Self(value.0)
7416    }
7417}
7418impl From<WrappedArgListMissingPtr> for WrappedArgListPtr {
7419    fn from(value: WrappedArgListMissingPtr) -> Self {
7420        Self(value.0)
7421    }
7422}
7423impl From<ArgListBracketedGreen> for WrappedArgListGreen {
7424    fn from(value: ArgListBracketedGreen) -> Self {
7425        Self(value.0)
7426    }
7427}
7428impl From<ArgListParenthesizedGreen> for WrappedArgListGreen {
7429    fn from(value: ArgListParenthesizedGreen) -> Self {
7430        Self(value.0)
7431    }
7432}
7433impl From<ArgListBracedGreen> for WrappedArgListGreen {
7434    fn from(value: ArgListBracedGreen) -> Self {
7435        Self(value.0)
7436    }
7437}
7438impl From<WrappedArgListMissingGreen> for WrappedArgListGreen {
7439    fn from(value: WrappedArgListMissingGreen) -> Self {
7440        Self(value.0)
7441    }
7442}
7443#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
7444pub struct WrappedArgListGreen(pub GreenId);
7445impl TypedSyntaxNode for WrappedArgList {
7446    const OPTIONAL_KIND: Option<SyntaxKind> = None;
7447    type StablePtr = WrappedArgListPtr;
7448    type Green = WrappedArgListGreen;
7449    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
7450        WrappedArgListGreen(WrappedArgListMissing::missing(db).0)
7451    }
7452    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
7453        let kind = node.kind(db);
7454        match kind {
7455            SyntaxKind::ArgListBracketed => {
7456                WrappedArgList::BracketedArgList(ArgListBracketed::from_syntax_node(db, node))
7457            }
7458            SyntaxKind::ArgListParenthesized => WrappedArgList::ParenthesizedArgList(
7459                ArgListParenthesized::from_syntax_node(db, node),
7460            ),
7461            SyntaxKind::ArgListBraced => {
7462                WrappedArgList::BracedArgList(ArgListBraced::from_syntax_node(db, node))
7463            }
7464            SyntaxKind::WrappedArgListMissing => {
7465                WrappedArgList::Missing(WrappedArgListMissing::from_syntax_node(db, node))
7466            }
7467            _ => {
7468                panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "WrappedArgList")
7469            }
7470        }
7471    }
7472    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
7473        let kind = node.kind(db);
7474        match kind {
7475            SyntaxKind::ArgListBracketed => {
7476                Some(WrappedArgList::BracketedArgList(ArgListBracketed::from_syntax_node(db, node)))
7477            }
7478            SyntaxKind::ArgListParenthesized => Some(WrappedArgList::ParenthesizedArgList(
7479                ArgListParenthesized::from_syntax_node(db, node),
7480            )),
7481            SyntaxKind::ArgListBraced => {
7482                Some(WrappedArgList::BracedArgList(ArgListBraced::from_syntax_node(db, node)))
7483            }
7484            SyntaxKind::WrappedArgListMissing => {
7485                Some(WrappedArgList::Missing(WrappedArgListMissing::from_syntax_node(db, node)))
7486            }
7487            _ => None,
7488        }
7489    }
7490    fn as_syntax_node(&self) -> SyntaxNode {
7491        match self {
7492            WrappedArgList::BracketedArgList(x) => x.as_syntax_node(),
7493            WrappedArgList::ParenthesizedArgList(x) => x.as_syntax_node(),
7494            WrappedArgList::BracedArgList(x) => x.as_syntax_node(),
7495            WrappedArgList::Missing(x) => x.as_syntax_node(),
7496        }
7497    }
7498    fn stable_ptr(&self) -> Self::StablePtr {
7499        WrappedArgListPtr(self.as_syntax_node().0.stable_ptr)
7500    }
7501}
7502impl From<&WrappedArgList> for SyntaxStablePtrId {
7503    fn from(node: &WrappedArgList) -> Self {
7504        node.stable_ptr().untyped()
7505    }
7506}
7507impl WrappedArgList {
7508    /// Checks if a kind of a variant of [WrappedArgList].
7509    pub fn is_variant(kind: SyntaxKind) -> bool {
7510        matches!(
7511            kind,
7512            SyntaxKind::ArgListBracketed
7513                | SyntaxKind::ArgListParenthesized
7514                | SyntaxKind::ArgListBraced
7515                | SyntaxKind::WrappedArgListMissing
7516        )
7517    }
7518}
7519#[derive(Clone, Debug, Eq, Hash, PartialEq)]
7520pub struct WrappedArgListMissing {
7521    node: SyntaxNode,
7522    children: Arc<[SyntaxNode]>,
7523}
7524impl WrappedArgListMissing {
7525    pub fn new_green(db: &dyn SyntaxGroup) -> WrappedArgListMissingGreen {
7526        let children: Vec<GreenId> = vec![];
7527        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
7528        WrappedArgListMissingGreen(
7529            Arc::new(GreenNode {
7530                kind: SyntaxKind::WrappedArgListMissing,
7531                details: GreenNodeDetails::Node { children, width },
7532            })
7533            .intern(db),
7534        )
7535    }
7536}
7537impl WrappedArgListMissing {}
7538#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
7539pub struct WrappedArgListMissingPtr(pub SyntaxStablePtrId);
7540impl WrappedArgListMissingPtr {}
7541impl TypedStablePtr for WrappedArgListMissingPtr {
7542    type SyntaxNode = WrappedArgListMissing;
7543    fn untyped(&self) -> SyntaxStablePtrId {
7544        self.0
7545    }
7546    fn lookup(&self, db: &dyn SyntaxGroup) -> WrappedArgListMissing {
7547        WrappedArgListMissing::from_syntax_node(db, self.0.lookup(db))
7548    }
7549}
7550impl From<WrappedArgListMissingPtr> for SyntaxStablePtrId {
7551    fn from(ptr: WrappedArgListMissingPtr) -> Self {
7552        ptr.untyped()
7553    }
7554}
7555#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
7556pub struct WrappedArgListMissingGreen(pub GreenId);
7557impl TypedSyntaxNode for WrappedArgListMissing {
7558    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::WrappedArgListMissing);
7559    type StablePtr = WrappedArgListMissingPtr;
7560    type Green = WrappedArgListMissingGreen;
7561    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
7562        WrappedArgListMissingGreen(
7563            Arc::new(GreenNode {
7564                kind: SyntaxKind::WrappedArgListMissing,
7565                details: GreenNodeDetails::Node { children: vec![], width: TextWidth::default() },
7566            })
7567            .intern(db),
7568        )
7569    }
7570    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
7571        let kind = node.kind(db);
7572        assert_eq!(
7573            kind,
7574            SyntaxKind::WrappedArgListMissing,
7575            "Unexpected SyntaxKind {:?}. Expected {:?}.",
7576            kind,
7577            SyntaxKind::WrappedArgListMissing
7578        );
7579        let children = db.get_children(node.clone());
7580        Self { node, children }
7581    }
7582    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
7583        let kind = node.kind(db);
7584        if kind == SyntaxKind::WrappedArgListMissing {
7585            Some(Self::from_syntax_node(db, node))
7586        } else {
7587            None
7588        }
7589    }
7590    fn as_syntax_node(&self) -> SyntaxNode {
7591        self.node.clone()
7592    }
7593    fn stable_ptr(&self) -> Self::StablePtr {
7594        WrappedArgListMissingPtr(self.node.0.stable_ptr)
7595    }
7596}
7597impl From<&WrappedArgListMissing> for SyntaxStablePtrId {
7598    fn from(node: &WrappedArgListMissing) -> Self {
7599        node.stable_ptr().untyped()
7600    }
7601}
7602#[derive(Clone, Debug, Eq, Hash, PartialEq)]
7603pub enum Pattern {
7604    Underscore(TerminalUnderscore),
7605    Literal(TerminalLiteralNumber),
7606    False(TerminalFalse),
7607    True(TerminalTrue),
7608    ShortString(TerminalShortString),
7609    String(TerminalString),
7610    Identifier(PatternIdentifier),
7611    Struct(PatternStruct),
7612    Tuple(PatternTuple),
7613    Enum(PatternEnum),
7614    FixedSizeArray(PatternFixedSizeArray),
7615    Path(ExprPath),
7616}
7617#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
7618pub struct PatternPtr(pub SyntaxStablePtrId);
7619impl TypedStablePtr for PatternPtr {
7620    type SyntaxNode = Pattern;
7621    fn untyped(&self) -> SyntaxStablePtrId {
7622        self.0
7623    }
7624    fn lookup(&self, db: &dyn SyntaxGroup) -> Pattern {
7625        Pattern::from_syntax_node(db, self.0.lookup(db))
7626    }
7627}
7628impl From<PatternPtr> for SyntaxStablePtrId {
7629    fn from(ptr: PatternPtr) -> Self {
7630        ptr.untyped()
7631    }
7632}
7633impl From<TerminalUnderscorePtr> for PatternPtr {
7634    fn from(value: TerminalUnderscorePtr) -> Self {
7635        Self(value.0)
7636    }
7637}
7638impl From<TerminalLiteralNumberPtr> for PatternPtr {
7639    fn from(value: TerminalLiteralNumberPtr) -> Self {
7640        Self(value.0)
7641    }
7642}
7643impl From<TerminalFalsePtr> for PatternPtr {
7644    fn from(value: TerminalFalsePtr) -> Self {
7645        Self(value.0)
7646    }
7647}
7648impl From<TerminalTruePtr> for PatternPtr {
7649    fn from(value: TerminalTruePtr) -> Self {
7650        Self(value.0)
7651    }
7652}
7653impl From<TerminalShortStringPtr> for PatternPtr {
7654    fn from(value: TerminalShortStringPtr) -> Self {
7655        Self(value.0)
7656    }
7657}
7658impl From<TerminalStringPtr> for PatternPtr {
7659    fn from(value: TerminalStringPtr) -> Self {
7660        Self(value.0)
7661    }
7662}
7663impl From<PatternIdentifierPtr> for PatternPtr {
7664    fn from(value: PatternIdentifierPtr) -> Self {
7665        Self(value.0)
7666    }
7667}
7668impl From<PatternStructPtr> for PatternPtr {
7669    fn from(value: PatternStructPtr) -> Self {
7670        Self(value.0)
7671    }
7672}
7673impl From<PatternTuplePtr> for PatternPtr {
7674    fn from(value: PatternTuplePtr) -> Self {
7675        Self(value.0)
7676    }
7677}
7678impl From<PatternEnumPtr> for PatternPtr {
7679    fn from(value: PatternEnumPtr) -> Self {
7680        Self(value.0)
7681    }
7682}
7683impl From<PatternFixedSizeArrayPtr> for PatternPtr {
7684    fn from(value: PatternFixedSizeArrayPtr) -> Self {
7685        Self(value.0)
7686    }
7687}
7688impl From<ExprPathPtr> for PatternPtr {
7689    fn from(value: ExprPathPtr) -> Self {
7690        Self(value.0)
7691    }
7692}
7693impl From<TerminalUnderscoreGreen> for PatternGreen {
7694    fn from(value: TerminalUnderscoreGreen) -> Self {
7695        Self(value.0)
7696    }
7697}
7698impl From<TerminalLiteralNumberGreen> for PatternGreen {
7699    fn from(value: TerminalLiteralNumberGreen) -> Self {
7700        Self(value.0)
7701    }
7702}
7703impl From<TerminalFalseGreen> for PatternGreen {
7704    fn from(value: TerminalFalseGreen) -> Self {
7705        Self(value.0)
7706    }
7707}
7708impl From<TerminalTrueGreen> for PatternGreen {
7709    fn from(value: TerminalTrueGreen) -> Self {
7710        Self(value.0)
7711    }
7712}
7713impl From<TerminalShortStringGreen> for PatternGreen {
7714    fn from(value: TerminalShortStringGreen) -> Self {
7715        Self(value.0)
7716    }
7717}
7718impl From<TerminalStringGreen> for PatternGreen {
7719    fn from(value: TerminalStringGreen) -> Self {
7720        Self(value.0)
7721    }
7722}
7723impl From<PatternIdentifierGreen> for PatternGreen {
7724    fn from(value: PatternIdentifierGreen) -> Self {
7725        Self(value.0)
7726    }
7727}
7728impl From<PatternStructGreen> for PatternGreen {
7729    fn from(value: PatternStructGreen) -> Self {
7730        Self(value.0)
7731    }
7732}
7733impl From<PatternTupleGreen> for PatternGreen {
7734    fn from(value: PatternTupleGreen) -> Self {
7735        Self(value.0)
7736    }
7737}
7738impl From<PatternEnumGreen> for PatternGreen {
7739    fn from(value: PatternEnumGreen) -> Self {
7740        Self(value.0)
7741    }
7742}
7743impl From<PatternFixedSizeArrayGreen> for PatternGreen {
7744    fn from(value: PatternFixedSizeArrayGreen) -> Self {
7745        Self(value.0)
7746    }
7747}
7748impl From<ExprPathGreen> for PatternGreen {
7749    fn from(value: ExprPathGreen) -> Self {
7750        Self(value.0)
7751    }
7752}
7753#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
7754pub struct PatternGreen(pub GreenId);
7755impl TypedSyntaxNode for Pattern {
7756    const OPTIONAL_KIND: Option<SyntaxKind> = None;
7757    type StablePtr = PatternPtr;
7758    type Green = PatternGreen;
7759    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
7760        panic!("No missing variant.");
7761    }
7762    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
7763        let kind = node.kind(db);
7764        match kind {
7765            SyntaxKind::TerminalUnderscore => {
7766                Pattern::Underscore(TerminalUnderscore::from_syntax_node(db, node))
7767            }
7768            SyntaxKind::TerminalLiteralNumber => {
7769                Pattern::Literal(TerminalLiteralNumber::from_syntax_node(db, node))
7770            }
7771            SyntaxKind::TerminalFalse => Pattern::False(TerminalFalse::from_syntax_node(db, node)),
7772            SyntaxKind::TerminalTrue => Pattern::True(TerminalTrue::from_syntax_node(db, node)),
7773            SyntaxKind::TerminalShortString => {
7774                Pattern::ShortString(TerminalShortString::from_syntax_node(db, node))
7775            }
7776            SyntaxKind::TerminalString => {
7777                Pattern::String(TerminalString::from_syntax_node(db, node))
7778            }
7779            SyntaxKind::PatternIdentifier => {
7780                Pattern::Identifier(PatternIdentifier::from_syntax_node(db, node))
7781            }
7782            SyntaxKind::PatternStruct => Pattern::Struct(PatternStruct::from_syntax_node(db, node)),
7783            SyntaxKind::PatternTuple => Pattern::Tuple(PatternTuple::from_syntax_node(db, node)),
7784            SyntaxKind::PatternEnum => Pattern::Enum(PatternEnum::from_syntax_node(db, node)),
7785            SyntaxKind::PatternFixedSizeArray => {
7786                Pattern::FixedSizeArray(PatternFixedSizeArray::from_syntax_node(db, node))
7787            }
7788            SyntaxKind::ExprPath => Pattern::Path(ExprPath::from_syntax_node(db, node)),
7789            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "Pattern"),
7790        }
7791    }
7792    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
7793        let kind = node.kind(db);
7794        match kind {
7795            SyntaxKind::TerminalUnderscore => {
7796                Some(Pattern::Underscore(TerminalUnderscore::from_syntax_node(db, node)))
7797            }
7798            SyntaxKind::TerminalLiteralNumber => {
7799                Some(Pattern::Literal(TerminalLiteralNumber::from_syntax_node(db, node)))
7800            }
7801            SyntaxKind::TerminalFalse => {
7802                Some(Pattern::False(TerminalFalse::from_syntax_node(db, node)))
7803            }
7804            SyntaxKind::TerminalTrue => {
7805                Some(Pattern::True(TerminalTrue::from_syntax_node(db, node)))
7806            }
7807            SyntaxKind::TerminalShortString => {
7808                Some(Pattern::ShortString(TerminalShortString::from_syntax_node(db, node)))
7809            }
7810            SyntaxKind::TerminalString => {
7811                Some(Pattern::String(TerminalString::from_syntax_node(db, node)))
7812            }
7813            SyntaxKind::PatternIdentifier => {
7814                Some(Pattern::Identifier(PatternIdentifier::from_syntax_node(db, node)))
7815            }
7816            SyntaxKind::PatternStruct => {
7817                Some(Pattern::Struct(PatternStruct::from_syntax_node(db, node)))
7818            }
7819            SyntaxKind::PatternTuple => {
7820                Some(Pattern::Tuple(PatternTuple::from_syntax_node(db, node)))
7821            }
7822            SyntaxKind::PatternEnum => Some(Pattern::Enum(PatternEnum::from_syntax_node(db, node))),
7823            SyntaxKind::PatternFixedSizeArray => {
7824                Some(Pattern::FixedSizeArray(PatternFixedSizeArray::from_syntax_node(db, node)))
7825            }
7826            SyntaxKind::ExprPath => Some(Pattern::Path(ExprPath::from_syntax_node(db, node))),
7827            _ => None,
7828        }
7829    }
7830    fn as_syntax_node(&self) -> SyntaxNode {
7831        match self {
7832            Pattern::Underscore(x) => x.as_syntax_node(),
7833            Pattern::Literal(x) => x.as_syntax_node(),
7834            Pattern::False(x) => x.as_syntax_node(),
7835            Pattern::True(x) => x.as_syntax_node(),
7836            Pattern::ShortString(x) => x.as_syntax_node(),
7837            Pattern::String(x) => x.as_syntax_node(),
7838            Pattern::Identifier(x) => x.as_syntax_node(),
7839            Pattern::Struct(x) => x.as_syntax_node(),
7840            Pattern::Tuple(x) => x.as_syntax_node(),
7841            Pattern::Enum(x) => x.as_syntax_node(),
7842            Pattern::FixedSizeArray(x) => x.as_syntax_node(),
7843            Pattern::Path(x) => x.as_syntax_node(),
7844        }
7845    }
7846    fn stable_ptr(&self) -> Self::StablePtr {
7847        PatternPtr(self.as_syntax_node().0.stable_ptr)
7848    }
7849}
7850impl From<&Pattern> for SyntaxStablePtrId {
7851    fn from(node: &Pattern) -> Self {
7852        node.stable_ptr().untyped()
7853    }
7854}
7855impl Pattern {
7856    /// Checks if a kind of a variant of [Pattern].
7857    pub fn is_variant(kind: SyntaxKind) -> bool {
7858        matches!(
7859            kind,
7860            SyntaxKind::TerminalUnderscore
7861                | SyntaxKind::TerminalLiteralNumber
7862                | SyntaxKind::TerminalFalse
7863                | SyntaxKind::TerminalTrue
7864                | SyntaxKind::TerminalShortString
7865                | SyntaxKind::TerminalString
7866                | SyntaxKind::PatternIdentifier
7867                | SyntaxKind::PatternStruct
7868                | SyntaxKind::PatternTuple
7869                | SyntaxKind::PatternEnum
7870                | SyntaxKind::PatternFixedSizeArray
7871                | SyntaxKind::ExprPath
7872        )
7873    }
7874}
7875#[derive(Clone, Debug, Eq, Hash, PartialEq)]
7876pub struct PatternIdentifier {
7877    node: SyntaxNode,
7878    children: Arc<[SyntaxNode]>,
7879}
7880impl PatternIdentifier {
7881    pub const INDEX_MODIFIERS: usize = 0;
7882    pub const INDEX_NAME: usize = 1;
7883    pub fn new_green(
7884        db: &dyn SyntaxGroup,
7885        modifiers: ModifierListGreen,
7886        name: TerminalIdentifierGreen,
7887    ) -> PatternIdentifierGreen {
7888        let children: Vec<GreenId> = vec![modifiers.0, name.0];
7889        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
7890        PatternIdentifierGreen(
7891            Arc::new(GreenNode {
7892                kind: SyntaxKind::PatternIdentifier,
7893                details: GreenNodeDetails::Node { children, width },
7894            })
7895            .intern(db),
7896        )
7897    }
7898}
7899impl PatternIdentifier {
7900    pub fn modifiers(&self, db: &dyn SyntaxGroup) -> ModifierList {
7901        ModifierList::from_syntax_node(db, self.children[0].clone())
7902    }
7903    pub fn name(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier {
7904        TerminalIdentifier::from_syntax_node(db, self.children[1].clone())
7905    }
7906}
7907#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
7908pub struct PatternIdentifierPtr(pub SyntaxStablePtrId);
7909impl PatternIdentifierPtr {
7910    pub fn name_green(self, db: &dyn SyntaxGroup) -> TerminalIdentifierGreen {
7911        let ptr = self.0.lookup_intern(db);
7912        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
7913            TerminalIdentifierGreen(key_fields[0])
7914        } else {
7915            panic!("Unexpected key field query on root.");
7916        }
7917    }
7918}
7919impl TypedStablePtr for PatternIdentifierPtr {
7920    type SyntaxNode = PatternIdentifier;
7921    fn untyped(&self) -> SyntaxStablePtrId {
7922        self.0
7923    }
7924    fn lookup(&self, db: &dyn SyntaxGroup) -> PatternIdentifier {
7925        PatternIdentifier::from_syntax_node(db, self.0.lookup(db))
7926    }
7927}
7928impl From<PatternIdentifierPtr> for SyntaxStablePtrId {
7929    fn from(ptr: PatternIdentifierPtr) -> Self {
7930        ptr.untyped()
7931    }
7932}
7933#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
7934pub struct PatternIdentifierGreen(pub GreenId);
7935impl TypedSyntaxNode for PatternIdentifier {
7936    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PatternIdentifier);
7937    type StablePtr = PatternIdentifierPtr;
7938    type Green = PatternIdentifierGreen;
7939    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
7940        PatternIdentifierGreen(
7941            Arc::new(GreenNode {
7942                kind: SyntaxKind::PatternIdentifier,
7943                details: GreenNodeDetails::Node {
7944                    children: vec![ModifierList::missing(db).0, TerminalIdentifier::missing(db).0],
7945                    width: TextWidth::default(),
7946                },
7947            })
7948            .intern(db),
7949        )
7950    }
7951    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
7952        let kind = node.kind(db);
7953        assert_eq!(
7954            kind,
7955            SyntaxKind::PatternIdentifier,
7956            "Unexpected SyntaxKind {:?}. Expected {:?}.",
7957            kind,
7958            SyntaxKind::PatternIdentifier
7959        );
7960        let children = db.get_children(node.clone());
7961        Self { node, children }
7962    }
7963    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
7964        let kind = node.kind(db);
7965        if kind == SyntaxKind::PatternIdentifier {
7966            Some(Self::from_syntax_node(db, node))
7967        } else {
7968            None
7969        }
7970    }
7971    fn as_syntax_node(&self) -> SyntaxNode {
7972        self.node.clone()
7973    }
7974    fn stable_ptr(&self) -> Self::StablePtr {
7975        PatternIdentifierPtr(self.node.0.stable_ptr)
7976    }
7977}
7978impl From<&PatternIdentifier> for SyntaxStablePtrId {
7979    fn from(node: &PatternIdentifier) -> Self {
7980        node.stable_ptr().untyped()
7981    }
7982}
7983#[derive(Clone, Debug, Eq, Hash, PartialEq)]
7984pub struct PatternStruct {
7985    node: SyntaxNode,
7986    children: Arc<[SyntaxNode]>,
7987}
7988impl PatternStruct {
7989    pub const INDEX_PATH: usize = 0;
7990    pub const INDEX_LBRACE: usize = 1;
7991    pub const INDEX_PARAMS: usize = 2;
7992    pub const INDEX_RBRACE: usize = 3;
7993    pub fn new_green(
7994        db: &dyn SyntaxGroup,
7995        path: ExprPathGreen,
7996        lbrace: TerminalLBraceGreen,
7997        params: PatternStructParamListGreen,
7998        rbrace: TerminalRBraceGreen,
7999    ) -> PatternStructGreen {
8000        let children: Vec<GreenId> = vec![path.0, lbrace.0, params.0, rbrace.0];
8001        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
8002        PatternStructGreen(
8003            Arc::new(GreenNode {
8004                kind: SyntaxKind::PatternStruct,
8005                details: GreenNodeDetails::Node { children, width },
8006            })
8007            .intern(db),
8008        )
8009    }
8010}
8011impl PatternStruct {
8012    pub fn path(&self, db: &dyn SyntaxGroup) -> ExprPath {
8013        ExprPath::from_syntax_node(db, self.children[0].clone())
8014    }
8015    pub fn lbrace(&self, db: &dyn SyntaxGroup) -> TerminalLBrace {
8016        TerminalLBrace::from_syntax_node(db, self.children[1].clone())
8017    }
8018    pub fn params(&self, db: &dyn SyntaxGroup) -> PatternStructParamList {
8019        PatternStructParamList::from_syntax_node(db, self.children[2].clone())
8020    }
8021    pub fn rbrace(&self, db: &dyn SyntaxGroup) -> TerminalRBrace {
8022        TerminalRBrace::from_syntax_node(db, self.children[3].clone())
8023    }
8024}
8025#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
8026pub struct PatternStructPtr(pub SyntaxStablePtrId);
8027impl PatternStructPtr {}
8028impl TypedStablePtr for PatternStructPtr {
8029    type SyntaxNode = PatternStruct;
8030    fn untyped(&self) -> SyntaxStablePtrId {
8031        self.0
8032    }
8033    fn lookup(&self, db: &dyn SyntaxGroup) -> PatternStruct {
8034        PatternStruct::from_syntax_node(db, self.0.lookup(db))
8035    }
8036}
8037impl From<PatternStructPtr> for SyntaxStablePtrId {
8038    fn from(ptr: PatternStructPtr) -> Self {
8039        ptr.untyped()
8040    }
8041}
8042#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
8043pub struct PatternStructGreen(pub GreenId);
8044impl TypedSyntaxNode for PatternStruct {
8045    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PatternStruct);
8046    type StablePtr = PatternStructPtr;
8047    type Green = PatternStructGreen;
8048    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
8049        PatternStructGreen(
8050            Arc::new(GreenNode {
8051                kind: SyntaxKind::PatternStruct,
8052                details: GreenNodeDetails::Node {
8053                    children: vec![
8054                        ExprPath::missing(db).0,
8055                        TerminalLBrace::missing(db).0,
8056                        PatternStructParamList::missing(db).0,
8057                        TerminalRBrace::missing(db).0,
8058                    ],
8059                    width: TextWidth::default(),
8060                },
8061            })
8062            .intern(db),
8063        )
8064    }
8065    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
8066        let kind = node.kind(db);
8067        assert_eq!(
8068            kind,
8069            SyntaxKind::PatternStruct,
8070            "Unexpected SyntaxKind {:?}. Expected {:?}.",
8071            kind,
8072            SyntaxKind::PatternStruct
8073        );
8074        let children = db.get_children(node.clone());
8075        Self { node, children }
8076    }
8077    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
8078        let kind = node.kind(db);
8079        if kind == SyntaxKind::PatternStruct {
8080            Some(Self::from_syntax_node(db, node))
8081        } else {
8082            None
8083        }
8084    }
8085    fn as_syntax_node(&self) -> SyntaxNode {
8086        self.node.clone()
8087    }
8088    fn stable_ptr(&self) -> Self::StablePtr {
8089        PatternStructPtr(self.node.0.stable_ptr)
8090    }
8091}
8092impl From<&PatternStruct> for SyntaxStablePtrId {
8093    fn from(node: &PatternStruct) -> Self {
8094        node.stable_ptr().untyped()
8095    }
8096}
8097#[derive(Clone, Debug, Eq, Hash, PartialEq)]
8098pub struct PatternStructParamList(ElementList<PatternStructParam, 2>);
8099impl Deref for PatternStructParamList {
8100    type Target = ElementList<PatternStructParam, 2>;
8101    fn deref(&self) -> &Self::Target {
8102        &self.0
8103    }
8104}
8105impl PatternStructParamList {
8106    pub fn new_green(
8107        db: &dyn SyntaxGroup,
8108        children: Vec<PatternStructParamListElementOrSeparatorGreen>,
8109    ) -> PatternStructParamListGreen {
8110        let width = children.iter().map(|id| id.id().lookup_intern(db).width()).sum();
8111        PatternStructParamListGreen(
8112            Arc::new(GreenNode {
8113                kind: SyntaxKind::PatternStructParamList,
8114                details: GreenNodeDetails::Node {
8115                    children: children.iter().map(|x| x.id()).collect(),
8116                    width,
8117                },
8118            })
8119            .intern(db),
8120        )
8121    }
8122}
8123#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
8124pub struct PatternStructParamListPtr(pub SyntaxStablePtrId);
8125impl TypedStablePtr for PatternStructParamListPtr {
8126    type SyntaxNode = PatternStructParamList;
8127    fn untyped(&self) -> SyntaxStablePtrId {
8128        self.0
8129    }
8130    fn lookup(&self, db: &dyn SyntaxGroup) -> PatternStructParamList {
8131        PatternStructParamList::from_syntax_node(db, self.0.lookup(db))
8132    }
8133}
8134impl From<PatternStructParamListPtr> for SyntaxStablePtrId {
8135    fn from(ptr: PatternStructParamListPtr) -> Self {
8136        ptr.untyped()
8137    }
8138}
8139#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
8140pub enum PatternStructParamListElementOrSeparatorGreen {
8141    Separator(TerminalCommaGreen),
8142    Element(PatternStructParamGreen),
8143}
8144impl From<TerminalCommaGreen> for PatternStructParamListElementOrSeparatorGreen {
8145    fn from(value: TerminalCommaGreen) -> Self {
8146        PatternStructParamListElementOrSeparatorGreen::Separator(value)
8147    }
8148}
8149impl From<PatternStructParamGreen> for PatternStructParamListElementOrSeparatorGreen {
8150    fn from(value: PatternStructParamGreen) -> Self {
8151        PatternStructParamListElementOrSeparatorGreen::Element(value)
8152    }
8153}
8154impl PatternStructParamListElementOrSeparatorGreen {
8155    fn id(&self) -> GreenId {
8156        match self {
8157            PatternStructParamListElementOrSeparatorGreen::Separator(green) => green.0,
8158            PatternStructParamListElementOrSeparatorGreen::Element(green) => green.0,
8159        }
8160    }
8161}
8162#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
8163pub struct PatternStructParamListGreen(pub GreenId);
8164impl TypedSyntaxNode for PatternStructParamList {
8165    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PatternStructParamList);
8166    type StablePtr = PatternStructParamListPtr;
8167    type Green = PatternStructParamListGreen;
8168    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
8169        PatternStructParamListGreen(
8170            Arc::new(GreenNode {
8171                kind: SyntaxKind::PatternStructParamList,
8172                details: GreenNodeDetails::Node { children: vec![], width: TextWidth::default() },
8173            })
8174            .intern(db),
8175        )
8176    }
8177    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
8178        Self(ElementList::new(node))
8179    }
8180    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
8181        if node.kind(db) == SyntaxKind::PatternStructParamList {
8182            Some(Self(ElementList::new(node)))
8183        } else {
8184            None
8185        }
8186    }
8187    fn as_syntax_node(&self) -> SyntaxNode {
8188        self.node.clone()
8189    }
8190    fn stable_ptr(&self) -> Self::StablePtr {
8191        PatternStructParamListPtr(self.node.0.stable_ptr)
8192    }
8193}
8194impl From<&PatternStructParamList> for SyntaxStablePtrId {
8195    fn from(node: &PatternStructParamList) -> Self {
8196        node.stable_ptr().untyped()
8197    }
8198}
8199#[derive(Clone, Debug, Eq, Hash, PartialEq)]
8200pub struct PatternTuple {
8201    node: SyntaxNode,
8202    children: Arc<[SyntaxNode]>,
8203}
8204impl PatternTuple {
8205    pub const INDEX_LPAREN: usize = 0;
8206    pub const INDEX_PATTERNS: usize = 1;
8207    pub const INDEX_RPAREN: usize = 2;
8208    pub fn new_green(
8209        db: &dyn SyntaxGroup,
8210        lparen: TerminalLParenGreen,
8211        patterns: PatternListGreen,
8212        rparen: TerminalRParenGreen,
8213    ) -> PatternTupleGreen {
8214        let children: Vec<GreenId> = vec![lparen.0, patterns.0, rparen.0];
8215        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
8216        PatternTupleGreen(
8217            Arc::new(GreenNode {
8218                kind: SyntaxKind::PatternTuple,
8219                details: GreenNodeDetails::Node { children, width },
8220            })
8221            .intern(db),
8222        )
8223    }
8224}
8225impl PatternTuple {
8226    pub fn lparen(&self, db: &dyn SyntaxGroup) -> TerminalLParen {
8227        TerminalLParen::from_syntax_node(db, self.children[0].clone())
8228    }
8229    pub fn patterns(&self, db: &dyn SyntaxGroup) -> PatternList {
8230        PatternList::from_syntax_node(db, self.children[1].clone())
8231    }
8232    pub fn rparen(&self, db: &dyn SyntaxGroup) -> TerminalRParen {
8233        TerminalRParen::from_syntax_node(db, self.children[2].clone())
8234    }
8235}
8236#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
8237pub struct PatternTuplePtr(pub SyntaxStablePtrId);
8238impl PatternTuplePtr {}
8239impl TypedStablePtr for PatternTuplePtr {
8240    type SyntaxNode = PatternTuple;
8241    fn untyped(&self) -> SyntaxStablePtrId {
8242        self.0
8243    }
8244    fn lookup(&self, db: &dyn SyntaxGroup) -> PatternTuple {
8245        PatternTuple::from_syntax_node(db, self.0.lookup(db))
8246    }
8247}
8248impl From<PatternTuplePtr> for SyntaxStablePtrId {
8249    fn from(ptr: PatternTuplePtr) -> Self {
8250        ptr.untyped()
8251    }
8252}
8253#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
8254pub struct PatternTupleGreen(pub GreenId);
8255impl TypedSyntaxNode for PatternTuple {
8256    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PatternTuple);
8257    type StablePtr = PatternTuplePtr;
8258    type Green = PatternTupleGreen;
8259    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
8260        PatternTupleGreen(
8261            Arc::new(GreenNode {
8262                kind: SyntaxKind::PatternTuple,
8263                details: GreenNodeDetails::Node {
8264                    children: vec![
8265                        TerminalLParen::missing(db).0,
8266                        PatternList::missing(db).0,
8267                        TerminalRParen::missing(db).0,
8268                    ],
8269                    width: TextWidth::default(),
8270                },
8271            })
8272            .intern(db),
8273        )
8274    }
8275    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
8276        let kind = node.kind(db);
8277        assert_eq!(
8278            kind,
8279            SyntaxKind::PatternTuple,
8280            "Unexpected SyntaxKind {:?}. Expected {:?}.",
8281            kind,
8282            SyntaxKind::PatternTuple
8283        );
8284        let children = db.get_children(node.clone());
8285        Self { node, children }
8286    }
8287    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
8288        let kind = node.kind(db);
8289        if kind == SyntaxKind::PatternTuple { Some(Self::from_syntax_node(db, node)) } else { None }
8290    }
8291    fn as_syntax_node(&self) -> SyntaxNode {
8292        self.node.clone()
8293    }
8294    fn stable_ptr(&self) -> Self::StablePtr {
8295        PatternTuplePtr(self.node.0.stable_ptr)
8296    }
8297}
8298impl From<&PatternTuple> for SyntaxStablePtrId {
8299    fn from(node: &PatternTuple) -> Self {
8300        node.stable_ptr().untyped()
8301    }
8302}
8303#[derive(Clone, Debug, Eq, Hash, PartialEq)]
8304pub struct PatternFixedSizeArray {
8305    node: SyntaxNode,
8306    children: Arc<[SyntaxNode]>,
8307}
8308impl PatternFixedSizeArray {
8309    pub const INDEX_LBRACK: usize = 0;
8310    pub const INDEX_PATTERNS: usize = 1;
8311    pub const INDEX_RBRACK: usize = 2;
8312    pub fn new_green(
8313        db: &dyn SyntaxGroup,
8314        lbrack: TerminalLBrackGreen,
8315        patterns: PatternListGreen,
8316        rbrack: TerminalRBrackGreen,
8317    ) -> PatternFixedSizeArrayGreen {
8318        let children: Vec<GreenId> = vec![lbrack.0, patterns.0, rbrack.0];
8319        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
8320        PatternFixedSizeArrayGreen(
8321            Arc::new(GreenNode {
8322                kind: SyntaxKind::PatternFixedSizeArray,
8323                details: GreenNodeDetails::Node { children, width },
8324            })
8325            .intern(db),
8326        )
8327    }
8328}
8329impl PatternFixedSizeArray {
8330    pub fn lbrack(&self, db: &dyn SyntaxGroup) -> TerminalLBrack {
8331        TerminalLBrack::from_syntax_node(db, self.children[0].clone())
8332    }
8333    pub fn patterns(&self, db: &dyn SyntaxGroup) -> PatternList {
8334        PatternList::from_syntax_node(db, self.children[1].clone())
8335    }
8336    pub fn rbrack(&self, db: &dyn SyntaxGroup) -> TerminalRBrack {
8337        TerminalRBrack::from_syntax_node(db, self.children[2].clone())
8338    }
8339}
8340#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
8341pub struct PatternFixedSizeArrayPtr(pub SyntaxStablePtrId);
8342impl PatternFixedSizeArrayPtr {}
8343impl TypedStablePtr for PatternFixedSizeArrayPtr {
8344    type SyntaxNode = PatternFixedSizeArray;
8345    fn untyped(&self) -> SyntaxStablePtrId {
8346        self.0
8347    }
8348    fn lookup(&self, db: &dyn SyntaxGroup) -> PatternFixedSizeArray {
8349        PatternFixedSizeArray::from_syntax_node(db, self.0.lookup(db))
8350    }
8351}
8352impl From<PatternFixedSizeArrayPtr> for SyntaxStablePtrId {
8353    fn from(ptr: PatternFixedSizeArrayPtr) -> Self {
8354        ptr.untyped()
8355    }
8356}
8357#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
8358pub struct PatternFixedSizeArrayGreen(pub GreenId);
8359impl TypedSyntaxNode for PatternFixedSizeArray {
8360    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PatternFixedSizeArray);
8361    type StablePtr = PatternFixedSizeArrayPtr;
8362    type Green = PatternFixedSizeArrayGreen;
8363    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
8364        PatternFixedSizeArrayGreen(
8365            Arc::new(GreenNode {
8366                kind: SyntaxKind::PatternFixedSizeArray,
8367                details: GreenNodeDetails::Node {
8368                    children: vec![
8369                        TerminalLBrack::missing(db).0,
8370                        PatternList::missing(db).0,
8371                        TerminalRBrack::missing(db).0,
8372                    ],
8373                    width: TextWidth::default(),
8374                },
8375            })
8376            .intern(db),
8377        )
8378    }
8379    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
8380        let kind = node.kind(db);
8381        assert_eq!(
8382            kind,
8383            SyntaxKind::PatternFixedSizeArray,
8384            "Unexpected SyntaxKind {:?}. Expected {:?}.",
8385            kind,
8386            SyntaxKind::PatternFixedSizeArray
8387        );
8388        let children = db.get_children(node.clone());
8389        Self { node, children }
8390    }
8391    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
8392        let kind = node.kind(db);
8393        if kind == SyntaxKind::PatternFixedSizeArray {
8394            Some(Self::from_syntax_node(db, node))
8395        } else {
8396            None
8397        }
8398    }
8399    fn as_syntax_node(&self) -> SyntaxNode {
8400        self.node.clone()
8401    }
8402    fn stable_ptr(&self) -> Self::StablePtr {
8403        PatternFixedSizeArrayPtr(self.node.0.stable_ptr)
8404    }
8405}
8406impl From<&PatternFixedSizeArray> for SyntaxStablePtrId {
8407    fn from(node: &PatternFixedSizeArray) -> Self {
8408        node.stable_ptr().untyped()
8409    }
8410}
8411#[derive(Clone, Debug, Eq, Hash, PartialEq)]
8412pub struct PatternList(ElementList<Pattern, 2>);
8413impl Deref for PatternList {
8414    type Target = ElementList<Pattern, 2>;
8415    fn deref(&self) -> &Self::Target {
8416        &self.0
8417    }
8418}
8419impl PatternList {
8420    pub fn new_green(
8421        db: &dyn SyntaxGroup,
8422        children: Vec<PatternListElementOrSeparatorGreen>,
8423    ) -> PatternListGreen {
8424        let width = children.iter().map(|id| id.id().lookup_intern(db).width()).sum();
8425        PatternListGreen(
8426            Arc::new(GreenNode {
8427                kind: SyntaxKind::PatternList,
8428                details: GreenNodeDetails::Node {
8429                    children: children.iter().map(|x| x.id()).collect(),
8430                    width,
8431                },
8432            })
8433            .intern(db),
8434        )
8435    }
8436}
8437#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
8438pub struct PatternListPtr(pub SyntaxStablePtrId);
8439impl TypedStablePtr for PatternListPtr {
8440    type SyntaxNode = PatternList;
8441    fn untyped(&self) -> SyntaxStablePtrId {
8442        self.0
8443    }
8444    fn lookup(&self, db: &dyn SyntaxGroup) -> PatternList {
8445        PatternList::from_syntax_node(db, self.0.lookup(db))
8446    }
8447}
8448impl From<PatternListPtr> for SyntaxStablePtrId {
8449    fn from(ptr: PatternListPtr) -> Self {
8450        ptr.untyped()
8451    }
8452}
8453#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
8454pub enum PatternListElementOrSeparatorGreen {
8455    Separator(TerminalCommaGreen),
8456    Element(PatternGreen),
8457}
8458impl From<TerminalCommaGreen> for PatternListElementOrSeparatorGreen {
8459    fn from(value: TerminalCommaGreen) -> Self {
8460        PatternListElementOrSeparatorGreen::Separator(value)
8461    }
8462}
8463impl From<PatternGreen> for PatternListElementOrSeparatorGreen {
8464    fn from(value: PatternGreen) -> Self {
8465        PatternListElementOrSeparatorGreen::Element(value)
8466    }
8467}
8468impl PatternListElementOrSeparatorGreen {
8469    fn id(&self) -> GreenId {
8470        match self {
8471            PatternListElementOrSeparatorGreen::Separator(green) => green.0,
8472            PatternListElementOrSeparatorGreen::Element(green) => green.0,
8473        }
8474    }
8475}
8476#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
8477pub struct PatternListGreen(pub GreenId);
8478impl TypedSyntaxNode for PatternList {
8479    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PatternList);
8480    type StablePtr = PatternListPtr;
8481    type Green = PatternListGreen;
8482    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
8483        PatternListGreen(
8484            Arc::new(GreenNode {
8485                kind: SyntaxKind::PatternList,
8486                details: GreenNodeDetails::Node { children: vec![], width: TextWidth::default() },
8487            })
8488            .intern(db),
8489        )
8490    }
8491    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
8492        Self(ElementList::new(node))
8493    }
8494    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
8495        if node.kind(db) == SyntaxKind::PatternList {
8496            Some(Self(ElementList::new(node)))
8497        } else {
8498            None
8499        }
8500    }
8501    fn as_syntax_node(&self) -> SyntaxNode {
8502        self.node.clone()
8503    }
8504    fn stable_ptr(&self) -> Self::StablePtr {
8505        PatternListPtr(self.node.0.stable_ptr)
8506    }
8507}
8508impl From<&PatternList> for SyntaxStablePtrId {
8509    fn from(node: &PatternList) -> Self {
8510        node.stable_ptr().untyped()
8511    }
8512}
8513#[derive(Clone, Debug, Eq, Hash, PartialEq)]
8514pub struct PatternListOr(ElementList<Pattern, 2>);
8515impl Deref for PatternListOr {
8516    type Target = ElementList<Pattern, 2>;
8517    fn deref(&self) -> &Self::Target {
8518        &self.0
8519    }
8520}
8521impl PatternListOr {
8522    pub fn new_green(
8523        db: &dyn SyntaxGroup,
8524        children: Vec<PatternListOrElementOrSeparatorGreen>,
8525    ) -> PatternListOrGreen {
8526        let width = children.iter().map(|id| id.id().lookup_intern(db).width()).sum();
8527        PatternListOrGreen(
8528            Arc::new(GreenNode {
8529                kind: SyntaxKind::PatternListOr,
8530                details: GreenNodeDetails::Node {
8531                    children: children.iter().map(|x| x.id()).collect(),
8532                    width,
8533                },
8534            })
8535            .intern(db),
8536        )
8537    }
8538}
8539#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
8540pub struct PatternListOrPtr(pub SyntaxStablePtrId);
8541impl TypedStablePtr for PatternListOrPtr {
8542    type SyntaxNode = PatternListOr;
8543    fn untyped(&self) -> SyntaxStablePtrId {
8544        self.0
8545    }
8546    fn lookup(&self, db: &dyn SyntaxGroup) -> PatternListOr {
8547        PatternListOr::from_syntax_node(db, self.0.lookup(db))
8548    }
8549}
8550impl From<PatternListOrPtr> for SyntaxStablePtrId {
8551    fn from(ptr: PatternListOrPtr) -> Self {
8552        ptr.untyped()
8553    }
8554}
8555#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
8556pub enum PatternListOrElementOrSeparatorGreen {
8557    Separator(TerminalOrGreen),
8558    Element(PatternGreen),
8559}
8560impl From<TerminalOrGreen> for PatternListOrElementOrSeparatorGreen {
8561    fn from(value: TerminalOrGreen) -> Self {
8562        PatternListOrElementOrSeparatorGreen::Separator(value)
8563    }
8564}
8565impl From<PatternGreen> for PatternListOrElementOrSeparatorGreen {
8566    fn from(value: PatternGreen) -> Self {
8567        PatternListOrElementOrSeparatorGreen::Element(value)
8568    }
8569}
8570impl PatternListOrElementOrSeparatorGreen {
8571    fn id(&self) -> GreenId {
8572        match self {
8573            PatternListOrElementOrSeparatorGreen::Separator(green) => green.0,
8574            PatternListOrElementOrSeparatorGreen::Element(green) => green.0,
8575        }
8576    }
8577}
8578#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
8579pub struct PatternListOrGreen(pub GreenId);
8580impl TypedSyntaxNode for PatternListOr {
8581    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PatternListOr);
8582    type StablePtr = PatternListOrPtr;
8583    type Green = PatternListOrGreen;
8584    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
8585        PatternListOrGreen(
8586            Arc::new(GreenNode {
8587                kind: SyntaxKind::PatternListOr,
8588                details: GreenNodeDetails::Node { children: vec![], width: TextWidth::default() },
8589            })
8590            .intern(db),
8591        )
8592    }
8593    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
8594        Self(ElementList::new(node))
8595    }
8596    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
8597        if node.kind(db) == SyntaxKind::PatternListOr {
8598            Some(Self(ElementList::new(node)))
8599        } else {
8600            None
8601        }
8602    }
8603    fn as_syntax_node(&self) -> SyntaxNode {
8604        self.node.clone()
8605    }
8606    fn stable_ptr(&self) -> Self::StablePtr {
8607        PatternListOrPtr(self.node.0.stable_ptr)
8608    }
8609}
8610impl From<&PatternListOr> for SyntaxStablePtrId {
8611    fn from(node: &PatternListOr) -> Self {
8612        node.stable_ptr().untyped()
8613    }
8614}
8615#[derive(Clone, Debug, Eq, Hash, PartialEq)]
8616pub enum PatternStructParam {
8617    Single(PatternIdentifier),
8618    WithExpr(PatternStructParamWithExpr),
8619    Tail(TerminalDotDot),
8620}
8621#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
8622pub struct PatternStructParamPtr(pub SyntaxStablePtrId);
8623impl TypedStablePtr for PatternStructParamPtr {
8624    type SyntaxNode = PatternStructParam;
8625    fn untyped(&self) -> SyntaxStablePtrId {
8626        self.0
8627    }
8628    fn lookup(&self, db: &dyn SyntaxGroup) -> PatternStructParam {
8629        PatternStructParam::from_syntax_node(db, self.0.lookup(db))
8630    }
8631}
8632impl From<PatternStructParamPtr> for SyntaxStablePtrId {
8633    fn from(ptr: PatternStructParamPtr) -> Self {
8634        ptr.untyped()
8635    }
8636}
8637impl From<PatternIdentifierPtr> for PatternStructParamPtr {
8638    fn from(value: PatternIdentifierPtr) -> Self {
8639        Self(value.0)
8640    }
8641}
8642impl From<PatternStructParamWithExprPtr> for PatternStructParamPtr {
8643    fn from(value: PatternStructParamWithExprPtr) -> Self {
8644        Self(value.0)
8645    }
8646}
8647impl From<TerminalDotDotPtr> for PatternStructParamPtr {
8648    fn from(value: TerminalDotDotPtr) -> Self {
8649        Self(value.0)
8650    }
8651}
8652impl From<PatternIdentifierGreen> for PatternStructParamGreen {
8653    fn from(value: PatternIdentifierGreen) -> Self {
8654        Self(value.0)
8655    }
8656}
8657impl From<PatternStructParamWithExprGreen> for PatternStructParamGreen {
8658    fn from(value: PatternStructParamWithExprGreen) -> Self {
8659        Self(value.0)
8660    }
8661}
8662impl From<TerminalDotDotGreen> for PatternStructParamGreen {
8663    fn from(value: TerminalDotDotGreen) -> Self {
8664        Self(value.0)
8665    }
8666}
8667#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
8668pub struct PatternStructParamGreen(pub GreenId);
8669impl TypedSyntaxNode for PatternStructParam {
8670    const OPTIONAL_KIND: Option<SyntaxKind> = None;
8671    type StablePtr = PatternStructParamPtr;
8672    type Green = PatternStructParamGreen;
8673    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
8674        panic!("No missing variant.");
8675    }
8676    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
8677        let kind = node.kind(db);
8678        match kind {
8679            SyntaxKind::PatternIdentifier => {
8680                PatternStructParam::Single(PatternIdentifier::from_syntax_node(db, node))
8681            }
8682            SyntaxKind::PatternStructParamWithExpr => {
8683                PatternStructParam::WithExpr(PatternStructParamWithExpr::from_syntax_node(db, node))
8684            }
8685            SyntaxKind::TerminalDotDot => {
8686                PatternStructParam::Tail(TerminalDotDot::from_syntax_node(db, node))
8687            }
8688            _ => panic!(
8689                "Unexpected syntax kind {:?} when constructing {}.",
8690                kind, "PatternStructParam"
8691            ),
8692        }
8693    }
8694    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
8695        let kind = node.kind(db);
8696        match kind {
8697            SyntaxKind::PatternIdentifier => {
8698                Some(PatternStructParam::Single(PatternIdentifier::from_syntax_node(db, node)))
8699            }
8700            SyntaxKind::PatternStructParamWithExpr => Some(PatternStructParam::WithExpr(
8701                PatternStructParamWithExpr::from_syntax_node(db, node),
8702            )),
8703            SyntaxKind::TerminalDotDot => {
8704                Some(PatternStructParam::Tail(TerminalDotDot::from_syntax_node(db, node)))
8705            }
8706            _ => None,
8707        }
8708    }
8709    fn as_syntax_node(&self) -> SyntaxNode {
8710        match self {
8711            PatternStructParam::Single(x) => x.as_syntax_node(),
8712            PatternStructParam::WithExpr(x) => x.as_syntax_node(),
8713            PatternStructParam::Tail(x) => x.as_syntax_node(),
8714        }
8715    }
8716    fn stable_ptr(&self) -> Self::StablePtr {
8717        PatternStructParamPtr(self.as_syntax_node().0.stable_ptr)
8718    }
8719}
8720impl From<&PatternStructParam> for SyntaxStablePtrId {
8721    fn from(node: &PatternStructParam) -> Self {
8722        node.stable_ptr().untyped()
8723    }
8724}
8725impl PatternStructParam {
8726    /// Checks if a kind of a variant of [PatternStructParam].
8727    pub fn is_variant(kind: SyntaxKind) -> bool {
8728        matches!(
8729            kind,
8730            SyntaxKind::PatternIdentifier
8731                | SyntaxKind::PatternStructParamWithExpr
8732                | SyntaxKind::TerminalDotDot
8733        )
8734    }
8735}
8736#[derive(Clone, Debug, Eq, Hash, PartialEq)]
8737pub struct PatternStructParamWithExpr {
8738    node: SyntaxNode,
8739    children: Arc<[SyntaxNode]>,
8740}
8741impl PatternStructParamWithExpr {
8742    pub const INDEX_MODIFIERS: usize = 0;
8743    pub const INDEX_NAME: usize = 1;
8744    pub const INDEX_COLON: usize = 2;
8745    pub const INDEX_PATTERN: usize = 3;
8746    pub fn new_green(
8747        db: &dyn SyntaxGroup,
8748        modifiers: ModifierListGreen,
8749        name: TerminalIdentifierGreen,
8750        colon: TerminalColonGreen,
8751        pattern: PatternGreen,
8752    ) -> PatternStructParamWithExprGreen {
8753        let children: Vec<GreenId> = vec![modifiers.0, name.0, colon.0, pattern.0];
8754        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
8755        PatternStructParamWithExprGreen(
8756            Arc::new(GreenNode {
8757                kind: SyntaxKind::PatternStructParamWithExpr,
8758                details: GreenNodeDetails::Node { children, width },
8759            })
8760            .intern(db),
8761        )
8762    }
8763}
8764impl PatternStructParamWithExpr {
8765    pub fn modifiers(&self, db: &dyn SyntaxGroup) -> ModifierList {
8766        ModifierList::from_syntax_node(db, self.children[0].clone())
8767    }
8768    pub fn name(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier {
8769        TerminalIdentifier::from_syntax_node(db, self.children[1].clone())
8770    }
8771    pub fn colon(&self, db: &dyn SyntaxGroup) -> TerminalColon {
8772        TerminalColon::from_syntax_node(db, self.children[2].clone())
8773    }
8774    pub fn pattern(&self, db: &dyn SyntaxGroup) -> Pattern {
8775        Pattern::from_syntax_node(db, self.children[3].clone())
8776    }
8777}
8778#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
8779pub struct PatternStructParamWithExprPtr(pub SyntaxStablePtrId);
8780impl PatternStructParamWithExprPtr {}
8781impl TypedStablePtr for PatternStructParamWithExprPtr {
8782    type SyntaxNode = PatternStructParamWithExpr;
8783    fn untyped(&self) -> SyntaxStablePtrId {
8784        self.0
8785    }
8786    fn lookup(&self, db: &dyn SyntaxGroup) -> PatternStructParamWithExpr {
8787        PatternStructParamWithExpr::from_syntax_node(db, self.0.lookup(db))
8788    }
8789}
8790impl From<PatternStructParamWithExprPtr> for SyntaxStablePtrId {
8791    fn from(ptr: PatternStructParamWithExprPtr) -> Self {
8792        ptr.untyped()
8793    }
8794}
8795#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
8796pub struct PatternStructParamWithExprGreen(pub GreenId);
8797impl TypedSyntaxNode for PatternStructParamWithExpr {
8798    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PatternStructParamWithExpr);
8799    type StablePtr = PatternStructParamWithExprPtr;
8800    type Green = PatternStructParamWithExprGreen;
8801    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
8802        PatternStructParamWithExprGreen(
8803            Arc::new(GreenNode {
8804                kind: SyntaxKind::PatternStructParamWithExpr,
8805                details: GreenNodeDetails::Node {
8806                    children: vec![
8807                        ModifierList::missing(db).0,
8808                        TerminalIdentifier::missing(db).0,
8809                        TerminalColon::missing(db).0,
8810                        Pattern::missing(db).0,
8811                    ],
8812                    width: TextWidth::default(),
8813                },
8814            })
8815            .intern(db),
8816        )
8817    }
8818    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
8819        let kind = node.kind(db);
8820        assert_eq!(
8821            kind,
8822            SyntaxKind::PatternStructParamWithExpr,
8823            "Unexpected SyntaxKind {:?}. Expected {:?}.",
8824            kind,
8825            SyntaxKind::PatternStructParamWithExpr
8826        );
8827        let children = db.get_children(node.clone());
8828        Self { node, children }
8829    }
8830    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
8831        let kind = node.kind(db);
8832        if kind == SyntaxKind::PatternStructParamWithExpr {
8833            Some(Self::from_syntax_node(db, node))
8834        } else {
8835            None
8836        }
8837    }
8838    fn as_syntax_node(&self) -> SyntaxNode {
8839        self.node.clone()
8840    }
8841    fn stable_ptr(&self) -> Self::StablePtr {
8842        PatternStructParamWithExprPtr(self.node.0.stable_ptr)
8843    }
8844}
8845impl From<&PatternStructParamWithExpr> for SyntaxStablePtrId {
8846    fn from(node: &PatternStructParamWithExpr) -> Self {
8847        node.stable_ptr().untyped()
8848    }
8849}
8850#[derive(Clone, Debug, Eq, Hash, PartialEq)]
8851pub struct PatternEnum {
8852    node: SyntaxNode,
8853    children: Arc<[SyntaxNode]>,
8854}
8855impl PatternEnum {
8856    pub const INDEX_PATH: usize = 0;
8857    pub const INDEX_PATTERN: usize = 1;
8858    pub fn new_green(
8859        db: &dyn SyntaxGroup,
8860        path: ExprPathGreen,
8861        pattern: OptionPatternEnumInnerPatternGreen,
8862    ) -> PatternEnumGreen {
8863        let children: Vec<GreenId> = vec![path.0, pattern.0];
8864        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
8865        PatternEnumGreen(
8866            Arc::new(GreenNode {
8867                kind: SyntaxKind::PatternEnum,
8868                details: GreenNodeDetails::Node { children, width },
8869            })
8870            .intern(db),
8871        )
8872    }
8873}
8874impl PatternEnum {
8875    pub fn path(&self, db: &dyn SyntaxGroup) -> ExprPath {
8876        ExprPath::from_syntax_node(db, self.children[0].clone())
8877    }
8878    pub fn pattern(&self, db: &dyn SyntaxGroup) -> OptionPatternEnumInnerPattern {
8879        OptionPatternEnumInnerPattern::from_syntax_node(db, self.children[1].clone())
8880    }
8881}
8882#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
8883pub struct PatternEnumPtr(pub SyntaxStablePtrId);
8884impl PatternEnumPtr {}
8885impl TypedStablePtr for PatternEnumPtr {
8886    type SyntaxNode = PatternEnum;
8887    fn untyped(&self) -> SyntaxStablePtrId {
8888        self.0
8889    }
8890    fn lookup(&self, db: &dyn SyntaxGroup) -> PatternEnum {
8891        PatternEnum::from_syntax_node(db, self.0.lookup(db))
8892    }
8893}
8894impl From<PatternEnumPtr> for SyntaxStablePtrId {
8895    fn from(ptr: PatternEnumPtr) -> Self {
8896        ptr.untyped()
8897    }
8898}
8899#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
8900pub struct PatternEnumGreen(pub GreenId);
8901impl TypedSyntaxNode for PatternEnum {
8902    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PatternEnum);
8903    type StablePtr = PatternEnumPtr;
8904    type Green = PatternEnumGreen;
8905    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
8906        PatternEnumGreen(
8907            Arc::new(GreenNode {
8908                kind: SyntaxKind::PatternEnum,
8909                details: GreenNodeDetails::Node {
8910                    children: vec![
8911                        ExprPath::missing(db).0,
8912                        OptionPatternEnumInnerPattern::missing(db).0,
8913                    ],
8914                    width: TextWidth::default(),
8915                },
8916            })
8917            .intern(db),
8918        )
8919    }
8920    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
8921        let kind = node.kind(db);
8922        assert_eq!(
8923            kind,
8924            SyntaxKind::PatternEnum,
8925            "Unexpected SyntaxKind {:?}. Expected {:?}.",
8926            kind,
8927            SyntaxKind::PatternEnum
8928        );
8929        let children = db.get_children(node.clone());
8930        Self { node, children }
8931    }
8932    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
8933        let kind = node.kind(db);
8934        if kind == SyntaxKind::PatternEnum { Some(Self::from_syntax_node(db, node)) } else { None }
8935    }
8936    fn as_syntax_node(&self) -> SyntaxNode {
8937        self.node.clone()
8938    }
8939    fn stable_ptr(&self) -> Self::StablePtr {
8940        PatternEnumPtr(self.node.0.stable_ptr)
8941    }
8942}
8943impl From<&PatternEnum> for SyntaxStablePtrId {
8944    fn from(node: &PatternEnum) -> Self {
8945        node.stable_ptr().untyped()
8946    }
8947}
8948#[derive(Clone, Debug, Eq, Hash, PartialEq)]
8949pub struct PatternEnumInnerPattern {
8950    node: SyntaxNode,
8951    children: Arc<[SyntaxNode]>,
8952}
8953impl PatternEnumInnerPattern {
8954    pub const INDEX_LPAREN: usize = 0;
8955    pub const INDEX_PATTERN: usize = 1;
8956    pub const INDEX_RPAREN: usize = 2;
8957    pub fn new_green(
8958        db: &dyn SyntaxGroup,
8959        lparen: TerminalLParenGreen,
8960        pattern: PatternGreen,
8961        rparen: TerminalRParenGreen,
8962    ) -> PatternEnumInnerPatternGreen {
8963        let children: Vec<GreenId> = vec![lparen.0, pattern.0, rparen.0];
8964        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
8965        PatternEnumInnerPatternGreen(
8966            Arc::new(GreenNode {
8967                kind: SyntaxKind::PatternEnumInnerPattern,
8968                details: GreenNodeDetails::Node { children, width },
8969            })
8970            .intern(db),
8971        )
8972    }
8973}
8974impl PatternEnumInnerPattern {
8975    pub fn lparen(&self, db: &dyn SyntaxGroup) -> TerminalLParen {
8976        TerminalLParen::from_syntax_node(db, self.children[0].clone())
8977    }
8978    pub fn pattern(&self, db: &dyn SyntaxGroup) -> Pattern {
8979        Pattern::from_syntax_node(db, self.children[1].clone())
8980    }
8981    pub fn rparen(&self, db: &dyn SyntaxGroup) -> TerminalRParen {
8982        TerminalRParen::from_syntax_node(db, self.children[2].clone())
8983    }
8984}
8985#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
8986pub struct PatternEnumInnerPatternPtr(pub SyntaxStablePtrId);
8987impl PatternEnumInnerPatternPtr {}
8988impl TypedStablePtr for PatternEnumInnerPatternPtr {
8989    type SyntaxNode = PatternEnumInnerPattern;
8990    fn untyped(&self) -> SyntaxStablePtrId {
8991        self.0
8992    }
8993    fn lookup(&self, db: &dyn SyntaxGroup) -> PatternEnumInnerPattern {
8994        PatternEnumInnerPattern::from_syntax_node(db, self.0.lookup(db))
8995    }
8996}
8997impl From<PatternEnumInnerPatternPtr> for SyntaxStablePtrId {
8998    fn from(ptr: PatternEnumInnerPatternPtr) -> Self {
8999        ptr.untyped()
9000    }
9001}
9002#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
9003pub struct PatternEnumInnerPatternGreen(pub GreenId);
9004impl TypedSyntaxNode for PatternEnumInnerPattern {
9005    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PatternEnumInnerPattern);
9006    type StablePtr = PatternEnumInnerPatternPtr;
9007    type Green = PatternEnumInnerPatternGreen;
9008    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
9009        PatternEnumInnerPatternGreen(
9010            Arc::new(GreenNode {
9011                kind: SyntaxKind::PatternEnumInnerPattern,
9012                details: GreenNodeDetails::Node {
9013                    children: vec![
9014                        TerminalLParen::missing(db).0,
9015                        Pattern::missing(db).0,
9016                        TerminalRParen::missing(db).0,
9017                    ],
9018                    width: TextWidth::default(),
9019                },
9020            })
9021            .intern(db),
9022        )
9023    }
9024    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
9025        let kind = node.kind(db);
9026        assert_eq!(
9027            kind,
9028            SyntaxKind::PatternEnumInnerPattern,
9029            "Unexpected SyntaxKind {:?}. Expected {:?}.",
9030            kind,
9031            SyntaxKind::PatternEnumInnerPattern
9032        );
9033        let children = db.get_children(node.clone());
9034        Self { node, children }
9035    }
9036    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
9037        let kind = node.kind(db);
9038        if kind == SyntaxKind::PatternEnumInnerPattern {
9039            Some(Self::from_syntax_node(db, node))
9040        } else {
9041            None
9042        }
9043    }
9044    fn as_syntax_node(&self) -> SyntaxNode {
9045        self.node.clone()
9046    }
9047    fn stable_ptr(&self) -> Self::StablePtr {
9048        PatternEnumInnerPatternPtr(self.node.0.stable_ptr)
9049    }
9050}
9051impl From<&PatternEnumInnerPattern> for SyntaxStablePtrId {
9052    fn from(node: &PatternEnumInnerPattern) -> Self {
9053        node.stable_ptr().untyped()
9054    }
9055}
9056#[derive(Clone, Debug, Eq, Hash, PartialEq)]
9057pub enum OptionPatternEnumInnerPattern {
9058    Empty(OptionPatternEnumInnerPatternEmpty),
9059    PatternEnumInnerPattern(PatternEnumInnerPattern),
9060}
9061#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
9062pub struct OptionPatternEnumInnerPatternPtr(pub SyntaxStablePtrId);
9063impl TypedStablePtr for OptionPatternEnumInnerPatternPtr {
9064    type SyntaxNode = OptionPatternEnumInnerPattern;
9065    fn untyped(&self) -> SyntaxStablePtrId {
9066        self.0
9067    }
9068    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionPatternEnumInnerPattern {
9069        OptionPatternEnumInnerPattern::from_syntax_node(db, self.0.lookup(db))
9070    }
9071}
9072impl From<OptionPatternEnumInnerPatternPtr> for SyntaxStablePtrId {
9073    fn from(ptr: OptionPatternEnumInnerPatternPtr) -> Self {
9074        ptr.untyped()
9075    }
9076}
9077impl From<OptionPatternEnumInnerPatternEmptyPtr> for OptionPatternEnumInnerPatternPtr {
9078    fn from(value: OptionPatternEnumInnerPatternEmptyPtr) -> Self {
9079        Self(value.0)
9080    }
9081}
9082impl From<PatternEnumInnerPatternPtr> for OptionPatternEnumInnerPatternPtr {
9083    fn from(value: PatternEnumInnerPatternPtr) -> Self {
9084        Self(value.0)
9085    }
9086}
9087impl From<OptionPatternEnumInnerPatternEmptyGreen> for OptionPatternEnumInnerPatternGreen {
9088    fn from(value: OptionPatternEnumInnerPatternEmptyGreen) -> Self {
9089        Self(value.0)
9090    }
9091}
9092impl From<PatternEnumInnerPatternGreen> for OptionPatternEnumInnerPatternGreen {
9093    fn from(value: PatternEnumInnerPatternGreen) -> Self {
9094        Self(value.0)
9095    }
9096}
9097#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
9098pub struct OptionPatternEnumInnerPatternGreen(pub GreenId);
9099impl TypedSyntaxNode for OptionPatternEnumInnerPattern {
9100    const OPTIONAL_KIND: Option<SyntaxKind> = None;
9101    type StablePtr = OptionPatternEnumInnerPatternPtr;
9102    type Green = OptionPatternEnumInnerPatternGreen;
9103    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
9104        panic!("No missing variant.");
9105    }
9106    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
9107        let kind = node.kind(db);
9108        match kind {
9109            SyntaxKind::OptionPatternEnumInnerPatternEmpty => OptionPatternEnumInnerPattern::Empty(
9110                OptionPatternEnumInnerPatternEmpty::from_syntax_node(db, node),
9111            ),
9112            SyntaxKind::PatternEnumInnerPattern => {
9113                OptionPatternEnumInnerPattern::PatternEnumInnerPattern(
9114                    PatternEnumInnerPattern::from_syntax_node(db, node),
9115                )
9116            }
9117            _ => panic!(
9118                "Unexpected syntax kind {:?} when constructing {}.",
9119                kind, "OptionPatternEnumInnerPattern"
9120            ),
9121        }
9122    }
9123    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
9124        let kind = node.kind(db);
9125        match kind {
9126            SyntaxKind::OptionPatternEnumInnerPatternEmpty => {
9127                Some(OptionPatternEnumInnerPattern::Empty(
9128                    OptionPatternEnumInnerPatternEmpty::from_syntax_node(db, node),
9129                ))
9130            }
9131            SyntaxKind::PatternEnumInnerPattern => {
9132                Some(OptionPatternEnumInnerPattern::PatternEnumInnerPattern(
9133                    PatternEnumInnerPattern::from_syntax_node(db, node),
9134                ))
9135            }
9136            _ => None,
9137        }
9138    }
9139    fn as_syntax_node(&self) -> SyntaxNode {
9140        match self {
9141            OptionPatternEnumInnerPattern::Empty(x) => x.as_syntax_node(),
9142            OptionPatternEnumInnerPattern::PatternEnumInnerPattern(x) => x.as_syntax_node(),
9143        }
9144    }
9145    fn stable_ptr(&self) -> Self::StablePtr {
9146        OptionPatternEnumInnerPatternPtr(self.as_syntax_node().0.stable_ptr)
9147    }
9148}
9149impl From<&OptionPatternEnumInnerPattern> for SyntaxStablePtrId {
9150    fn from(node: &OptionPatternEnumInnerPattern) -> Self {
9151        node.stable_ptr().untyped()
9152    }
9153}
9154impl OptionPatternEnumInnerPattern {
9155    /// Checks if a kind of a variant of [OptionPatternEnumInnerPattern].
9156    pub fn is_variant(kind: SyntaxKind) -> bool {
9157        matches!(
9158            kind,
9159            SyntaxKind::OptionPatternEnumInnerPatternEmpty | SyntaxKind::PatternEnumInnerPattern
9160        )
9161    }
9162}
9163#[derive(Clone, Debug, Eq, Hash, PartialEq)]
9164pub struct OptionPatternEnumInnerPatternEmpty {
9165    node: SyntaxNode,
9166    children: Arc<[SyntaxNode]>,
9167}
9168impl OptionPatternEnumInnerPatternEmpty {
9169    pub fn new_green(db: &dyn SyntaxGroup) -> OptionPatternEnumInnerPatternEmptyGreen {
9170        let children: Vec<GreenId> = vec![];
9171        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
9172        OptionPatternEnumInnerPatternEmptyGreen(
9173            Arc::new(GreenNode {
9174                kind: SyntaxKind::OptionPatternEnumInnerPatternEmpty,
9175                details: GreenNodeDetails::Node { children, width },
9176            })
9177            .intern(db),
9178        )
9179    }
9180}
9181impl OptionPatternEnumInnerPatternEmpty {}
9182#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
9183pub struct OptionPatternEnumInnerPatternEmptyPtr(pub SyntaxStablePtrId);
9184impl OptionPatternEnumInnerPatternEmptyPtr {}
9185impl TypedStablePtr for OptionPatternEnumInnerPatternEmptyPtr {
9186    type SyntaxNode = OptionPatternEnumInnerPatternEmpty;
9187    fn untyped(&self) -> SyntaxStablePtrId {
9188        self.0
9189    }
9190    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionPatternEnumInnerPatternEmpty {
9191        OptionPatternEnumInnerPatternEmpty::from_syntax_node(db, self.0.lookup(db))
9192    }
9193}
9194impl From<OptionPatternEnumInnerPatternEmptyPtr> for SyntaxStablePtrId {
9195    fn from(ptr: OptionPatternEnumInnerPatternEmptyPtr) -> Self {
9196        ptr.untyped()
9197    }
9198}
9199#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
9200pub struct OptionPatternEnumInnerPatternEmptyGreen(pub GreenId);
9201impl TypedSyntaxNode for OptionPatternEnumInnerPatternEmpty {
9202    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionPatternEnumInnerPatternEmpty);
9203    type StablePtr = OptionPatternEnumInnerPatternEmptyPtr;
9204    type Green = OptionPatternEnumInnerPatternEmptyGreen;
9205    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
9206        OptionPatternEnumInnerPatternEmptyGreen(
9207            Arc::new(GreenNode {
9208                kind: SyntaxKind::OptionPatternEnumInnerPatternEmpty,
9209                details: GreenNodeDetails::Node { children: vec![], width: TextWidth::default() },
9210            })
9211            .intern(db),
9212        )
9213    }
9214    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
9215        let kind = node.kind(db);
9216        assert_eq!(
9217            kind,
9218            SyntaxKind::OptionPatternEnumInnerPatternEmpty,
9219            "Unexpected SyntaxKind {:?}. Expected {:?}.",
9220            kind,
9221            SyntaxKind::OptionPatternEnumInnerPatternEmpty
9222        );
9223        let children = db.get_children(node.clone());
9224        Self { node, children }
9225    }
9226    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
9227        let kind = node.kind(db);
9228        if kind == SyntaxKind::OptionPatternEnumInnerPatternEmpty {
9229            Some(Self::from_syntax_node(db, node))
9230        } else {
9231            None
9232        }
9233    }
9234    fn as_syntax_node(&self) -> SyntaxNode {
9235        self.node.clone()
9236    }
9237    fn stable_ptr(&self) -> Self::StablePtr {
9238        OptionPatternEnumInnerPatternEmptyPtr(self.node.0.stable_ptr)
9239    }
9240}
9241impl From<&OptionPatternEnumInnerPatternEmpty> for SyntaxStablePtrId {
9242    fn from(node: &OptionPatternEnumInnerPatternEmpty) -> Self {
9243        node.stable_ptr().untyped()
9244    }
9245}
9246#[derive(Clone, Debug, Eq, Hash, PartialEq)]
9247pub struct TypeClause {
9248    node: SyntaxNode,
9249    children: Arc<[SyntaxNode]>,
9250}
9251impl TypeClause {
9252    pub const INDEX_COLON: usize = 0;
9253    pub const INDEX_TY: usize = 1;
9254    pub fn new_green(
9255        db: &dyn SyntaxGroup,
9256        colon: TerminalColonGreen,
9257        ty: ExprGreen,
9258    ) -> TypeClauseGreen {
9259        let children: Vec<GreenId> = vec![colon.0, ty.0];
9260        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
9261        TypeClauseGreen(
9262            Arc::new(GreenNode {
9263                kind: SyntaxKind::TypeClause,
9264                details: GreenNodeDetails::Node { children, width },
9265            })
9266            .intern(db),
9267        )
9268    }
9269}
9270impl TypeClause {
9271    pub fn colon(&self, db: &dyn SyntaxGroup) -> TerminalColon {
9272        TerminalColon::from_syntax_node(db, self.children[0].clone())
9273    }
9274    pub fn ty(&self, db: &dyn SyntaxGroup) -> Expr {
9275        Expr::from_syntax_node(db, self.children[1].clone())
9276    }
9277}
9278#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
9279pub struct TypeClausePtr(pub SyntaxStablePtrId);
9280impl TypeClausePtr {}
9281impl TypedStablePtr for TypeClausePtr {
9282    type SyntaxNode = TypeClause;
9283    fn untyped(&self) -> SyntaxStablePtrId {
9284        self.0
9285    }
9286    fn lookup(&self, db: &dyn SyntaxGroup) -> TypeClause {
9287        TypeClause::from_syntax_node(db, self.0.lookup(db))
9288    }
9289}
9290impl From<TypeClausePtr> for SyntaxStablePtrId {
9291    fn from(ptr: TypeClausePtr) -> Self {
9292        ptr.untyped()
9293    }
9294}
9295#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
9296pub struct TypeClauseGreen(pub GreenId);
9297impl TypedSyntaxNode for TypeClause {
9298    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TypeClause);
9299    type StablePtr = TypeClausePtr;
9300    type Green = TypeClauseGreen;
9301    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
9302        TypeClauseGreen(
9303            Arc::new(GreenNode {
9304                kind: SyntaxKind::TypeClause,
9305                details: GreenNodeDetails::Node {
9306                    children: vec![TerminalColon::missing(db).0, Expr::missing(db).0],
9307                    width: TextWidth::default(),
9308                },
9309            })
9310            .intern(db),
9311        )
9312    }
9313    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
9314        let kind = node.kind(db);
9315        assert_eq!(
9316            kind,
9317            SyntaxKind::TypeClause,
9318            "Unexpected SyntaxKind {:?}. Expected {:?}.",
9319            kind,
9320            SyntaxKind::TypeClause
9321        );
9322        let children = db.get_children(node.clone());
9323        Self { node, children }
9324    }
9325    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
9326        let kind = node.kind(db);
9327        if kind == SyntaxKind::TypeClause { Some(Self::from_syntax_node(db, node)) } else { None }
9328    }
9329    fn as_syntax_node(&self) -> SyntaxNode {
9330        self.node.clone()
9331    }
9332    fn stable_ptr(&self) -> Self::StablePtr {
9333        TypeClausePtr(self.node.0.stable_ptr)
9334    }
9335}
9336impl From<&TypeClause> for SyntaxStablePtrId {
9337    fn from(node: &TypeClause) -> Self {
9338        node.stable_ptr().untyped()
9339    }
9340}
9341#[derive(Clone, Debug, Eq, Hash, PartialEq)]
9342pub enum OptionTypeClause {
9343    Empty(OptionTypeClauseEmpty),
9344    TypeClause(TypeClause),
9345}
9346#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
9347pub struct OptionTypeClausePtr(pub SyntaxStablePtrId);
9348impl TypedStablePtr for OptionTypeClausePtr {
9349    type SyntaxNode = OptionTypeClause;
9350    fn untyped(&self) -> SyntaxStablePtrId {
9351        self.0
9352    }
9353    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionTypeClause {
9354        OptionTypeClause::from_syntax_node(db, self.0.lookup(db))
9355    }
9356}
9357impl From<OptionTypeClausePtr> for SyntaxStablePtrId {
9358    fn from(ptr: OptionTypeClausePtr) -> Self {
9359        ptr.untyped()
9360    }
9361}
9362impl From<OptionTypeClauseEmptyPtr> for OptionTypeClausePtr {
9363    fn from(value: OptionTypeClauseEmptyPtr) -> Self {
9364        Self(value.0)
9365    }
9366}
9367impl From<TypeClausePtr> for OptionTypeClausePtr {
9368    fn from(value: TypeClausePtr) -> Self {
9369        Self(value.0)
9370    }
9371}
9372impl From<OptionTypeClauseEmptyGreen> for OptionTypeClauseGreen {
9373    fn from(value: OptionTypeClauseEmptyGreen) -> Self {
9374        Self(value.0)
9375    }
9376}
9377impl From<TypeClauseGreen> for OptionTypeClauseGreen {
9378    fn from(value: TypeClauseGreen) -> Self {
9379        Self(value.0)
9380    }
9381}
9382#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
9383pub struct OptionTypeClauseGreen(pub GreenId);
9384impl TypedSyntaxNode for OptionTypeClause {
9385    const OPTIONAL_KIND: Option<SyntaxKind> = None;
9386    type StablePtr = OptionTypeClausePtr;
9387    type Green = OptionTypeClauseGreen;
9388    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
9389        panic!("No missing variant.");
9390    }
9391    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
9392        let kind = node.kind(db);
9393        match kind {
9394            SyntaxKind::OptionTypeClauseEmpty => {
9395                OptionTypeClause::Empty(OptionTypeClauseEmpty::from_syntax_node(db, node))
9396            }
9397            SyntaxKind::TypeClause => {
9398                OptionTypeClause::TypeClause(TypeClause::from_syntax_node(db, node))
9399            }
9400            _ => panic!(
9401                "Unexpected syntax kind {:?} when constructing {}.",
9402                kind, "OptionTypeClause"
9403            ),
9404        }
9405    }
9406    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
9407        let kind = node.kind(db);
9408        match kind {
9409            SyntaxKind::OptionTypeClauseEmpty => {
9410                Some(OptionTypeClause::Empty(OptionTypeClauseEmpty::from_syntax_node(db, node)))
9411            }
9412            SyntaxKind::TypeClause => {
9413                Some(OptionTypeClause::TypeClause(TypeClause::from_syntax_node(db, node)))
9414            }
9415            _ => None,
9416        }
9417    }
9418    fn as_syntax_node(&self) -> SyntaxNode {
9419        match self {
9420            OptionTypeClause::Empty(x) => x.as_syntax_node(),
9421            OptionTypeClause::TypeClause(x) => x.as_syntax_node(),
9422        }
9423    }
9424    fn stable_ptr(&self) -> Self::StablePtr {
9425        OptionTypeClausePtr(self.as_syntax_node().0.stable_ptr)
9426    }
9427}
9428impl From<&OptionTypeClause> for SyntaxStablePtrId {
9429    fn from(node: &OptionTypeClause) -> Self {
9430        node.stable_ptr().untyped()
9431    }
9432}
9433impl OptionTypeClause {
9434    /// Checks if a kind of a variant of [OptionTypeClause].
9435    pub fn is_variant(kind: SyntaxKind) -> bool {
9436        matches!(kind, SyntaxKind::OptionTypeClauseEmpty | SyntaxKind::TypeClause)
9437    }
9438}
9439#[derive(Clone, Debug, Eq, Hash, PartialEq)]
9440pub struct OptionTypeClauseEmpty {
9441    node: SyntaxNode,
9442    children: Arc<[SyntaxNode]>,
9443}
9444impl OptionTypeClauseEmpty {
9445    pub fn new_green(db: &dyn SyntaxGroup) -> OptionTypeClauseEmptyGreen {
9446        let children: Vec<GreenId> = vec![];
9447        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
9448        OptionTypeClauseEmptyGreen(
9449            Arc::new(GreenNode {
9450                kind: SyntaxKind::OptionTypeClauseEmpty,
9451                details: GreenNodeDetails::Node { children, width },
9452            })
9453            .intern(db),
9454        )
9455    }
9456}
9457impl OptionTypeClauseEmpty {}
9458#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
9459pub struct OptionTypeClauseEmptyPtr(pub SyntaxStablePtrId);
9460impl OptionTypeClauseEmptyPtr {}
9461impl TypedStablePtr for OptionTypeClauseEmptyPtr {
9462    type SyntaxNode = OptionTypeClauseEmpty;
9463    fn untyped(&self) -> SyntaxStablePtrId {
9464        self.0
9465    }
9466    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionTypeClauseEmpty {
9467        OptionTypeClauseEmpty::from_syntax_node(db, self.0.lookup(db))
9468    }
9469}
9470impl From<OptionTypeClauseEmptyPtr> for SyntaxStablePtrId {
9471    fn from(ptr: OptionTypeClauseEmptyPtr) -> Self {
9472        ptr.untyped()
9473    }
9474}
9475#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
9476pub struct OptionTypeClauseEmptyGreen(pub GreenId);
9477impl TypedSyntaxNode for OptionTypeClauseEmpty {
9478    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionTypeClauseEmpty);
9479    type StablePtr = OptionTypeClauseEmptyPtr;
9480    type Green = OptionTypeClauseEmptyGreen;
9481    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
9482        OptionTypeClauseEmptyGreen(
9483            Arc::new(GreenNode {
9484                kind: SyntaxKind::OptionTypeClauseEmpty,
9485                details: GreenNodeDetails::Node { children: vec![], width: TextWidth::default() },
9486            })
9487            .intern(db),
9488        )
9489    }
9490    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
9491        let kind = node.kind(db);
9492        assert_eq!(
9493            kind,
9494            SyntaxKind::OptionTypeClauseEmpty,
9495            "Unexpected SyntaxKind {:?}. Expected {:?}.",
9496            kind,
9497            SyntaxKind::OptionTypeClauseEmpty
9498        );
9499        let children = db.get_children(node.clone());
9500        Self { node, children }
9501    }
9502    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
9503        let kind = node.kind(db);
9504        if kind == SyntaxKind::OptionTypeClauseEmpty {
9505            Some(Self::from_syntax_node(db, node))
9506        } else {
9507            None
9508        }
9509    }
9510    fn as_syntax_node(&self) -> SyntaxNode {
9511        self.node.clone()
9512    }
9513    fn stable_ptr(&self) -> Self::StablePtr {
9514        OptionTypeClauseEmptyPtr(self.node.0.stable_ptr)
9515    }
9516}
9517impl From<&OptionTypeClauseEmpty> for SyntaxStablePtrId {
9518    fn from(node: &OptionTypeClauseEmpty) -> Self {
9519        node.stable_ptr().untyped()
9520    }
9521}
9522#[derive(Clone, Debug, Eq, Hash, PartialEq)]
9523pub struct ReturnTypeClause {
9524    node: SyntaxNode,
9525    children: Arc<[SyntaxNode]>,
9526}
9527impl ReturnTypeClause {
9528    pub const INDEX_ARROW: usize = 0;
9529    pub const INDEX_TY: usize = 1;
9530    pub fn new_green(
9531        db: &dyn SyntaxGroup,
9532        arrow: TerminalArrowGreen,
9533        ty: ExprGreen,
9534    ) -> ReturnTypeClauseGreen {
9535        let children: Vec<GreenId> = vec![arrow.0, ty.0];
9536        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
9537        ReturnTypeClauseGreen(
9538            Arc::new(GreenNode {
9539                kind: SyntaxKind::ReturnTypeClause,
9540                details: GreenNodeDetails::Node { children, width },
9541            })
9542            .intern(db),
9543        )
9544    }
9545}
9546impl ReturnTypeClause {
9547    pub fn arrow(&self, db: &dyn SyntaxGroup) -> TerminalArrow {
9548        TerminalArrow::from_syntax_node(db, self.children[0].clone())
9549    }
9550    pub fn ty(&self, db: &dyn SyntaxGroup) -> Expr {
9551        Expr::from_syntax_node(db, self.children[1].clone())
9552    }
9553}
9554#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
9555pub struct ReturnTypeClausePtr(pub SyntaxStablePtrId);
9556impl ReturnTypeClausePtr {}
9557impl TypedStablePtr for ReturnTypeClausePtr {
9558    type SyntaxNode = ReturnTypeClause;
9559    fn untyped(&self) -> SyntaxStablePtrId {
9560        self.0
9561    }
9562    fn lookup(&self, db: &dyn SyntaxGroup) -> ReturnTypeClause {
9563        ReturnTypeClause::from_syntax_node(db, self.0.lookup(db))
9564    }
9565}
9566impl From<ReturnTypeClausePtr> for SyntaxStablePtrId {
9567    fn from(ptr: ReturnTypeClausePtr) -> Self {
9568        ptr.untyped()
9569    }
9570}
9571#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
9572pub struct ReturnTypeClauseGreen(pub GreenId);
9573impl TypedSyntaxNode for ReturnTypeClause {
9574    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ReturnTypeClause);
9575    type StablePtr = ReturnTypeClausePtr;
9576    type Green = ReturnTypeClauseGreen;
9577    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
9578        ReturnTypeClauseGreen(
9579            Arc::new(GreenNode {
9580                kind: SyntaxKind::ReturnTypeClause,
9581                details: GreenNodeDetails::Node {
9582                    children: vec![TerminalArrow::missing(db).0, Expr::missing(db).0],
9583                    width: TextWidth::default(),
9584                },
9585            })
9586            .intern(db),
9587        )
9588    }
9589    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
9590        let kind = node.kind(db);
9591        assert_eq!(
9592            kind,
9593            SyntaxKind::ReturnTypeClause,
9594            "Unexpected SyntaxKind {:?}. Expected {:?}.",
9595            kind,
9596            SyntaxKind::ReturnTypeClause
9597        );
9598        let children = db.get_children(node.clone());
9599        Self { node, children }
9600    }
9601    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
9602        let kind = node.kind(db);
9603        if kind == SyntaxKind::ReturnTypeClause {
9604            Some(Self::from_syntax_node(db, node))
9605        } else {
9606            None
9607        }
9608    }
9609    fn as_syntax_node(&self) -> SyntaxNode {
9610        self.node.clone()
9611    }
9612    fn stable_ptr(&self) -> Self::StablePtr {
9613        ReturnTypeClausePtr(self.node.0.stable_ptr)
9614    }
9615}
9616impl From<&ReturnTypeClause> for SyntaxStablePtrId {
9617    fn from(node: &ReturnTypeClause) -> Self {
9618        node.stable_ptr().untyped()
9619    }
9620}
9621#[derive(Clone, Debug, Eq, Hash, PartialEq)]
9622pub enum OptionReturnTypeClause {
9623    Empty(OptionReturnTypeClauseEmpty),
9624    ReturnTypeClause(ReturnTypeClause),
9625}
9626#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
9627pub struct OptionReturnTypeClausePtr(pub SyntaxStablePtrId);
9628impl TypedStablePtr for OptionReturnTypeClausePtr {
9629    type SyntaxNode = OptionReturnTypeClause;
9630    fn untyped(&self) -> SyntaxStablePtrId {
9631        self.0
9632    }
9633    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionReturnTypeClause {
9634        OptionReturnTypeClause::from_syntax_node(db, self.0.lookup(db))
9635    }
9636}
9637impl From<OptionReturnTypeClausePtr> for SyntaxStablePtrId {
9638    fn from(ptr: OptionReturnTypeClausePtr) -> Self {
9639        ptr.untyped()
9640    }
9641}
9642impl From<OptionReturnTypeClauseEmptyPtr> for OptionReturnTypeClausePtr {
9643    fn from(value: OptionReturnTypeClauseEmptyPtr) -> Self {
9644        Self(value.0)
9645    }
9646}
9647impl From<ReturnTypeClausePtr> for OptionReturnTypeClausePtr {
9648    fn from(value: ReturnTypeClausePtr) -> Self {
9649        Self(value.0)
9650    }
9651}
9652impl From<OptionReturnTypeClauseEmptyGreen> for OptionReturnTypeClauseGreen {
9653    fn from(value: OptionReturnTypeClauseEmptyGreen) -> Self {
9654        Self(value.0)
9655    }
9656}
9657impl From<ReturnTypeClauseGreen> for OptionReturnTypeClauseGreen {
9658    fn from(value: ReturnTypeClauseGreen) -> Self {
9659        Self(value.0)
9660    }
9661}
9662#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
9663pub struct OptionReturnTypeClauseGreen(pub GreenId);
9664impl TypedSyntaxNode for OptionReturnTypeClause {
9665    const OPTIONAL_KIND: Option<SyntaxKind> = None;
9666    type StablePtr = OptionReturnTypeClausePtr;
9667    type Green = OptionReturnTypeClauseGreen;
9668    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
9669        panic!("No missing variant.");
9670    }
9671    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
9672        let kind = node.kind(db);
9673        match kind {
9674            SyntaxKind::OptionReturnTypeClauseEmpty => OptionReturnTypeClause::Empty(
9675                OptionReturnTypeClauseEmpty::from_syntax_node(db, node),
9676            ),
9677            SyntaxKind::ReturnTypeClause => OptionReturnTypeClause::ReturnTypeClause(
9678                ReturnTypeClause::from_syntax_node(db, node),
9679            ),
9680            _ => panic!(
9681                "Unexpected syntax kind {:?} when constructing {}.",
9682                kind, "OptionReturnTypeClause"
9683            ),
9684        }
9685    }
9686    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
9687        let kind = node.kind(db);
9688        match kind {
9689            SyntaxKind::OptionReturnTypeClauseEmpty => Some(OptionReturnTypeClause::Empty(
9690                OptionReturnTypeClauseEmpty::from_syntax_node(db, node),
9691            )),
9692            SyntaxKind::ReturnTypeClause => Some(OptionReturnTypeClause::ReturnTypeClause(
9693                ReturnTypeClause::from_syntax_node(db, node),
9694            )),
9695            _ => None,
9696        }
9697    }
9698    fn as_syntax_node(&self) -> SyntaxNode {
9699        match self {
9700            OptionReturnTypeClause::Empty(x) => x.as_syntax_node(),
9701            OptionReturnTypeClause::ReturnTypeClause(x) => x.as_syntax_node(),
9702        }
9703    }
9704    fn stable_ptr(&self) -> Self::StablePtr {
9705        OptionReturnTypeClausePtr(self.as_syntax_node().0.stable_ptr)
9706    }
9707}
9708impl From<&OptionReturnTypeClause> for SyntaxStablePtrId {
9709    fn from(node: &OptionReturnTypeClause) -> Self {
9710        node.stable_ptr().untyped()
9711    }
9712}
9713impl OptionReturnTypeClause {
9714    /// Checks if a kind of a variant of [OptionReturnTypeClause].
9715    pub fn is_variant(kind: SyntaxKind) -> bool {
9716        matches!(kind, SyntaxKind::OptionReturnTypeClauseEmpty | SyntaxKind::ReturnTypeClause)
9717    }
9718}
9719#[derive(Clone, Debug, Eq, Hash, PartialEq)]
9720pub struct OptionReturnTypeClauseEmpty {
9721    node: SyntaxNode,
9722    children: Arc<[SyntaxNode]>,
9723}
9724impl OptionReturnTypeClauseEmpty {
9725    pub fn new_green(db: &dyn SyntaxGroup) -> OptionReturnTypeClauseEmptyGreen {
9726        let children: Vec<GreenId> = vec![];
9727        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
9728        OptionReturnTypeClauseEmptyGreen(
9729            Arc::new(GreenNode {
9730                kind: SyntaxKind::OptionReturnTypeClauseEmpty,
9731                details: GreenNodeDetails::Node { children, width },
9732            })
9733            .intern(db),
9734        )
9735    }
9736}
9737impl OptionReturnTypeClauseEmpty {}
9738#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
9739pub struct OptionReturnTypeClauseEmptyPtr(pub SyntaxStablePtrId);
9740impl OptionReturnTypeClauseEmptyPtr {}
9741impl TypedStablePtr for OptionReturnTypeClauseEmptyPtr {
9742    type SyntaxNode = OptionReturnTypeClauseEmpty;
9743    fn untyped(&self) -> SyntaxStablePtrId {
9744        self.0
9745    }
9746    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionReturnTypeClauseEmpty {
9747        OptionReturnTypeClauseEmpty::from_syntax_node(db, self.0.lookup(db))
9748    }
9749}
9750impl From<OptionReturnTypeClauseEmptyPtr> for SyntaxStablePtrId {
9751    fn from(ptr: OptionReturnTypeClauseEmptyPtr) -> Self {
9752        ptr.untyped()
9753    }
9754}
9755#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
9756pub struct OptionReturnTypeClauseEmptyGreen(pub GreenId);
9757impl TypedSyntaxNode for OptionReturnTypeClauseEmpty {
9758    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionReturnTypeClauseEmpty);
9759    type StablePtr = OptionReturnTypeClauseEmptyPtr;
9760    type Green = OptionReturnTypeClauseEmptyGreen;
9761    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
9762        OptionReturnTypeClauseEmptyGreen(
9763            Arc::new(GreenNode {
9764                kind: SyntaxKind::OptionReturnTypeClauseEmpty,
9765                details: GreenNodeDetails::Node { children: vec![], width: TextWidth::default() },
9766            })
9767            .intern(db),
9768        )
9769    }
9770    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
9771        let kind = node.kind(db);
9772        assert_eq!(
9773            kind,
9774            SyntaxKind::OptionReturnTypeClauseEmpty,
9775            "Unexpected SyntaxKind {:?}. Expected {:?}.",
9776            kind,
9777            SyntaxKind::OptionReturnTypeClauseEmpty
9778        );
9779        let children = db.get_children(node.clone());
9780        Self { node, children }
9781    }
9782    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
9783        let kind = node.kind(db);
9784        if kind == SyntaxKind::OptionReturnTypeClauseEmpty {
9785            Some(Self::from_syntax_node(db, node))
9786        } else {
9787            None
9788        }
9789    }
9790    fn as_syntax_node(&self) -> SyntaxNode {
9791        self.node.clone()
9792    }
9793    fn stable_ptr(&self) -> Self::StablePtr {
9794        OptionReturnTypeClauseEmptyPtr(self.node.0.stable_ptr)
9795    }
9796}
9797impl From<&OptionReturnTypeClauseEmpty> for SyntaxStablePtrId {
9798    fn from(node: &OptionReturnTypeClauseEmpty) -> Self {
9799        node.stable_ptr().untyped()
9800    }
9801}
9802#[derive(Clone, Debug, Eq, Hash, PartialEq)]
9803pub enum Statement {
9804    Let(StatementLet),
9805    Expr(StatementExpr),
9806    Continue(StatementContinue),
9807    Return(StatementReturn),
9808    Break(StatementBreak),
9809    Item(StatementItem),
9810    Missing(StatementMissing),
9811}
9812#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
9813pub struct StatementPtr(pub SyntaxStablePtrId);
9814impl TypedStablePtr for StatementPtr {
9815    type SyntaxNode = Statement;
9816    fn untyped(&self) -> SyntaxStablePtrId {
9817        self.0
9818    }
9819    fn lookup(&self, db: &dyn SyntaxGroup) -> Statement {
9820        Statement::from_syntax_node(db, self.0.lookup(db))
9821    }
9822}
9823impl From<StatementPtr> for SyntaxStablePtrId {
9824    fn from(ptr: StatementPtr) -> Self {
9825        ptr.untyped()
9826    }
9827}
9828impl From<StatementLetPtr> for StatementPtr {
9829    fn from(value: StatementLetPtr) -> Self {
9830        Self(value.0)
9831    }
9832}
9833impl From<StatementExprPtr> for StatementPtr {
9834    fn from(value: StatementExprPtr) -> Self {
9835        Self(value.0)
9836    }
9837}
9838impl From<StatementContinuePtr> for StatementPtr {
9839    fn from(value: StatementContinuePtr) -> Self {
9840        Self(value.0)
9841    }
9842}
9843impl From<StatementReturnPtr> for StatementPtr {
9844    fn from(value: StatementReturnPtr) -> Self {
9845        Self(value.0)
9846    }
9847}
9848impl From<StatementBreakPtr> for StatementPtr {
9849    fn from(value: StatementBreakPtr) -> Self {
9850        Self(value.0)
9851    }
9852}
9853impl From<StatementItemPtr> for StatementPtr {
9854    fn from(value: StatementItemPtr) -> Self {
9855        Self(value.0)
9856    }
9857}
9858impl From<StatementMissingPtr> for StatementPtr {
9859    fn from(value: StatementMissingPtr) -> Self {
9860        Self(value.0)
9861    }
9862}
9863impl From<StatementLetGreen> for StatementGreen {
9864    fn from(value: StatementLetGreen) -> Self {
9865        Self(value.0)
9866    }
9867}
9868impl From<StatementExprGreen> for StatementGreen {
9869    fn from(value: StatementExprGreen) -> Self {
9870        Self(value.0)
9871    }
9872}
9873impl From<StatementContinueGreen> for StatementGreen {
9874    fn from(value: StatementContinueGreen) -> Self {
9875        Self(value.0)
9876    }
9877}
9878impl From<StatementReturnGreen> for StatementGreen {
9879    fn from(value: StatementReturnGreen) -> Self {
9880        Self(value.0)
9881    }
9882}
9883impl From<StatementBreakGreen> for StatementGreen {
9884    fn from(value: StatementBreakGreen) -> Self {
9885        Self(value.0)
9886    }
9887}
9888impl From<StatementItemGreen> for StatementGreen {
9889    fn from(value: StatementItemGreen) -> Self {
9890        Self(value.0)
9891    }
9892}
9893impl From<StatementMissingGreen> for StatementGreen {
9894    fn from(value: StatementMissingGreen) -> Self {
9895        Self(value.0)
9896    }
9897}
9898#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
9899pub struct StatementGreen(pub GreenId);
9900impl TypedSyntaxNode for Statement {
9901    const OPTIONAL_KIND: Option<SyntaxKind> = None;
9902    type StablePtr = StatementPtr;
9903    type Green = StatementGreen;
9904    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
9905        StatementGreen(StatementMissing::missing(db).0)
9906    }
9907    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
9908        let kind = node.kind(db);
9909        match kind {
9910            SyntaxKind::StatementLet => Statement::Let(StatementLet::from_syntax_node(db, node)),
9911            SyntaxKind::StatementExpr => Statement::Expr(StatementExpr::from_syntax_node(db, node)),
9912            SyntaxKind::StatementContinue => {
9913                Statement::Continue(StatementContinue::from_syntax_node(db, node))
9914            }
9915            SyntaxKind::StatementReturn => {
9916                Statement::Return(StatementReturn::from_syntax_node(db, node))
9917            }
9918            SyntaxKind::StatementBreak => {
9919                Statement::Break(StatementBreak::from_syntax_node(db, node))
9920            }
9921            SyntaxKind::StatementItem => Statement::Item(StatementItem::from_syntax_node(db, node)),
9922            SyntaxKind::StatementMissing => {
9923                Statement::Missing(StatementMissing::from_syntax_node(db, node))
9924            }
9925            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "Statement"),
9926        }
9927    }
9928    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
9929        let kind = node.kind(db);
9930        match kind {
9931            SyntaxKind::StatementLet => {
9932                Some(Statement::Let(StatementLet::from_syntax_node(db, node)))
9933            }
9934            SyntaxKind::StatementExpr => {
9935                Some(Statement::Expr(StatementExpr::from_syntax_node(db, node)))
9936            }
9937            SyntaxKind::StatementContinue => {
9938                Some(Statement::Continue(StatementContinue::from_syntax_node(db, node)))
9939            }
9940            SyntaxKind::StatementReturn => {
9941                Some(Statement::Return(StatementReturn::from_syntax_node(db, node)))
9942            }
9943            SyntaxKind::StatementBreak => {
9944                Some(Statement::Break(StatementBreak::from_syntax_node(db, node)))
9945            }
9946            SyntaxKind::StatementItem => {
9947                Some(Statement::Item(StatementItem::from_syntax_node(db, node)))
9948            }
9949            SyntaxKind::StatementMissing => {
9950                Some(Statement::Missing(StatementMissing::from_syntax_node(db, node)))
9951            }
9952            _ => None,
9953        }
9954    }
9955    fn as_syntax_node(&self) -> SyntaxNode {
9956        match self {
9957            Statement::Let(x) => x.as_syntax_node(),
9958            Statement::Expr(x) => x.as_syntax_node(),
9959            Statement::Continue(x) => x.as_syntax_node(),
9960            Statement::Return(x) => x.as_syntax_node(),
9961            Statement::Break(x) => x.as_syntax_node(),
9962            Statement::Item(x) => x.as_syntax_node(),
9963            Statement::Missing(x) => x.as_syntax_node(),
9964        }
9965    }
9966    fn stable_ptr(&self) -> Self::StablePtr {
9967        StatementPtr(self.as_syntax_node().0.stable_ptr)
9968    }
9969}
9970impl From<&Statement> for SyntaxStablePtrId {
9971    fn from(node: &Statement) -> Self {
9972        node.stable_ptr().untyped()
9973    }
9974}
9975impl Statement {
9976    /// Checks if a kind of a variant of [Statement].
9977    pub fn is_variant(kind: SyntaxKind) -> bool {
9978        matches!(
9979            kind,
9980            SyntaxKind::StatementLet
9981                | SyntaxKind::StatementExpr
9982                | SyntaxKind::StatementContinue
9983                | SyntaxKind::StatementReturn
9984                | SyntaxKind::StatementBreak
9985                | SyntaxKind::StatementItem
9986                | SyntaxKind::StatementMissing
9987        )
9988    }
9989}
9990#[derive(Clone, Debug, Eq, Hash, PartialEq)]
9991pub struct StatementList(ElementList<Statement, 1>);
9992impl Deref for StatementList {
9993    type Target = ElementList<Statement, 1>;
9994    fn deref(&self) -> &Self::Target {
9995        &self.0
9996    }
9997}
9998impl StatementList {
9999    pub fn new_green(db: &dyn SyntaxGroup, children: Vec<StatementGreen>) -> StatementListGreen {
10000        let width = children.iter().map(|id| id.0.lookup_intern(db).width()).sum();
10001        StatementListGreen(
10002            Arc::new(GreenNode {
10003                kind: SyntaxKind::StatementList,
10004                details: GreenNodeDetails::Node {
10005                    children: children.iter().map(|x| x.0).collect(),
10006                    width,
10007                },
10008            })
10009            .intern(db),
10010        )
10011    }
10012}
10013#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
10014pub struct StatementListPtr(pub SyntaxStablePtrId);
10015impl TypedStablePtr for StatementListPtr {
10016    type SyntaxNode = StatementList;
10017    fn untyped(&self) -> SyntaxStablePtrId {
10018        self.0
10019    }
10020    fn lookup(&self, db: &dyn SyntaxGroup) -> StatementList {
10021        StatementList::from_syntax_node(db, self.0.lookup(db))
10022    }
10023}
10024impl From<StatementListPtr> for SyntaxStablePtrId {
10025    fn from(ptr: StatementListPtr) -> Self {
10026        ptr.untyped()
10027    }
10028}
10029#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
10030pub struct StatementListGreen(pub GreenId);
10031impl TypedSyntaxNode for StatementList {
10032    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StatementList);
10033    type StablePtr = StatementListPtr;
10034    type Green = StatementListGreen;
10035    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
10036        StatementListGreen(
10037            Arc::new(GreenNode {
10038                kind: SyntaxKind::StatementList,
10039                details: GreenNodeDetails::Node { children: vec![], width: TextWidth::default() },
10040            })
10041            .intern(db),
10042        )
10043    }
10044    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
10045        Self(ElementList::new(node))
10046    }
10047    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
10048        if node.kind(db) == SyntaxKind::StatementList {
10049            Some(Self(ElementList::new(node)))
10050        } else {
10051            None
10052        }
10053    }
10054    fn as_syntax_node(&self) -> SyntaxNode {
10055        self.node.clone()
10056    }
10057    fn stable_ptr(&self) -> Self::StablePtr {
10058        StatementListPtr(self.node.0.stable_ptr)
10059    }
10060}
10061impl From<&StatementList> for SyntaxStablePtrId {
10062    fn from(node: &StatementList) -> Self {
10063        node.stable_ptr().untyped()
10064    }
10065}
10066#[derive(Clone, Debug, Eq, Hash, PartialEq)]
10067pub struct StatementMissing {
10068    node: SyntaxNode,
10069    children: Arc<[SyntaxNode]>,
10070}
10071impl StatementMissing {
10072    pub fn new_green(db: &dyn SyntaxGroup) -> StatementMissingGreen {
10073        let children: Vec<GreenId> = vec![];
10074        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
10075        StatementMissingGreen(
10076            Arc::new(GreenNode {
10077                kind: SyntaxKind::StatementMissing,
10078                details: GreenNodeDetails::Node { children, width },
10079            })
10080            .intern(db),
10081        )
10082    }
10083}
10084impl StatementMissing {}
10085#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
10086pub struct StatementMissingPtr(pub SyntaxStablePtrId);
10087impl StatementMissingPtr {}
10088impl TypedStablePtr for StatementMissingPtr {
10089    type SyntaxNode = StatementMissing;
10090    fn untyped(&self) -> SyntaxStablePtrId {
10091        self.0
10092    }
10093    fn lookup(&self, db: &dyn SyntaxGroup) -> StatementMissing {
10094        StatementMissing::from_syntax_node(db, self.0.lookup(db))
10095    }
10096}
10097impl From<StatementMissingPtr> for SyntaxStablePtrId {
10098    fn from(ptr: StatementMissingPtr) -> Self {
10099        ptr.untyped()
10100    }
10101}
10102#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
10103pub struct StatementMissingGreen(pub GreenId);
10104impl TypedSyntaxNode for StatementMissing {
10105    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StatementMissing);
10106    type StablePtr = StatementMissingPtr;
10107    type Green = StatementMissingGreen;
10108    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
10109        StatementMissingGreen(
10110            Arc::new(GreenNode {
10111                kind: SyntaxKind::StatementMissing,
10112                details: GreenNodeDetails::Node { children: vec![], width: TextWidth::default() },
10113            })
10114            .intern(db),
10115        )
10116    }
10117    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
10118        let kind = node.kind(db);
10119        assert_eq!(
10120            kind,
10121            SyntaxKind::StatementMissing,
10122            "Unexpected SyntaxKind {:?}. Expected {:?}.",
10123            kind,
10124            SyntaxKind::StatementMissing
10125        );
10126        let children = db.get_children(node.clone());
10127        Self { node, children }
10128    }
10129    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
10130        let kind = node.kind(db);
10131        if kind == SyntaxKind::StatementMissing {
10132            Some(Self::from_syntax_node(db, node))
10133        } else {
10134            None
10135        }
10136    }
10137    fn as_syntax_node(&self) -> SyntaxNode {
10138        self.node.clone()
10139    }
10140    fn stable_ptr(&self) -> Self::StablePtr {
10141        StatementMissingPtr(self.node.0.stable_ptr)
10142    }
10143}
10144impl From<&StatementMissing> for SyntaxStablePtrId {
10145    fn from(node: &StatementMissing) -> Self {
10146        node.stable_ptr().untyped()
10147    }
10148}
10149#[derive(Clone, Debug, Eq, Hash, PartialEq)]
10150pub struct StatementLet {
10151    node: SyntaxNode,
10152    children: Arc<[SyntaxNode]>,
10153}
10154impl StatementLet {
10155    pub const INDEX_ATTRIBUTES: usize = 0;
10156    pub const INDEX_LET_KW: usize = 1;
10157    pub const INDEX_PATTERN: usize = 2;
10158    pub const INDEX_TYPE_CLAUSE: usize = 3;
10159    pub const INDEX_EQ: usize = 4;
10160    pub const INDEX_RHS: usize = 5;
10161    pub const INDEX_SEMICOLON: usize = 6;
10162    pub fn new_green(
10163        db: &dyn SyntaxGroup,
10164        attributes: AttributeListGreen,
10165        let_kw: TerminalLetGreen,
10166        pattern: PatternGreen,
10167        type_clause: OptionTypeClauseGreen,
10168        eq: TerminalEqGreen,
10169        rhs: ExprGreen,
10170        semicolon: TerminalSemicolonGreen,
10171    ) -> StatementLetGreen {
10172        let children: Vec<GreenId> =
10173            vec![attributes.0, let_kw.0, pattern.0, type_clause.0, eq.0, rhs.0, semicolon.0];
10174        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
10175        StatementLetGreen(
10176            Arc::new(GreenNode {
10177                kind: SyntaxKind::StatementLet,
10178                details: GreenNodeDetails::Node { children, width },
10179            })
10180            .intern(db),
10181        )
10182    }
10183}
10184impl StatementLet {
10185    pub fn attributes(&self, db: &dyn SyntaxGroup) -> AttributeList {
10186        AttributeList::from_syntax_node(db, self.children[0].clone())
10187    }
10188    pub fn let_kw(&self, db: &dyn SyntaxGroup) -> TerminalLet {
10189        TerminalLet::from_syntax_node(db, self.children[1].clone())
10190    }
10191    pub fn pattern(&self, db: &dyn SyntaxGroup) -> Pattern {
10192        Pattern::from_syntax_node(db, self.children[2].clone())
10193    }
10194    pub fn type_clause(&self, db: &dyn SyntaxGroup) -> OptionTypeClause {
10195        OptionTypeClause::from_syntax_node(db, self.children[3].clone())
10196    }
10197    pub fn eq(&self, db: &dyn SyntaxGroup) -> TerminalEq {
10198        TerminalEq::from_syntax_node(db, self.children[4].clone())
10199    }
10200    pub fn rhs(&self, db: &dyn SyntaxGroup) -> Expr {
10201        Expr::from_syntax_node(db, self.children[5].clone())
10202    }
10203    pub fn semicolon(&self, db: &dyn SyntaxGroup) -> TerminalSemicolon {
10204        TerminalSemicolon::from_syntax_node(db, self.children[6].clone())
10205    }
10206}
10207#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
10208pub struct StatementLetPtr(pub SyntaxStablePtrId);
10209impl StatementLetPtr {
10210    pub fn pattern_green(self, db: &dyn SyntaxGroup) -> PatternGreen {
10211        let ptr = self.0.lookup_intern(db);
10212        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
10213            PatternGreen(key_fields[0])
10214        } else {
10215            panic!("Unexpected key field query on root.");
10216        }
10217    }
10218}
10219impl TypedStablePtr for StatementLetPtr {
10220    type SyntaxNode = StatementLet;
10221    fn untyped(&self) -> SyntaxStablePtrId {
10222        self.0
10223    }
10224    fn lookup(&self, db: &dyn SyntaxGroup) -> StatementLet {
10225        StatementLet::from_syntax_node(db, self.0.lookup(db))
10226    }
10227}
10228impl From<StatementLetPtr> for SyntaxStablePtrId {
10229    fn from(ptr: StatementLetPtr) -> Self {
10230        ptr.untyped()
10231    }
10232}
10233#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
10234pub struct StatementLetGreen(pub GreenId);
10235impl TypedSyntaxNode for StatementLet {
10236    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StatementLet);
10237    type StablePtr = StatementLetPtr;
10238    type Green = StatementLetGreen;
10239    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
10240        StatementLetGreen(
10241            Arc::new(GreenNode {
10242                kind: SyntaxKind::StatementLet,
10243                details: GreenNodeDetails::Node {
10244                    children: vec![
10245                        AttributeList::missing(db).0,
10246                        TerminalLet::missing(db).0,
10247                        Pattern::missing(db).0,
10248                        OptionTypeClause::missing(db).0,
10249                        TerminalEq::missing(db).0,
10250                        Expr::missing(db).0,
10251                        TerminalSemicolon::missing(db).0,
10252                    ],
10253                    width: TextWidth::default(),
10254                },
10255            })
10256            .intern(db),
10257        )
10258    }
10259    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
10260        let kind = node.kind(db);
10261        assert_eq!(
10262            kind,
10263            SyntaxKind::StatementLet,
10264            "Unexpected SyntaxKind {:?}. Expected {:?}.",
10265            kind,
10266            SyntaxKind::StatementLet
10267        );
10268        let children = db.get_children(node.clone());
10269        Self { node, children }
10270    }
10271    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
10272        let kind = node.kind(db);
10273        if kind == SyntaxKind::StatementLet { Some(Self::from_syntax_node(db, node)) } else { None }
10274    }
10275    fn as_syntax_node(&self) -> SyntaxNode {
10276        self.node.clone()
10277    }
10278    fn stable_ptr(&self) -> Self::StablePtr {
10279        StatementLetPtr(self.node.0.stable_ptr)
10280    }
10281}
10282impl From<&StatementLet> for SyntaxStablePtrId {
10283    fn from(node: &StatementLet) -> Self {
10284        node.stable_ptr().untyped()
10285    }
10286}
10287#[derive(Clone, Debug, Eq, Hash, PartialEq)]
10288pub enum OptionTerminalSemicolon {
10289    Empty(OptionTerminalSemicolonEmpty),
10290    TerminalSemicolon(TerminalSemicolon),
10291}
10292#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
10293pub struct OptionTerminalSemicolonPtr(pub SyntaxStablePtrId);
10294impl TypedStablePtr for OptionTerminalSemicolonPtr {
10295    type SyntaxNode = OptionTerminalSemicolon;
10296    fn untyped(&self) -> SyntaxStablePtrId {
10297        self.0
10298    }
10299    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionTerminalSemicolon {
10300        OptionTerminalSemicolon::from_syntax_node(db, self.0.lookup(db))
10301    }
10302}
10303impl From<OptionTerminalSemicolonPtr> for SyntaxStablePtrId {
10304    fn from(ptr: OptionTerminalSemicolonPtr) -> Self {
10305        ptr.untyped()
10306    }
10307}
10308impl From<OptionTerminalSemicolonEmptyPtr> for OptionTerminalSemicolonPtr {
10309    fn from(value: OptionTerminalSemicolonEmptyPtr) -> Self {
10310        Self(value.0)
10311    }
10312}
10313impl From<TerminalSemicolonPtr> for OptionTerminalSemicolonPtr {
10314    fn from(value: TerminalSemicolonPtr) -> Self {
10315        Self(value.0)
10316    }
10317}
10318impl From<OptionTerminalSemicolonEmptyGreen> for OptionTerminalSemicolonGreen {
10319    fn from(value: OptionTerminalSemicolonEmptyGreen) -> Self {
10320        Self(value.0)
10321    }
10322}
10323impl From<TerminalSemicolonGreen> for OptionTerminalSemicolonGreen {
10324    fn from(value: TerminalSemicolonGreen) -> Self {
10325        Self(value.0)
10326    }
10327}
10328#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
10329pub struct OptionTerminalSemicolonGreen(pub GreenId);
10330impl TypedSyntaxNode for OptionTerminalSemicolon {
10331    const OPTIONAL_KIND: Option<SyntaxKind> = None;
10332    type StablePtr = OptionTerminalSemicolonPtr;
10333    type Green = OptionTerminalSemicolonGreen;
10334    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
10335        panic!("No missing variant.");
10336    }
10337    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
10338        let kind = node.kind(db);
10339        match kind {
10340            SyntaxKind::OptionTerminalSemicolonEmpty => OptionTerminalSemicolon::Empty(
10341                OptionTerminalSemicolonEmpty::from_syntax_node(db, node),
10342            ),
10343            SyntaxKind::TerminalSemicolon => OptionTerminalSemicolon::TerminalSemicolon(
10344                TerminalSemicolon::from_syntax_node(db, node),
10345            ),
10346            _ => panic!(
10347                "Unexpected syntax kind {:?} when constructing {}.",
10348                kind, "OptionTerminalSemicolon"
10349            ),
10350        }
10351    }
10352    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
10353        let kind = node.kind(db);
10354        match kind {
10355            SyntaxKind::OptionTerminalSemicolonEmpty => Some(OptionTerminalSemicolon::Empty(
10356                OptionTerminalSemicolonEmpty::from_syntax_node(db, node),
10357            )),
10358            SyntaxKind::TerminalSemicolon => Some(OptionTerminalSemicolon::TerminalSemicolon(
10359                TerminalSemicolon::from_syntax_node(db, node),
10360            )),
10361            _ => None,
10362        }
10363    }
10364    fn as_syntax_node(&self) -> SyntaxNode {
10365        match self {
10366            OptionTerminalSemicolon::Empty(x) => x.as_syntax_node(),
10367            OptionTerminalSemicolon::TerminalSemicolon(x) => x.as_syntax_node(),
10368        }
10369    }
10370    fn stable_ptr(&self) -> Self::StablePtr {
10371        OptionTerminalSemicolonPtr(self.as_syntax_node().0.stable_ptr)
10372    }
10373}
10374impl From<&OptionTerminalSemicolon> for SyntaxStablePtrId {
10375    fn from(node: &OptionTerminalSemicolon) -> Self {
10376        node.stable_ptr().untyped()
10377    }
10378}
10379impl OptionTerminalSemicolon {
10380    /// Checks if a kind of a variant of [OptionTerminalSemicolon].
10381    pub fn is_variant(kind: SyntaxKind) -> bool {
10382        matches!(kind, SyntaxKind::OptionTerminalSemicolonEmpty | SyntaxKind::TerminalSemicolon)
10383    }
10384}
10385#[derive(Clone, Debug, Eq, Hash, PartialEq)]
10386pub struct OptionTerminalSemicolonEmpty {
10387    node: SyntaxNode,
10388    children: Arc<[SyntaxNode]>,
10389}
10390impl OptionTerminalSemicolonEmpty {
10391    pub fn new_green(db: &dyn SyntaxGroup) -> OptionTerminalSemicolonEmptyGreen {
10392        let children: Vec<GreenId> = vec![];
10393        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
10394        OptionTerminalSemicolonEmptyGreen(
10395            Arc::new(GreenNode {
10396                kind: SyntaxKind::OptionTerminalSemicolonEmpty,
10397                details: GreenNodeDetails::Node { children, width },
10398            })
10399            .intern(db),
10400        )
10401    }
10402}
10403impl OptionTerminalSemicolonEmpty {}
10404#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
10405pub struct OptionTerminalSemicolonEmptyPtr(pub SyntaxStablePtrId);
10406impl OptionTerminalSemicolonEmptyPtr {}
10407impl TypedStablePtr for OptionTerminalSemicolonEmptyPtr {
10408    type SyntaxNode = OptionTerminalSemicolonEmpty;
10409    fn untyped(&self) -> SyntaxStablePtrId {
10410        self.0
10411    }
10412    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionTerminalSemicolonEmpty {
10413        OptionTerminalSemicolonEmpty::from_syntax_node(db, self.0.lookup(db))
10414    }
10415}
10416impl From<OptionTerminalSemicolonEmptyPtr> for SyntaxStablePtrId {
10417    fn from(ptr: OptionTerminalSemicolonEmptyPtr) -> Self {
10418        ptr.untyped()
10419    }
10420}
10421#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
10422pub struct OptionTerminalSemicolonEmptyGreen(pub GreenId);
10423impl TypedSyntaxNode for OptionTerminalSemicolonEmpty {
10424    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionTerminalSemicolonEmpty);
10425    type StablePtr = OptionTerminalSemicolonEmptyPtr;
10426    type Green = OptionTerminalSemicolonEmptyGreen;
10427    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
10428        OptionTerminalSemicolonEmptyGreen(
10429            Arc::new(GreenNode {
10430                kind: SyntaxKind::OptionTerminalSemicolonEmpty,
10431                details: GreenNodeDetails::Node { children: vec![], width: TextWidth::default() },
10432            })
10433            .intern(db),
10434        )
10435    }
10436    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
10437        let kind = node.kind(db);
10438        assert_eq!(
10439            kind,
10440            SyntaxKind::OptionTerminalSemicolonEmpty,
10441            "Unexpected SyntaxKind {:?}. Expected {:?}.",
10442            kind,
10443            SyntaxKind::OptionTerminalSemicolonEmpty
10444        );
10445        let children = db.get_children(node.clone());
10446        Self { node, children }
10447    }
10448    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
10449        let kind = node.kind(db);
10450        if kind == SyntaxKind::OptionTerminalSemicolonEmpty {
10451            Some(Self::from_syntax_node(db, node))
10452        } else {
10453            None
10454        }
10455    }
10456    fn as_syntax_node(&self) -> SyntaxNode {
10457        self.node.clone()
10458    }
10459    fn stable_ptr(&self) -> Self::StablePtr {
10460        OptionTerminalSemicolonEmptyPtr(self.node.0.stable_ptr)
10461    }
10462}
10463impl From<&OptionTerminalSemicolonEmpty> for SyntaxStablePtrId {
10464    fn from(node: &OptionTerminalSemicolonEmpty) -> Self {
10465        node.stable_ptr().untyped()
10466    }
10467}
10468#[derive(Clone, Debug, Eq, Hash, PartialEq)]
10469pub struct StatementExpr {
10470    node: SyntaxNode,
10471    children: Arc<[SyntaxNode]>,
10472}
10473impl StatementExpr {
10474    pub const INDEX_ATTRIBUTES: usize = 0;
10475    pub const INDEX_EXPR: usize = 1;
10476    pub const INDEX_SEMICOLON: usize = 2;
10477    pub fn new_green(
10478        db: &dyn SyntaxGroup,
10479        attributes: AttributeListGreen,
10480        expr: ExprGreen,
10481        semicolon: OptionTerminalSemicolonGreen,
10482    ) -> StatementExprGreen {
10483        let children: Vec<GreenId> = vec![attributes.0, expr.0, semicolon.0];
10484        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
10485        StatementExprGreen(
10486            Arc::new(GreenNode {
10487                kind: SyntaxKind::StatementExpr,
10488                details: GreenNodeDetails::Node { children, width },
10489            })
10490            .intern(db),
10491        )
10492    }
10493}
10494impl StatementExpr {
10495    pub fn attributes(&self, db: &dyn SyntaxGroup) -> AttributeList {
10496        AttributeList::from_syntax_node(db, self.children[0].clone())
10497    }
10498    pub fn expr(&self, db: &dyn SyntaxGroup) -> Expr {
10499        Expr::from_syntax_node(db, self.children[1].clone())
10500    }
10501    pub fn semicolon(&self, db: &dyn SyntaxGroup) -> OptionTerminalSemicolon {
10502        OptionTerminalSemicolon::from_syntax_node(db, self.children[2].clone())
10503    }
10504}
10505#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
10506pub struct StatementExprPtr(pub SyntaxStablePtrId);
10507impl StatementExprPtr {}
10508impl TypedStablePtr for StatementExprPtr {
10509    type SyntaxNode = StatementExpr;
10510    fn untyped(&self) -> SyntaxStablePtrId {
10511        self.0
10512    }
10513    fn lookup(&self, db: &dyn SyntaxGroup) -> StatementExpr {
10514        StatementExpr::from_syntax_node(db, self.0.lookup(db))
10515    }
10516}
10517impl From<StatementExprPtr> for SyntaxStablePtrId {
10518    fn from(ptr: StatementExprPtr) -> Self {
10519        ptr.untyped()
10520    }
10521}
10522#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
10523pub struct StatementExprGreen(pub GreenId);
10524impl TypedSyntaxNode for StatementExpr {
10525    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StatementExpr);
10526    type StablePtr = StatementExprPtr;
10527    type Green = StatementExprGreen;
10528    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
10529        StatementExprGreen(
10530            Arc::new(GreenNode {
10531                kind: SyntaxKind::StatementExpr,
10532                details: GreenNodeDetails::Node {
10533                    children: vec![
10534                        AttributeList::missing(db).0,
10535                        Expr::missing(db).0,
10536                        OptionTerminalSemicolon::missing(db).0,
10537                    ],
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::StatementExpr,
10549            "Unexpected SyntaxKind {:?}. Expected {:?}.",
10550            kind,
10551            SyntaxKind::StatementExpr
10552        );
10553        let children = db.get_children(node.clone());
10554        Self { node, children }
10555    }
10556    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
10557        let kind = node.kind(db);
10558        if kind == SyntaxKind::StatementExpr {
10559            Some(Self::from_syntax_node(db, node))
10560        } else {
10561            None
10562        }
10563    }
10564    fn as_syntax_node(&self) -> SyntaxNode {
10565        self.node.clone()
10566    }
10567    fn stable_ptr(&self) -> Self::StablePtr {
10568        StatementExprPtr(self.node.0.stable_ptr)
10569    }
10570}
10571impl From<&StatementExpr> for SyntaxStablePtrId {
10572    fn from(node: &StatementExpr) -> Self {
10573        node.stable_ptr().untyped()
10574    }
10575}
10576#[derive(Clone, Debug, Eq, Hash, PartialEq)]
10577pub struct StatementContinue {
10578    node: SyntaxNode,
10579    children: Arc<[SyntaxNode]>,
10580}
10581impl StatementContinue {
10582    pub const INDEX_ATTRIBUTES: usize = 0;
10583    pub const INDEX_CONTINUE_KW: usize = 1;
10584    pub const INDEX_SEMICOLON: usize = 2;
10585    pub fn new_green(
10586        db: &dyn SyntaxGroup,
10587        attributes: AttributeListGreen,
10588        continue_kw: TerminalContinueGreen,
10589        semicolon: TerminalSemicolonGreen,
10590    ) -> StatementContinueGreen {
10591        let children: Vec<GreenId> = vec![attributes.0, continue_kw.0, semicolon.0];
10592        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
10593        StatementContinueGreen(
10594            Arc::new(GreenNode {
10595                kind: SyntaxKind::StatementContinue,
10596                details: GreenNodeDetails::Node { children, width },
10597            })
10598            .intern(db),
10599        )
10600    }
10601}
10602impl StatementContinue {
10603    pub fn attributes(&self, db: &dyn SyntaxGroup) -> AttributeList {
10604        AttributeList::from_syntax_node(db, self.children[0].clone())
10605    }
10606    pub fn continue_kw(&self, db: &dyn SyntaxGroup) -> TerminalContinue {
10607        TerminalContinue::from_syntax_node(db, self.children[1].clone())
10608    }
10609    pub fn semicolon(&self, db: &dyn SyntaxGroup) -> TerminalSemicolon {
10610        TerminalSemicolon::from_syntax_node(db, self.children[2].clone())
10611    }
10612}
10613#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
10614pub struct StatementContinuePtr(pub SyntaxStablePtrId);
10615impl StatementContinuePtr {}
10616impl TypedStablePtr for StatementContinuePtr {
10617    type SyntaxNode = StatementContinue;
10618    fn untyped(&self) -> SyntaxStablePtrId {
10619        self.0
10620    }
10621    fn lookup(&self, db: &dyn SyntaxGroup) -> StatementContinue {
10622        StatementContinue::from_syntax_node(db, self.0.lookup(db))
10623    }
10624}
10625impl From<StatementContinuePtr> for SyntaxStablePtrId {
10626    fn from(ptr: StatementContinuePtr) -> Self {
10627        ptr.untyped()
10628    }
10629}
10630#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
10631pub struct StatementContinueGreen(pub GreenId);
10632impl TypedSyntaxNode for StatementContinue {
10633    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StatementContinue);
10634    type StablePtr = StatementContinuePtr;
10635    type Green = StatementContinueGreen;
10636    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
10637        StatementContinueGreen(
10638            Arc::new(GreenNode {
10639                kind: SyntaxKind::StatementContinue,
10640                details: GreenNodeDetails::Node {
10641                    children: vec![
10642                        AttributeList::missing(db).0,
10643                        TerminalContinue::missing(db).0,
10644                        TerminalSemicolon::missing(db).0,
10645                    ],
10646                    width: TextWidth::default(),
10647                },
10648            })
10649            .intern(db),
10650        )
10651    }
10652    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
10653        let kind = node.kind(db);
10654        assert_eq!(
10655            kind,
10656            SyntaxKind::StatementContinue,
10657            "Unexpected SyntaxKind {:?}. Expected {:?}.",
10658            kind,
10659            SyntaxKind::StatementContinue
10660        );
10661        let children = db.get_children(node.clone());
10662        Self { node, children }
10663    }
10664    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
10665        let kind = node.kind(db);
10666        if kind == SyntaxKind::StatementContinue {
10667            Some(Self::from_syntax_node(db, node))
10668        } else {
10669            None
10670        }
10671    }
10672    fn as_syntax_node(&self) -> SyntaxNode {
10673        self.node.clone()
10674    }
10675    fn stable_ptr(&self) -> Self::StablePtr {
10676        StatementContinuePtr(self.node.0.stable_ptr)
10677    }
10678}
10679impl From<&StatementContinue> for SyntaxStablePtrId {
10680    fn from(node: &StatementContinue) -> Self {
10681        node.stable_ptr().untyped()
10682    }
10683}
10684#[derive(Clone, Debug, Eq, Hash, PartialEq)]
10685pub struct ExprClause {
10686    node: SyntaxNode,
10687    children: Arc<[SyntaxNode]>,
10688}
10689impl ExprClause {
10690    pub const INDEX_EXPR: usize = 0;
10691    pub fn new_green(db: &dyn SyntaxGroup, expr: ExprGreen) -> ExprClauseGreen {
10692        let children: Vec<GreenId> = vec![expr.0];
10693        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
10694        ExprClauseGreen(
10695            Arc::new(GreenNode {
10696                kind: SyntaxKind::ExprClause,
10697                details: GreenNodeDetails::Node { children, width },
10698            })
10699            .intern(db),
10700        )
10701    }
10702}
10703impl ExprClause {
10704    pub fn expr(&self, db: &dyn SyntaxGroup) -> Expr {
10705        Expr::from_syntax_node(db, self.children[0].clone())
10706    }
10707}
10708#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
10709pub struct ExprClausePtr(pub SyntaxStablePtrId);
10710impl ExprClausePtr {}
10711impl TypedStablePtr for ExprClausePtr {
10712    type SyntaxNode = ExprClause;
10713    fn untyped(&self) -> SyntaxStablePtrId {
10714        self.0
10715    }
10716    fn lookup(&self, db: &dyn SyntaxGroup) -> ExprClause {
10717        ExprClause::from_syntax_node(db, self.0.lookup(db))
10718    }
10719}
10720impl From<ExprClausePtr> for SyntaxStablePtrId {
10721    fn from(ptr: ExprClausePtr) -> Self {
10722        ptr.untyped()
10723    }
10724}
10725#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
10726pub struct ExprClauseGreen(pub GreenId);
10727impl TypedSyntaxNode for ExprClause {
10728    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprClause);
10729    type StablePtr = ExprClausePtr;
10730    type Green = ExprClauseGreen;
10731    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
10732        ExprClauseGreen(
10733            Arc::new(GreenNode {
10734                kind: SyntaxKind::ExprClause,
10735                details: GreenNodeDetails::Node {
10736                    children: vec![Expr::missing(db).0],
10737                    width: TextWidth::default(),
10738                },
10739            })
10740            .intern(db),
10741        )
10742    }
10743    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
10744        let kind = node.kind(db);
10745        assert_eq!(
10746            kind,
10747            SyntaxKind::ExprClause,
10748            "Unexpected SyntaxKind {:?}. Expected {:?}.",
10749            kind,
10750            SyntaxKind::ExprClause
10751        );
10752        let children = db.get_children(node.clone());
10753        Self { node, children }
10754    }
10755    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
10756        let kind = node.kind(db);
10757        if kind == SyntaxKind::ExprClause { Some(Self::from_syntax_node(db, node)) } else { None }
10758    }
10759    fn as_syntax_node(&self) -> SyntaxNode {
10760        self.node.clone()
10761    }
10762    fn stable_ptr(&self) -> Self::StablePtr {
10763        ExprClausePtr(self.node.0.stable_ptr)
10764    }
10765}
10766impl From<&ExprClause> for SyntaxStablePtrId {
10767    fn from(node: &ExprClause) -> Self {
10768        node.stable_ptr().untyped()
10769    }
10770}
10771#[derive(Clone, Debug, Eq, Hash, PartialEq)]
10772pub enum OptionExprClause {
10773    Empty(OptionExprClauseEmpty),
10774    ExprClause(ExprClause),
10775}
10776#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
10777pub struct OptionExprClausePtr(pub SyntaxStablePtrId);
10778impl TypedStablePtr for OptionExprClausePtr {
10779    type SyntaxNode = OptionExprClause;
10780    fn untyped(&self) -> SyntaxStablePtrId {
10781        self.0
10782    }
10783    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionExprClause {
10784        OptionExprClause::from_syntax_node(db, self.0.lookup(db))
10785    }
10786}
10787impl From<OptionExprClausePtr> for SyntaxStablePtrId {
10788    fn from(ptr: OptionExprClausePtr) -> Self {
10789        ptr.untyped()
10790    }
10791}
10792impl From<OptionExprClauseEmptyPtr> for OptionExprClausePtr {
10793    fn from(value: OptionExprClauseEmptyPtr) -> Self {
10794        Self(value.0)
10795    }
10796}
10797impl From<ExprClausePtr> for OptionExprClausePtr {
10798    fn from(value: ExprClausePtr) -> Self {
10799        Self(value.0)
10800    }
10801}
10802impl From<OptionExprClauseEmptyGreen> for OptionExprClauseGreen {
10803    fn from(value: OptionExprClauseEmptyGreen) -> Self {
10804        Self(value.0)
10805    }
10806}
10807impl From<ExprClauseGreen> for OptionExprClauseGreen {
10808    fn from(value: ExprClauseGreen) -> Self {
10809        Self(value.0)
10810    }
10811}
10812#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
10813pub struct OptionExprClauseGreen(pub GreenId);
10814impl TypedSyntaxNode for OptionExprClause {
10815    const OPTIONAL_KIND: Option<SyntaxKind> = None;
10816    type StablePtr = OptionExprClausePtr;
10817    type Green = OptionExprClauseGreen;
10818    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
10819        panic!("No missing variant.");
10820    }
10821    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
10822        let kind = node.kind(db);
10823        match kind {
10824            SyntaxKind::OptionExprClauseEmpty => {
10825                OptionExprClause::Empty(OptionExprClauseEmpty::from_syntax_node(db, node))
10826            }
10827            SyntaxKind::ExprClause => {
10828                OptionExprClause::ExprClause(ExprClause::from_syntax_node(db, node))
10829            }
10830            _ => panic!(
10831                "Unexpected syntax kind {:?} when constructing {}.",
10832                kind, "OptionExprClause"
10833            ),
10834        }
10835    }
10836    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
10837        let kind = node.kind(db);
10838        match kind {
10839            SyntaxKind::OptionExprClauseEmpty => {
10840                Some(OptionExprClause::Empty(OptionExprClauseEmpty::from_syntax_node(db, node)))
10841            }
10842            SyntaxKind::ExprClause => {
10843                Some(OptionExprClause::ExprClause(ExprClause::from_syntax_node(db, node)))
10844            }
10845            _ => None,
10846        }
10847    }
10848    fn as_syntax_node(&self) -> SyntaxNode {
10849        match self {
10850            OptionExprClause::Empty(x) => x.as_syntax_node(),
10851            OptionExprClause::ExprClause(x) => x.as_syntax_node(),
10852        }
10853    }
10854    fn stable_ptr(&self) -> Self::StablePtr {
10855        OptionExprClausePtr(self.as_syntax_node().0.stable_ptr)
10856    }
10857}
10858impl From<&OptionExprClause> for SyntaxStablePtrId {
10859    fn from(node: &OptionExprClause) -> Self {
10860        node.stable_ptr().untyped()
10861    }
10862}
10863impl OptionExprClause {
10864    /// Checks if a kind of a variant of [OptionExprClause].
10865    pub fn is_variant(kind: SyntaxKind) -> bool {
10866        matches!(kind, SyntaxKind::OptionExprClauseEmpty | SyntaxKind::ExprClause)
10867    }
10868}
10869#[derive(Clone, Debug, Eq, Hash, PartialEq)]
10870pub struct OptionExprClauseEmpty {
10871    node: SyntaxNode,
10872    children: Arc<[SyntaxNode]>,
10873}
10874impl OptionExprClauseEmpty {
10875    pub fn new_green(db: &dyn SyntaxGroup) -> OptionExprClauseEmptyGreen {
10876        let children: Vec<GreenId> = vec![];
10877        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
10878        OptionExprClauseEmptyGreen(
10879            Arc::new(GreenNode {
10880                kind: SyntaxKind::OptionExprClauseEmpty,
10881                details: GreenNodeDetails::Node { children, width },
10882            })
10883            .intern(db),
10884        )
10885    }
10886}
10887impl OptionExprClauseEmpty {}
10888#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
10889pub struct OptionExprClauseEmptyPtr(pub SyntaxStablePtrId);
10890impl OptionExprClauseEmptyPtr {}
10891impl TypedStablePtr for OptionExprClauseEmptyPtr {
10892    type SyntaxNode = OptionExprClauseEmpty;
10893    fn untyped(&self) -> SyntaxStablePtrId {
10894        self.0
10895    }
10896    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionExprClauseEmpty {
10897        OptionExprClauseEmpty::from_syntax_node(db, self.0.lookup(db))
10898    }
10899}
10900impl From<OptionExprClauseEmptyPtr> for SyntaxStablePtrId {
10901    fn from(ptr: OptionExprClauseEmptyPtr) -> Self {
10902        ptr.untyped()
10903    }
10904}
10905#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
10906pub struct OptionExprClauseEmptyGreen(pub GreenId);
10907impl TypedSyntaxNode for OptionExprClauseEmpty {
10908    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionExprClauseEmpty);
10909    type StablePtr = OptionExprClauseEmptyPtr;
10910    type Green = OptionExprClauseEmptyGreen;
10911    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
10912        OptionExprClauseEmptyGreen(
10913            Arc::new(GreenNode {
10914                kind: SyntaxKind::OptionExprClauseEmpty,
10915                details: GreenNodeDetails::Node { children: vec![], width: TextWidth::default() },
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::OptionExprClauseEmpty,
10925            "Unexpected SyntaxKind {:?}. Expected {:?}.",
10926            kind,
10927            SyntaxKind::OptionExprClauseEmpty
10928        );
10929        let children = db.get_children(node.clone());
10930        Self { node, children }
10931    }
10932    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
10933        let kind = node.kind(db);
10934        if kind == SyntaxKind::OptionExprClauseEmpty {
10935            Some(Self::from_syntax_node(db, node))
10936        } else {
10937            None
10938        }
10939    }
10940    fn as_syntax_node(&self) -> SyntaxNode {
10941        self.node.clone()
10942    }
10943    fn stable_ptr(&self) -> Self::StablePtr {
10944        OptionExprClauseEmptyPtr(self.node.0.stable_ptr)
10945    }
10946}
10947impl From<&OptionExprClauseEmpty> for SyntaxStablePtrId {
10948    fn from(node: &OptionExprClauseEmpty) -> Self {
10949        node.stable_ptr().untyped()
10950    }
10951}
10952#[derive(Clone, Debug, Eq, Hash, PartialEq)]
10953pub struct StatementReturn {
10954    node: SyntaxNode,
10955    children: Arc<[SyntaxNode]>,
10956}
10957impl StatementReturn {
10958    pub const INDEX_ATTRIBUTES: usize = 0;
10959    pub const INDEX_RETURN_KW: usize = 1;
10960    pub const INDEX_EXPR_CLAUSE: usize = 2;
10961    pub const INDEX_SEMICOLON: usize = 3;
10962    pub fn new_green(
10963        db: &dyn SyntaxGroup,
10964        attributes: AttributeListGreen,
10965        return_kw: TerminalReturnGreen,
10966        expr_clause: OptionExprClauseGreen,
10967        semicolon: TerminalSemicolonGreen,
10968    ) -> StatementReturnGreen {
10969        let children: Vec<GreenId> = vec![attributes.0, return_kw.0, expr_clause.0, semicolon.0];
10970        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
10971        StatementReturnGreen(
10972            Arc::new(GreenNode {
10973                kind: SyntaxKind::StatementReturn,
10974                details: GreenNodeDetails::Node { children, width },
10975            })
10976            .intern(db),
10977        )
10978    }
10979}
10980impl StatementReturn {
10981    pub fn attributes(&self, db: &dyn SyntaxGroup) -> AttributeList {
10982        AttributeList::from_syntax_node(db, self.children[0].clone())
10983    }
10984    pub fn return_kw(&self, db: &dyn SyntaxGroup) -> TerminalReturn {
10985        TerminalReturn::from_syntax_node(db, self.children[1].clone())
10986    }
10987    pub fn expr_clause(&self, db: &dyn SyntaxGroup) -> OptionExprClause {
10988        OptionExprClause::from_syntax_node(db, self.children[2].clone())
10989    }
10990    pub fn semicolon(&self, db: &dyn SyntaxGroup) -> TerminalSemicolon {
10991        TerminalSemicolon::from_syntax_node(db, self.children[3].clone())
10992    }
10993}
10994#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
10995pub struct StatementReturnPtr(pub SyntaxStablePtrId);
10996impl StatementReturnPtr {}
10997impl TypedStablePtr for StatementReturnPtr {
10998    type SyntaxNode = StatementReturn;
10999    fn untyped(&self) -> SyntaxStablePtrId {
11000        self.0
11001    }
11002    fn lookup(&self, db: &dyn SyntaxGroup) -> StatementReturn {
11003        StatementReturn::from_syntax_node(db, self.0.lookup(db))
11004    }
11005}
11006impl From<StatementReturnPtr> for SyntaxStablePtrId {
11007    fn from(ptr: StatementReturnPtr) -> Self {
11008        ptr.untyped()
11009    }
11010}
11011#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
11012pub struct StatementReturnGreen(pub GreenId);
11013impl TypedSyntaxNode for StatementReturn {
11014    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StatementReturn);
11015    type StablePtr = StatementReturnPtr;
11016    type Green = StatementReturnGreen;
11017    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
11018        StatementReturnGreen(
11019            Arc::new(GreenNode {
11020                kind: SyntaxKind::StatementReturn,
11021                details: GreenNodeDetails::Node {
11022                    children: vec![
11023                        AttributeList::missing(db).0,
11024                        TerminalReturn::missing(db).0,
11025                        OptionExprClause::missing(db).0,
11026                        TerminalSemicolon::missing(db).0,
11027                    ],
11028                    width: TextWidth::default(),
11029                },
11030            })
11031            .intern(db),
11032        )
11033    }
11034    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
11035        let kind = node.kind(db);
11036        assert_eq!(
11037            kind,
11038            SyntaxKind::StatementReturn,
11039            "Unexpected SyntaxKind {:?}. Expected {:?}.",
11040            kind,
11041            SyntaxKind::StatementReturn
11042        );
11043        let children = db.get_children(node.clone());
11044        Self { node, children }
11045    }
11046    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
11047        let kind = node.kind(db);
11048        if kind == SyntaxKind::StatementReturn {
11049            Some(Self::from_syntax_node(db, node))
11050        } else {
11051            None
11052        }
11053    }
11054    fn as_syntax_node(&self) -> SyntaxNode {
11055        self.node.clone()
11056    }
11057    fn stable_ptr(&self) -> Self::StablePtr {
11058        StatementReturnPtr(self.node.0.stable_ptr)
11059    }
11060}
11061impl From<&StatementReturn> for SyntaxStablePtrId {
11062    fn from(node: &StatementReturn) -> Self {
11063        node.stable_ptr().untyped()
11064    }
11065}
11066#[derive(Clone, Debug, Eq, Hash, PartialEq)]
11067pub struct StatementBreak {
11068    node: SyntaxNode,
11069    children: Arc<[SyntaxNode]>,
11070}
11071impl StatementBreak {
11072    pub const INDEX_ATTRIBUTES: usize = 0;
11073    pub const INDEX_BREAK_KW: usize = 1;
11074    pub const INDEX_EXPR_CLAUSE: usize = 2;
11075    pub const INDEX_SEMICOLON: usize = 3;
11076    pub fn new_green(
11077        db: &dyn SyntaxGroup,
11078        attributes: AttributeListGreen,
11079        break_kw: TerminalBreakGreen,
11080        expr_clause: OptionExprClauseGreen,
11081        semicolon: TerminalSemicolonGreen,
11082    ) -> StatementBreakGreen {
11083        let children: Vec<GreenId> = vec![attributes.0, break_kw.0, expr_clause.0, semicolon.0];
11084        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
11085        StatementBreakGreen(
11086            Arc::new(GreenNode {
11087                kind: SyntaxKind::StatementBreak,
11088                details: GreenNodeDetails::Node { children, width },
11089            })
11090            .intern(db),
11091        )
11092    }
11093}
11094impl StatementBreak {
11095    pub fn attributes(&self, db: &dyn SyntaxGroup) -> AttributeList {
11096        AttributeList::from_syntax_node(db, self.children[0].clone())
11097    }
11098    pub fn break_kw(&self, db: &dyn SyntaxGroup) -> TerminalBreak {
11099        TerminalBreak::from_syntax_node(db, self.children[1].clone())
11100    }
11101    pub fn expr_clause(&self, db: &dyn SyntaxGroup) -> OptionExprClause {
11102        OptionExprClause::from_syntax_node(db, self.children[2].clone())
11103    }
11104    pub fn semicolon(&self, db: &dyn SyntaxGroup) -> TerminalSemicolon {
11105        TerminalSemicolon::from_syntax_node(db, self.children[3].clone())
11106    }
11107}
11108#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
11109pub struct StatementBreakPtr(pub SyntaxStablePtrId);
11110impl StatementBreakPtr {}
11111impl TypedStablePtr for StatementBreakPtr {
11112    type SyntaxNode = StatementBreak;
11113    fn untyped(&self) -> SyntaxStablePtrId {
11114        self.0
11115    }
11116    fn lookup(&self, db: &dyn SyntaxGroup) -> StatementBreak {
11117        StatementBreak::from_syntax_node(db, self.0.lookup(db))
11118    }
11119}
11120impl From<StatementBreakPtr> for SyntaxStablePtrId {
11121    fn from(ptr: StatementBreakPtr) -> Self {
11122        ptr.untyped()
11123    }
11124}
11125#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
11126pub struct StatementBreakGreen(pub GreenId);
11127impl TypedSyntaxNode for StatementBreak {
11128    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StatementBreak);
11129    type StablePtr = StatementBreakPtr;
11130    type Green = StatementBreakGreen;
11131    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
11132        StatementBreakGreen(
11133            Arc::new(GreenNode {
11134                kind: SyntaxKind::StatementBreak,
11135                details: GreenNodeDetails::Node {
11136                    children: vec![
11137                        AttributeList::missing(db).0,
11138                        TerminalBreak::missing(db).0,
11139                        OptionExprClause::missing(db).0,
11140                        TerminalSemicolon::missing(db).0,
11141                    ],
11142                    width: TextWidth::default(),
11143                },
11144            })
11145            .intern(db),
11146        )
11147    }
11148    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
11149        let kind = node.kind(db);
11150        assert_eq!(
11151            kind,
11152            SyntaxKind::StatementBreak,
11153            "Unexpected SyntaxKind {:?}. Expected {:?}.",
11154            kind,
11155            SyntaxKind::StatementBreak
11156        );
11157        let children = db.get_children(node.clone());
11158        Self { node, children }
11159    }
11160    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
11161        let kind = node.kind(db);
11162        if kind == SyntaxKind::StatementBreak {
11163            Some(Self::from_syntax_node(db, node))
11164        } else {
11165            None
11166        }
11167    }
11168    fn as_syntax_node(&self) -> SyntaxNode {
11169        self.node.clone()
11170    }
11171    fn stable_ptr(&self) -> Self::StablePtr {
11172        StatementBreakPtr(self.node.0.stable_ptr)
11173    }
11174}
11175impl From<&StatementBreak> for SyntaxStablePtrId {
11176    fn from(node: &StatementBreak) -> Self {
11177        node.stable_ptr().untyped()
11178    }
11179}
11180#[derive(Clone, Debug, Eq, Hash, PartialEq)]
11181pub struct StatementItem {
11182    node: SyntaxNode,
11183    children: Arc<[SyntaxNode]>,
11184}
11185impl StatementItem {
11186    pub const INDEX_ITEM: usize = 0;
11187    pub fn new_green(db: &dyn SyntaxGroup, item: ModuleItemGreen) -> StatementItemGreen {
11188        let children: Vec<GreenId> = vec![item.0];
11189        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
11190        StatementItemGreen(
11191            Arc::new(GreenNode {
11192                kind: SyntaxKind::StatementItem,
11193                details: GreenNodeDetails::Node { children, width },
11194            })
11195            .intern(db),
11196        )
11197    }
11198}
11199impl StatementItem {
11200    pub fn item(&self, db: &dyn SyntaxGroup) -> ModuleItem {
11201        ModuleItem::from_syntax_node(db, self.children[0].clone())
11202    }
11203}
11204#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
11205pub struct StatementItemPtr(pub SyntaxStablePtrId);
11206impl StatementItemPtr {}
11207impl TypedStablePtr for StatementItemPtr {
11208    type SyntaxNode = StatementItem;
11209    fn untyped(&self) -> SyntaxStablePtrId {
11210        self.0
11211    }
11212    fn lookup(&self, db: &dyn SyntaxGroup) -> StatementItem {
11213        StatementItem::from_syntax_node(db, self.0.lookup(db))
11214    }
11215}
11216impl From<StatementItemPtr> for SyntaxStablePtrId {
11217    fn from(ptr: StatementItemPtr) -> Self {
11218        ptr.untyped()
11219    }
11220}
11221#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
11222pub struct StatementItemGreen(pub GreenId);
11223impl TypedSyntaxNode for StatementItem {
11224    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StatementItem);
11225    type StablePtr = StatementItemPtr;
11226    type Green = StatementItemGreen;
11227    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
11228        StatementItemGreen(
11229            Arc::new(GreenNode {
11230                kind: SyntaxKind::StatementItem,
11231                details: GreenNodeDetails::Node {
11232                    children: vec![ModuleItem::missing(db).0],
11233                    width: TextWidth::default(),
11234                },
11235            })
11236            .intern(db),
11237        )
11238    }
11239    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
11240        let kind = node.kind(db);
11241        assert_eq!(
11242            kind,
11243            SyntaxKind::StatementItem,
11244            "Unexpected SyntaxKind {:?}. Expected {:?}.",
11245            kind,
11246            SyntaxKind::StatementItem
11247        );
11248        let children = db.get_children(node.clone());
11249        Self { node, children }
11250    }
11251    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
11252        let kind = node.kind(db);
11253        if kind == SyntaxKind::StatementItem {
11254            Some(Self::from_syntax_node(db, node))
11255        } else {
11256            None
11257        }
11258    }
11259    fn as_syntax_node(&self) -> SyntaxNode {
11260        self.node.clone()
11261    }
11262    fn stable_ptr(&self) -> Self::StablePtr {
11263        StatementItemPtr(self.node.0.stable_ptr)
11264    }
11265}
11266impl From<&StatementItem> for SyntaxStablePtrId {
11267    fn from(node: &StatementItem) -> Self {
11268        node.stable_ptr().untyped()
11269    }
11270}
11271#[derive(Clone, Debug, Eq, Hash, PartialEq)]
11272pub struct Param {
11273    node: SyntaxNode,
11274    children: Arc<[SyntaxNode]>,
11275}
11276impl Param {
11277    pub const INDEX_MODIFIERS: usize = 0;
11278    pub const INDEX_NAME: usize = 1;
11279    pub const INDEX_TYPE_CLAUSE: usize = 2;
11280    pub fn new_green(
11281        db: &dyn SyntaxGroup,
11282        modifiers: ModifierListGreen,
11283        name: TerminalIdentifierGreen,
11284        type_clause: OptionTypeClauseGreen,
11285    ) -> ParamGreen {
11286        let children: Vec<GreenId> = vec![modifiers.0, name.0, type_clause.0];
11287        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
11288        ParamGreen(
11289            Arc::new(GreenNode {
11290                kind: SyntaxKind::Param,
11291                details: GreenNodeDetails::Node { children, width },
11292            })
11293            .intern(db),
11294        )
11295    }
11296}
11297impl Param {
11298    pub fn modifiers(&self, db: &dyn SyntaxGroup) -> ModifierList {
11299        ModifierList::from_syntax_node(db, self.children[0].clone())
11300    }
11301    pub fn name(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier {
11302        TerminalIdentifier::from_syntax_node(db, self.children[1].clone())
11303    }
11304    pub fn type_clause(&self, db: &dyn SyntaxGroup) -> OptionTypeClause {
11305        OptionTypeClause::from_syntax_node(db, self.children[2].clone())
11306    }
11307}
11308#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
11309pub struct ParamPtr(pub SyntaxStablePtrId);
11310impl ParamPtr {
11311    pub fn name_green(self, db: &dyn SyntaxGroup) -> TerminalIdentifierGreen {
11312        let ptr = self.0.lookup_intern(db);
11313        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
11314            TerminalIdentifierGreen(key_fields[0])
11315        } else {
11316            panic!("Unexpected key field query on root.");
11317        }
11318    }
11319}
11320impl TypedStablePtr for ParamPtr {
11321    type SyntaxNode = Param;
11322    fn untyped(&self) -> SyntaxStablePtrId {
11323        self.0
11324    }
11325    fn lookup(&self, db: &dyn SyntaxGroup) -> Param {
11326        Param::from_syntax_node(db, self.0.lookup(db))
11327    }
11328}
11329impl From<ParamPtr> for SyntaxStablePtrId {
11330    fn from(ptr: ParamPtr) -> Self {
11331        ptr.untyped()
11332    }
11333}
11334#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
11335pub struct ParamGreen(pub GreenId);
11336impl TypedSyntaxNode for Param {
11337    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::Param);
11338    type StablePtr = ParamPtr;
11339    type Green = ParamGreen;
11340    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
11341        ParamGreen(
11342            Arc::new(GreenNode {
11343                kind: SyntaxKind::Param,
11344                details: GreenNodeDetails::Node {
11345                    children: vec![
11346                        ModifierList::missing(db).0,
11347                        TerminalIdentifier::missing(db).0,
11348                        OptionTypeClause::missing(db).0,
11349                    ],
11350                    width: TextWidth::default(),
11351                },
11352            })
11353            .intern(db),
11354        )
11355    }
11356    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
11357        let kind = node.kind(db);
11358        assert_eq!(
11359            kind,
11360            SyntaxKind::Param,
11361            "Unexpected SyntaxKind {:?}. Expected {:?}.",
11362            kind,
11363            SyntaxKind::Param
11364        );
11365        let children = db.get_children(node.clone());
11366        Self { node, children }
11367    }
11368    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
11369        let kind = node.kind(db);
11370        if kind == SyntaxKind::Param { Some(Self::from_syntax_node(db, node)) } else { None }
11371    }
11372    fn as_syntax_node(&self) -> SyntaxNode {
11373        self.node.clone()
11374    }
11375    fn stable_ptr(&self) -> Self::StablePtr {
11376        ParamPtr(self.node.0.stable_ptr)
11377    }
11378}
11379impl From<&Param> for SyntaxStablePtrId {
11380    fn from(node: &Param) -> Self {
11381        node.stable_ptr().untyped()
11382    }
11383}
11384#[derive(Clone, Debug, Eq, Hash, PartialEq)]
11385pub struct ModifierList(ElementList<Modifier, 1>);
11386impl Deref for ModifierList {
11387    type Target = ElementList<Modifier, 1>;
11388    fn deref(&self) -> &Self::Target {
11389        &self.0
11390    }
11391}
11392impl ModifierList {
11393    pub fn new_green(db: &dyn SyntaxGroup, children: Vec<ModifierGreen>) -> ModifierListGreen {
11394        let width = children.iter().map(|id| id.0.lookup_intern(db).width()).sum();
11395        ModifierListGreen(
11396            Arc::new(GreenNode {
11397                kind: SyntaxKind::ModifierList,
11398                details: GreenNodeDetails::Node {
11399                    children: children.iter().map(|x| x.0).collect(),
11400                    width,
11401                },
11402            })
11403            .intern(db),
11404        )
11405    }
11406}
11407#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
11408pub struct ModifierListPtr(pub SyntaxStablePtrId);
11409impl TypedStablePtr for ModifierListPtr {
11410    type SyntaxNode = ModifierList;
11411    fn untyped(&self) -> SyntaxStablePtrId {
11412        self.0
11413    }
11414    fn lookup(&self, db: &dyn SyntaxGroup) -> ModifierList {
11415        ModifierList::from_syntax_node(db, self.0.lookup(db))
11416    }
11417}
11418impl From<ModifierListPtr> for SyntaxStablePtrId {
11419    fn from(ptr: ModifierListPtr) -> Self {
11420        ptr.untyped()
11421    }
11422}
11423#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
11424pub struct ModifierListGreen(pub GreenId);
11425impl TypedSyntaxNode for ModifierList {
11426    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ModifierList);
11427    type StablePtr = ModifierListPtr;
11428    type Green = ModifierListGreen;
11429    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
11430        ModifierListGreen(
11431            Arc::new(GreenNode {
11432                kind: SyntaxKind::ModifierList,
11433                details: GreenNodeDetails::Node { children: vec![], width: TextWidth::default() },
11434            })
11435            .intern(db),
11436        )
11437    }
11438    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
11439        Self(ElementList::new(node))
11440    }
11441    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
11442        if node.kind(db) == SyntaxKind::ModifierList {
11443            Some(Self(ElementList::new(node)))
11444        } else {
11445            None
11446        }
11447    }
11448    fn as_syntax_node(&self) -> SyntaxNode {
11449        self.node.clone()
11450    }
11451    fn stable_ptr(&self) -> Self::StablePtr {
11452        ModifierListPtr(self.node.0.stable_ptr)
11453    }
11454}
11455impl From<&ModifierList> for SyntaxStablePtrId {
11456    fn from(node: &ModifierList) -> Self {
11457        node.stable_ptr().untyped()
11458    }
11459}
11460#[derive(Clone, Debug, Eq, Hash, PartialEq)]
11461pub enum Modifier {
11462    Ref(TerminalRef),
11463    Mut(TerminalMut),
11464}
11465#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
11466pub struct ModifierPtr(pub SyntaxStablePtrId);
11467impl TypedStablePtr for ModifierPtr {
11468    type SyntaxNode = Modifier;
11469    fn untyped(&self) -> SyntaxStablePtrId {
11470        self.0
11471    }
11472    fn lookup(&self, db: &dyn SyntaxGroup) -> Modifier {
11473        Modifier::from_syntax_node(db, self.0.lookup(db))
11474    }
11475}
11476impl From<ModifierPtr> for SyntaxStablePtrId {
11477    fn from(ptr: ModifierPtr) -> Self {
11478        ptr.untyped()
11479    }
11480}
11481impl From<TerminalRefPtr> for ModifierPtr {
11482    fn from(value: TerminalRefPtr) -> Self {
11483        Self(value.0)
11484    }
11485}
11486impl From<TerminalMutPtr> for ModifierPtr {
11487    fn from(value: TerminalMutPtr) -> Self {
11488        Self(value.0)
11489    }
11490}
11491impl From<TerminalRefGreen> for ModifierGreen {
11492    fn from(value: TerminalRefGreen) -> Self {
11493        Self(value.0)
11494    }
11495}
11496impl From<TerminalMutGreen> for ModifierGreen {
11497    fn from(value: TerminalMutGreen) -> Self {
11498        Self(value.0)
11499    }
11500}
11501#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
11502pub struct ModifierGreen(pub GreenId);
11503impl TypedSyntaxNode for Modifier {
11504    const OPTIONAL_KIND: Option<SyntaxKind> = None;
11505    type StablePtr = ModifierPtr;
11506    type Green = ModifierGreen;
11507    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
11508        panic!("No missing variant.");
11509    }
11510    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
11511        let kind = node.kind(db);
11512        match kind {
11513            SyntaxKind::TerminalRef => Modifier::Ref(TerminalRef::from_syntax_node(db, node)),
11514            SyntaxKind::TerminalMut => Modifier::Mut(TerminalMut::from_syntax_node(db, node)),
11515            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "Modifier"),
11516        }
11517    }
11518    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
11519        let kind = node.kind(db);
11520        match kind {
11521            SyntaxKind::TerminalRef => Some(Modifier::Ref(TerminalRef::from_syntax_node(db, node))),
11522            SyntaxKind::TerminalMut => Some(Modifier::Mut(TerminalMut::from_syntax_node(db, node))),
11523            _ => None,
11524        }
11525    }
11526    fn as_syntax_node(&self) -> SyntaxNode {
11527        match self {
11528            Modifier::Ref(x) => x.as_syntax_node(),
11529            Modifier::Mut(x) => x.as_syntax_node(),
11530        }
11531    }
11532    fn stable_ptr(&self) -> Self::StablePtr {
11533        ModifierPtr(self.as_syntax_node().0.stable_ptr)
11534    }
11535}
11536impl From<&Modifier> for SyntaxStablePtrId {
11537    fn from(node: &Modifier) -> Self {
11538        node.stable_ptr().untyped()
11539    }
11540}
11541impl Modifier {
11542    /// Checks if a kind of a variant of [Modifier].
11543    pub fn is_variant(kind: SyntaxKind) -> bool {
11544        matches!(kind, SyntaxKind::TerminalRef | SyntaxKind::TerminalMut)
11545    }
11546}
11547#[derive(Clone, Debug, Eq, Hash, PartialEq)]
11548pub struct ParamList(ElementList<Param, 2>);
11549impl Deref for ParamList {
11550    type Target = ElementList<Param, 2>;
11551    fn deref(&self) -> &Self::Target {
11552        &self.0
11553    }
11554}
11555impl ParamList {
11556    pub fn new_green(
11557        db: &dyn SyntaxGroup,
11558        children: Vec<ParamListElementOrSeparatorGreen>,
11559    ) -> ParamListGreen {
11560        let width = children.iter().map(|id| id.id().lookup_intern(db).width()).sum();
11561        ParamListGreen(
11562            Arc::new(GreenNode {
11563                kind: SyntaxKind::ParamList,
11564                details: GreenNodeDetails::Node {
11565                    children: children.iter().map(|x| x.id()).collect(),
11566                    width,
11567                },
11568            })
11569            .intern(db),
11570        )
11571    }
11572}
11573#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
11574pub struct ParamListPtr(pub SyntaxStablePtrId);
11575impl TypedStablePtr for ParamListPtr {
11576    type SyntaxNode = ParamList;
11577    fn untyped(&self) -> SyntaxStablePtrId {
11578        self.0
11579    }
11580    fn lookup(&self, db: &dyn SyntaxGroup) -> ParamList {
11581        ParamList::from_syntax_node(db, self.0.lookup(db))
11582    }
11583}
11584impl From<ParamListPtr> for SyntaxStablePtrId {
11585    fn from(ptr: ParamListPtr) -> Self {
11586        ptr.untyped()
11587    }
11588}
11589#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
11590pub enum ParamListElementOrSeparatorGreen {
11591    Separator(TerminalCommaGreen),
11592    Element(ParamGreen),
11593}
11594impl From<TerminalCommaGreen> for ParamListElementOrSeparatorGreen {
11595    fn from(value: TerminalCommaGreen) -> Self {
11596        ParamListElementOrSeparatorGreen::Separator(value)
11597    }
11598}
11599impl From<ParamGreen> for ParamListElementOrSeparatorGreen {
11600    fn from(value: ParamGreen) -> Self {
11601        ParamListElementOrSeparatorGreen::Element(value)
11602    }
11603}
11604impl ParamListElementOrSeparatorGreen {
11605    fn id(&self) -> GreenId {
11606        match self {
11607            ParamListElementOrSeparatorGreen::Separator(green) => green.0,
11608            ParamListElementOrSeparatorGreen::Element(green) => green.0,
11609        }
11610    }
11611}
11612#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
11613pub struct ParamListGreen(pub GreenId);
11614impl TypedSyntaxNode for ParamList {
11615    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ParamList);
11616    type StablePtr = ParamListPtr;
11617    type Green = ParamListGreen;
11618    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
11619        ParamListGreen(
11620            Arc::new(GreenNode {
11621                kind: SyntaxKind::ParamList,
11622                details: GreenNodeDetails::Node { children: vec![], width: TextWidth::default() },
11623            })
11624            .intern(db),
11625        )
11626    }
11627    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
11628        Self(ElementList::new(node))
11629    }
11630    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
11631        if node.kind(db) == SyntaxKind::ParamList {
11632            Some(Self(ElementList::new(node)))
11633        } else {
11634            None
11635        }
11636    }
11637    fn as_syntax_node(&self) -> SyntaxNode {
11638        self.node.clone()
11639    }
11640    fn stable_ptr(&self) -> Self::StablePtr {
11641        ParamListPtr(self.node.0.stable_ptr)
11642    }
11643}
11644impl From<&ParamList> for SyntaxStablePtrId {
11645    fn from(node: &ParamList) -> Self {
11646        node.stable_ptr().untyped()
11647    }
11648}
11649#[derive(Clone, Debug, Eq, Hash, PartialEq)]
11650pub struct ImplicitsClause {
11651    node: SyntaxNode,
11652    children: Arc<[SyntaxNode]>,
11653}
11654impl ImplicitsClause {
11655    pub const INDEX_IMPLICITS_KW: usize = 0;
11656    pub const INDEX_LPAREN: usize = 1;
11657    pub const INDEX_IMPLICITS: usize = 2;
11658    pub const INDEX_RPAREN: usize = 3;
11659    pub fn new_green(
11660        db: &dyn SyntaxGroup,
11661        implicits_kw: TerminalImplicitsGreen,
11662        lparen: TerminalLParenGreen,
11663        implicits: ImplicitsListGreen,
11664        rparen: TerminalRParenGreen,
11665    ) -> ImplicitsClauseGreen {
11666        let children: Vec<GreenId> = vec![implicits_kw.0, lparen.0, implicits.0, rparen.0];
11667        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
11668        ImplicitsClauseGreen(
11669            Arc::new(GreenNode {
11670                kind: SyntaxKind::ImplicitsClause,
11671                details: GreenNodeDetails::Node { children, width },
11672            })
11673            .intern(db),
11674        )
11675    }
11676}
11677impl ImplicitsClause {
11678    pub fn implicits_kw(&self, db: &dyn SyntaxGroup) -> TerminalImplicits {
11679        TerminalImplicits::from_syntax_node(db, self.children[0].clone())
11680    }
11681    pub fn lparen(&self, db: &dyn SyntaxGroup) -> TerminalLParen {
11682        TerminalLParen::from_syntax_node(db, self.children[1].clone())
11683    }
11684    pub fn implicits(&self, db: &dyn SyntaxGroup) -> ImplicitsList {
11685        ImplicitsList::from_syntax_node(db, self.children[2].clone())
11686    }
11687    pub fn rparen(&self, db: &dyn SyntaxGroup) -> TerminalRParen {
11688        TerminalRParen::from_syntax_node(db, self.children[3].clone())
11689    }
11690}
11691#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
11692pub struct ImplicitsClausePtr(pub SyntaxStablePtrId);
11693impl ImplicitsClausePtr {}
11694impl TypedStablePtr for ImplicitsClausePtr {
11695    type SyntaxNode = ImplicitsClause;
11696    fn untyped(&self) -> SyntaxStablePtrId {
11697        self.0
11698    }
11699    fn lookup(&self, db: &dyn SyntaxGroup) -> ImplicitsClause {
11700        ImplicitsClause::from_syntax_node(db, self.0.lookup(db))
11701    }
11702}
11703impl From<ImplicitsClausePtr> for SyntaxStablePtrId {
11704    fn from(ptr: ImplicitsClausePtr) -> Self {
11705        ptr.untyped()
11706    }
11707}
11708#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
11709pub struct ImplicitsClauseGreen(pub GreenId);
11710impl TypedSyntaxNode for ImplicitsClause {
11711    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ImplicitsClause);
11712    type StablePtr = ImplicitsClausePtr;
11713    type Green = ImplicitsClauseGreen;
11714    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
11715        ImplicitsClauseGreen(
11716            Arc::new(GreenNode {
11717                kind: SyntaxKind::ImplicitsClause,
11718                details: GreenNodeDetails::Node {
11719                    children: vec![
11720                        TerminalImplicits::missing(db).0,
11721                        TerminalLParen::missing(db).0,
11722                        ImplicitsList::missing(db).0,
11723                        TerminalRParen::missing(db).0,
11724                    ],
11725                    width: TextWidth::default(),
11726                },
11727            })
11728            .intern(db),
11729        )
11730    }
11731    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
11732        let kind = node.kind(db);
11733        assert_eq!(
11734            kind,
11735            SyntaxKind::ImplicitsClause,
11736            "Unexpected SyntaxKind {:?}. Expected {:?}.",
11737            kind,
11738            SyntaxKind::ImplicitsClause
11739        );
11740        let children = db.get_children(node.clone());
11741        Self { node, children }
11742    }
11743    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
11744        let kind = node.kind(db);
11745        if kind == SyntaxKind::ImplicitsClause {
11746            Some(Self::from_syntax_node(db, node))
11747        } else {
11748            None
11749        }
11750    }
11751    fn as_syntax_node(&self) -> SyntaxNode {
11752        self.node.clone()
11753    }
11754    fn stable_ptr(&self) -> Self::StablePtr {
11755        ImplicitsClausePtr(self.node.0.stable_ptr)
11756    }
11757}
11758impl From<&ImplicitsClause> for SyntaxStablePtrId {
11759    fn from(node: &ImplicitsClause) -> Self {
11760        node.stable_ptr().untyped()
11761    }
11762}
11763#[derive(Clone, Debug, Eq, Hash, PartialEq)]
11764pub struct ImplicitsList(ElementList<ExprPath, 2>);
11765impl Deref for ImplicitsList {
11766    type Target = ElementList<ExprPath, 2>;
11767    fn deref(&self) -> &Self::Target {
11768        &self.0
11769    }
11770}
11771impl ImplicitsList {
11772    pub fn new_green(
11773        db: &dyn SyntaxGroup,
11774        children: Vec<ImplicitsListElementOrSeparatorGreen>,
11775    ) -> ImplicitsListGreen {
11776        let width = children.iter().map(|id| id.id().lookup_intern(db).width()).sum();
11777        ImplicitsListGreen(
11778            Arc::new(GreenNode {
11779                kind: SyntaxKind::ImplicitsList,
11780                details: GreenNodeDetails::Node {
11781                    children: children.iter().map(|x| x.id()).collect(),
11782                    width,
11783                },
11784            })
11785            .intern(db),
11786        )
11787    }
11788}
11789#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
11790pub struct ImplicitsListPtr(pub SyntaxStablePtrId);
11791impl TypedStablePtr for ImplicitsListPtr {
11792    type SyntaxNode = ImplicitsList;
11793    fn untyped(&self) -> SyntaxStablePtrId {
11794        self.0
11795    }
11796    fn lookup(&self, db: &dyn SyntaxGroup) -> ImplicitsList {
11797        ImplicitsList::from_syntax_node(db, self.0.lookup(db))
11798    }
11799}
11800impl From<ImplicitsListPtr> for SyntaxStablePtrId {
11801    fn from(ptr: ImplicitsListPtr) -> Self {
11802        ptr.untyped()
11803    }
11804}
11805#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
11806pub enum ImplicitsListElementOrSeparatorGreen {
11807    Separator(TerminalCommaGreen),
11808    Element(ExprPathGreen),
11809}
11810impl From<TerminalCommaGreen> for ImplicitsListElementOrSeparatorGreen {
11811    fn from(value: TerminalCommaGreen) -> Self {
11812        ImplicitsListElementOrSeparatorGreen::Separator(value)
11813    }
11814}
11815impl From<ExprPathGreen> for ImplicitsListElementOrSeparatorGreen {
11816    fn from(value: ExprPathGreen) -> Self {
11817        ImplicitsListElementOrSeparatorGreen::Element(value)
11818    }
11819}
11820impl ImplicitsListElementOrSeparatorGreen {
11821    fn id(&self) -> GreenId {
11822        match self {
11823            ImplicitsListElementOrSeparatorGreen::Separator(green) => green.0,
11824            ImplicitsListElementOrSeparatorGreen::Element(green) => green.0,
11825        }
11826    }
11827}
11828#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
11829pub struct ImplicitsListGreen(pub GreenId);
11830impl TypedSyntaxNode for ImplicitsList {
11831    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ImplicitsList);
11832    type StablePtr = ImplicitsListPtr;
11833    type Green = ImplicitsListGreen;
11834    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
11835        ImplicitsListGreen(
11836            Arc::new(GreenNode {
11837                kind: SyntaxKind::ImplicitsList,
11838                details: GreenNodeDetails::Node { children: vec![], width: TextWidth::default() },
11839            })
11840            .intern(db),
11841        )
11842    }
11843    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
11844        Self(ElementList::new(node))
11845    }
11846    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
11847        if node.kind(db) == SyntaxKind::ImplicitsList {
11848            Some(Self(ElementList::new(node)))
11849        } else {
11850            None
11851        }
11852    }
11853    fn as_syntax_node(&self) -> SyntaxNode {
11854        self.node.clone()
11855    }
11856    fn stable_ptr(&self) -> Self::StablePtr {
11857        ImplicitsListPtr(self.node.0.stable_ptr)
11858    }
11859}
11860impl From<&ImplicitsList> for SyntaxStablePtrId {
11861    fn from(node: &ImplicitsList) -> Self {
11862        node.stable_ptr().untyped()
11863    }
11864}
11865#[derive(Clone, Debug, Eq, Hash, PartialEq)]
11866pub enum OptionImplicitsClause {
11867    Empty(OptionImplicitsClauseEmpty),
11868    ImplicitsClause(ImplicitsClause),
11869}
11870#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
11871pub struct OptionImplicitsClausePtr(pub SyntaxStablePtrId);
11872impl TypedStablePtr for OptionImplicitsClausePtr {
11873    type SyntaxNode = OptionImplicitsClause;
11874    fn untyped(&self) -> SyntaxStablePtrId {
11875        self.0
11876    }
11877    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionImplicitsClause {
11878        OptionImplicitsClause::from_syntax_node(db, self.0.lookup(db))
11879    }
11880}
11881impl From<OptionImplicitsClausePtr> for SyntaxStablePtrId {
11882    fn from(ptr: OptionImplicitsClausePtr) -> Self {
11883        ptr.untyped()
11884    }
11885}
11886impl From<OptionImplicitsClauseEmptyPtr> for OptionImplicitsClausePtr {
11887    fn from(value: OptionImplicitsClauseEmptyPtr) -> Self {
11888        Self(value.0)
11889    }
11890}
11891impl From<ImplicitsClausePtr> for OptionImplicitsClausePtr {
11892    fn from(value: ImplicitsClausePtr) -> Self {
11893        Self(value.0)
11894    }
11895}
11896impl From<OptionImplicitsClauseEmptyGreen> for OptionImplicitsClauseGreen {
11897    fn from(value: OptionImplicitsClauseEmptyGreen) -> Self {
11898        Self(value.0)
11899    }
11900}
11901impl From<ImplicitsClauseGreen> for OptionImplicitsClauseGreen {
11902    fn from(value: ImplicitsClauseGreen) -> Self {
11903        Self(value.0)
11904    }
11905}
11906#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
11907pub struct OptionImplicitsClauseGreen(pub GreenId);
11908impl TypedSyntaxNode for OptionImplicitsClause {
11909    const OPTIONAL_KIND: Option<SyntaxKind> = None;
11910    type StablePtr = OptionImplicitsClausePtr;
11911    type Green = OptionImplicitsClauseGreen;
11912    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
11913        panic!("No missing variant.");
11914    }
11915    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
11916        let kind = node.kind(db);
11917        match kind {
11918            SyntaxKind::OptionImplicitsClauseEmpty => {
11919                OptionImplicitsClause::Empty(OptionImplicitsClauseEmpty::from_syntax_node(db, node))
11920            }
11921            SyntaxKind::ImplicitsClause => {
11922                OptionImplicitsClause::ImplicitsClause(ImplicitsClause::from_syntax_node(db, node))
11923            }
11924            _ => panic!(
11925                "Unexpected syntax kind {:?} when constructing {}.",
11926                kind, "OptionImplicitsClause"
11927            ),
11928        }
11929    }
11930    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
11931        let kind = node.kind(db);
11932        match kind {
11933            SyntaxKind::OptionImplicitsClauseEmpty => Some(OptionImplicitsClause::Empty(
11934                OptionImplicitsClauseEmpty::from_syntax_node(db, node),
11935            )),
11936            SyntaxKind::ImplicitsClause => Some(OptionImplicitsClause::ImplicitsClause(
11937                ImplicitsClause::from_syntax_node(db, node),
11938            )),
11939            _ => None,
11940        }
11941    }
11942    fn as_syntax_node(&self) -> SyntaxNode {
11943        match self {
11944            OptionImplicitsClause::Empty(x) => x.as_syntax_node(),
11945            OptionImplicitsClause::ImplicitsClause(x) => x.as_syntax_node(),
11946        }
11947    }
11948    fn stable_ptr(&self) -> Self::StablePtr {
11949        OptionImplicitsClausePtr(self.as_syntax_node().0.stable_ptr)
11950    }
11951}
11952impl From<&OptionImplicitsClause> for SyntaxStablePtrId {
11953    fn from(node: &OptionImplicitsClause) -> Self {
11954        node.stable_ptr().untyped()
11955    }
11956}
11957impl OptionImplicitsClause {
11958    /// Checks if a kind of a variant of [OptionImplicitsClause].
11959    pub fn is_variant(kind: SyntaxKind) -> bool {
11960        matches!(kind, SyntaxKind::OptionImplicitsClauseEmpty | SyntaxKind::ImplicitsClause)
11961    }
11962}
11963#[derive(Clone, Debug, Eq, Hash, PartialEq)]
11964pub struct OptionImplicitsClauseEmpty {
11965    node: SyntaxNode,
11966    children: Arc<[SyntaxNode]>,
11967}
11968impl OptionImplicitsClauseEmpty {
11969    pub fn new_green(db: &dyn SyntaxGroup) -> OptionImplicitsClauseEmptyGreen {
11970        let children: Vec<GreenId> = vec![];
11971        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
11972        OptionImplicitsClauseEmptyGreen(
11973            Arc::new(GreenNode {
11974                kind: SyntaxKind::OptionImplicitsClauseEmpty,
11975                details: GreenNodeDetails::Node { children, width },
11976            })
11977            .intern(db),
11978        )
11979    }
11980}
11981impl OptionImplicitsClauseEmpty {}
11982#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
11983pub struct OptionImplicitsClauseEmptyPtr(pub SyntaxStablePtrId);
11984impl OptionImplicitsClauseEmptyPtr {}
11985impl TypedStablePtr for OptionImplicitsClauseEmptyPtr {
11986    type SyntaxNode = OptionImplicitsClauseEmpty;
11987    fn untyped(&self) -> SyntaxStablePtrId {
11988        self.0
11989    }
11990    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionImplicitsClauseEmpty {
11991        OptionImplicitsClauseEmpty::from_syntax_node(db, self.0.lookup(db))
11992    }
11993}
11994impl From<OptionImplicitsClauseEmptyPtr> for SyntaxStablePtrId {
11995    fn from(ptr: OptionImplicitsClauseEmptyPtr) -> Self {
11996        ptr.untyped()
11997    }
11998}
11999#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
12000pub struct OptionImplicitsClauseEmptyGreen(pub GreenId);
12001impl TypedSyntaxNode for OptionImplicitsClauseEmpty {
12002    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionImplicitsClauseEmpty);
12003    type StablePtr = OptionImplicitsClauseEmptyPtr;
12004    type Green = OptionImplicitsClauseEmptyGreen;
12005    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
12006        OptionImplicitsClauseEmptyGreen(
12007            Arc::new(GreenNode {
12008                kind: SyntaxKind::OptionImplicitsClauseEmpty,
12009                details: GreenNodeDetails::Node { children: vec![], width: TextWidth::default() },
12010            })
12011            .intern(db),
12012        )
12013    }
12014    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
12015        let kind = node.kind(db);
12016        assert_eq!(
12017            kind,
12018            SyntaxKind::OptionImplicitsClauseEmpty,
12019            "Unexpected SyntaxKind {:?}. Expected {:?}.",
12020            kind,
12021            SyntaxKind::OptionImplicitsClauseEmpty
12022        );
12023        let children = db.get_children(node.clone());
12024        Self { node, children }
12025    }
12026    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
12027        let kind = node.kind(db);
12028        if kind == SyntaxKind::OptionImplicitsClauseEmpty {
12029            Some(Self::from_syntax_node(db, node))
12030        } else {
12031            None
12032        }
12033    }
12034    fn as_syntax_node(&self) -> SyntaxNode {
12035        self.node.clone()
12036    }
12037    fn stable_ptr(&self) -> Self::StablePtr {
12038        OptionImplicitsClauseEmptyPtr(self.node.0.stable_ptr)
12039    }
12040}
12041impl From<&OptionImplicitsClauseEmpty> for SyntaxStablePtrId {
12042    fn from(node: &OptionImplicitsClauseEmpty) -> Self {
12043        node.stable_ptr().untyped()
12044    }
12045}
12046#[derive(Clone, Debug, Eq, Hash, PartialEq)]
12047pub enum OptionTerminalNoPanic {
12048    Empty(OptionTerminalNoPanicEmpty),
12049    TerminalNoPanic(TerminalNoPanic),
12050}
12051#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
12052pub struct OptionTerminalNoPanicPtr(pub SyntaxStablePtrId);
12053impl TypedStablePtr for OptionTerminalNoPanicPtr {
12054    type SyntaxNode = OptionTerminalNoPanic;
12055    fn untyped(&self) -> SyntaxStablePtrId {
12056        self.0
12057    }
12058    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionTerminalNoPanic {
12059        OptionTerminalNoPanic::from_syntax_node(db, self.0.lookup(db))
12060    }
12061}
12062impl From<OptionTerminalNoPanicPtr> for SyntaxStablePtrId {
12063    fn from(ptr: OptionTerminalNoPanicPtr) -> Self {
12064        ptr.untyped()
12065    }
12066}
12067impl From<OptionTerminalNoPanicEmptyPtr> for OptionTerminalNoPanicPtr {
12068    fn from(value: OptionTerminalNoPanicEmptyPtr) -> Self {
12069        Self(value.0)
12070    }
12071}
12072impl From<TerminalNoPanicPtr> for OptionTerminalNoPanicPtr {
12073    fn from(value: TerminalNoPanicPtr) -> Self {
12074        Self(value.0)
12075    }
12076}
12077impl From<OptionTerminalNoPanicEmptyGreen> for OptionTerminalNoPanicGreen {
12078    fn from(value: OptionTerminalNoPanicEmptyGreen) -> Self {
12079        Self(value.0)
12080    }
12081}
12082impl From<TerminalNoPanicGreen> for OptionTerminalNoPanicGreen {
12083    fn from(value: TerminalNoPanicGreen) -> Self {
12084        Self(value.0)
12085    }
12086}
12087#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
12088pub struct OptionTerminalNoPanicGreen(pub GreenId);
12089impl TypedSyntaxNode for OptionTerminalNoPanic {
12090    const OPTIONAL_KIND: Option<SyntaxKind> = None;
12091    type StablePtr = OptionTerminalNoPanicPtr;
12092    type Green = OptionTerminalNoPanicGreen;
12093    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
12094        panic!("No missing variant.");
12095    }
12096    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
12097        let kind = node.kind(db);
12098        match kind {
12099            SyntaxKind::OptionTerminalNoPanicEmpty => {
12100                OptionTerminalNoPanic::Empty(OptionTerminalNoPanicEmpty::from_syntax_node(db, node))
12101            }
12102            SyntaxKind::TerminalNoPanic => {
12103                OptionTerminalNoPanic::TerminalNoPanic(TerminalNoPanic::from_syntax_node(db, node))
12104            }
12105            _ => panic!(
12106                "Unexpected syntax kind {:?} when constructing {}.",
12107                kind, "OptionTerminalNoPanic"
12108            ),
12109        }
12110    }
12111    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
12112        let kind = node.kind(db);
12113        match kind {
12114            SyntaxKind::OptionTerminalNoPanicEmpty => Some(OptionTerminalNoPanic::Empty(
12115                OptionTerminalNoPanicEmpty::from_syntax_node(db, node),
12116            )),
12117            SyntaxKind::TerminalNoPanic => Some(OptionTerminalNoPanic::TerminalNoPanic(
12118                TerminalNoPanic::from_syntax_node(db, node),
12119            )),
12120            _ => None,
12121        }
12122    }
12123    fn as_syntax_node(&self) -> SyntaxNode {
12124        match self {
12125            OptionTerminalNoPanic::Empty(x) => x.as_syntax_node(),
12126            OptionTerminalNoPanic::TerminalNoPanic(x) => x.as_syntax_node(),
12127        }
12128    }
12129    fn stable_ptr(&self) -> Self::StablePtr {
12130        OptionTerminalNoPanicPtr(self.as_syntax_node().0.stable_ptr)
12131    }
12132}
12133impl From<&OptionTerminalNoPanic> for SyntaxStablePtrId {
12134    fn from(node: &OptionTerminalNoPanic) -> Self {
12135        node.stable_ptr().untyped()
12136    }
12137}
12138impl OptionTerminalNoPanic {
12139    /// Checks if a kind of a variant of [OptionTerminalNoPanic].
12140    pub fn is_variant(kind: SyntaxKind) -> bool {
12141        matches!(kind, SyntaxKind::OptionTerminalNoPanicEmpty | SyntaxKind::TerminalNoPanic)
12142    }
12143}
12144#[derive(Clone, Debug, Eq, Hash, PartialEq)]
12145pub struct OptionTerminalNoPanicEmpty {
12146    node: SyntaxNode,
12147    children: Arc<[SyntaxNode]>,
12148}
12149impl OptionTerminalNoPanicEmpty {
12150    pub fn new_green(db: &dyn SyntaxGroup) -> OptionTerminalNoPanicEmptyGreen {
12151        let children: Vec<GreenId> = vec![];
12152        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
12153        OptionTerminalNoPanicEmptyGreen(
12154            Arc::new(GreenNode {
12155                kind: SyntaxKind::OptionTerminalNoPanicEmpty,
12156                details: GreenNodeDetails::Node { children, width },
12157            })
12158            .intern(db),
12159        )
12160    }
12161}
12162impl OptionTerminalNoPanicEmpty {}
12163#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
12164pub struct OptionTerminalNoPanicEmptyPtr(pub SyntaxStablePtrId);
12165impl OptionTerminalNoPanicEmptyPtr {}
12166impl TypedStablePtr for OptionTerminalNoPanicEmptyPtr {
12167    type SyntaxNode = OptionTerminalNoPanicEmpty;
12168    fn untyped(&self) -> SyntaxStablePtrId {
12169        self.0
12170    }
12171    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionTerminalNoPanicEmpty {
12172        OptionTerminalNoPanicEmpty::from_syntax_node(db, self.0.lookup(db))
12173    }
12174}
12175impl From<OptionTerminalNoPanicEmptyPtr> for SyntaxStablePtrId {
12176    fn from(ptr: OptionTerminalNoPanicEmptyPtr) -> Self {
12177        ptr.untyped()
12178    }
12179}
12180#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
12181pub struct OptionTerminalNoPanicEmptyGreen(pub GreenId);
12182impl TypedSyntaxNode for OptionTerminalNoPanicEmpty {
12183    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionTerminalNoPanicEmpty);
12184    type StablePtr = OptionTerminalNoPanicEmptyPtr;
12185    type Green = OptionTerminalNoPanicEmptyGreen;
12186    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
12187        OptionTerminalNoPanicEmptyGreen(
12188            Arc::new(GreenNode {
12189                kind: SyntaxKind::OptionTerminalNoPanicEmpty,
12190                details: GreenNodeDetails::Node { children: vec![], width: TextWidth::default() },
12191            })
12192            .intern(db),
12193        )
12194    }
12195    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
12196        let kind = node.kind(db);
12197        assert_eq!(
12198            kind,
12199            SyntaxKind::OptionTerminalNoPanicEmpty,
12200            "Unexpected SyntaxKind {:?}. Expected {:?}.",
12201            kind,
12202            SyntaxKind::OptionTerminalNoPanicEmpty
12203        );
12204        let children = db.get_children(node.clone());
12205        Self { node, children }
12206    }
12207    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
12208        let kind = node.kind(db);
12209        if kind == SyntaxKind::OptionTerminalNoPanicEmpty {
12210            Some(Self::from_syntax_node(db, node))
12211        } else {
12212            None
12213        }
12214    }
12215    fn as_syntax_node(&self) -> SyntaxNode {
12216        self.node.clone()
12217    }
12218    fn stable_ptr(&self) -> Self::StablePtr {
12219        OptionTerminalNoPanicEmptyPtr(self.node.0.stable_ptr)
12220    }
12221}
12222impl From<&OptionTerminalNoPanicEmpty> for SyntaxStablePtrId {
12223    fn from(node: &OptionTerminalNoPanicEmpty) -> Self {
12224        node.stable_ptr().untyped()
12225    }
12226}
12227#[derive(Clone, Debug, Eq, Hash, PartialEq)]
12228pub enum OptionTerminalConst {
12229    Empty(OptionTerminalConstEmpty),
12230    TerminalConst(TerminalConst),
12231}
12232#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
12233pub struct OptionTerminalConstPtr(pub SyntaxStablePtrId);
12234impl TypedStablePtr for OptionTerminalConstPtr {
12235    type SyntaxNode = OptionTerminalConst;
12236    fn untyped(&self) -> SyntaxStablePtrId {
12237        self.0
12238    }
12239    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionTerminalConst {
12240        OptionTerminalConst::from_syntax_node(db, self.0.lookup(db))
12241    }
12242}
12243impl From<OptionTerminalConstPtr> for SyntaxStablePtrId {
12244    fn from(ptr: OptionTerminalConstPtr) -> Self {
12245        ptr.untyped()
12246    }
12247}
12248impl From<OptionTerminalConstEmptyPtr> for OptionTerminalConstPtr {
12249    fn from(value: OptionTerminalConstEmptyPtr) -> Self {
12250        Self(value.0)
12251    }
12252}
12253impl From<TerminalConstPtr> for OptionTerminalConstPtr {
12254    fn from(value: TerminalConstPtr) -> Self {
12255        Self(value.0)
12256    }
12257}
12258impl From<OptionTerminalConstEmptyGreen> for OptionTerminalConstGreen {
12259    fn from(value: OptionTerminalConstEmptyGreen) -> Self {
12260        Self(value.0)
12261    }
12262}
12263impl From<TerminalConstGreen> for OptionTerminalConstGreen {
12264    fn from(value: TerminalConstGreen) -> Self {
12265        Self(value.0)
12266    }
12267}
12268#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
12269pub struct OptionTerminalConstGreen(pub GreenId);
12270impl TypedSyntaxNode for OptionTerminalConst {
12271    const OPTIONAL_KIND: Option<SyntaxKind> = None;
12272    type StablePtr = OptionTerminalConstPtr;
12273    type Green = OptionTerminalConstGreen;
12274    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
12275        panic!("No missing variant.");
12276    }
12277    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
12278        let kind = node.kind(db);
12279        match kind {
12280            SyntaxKind::OptionTerminalConstEmpty => {
12281                OptionTerminalConst::Empty(OptionTerminalConstEmpty::from_syntax_node(db, node))
12282            }
12283            SyntaxKind::TerminalConst => {
12284                OptionTerminalConst::TerminalConst(TerminalConst::from_syntax_node(db, node))
12285            }
12286            _ => panic!(
12287                "Unexpected syntax kind {:?} when constructing {}.",
12288                kind, "OptionTerminalConst"
12289            ),
12290        }
12291    }
12292    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
12293        let kind = node.kind(db);
12294        match kind {
12295            SyntaxKind::OptionTerminalConstEmpty => Some(OptionTerminalConst::Empty(
12296                OptionTerminalConstEmpty::from_syntax_node(db, node),
12297            )),
12298            SyntaxKind::TerminalConst => {
12299                Some(OptionTerminalConst::TerminalConst(TerminalConst::from_syntax_node(db, node)))
12300            }
12301            _ => None,
12302        }
12303    }
12304    fn as_syntax_node(&self) -> SyntaxNode {
12305        match self {
12306            OptionTerminalConst::Empty(x) => x.as_syntax_node(),
12307            OptionTerminalConst::TerminalConst(x) => x.as_syntax_node(),
12308        }
12309    }
12310    fn stable_ptr(&self) -> Self::StablePtr {
12311        OptionTerminalConstPtr(self.as_syntax_node().0.stable_ptr)
12312    }
12313}
12314impl From<&OptionTerminalConst> for SyntaxStablePtrId {
12315    fn from(node: &OptionTerminalConst) -> Self {
12316        node.stable_ptr().untyped()
12317    }
12318}
12319impl OptionTerminalConst {
12320    /// Checks if a kind of a variant of [OptionTerminalConst].
12321    pub fn is_variant(kind: SyntaxKind) -> bool {
12322        matches!(kind, SyntaxKind::OptionTerminalConstEmpty | SyntaxKind::TerminalConst)
12323    }
12324}
12325#[derive(Clone, Debug, Eq, Hash, PartialEq)]
12326pub struct OptionTerminalConstEmpty {
12327    node: SyntaxNode,
12328    children: Arc<[SyntaxNode]>,
12329}
12330impl OptionTerminalConstEmpty {
12331    pub fn new_green(db: &dyn SyntaxGroup) -> OptionTerminalConstEmptyGreen {
12332        let children: Vec<GreenId> = vec![];
12333        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
12334        OptionTerminalConstEmptyGreen(
12335            Arc::new(GreenNode {
12336                kind: SyntaxKind::OptionTerminalConstEmpty,
12337                details: GreenNodeDetails::Node { children, width },
12338            })
12339            .intern(db),
12340        )
12341    }
12342}
12343impl OptionTerminalConstEmpty {}
12344#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
12345pub struct OptionTerminalConstEmptyPtr(pub SyntaxStablePtrId);
12346impl OptionTerminalConstEmptyPtr {}
12347impl TypedStablePtr for OptionTerminalConstEmptyPtr {
12348    type SyntaxNode = OptionTerminalConstEmpty;
12349    fn untyped(&self) -> SyntaxStablePtrId {
12350        self.0
12351    }
12352    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionTerminalConstEmpty {
12353        OptionTerminalConstEmpty::from_syntax_node(db, self.0.lookup(db))
12354    }
12355}
12356impl From<OptionTerminalConstEmptyPtr> for SyntaxStablePtrId {
12357    fn from(ptr: OptionTerminalConstEmptyPtr) -> Self {
12358        ptr.untyped()
12359    }
12360}
12361#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
12362pub struct OptionTerminalConstEmptyGreen(pub GreenId);
12363impl TypedSyntaxNode for OptionTerminalConstEmpty {
12364    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionTerminalConstEmpty);
12365    type StablePtr = OptionTerminalConstEmptyPtr;
12366    type Green = OptionTerminalConstEmptyGreen;
12367    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
12368        OptionTerminalConstEmptyGreen(
12369            Arc::new(GreenNode {
12370                kind: SyntaxKind::OptionTerminalConstEmpty,
12371                details: GreenNodeDetails::Node { children: vec![], width: TextWidth::default() },
12372            })
12373            .intern(db),
12374        )
12375    }
12376    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
12377        let kind = node.kind(db);
12378        assert_eq!(
12379            kind,
12380            SyntaxKind::OptionTerminalConstEmpty,
12381            "Unexpected SyntaxKind {:?}. Expected {:?}.",
12382            kind,
12383            SyntaxKind::OptionTerminalConstEmpty
12384        );
12385        let children = db.get_children(node.clone());
12386        Self { node, children }
12387    }
12388    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
12389        let kind = node.kind(db);
12390        if kind == SyntaxKind::OptionTerminalConstEmpty {
12391            Some(Self::from_syntax_node(db, node))
12392        } else {
12393            None
12394        }
12395    }
12396    fn as_syntax_node(&self) -> SyntaxNode {
12397        self.node.clone()
12398    }
12399    fn stable_ptr(&self) -> Self::StablePtr {
12400        OptionTerminalConstEmptyPtr(self.node.0.stable_ptr)
12401    }
12402}
12403impl From<&OptionTerminalConstEmpty> for SyntaxStablePtrId {
12404    fn from(node: &OptionTerminalConstEmpty) -> Self {
12405        node.stable_ptr().untyped()
12406    }
12407}
12408#[derive(Clone, Debug, Eq, Hash, PartialEq)]
12409pub struct FunctionSignature {
12410    node: SyntaxNode,
12411    children: Arc<[SyntaxNode]>,
12412}
12413impl FunctionSignature {
12414    pub const INDEX_LPAREN: usize = 0;
12415    pub const INDEX_PARAMETERS: usize = 1;
12416    pub const INDEX_RPAREN: usize = 2;
12417    pub const INDEX_RET_TY: usize = 3;
12418    pub const INDEX_IMPLICITS_CLAUSE: usize = 4;
12419    pub const INDEX_OPTIONAL_NO_PANIC: usize = 5;
12420    pub fn new_green(
12421        db: &dyn SyntaxGroup,
12422        lparen: TerminalLParenGreen,
12423        parameters: ParamListGreen,
12424        rparen: TerminalRParenGreen,
12425        ret_ty: OptionReturnTypeClauseGreen,
12426        implicits_clause: OptionImplicitsClauseGreen,
12427        optional_no_panic: OptionTerminalNoPanicGreen,
12428    ) -> FunctionSignatureGreen {
12429        let children: Vec<GreenId> = vec![
12430            lparen.0,
12431            parameters.0,
12432            rparen.0,
12433            ret_ty.0,
12434            implicits_clause.0,
12435            optional_no_panic.0,
12436        ];
12437        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
12438        FunctionSignatureGreen(
12439            Arc::new(GreenNode {
12440                kind: SyntaxKind::FunctionSignature,
12441                details: GreenNodeDetails::Node { children, width },
12442            })
12443            .intern(db),
12444        )
12445    }
12446}
12447impl FunctionSignature {
12448    pub fn lparen(&self, db: &dyn SyntaxGroup) -> TerminalLParen {
12449        TerminalLParen::from_syntax_node(db, self.children[0].clone())
12450    }
12451    pub fn parameters(&self, db: &dyn SyntaxGroup) -> ParamList {
12452        ParamList::from_syntax_node(db, self.children[1].clone())
12453    }
12454    pub fn rparen(&self, db: &dyn SyntaxGroup) -> TerminalRParen {
12455        TerminalRParen::from_syntax_node(db, self.children[2].clone())
12456    }
12457    pub fn ret_ty(&self, db: &dyn SyntaxGroup) -> OptionReturnTypeClause {
12458        OptionReturnTypeClause::from_syntax_node(db, self.children[3].clone())
12459    }
12460    pub fn implicits_clause(&self, db: &dyn SyntaxGroup) -> OptionImplicitsClause {
12461        OptionImplicitsClause::from_syntax_node(db, self.children[4].clone())
12462    }
12463    pub fn optional_no_panic(&self, db: &dyn SyntaxGroup) -> OptionTerminalNoPanic {
12464        OptionTerminalNoPanic::from_syntax_node(db, self.children[5].clone())
12465    }
12466}
12467#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
12468pub struct FunctionSignaturePtr(pub SyntaxStablePtrId);
12469impl FunctionSignaturePtr {}
12470impl TypedStablePtr for FunctionSignaturePtr {
12471    type SyntaxNode = FunctionSignature;
12472    fn untyped(&self) -> SyntaxStablePtrId {
12473        self.0
12474    }
12475    fn lookup(&self, db: &dyn SyntaxGroup) -> FunctionSignature {
12476        FunctionSignature::from_syntax_node(db, self.0.lookup(db))
12477    }
12478}
12479impl From<FunctionSignaturePtr> for SyntaxStablePtrId {
12480    fn from(ptr: FunctionSignaturePtr) -> Self {
12481        ptr.untyped()
12482    }
12483}
12484#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
12485pub struct FunctionSignatureGreen(pub GreenId);
12486impl TypedSyntaxNode for FunctionSignature {
12487    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::FunctionSignature);
12488    type StablePtr = FunctionSignaturePtr;
12489    type Green = FunctionSignatureGreen;
12490    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
12491        FunctionSignatureGreen(
12492            Arc::new(GreenNode {
12493                kind: SyntaxKind::FunctionSignature,
12494                details: GreenNodeDetails::Node {
12495                    children: vec![
12496                        TerminalLParen::missing(db).0,
12497                        ParamList::missing(db).0,
12498                        TerminalRParen::missing(db).0,
12499                        OptionReturnTypeClause::missing(db).0,
12500                        OptionImplicitsClause::missing(db).0,
12501                        OptionTerminalNoPanic::missing(db).0,
12502                    ],
12503                    width: TextWidth::default(),
12504                },
12505            })
12506            .intern(db),
12507        )
12508    }
12509    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
12510        let kind = node.kind(db);
12511        assert_eq!(
12512            kind,
12513            SyntaxKind::FunctionSignature,
12514            "Unexpected SyntaxKind {:?}. Expected {:?}.",
12515            kind,
12516            SyntaxKind::FunctionSignature
12517        );
12518        let children = db.get_children(node.clone());
12519        Self { node, children }
12520    }
12521    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
12522        let kind = node.kind(db);
12523        if kind == SyntaxKind::FunctionSignature {
12524            Some(Self::from_syntax_node(db, node))
12525        } else {
12526            None
12527        }
12528    }
12529    fn as_syntax_node(&self) -> SyntaxNode {
12530        self.node.clone()
12531    }
12532    fn stable_ptr(&self) -> Self::StablePtr {
12533        FunctionSignaturePtr(self.node.0.stable_ptr)
12534    }
12535}
12536impl From<&FunctionSignature> for SyntaxStablePtrId {
12537    fn from(node: &FunctionSignature) -> Self {
12538        node.stable_ptr().untyped()
12539    }
12540}
12541#[derive(Clone, Debug, Eq, Hash, PartialEq)]
12542pub struct Member {
12543    node: SyntaxNode,
12544    children: Arc<[SyntaxNode]>,
12545}
12546impl Member {
12547    pub const INDEX_ATTRIBUTES: usize = 0;
12548    pub const INDEX_VISIBILITY: usize = 1;
12549    pub const INDEX_NAME: usize = 2;
12550    pub const INDEX_TYPE_CLAUSE: usize = 3;
12551    pub fn new_green(
12552        db: &dyn SyntaxGroup,
12553        attributes: AttributeListGreen,
12554        visibility: VisibilityGreen,
12555        name: TerminalIdentifierGreen,
12556        type_clause: TypeClauseGreen,
12557    ) -> MemberGreen {
12558        let children: Vec<GreenId> = vec![attributes.0, visibility.0, name.0, type_clause.0];
12559        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
12560        MemberGreen(
12561            Arc::new(GreenNode {
12562                kind: SyntaxKind::Member,
12563                details: GreenNodeDetails::Node { children, width },
12564            })
12565            .intern(db),
12566        )
12567    }
12568}
12569impl Member {
12570    pub fn attributes(&self, db: &dyn SyntaxGroup) -> AttributeList {
12571        AttributeList::from_syntax_node(db, self.children[0].clone())
12572    }
12573    pub fn visibility(&self, db: &dyn SyntaxGroup) -> Visibility {
12574        Visibility::from_syntax_node(db, self.children[1].clone())
12575    }
12576    pub fn name(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier {
12577        TerminalIdentifier::from_syntax_node(db, self.children[2].clone())
12578    }
12579    pub fn type_clause(&self, db: &dyn SyntaxGroup) -> TypeClause {
12580        TypeClause::from_syntax_node(db, self.children[3].clone())
12581    }
12582}
12583#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
12584pub struct MemberPtr(pub SyntaxStablePtrId);
12585impl MemberPtr {
12586    pub fn name_green(self, db: &dyn SyntaxGroup) -> TerminalIdentifierGreen {
12587        let ptr = self.0.lookup_intern(db);
12588        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
12589            TerminalIdentifierGreen(key_fields[0])
12590        } else {
12591            panic!("Unexpected key field query on root.");
12592        }
12593    }
12594}
12595impl TypedStablePtr for MemberPtr {
12596    type SyntaxNode = Member;
12597    fn untyped(&self) -> SyntaxStablePtrId {
12598        self.0
12599    }
12600    fn lookup(&self, db: &dyn SyntaxGroup) -> Member {
12601        Member::from_syntax_node(db, self.0.lookup(db))
12602    }
12603}
12604impl From<MemberPtr> for SyntaxStablePtrId {
12605    fn from(ptr: MemberPtr) -> Self {
12606        ptr.untyped()
12607    }
12608}
12609#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
12610pub struct MemberGreen(pub GreenId);
12611impl TypedSyntaxNode for Member {
12612    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::Member);
12613    type StablePtr = MemberPtr;
12614    type Green = MemberGreen;
12615    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
12616        MemberGreen(
12617            Arc::new(GreenNode {
12618                kind: SyntaxKind::Member,
12619                details: GreenNodeDetails::Node {
12620                    children: vec![
12621                        AttributeList::missing(db).0,
12622                        Visibility::missing(db).0,
12623                        TerminalIdentifier::missing(db).0,
12624                        TypeClause::missing(db).0,
12625                    ],
12626                    width: TextWidth::default(),
12627                },
12628            })
12629            .intern(db),
12630        )
12631    }
12632    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
12633        let kind = node.kind(db);
12634        assert_eq!(
12635            kind,
12636            SyntaxKind::Member,
12637            "Unexpected SyntaxKind {:?}. Expected {:?}.",
12638            kind,
12639            SyntaxKind::Member
12640        );
12641        let children = db.get_children(node.clone());
12642        Self { node, children }
12643    }
12644    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
12645        let kind = node.kind(db);
12646        if kind == SyntaxKind::Member { Some(Self::from_syntax_node(db, node)) } else { None }
12647    }
12648    fn as_syntax_node(&self) -> SyntaxNode {
12649        self.node.clone()
12650    }
12651    fn stable_ptr(&self) -> Self::StablePtr {
12652        MemberPtr(self.node.0.stable_ptr)
12653    }
12654}
12655impl From<&Member> for SyntaxStablePtrId {
12656    fn from(node: &Member) -> Self {
12657        node.stable_ptr().untyped()
12658    }
12659}
12660#[derive(Clone, Debug, Eq, Hash, PartialEq)]
12661pub struct MemberList(ElementList<Member, 2>);
12662impl Deref for MemberList {
12663    type Target = ElementList<Member, 2>;
12664    fn deref(&self) -> &Self::Target {
12665        &self.0
12666    }
12667}
12668impl MemberList {
12669    pub fn new_green(
12670        db: &dyn SyntaxGroup,
12671        children: Vec<MemberListElementOrSeparatorGreen>,
12672    ) -> MemberListGreen {
12673        let width = children.iter().map(|id| id.id().lookup_intern(db).width()).sum();
12674        MemberListGreen(
12675            Arc::new(GreenNode {
12676                kind: SyntaxKind::MemberList,
12677                details: GreenNodeDetails::Node {
12678                    children: children.iter().map(|x| x.id()).collect(),
12679                    width,
12680                },
12681            })
12682            .intern(db),
12683        )
12684    }
12685}
12686#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
12687pub struct MemberListPtr(pub SyntaxStablePtrId);
12688impl TypedStablePtr for MemberListPtr {
12689    type SyntaxNode = MemberList;
12690    fn untyped(&self) -> SyntaxStablePtrId {
12691        self.0
12692    }
12693    fn lookup(&self, db: &dyn SyntaxGroup) -> MemberList {
12694        MemberList::from_syntax_node(db, self.0.lookup(db))
12695    }
12696}
12697impl From<MemberListPtr> for SyntaxStablePtrId {
12698    fn from(ptr: MemberListPtr) -> Self {
12699        ptr.untyped()
12700    }
12701}
12702#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
12703pub enum MemberListElementOrSeparatorGreen {
12704    Separator(TerminalCommaGreen),
12705    Element(MemberGreen),
12706}
12707impl From<TerminalCommaGreen> for MemberListElementOrSeparatorGreen {
12708    fn from(value: TerminalCommaGreen) -> Self {
12709        MemberListElementOrSeparatorGreen::Separator(value)
12710    }
12711}
12712impl From<MemberGreen> for MemberListElementOrSeparatorGreen {
12713    fn from(value: MemberGreen) -> Self {
12714        MemberListElementOrSeparatorGreen::Element(value)
12715    }
12716}
12717impl MemberListElementOrSeparatorGreen {
12718    fn id(&self) -> GreenId {
12719        match self {
12720            MemberListElementOrSeparatorGreen::Separator(green) => green.0,
12721            MemberListElementOrSeparatorGreen::Element(green) => green.0,
12722        }
12723    }
12724}
12725#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
12726pub struct MemberListGreen(pub GreenId);
12727impl TypedSyntaxNode for MemberList {
12728    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::MemberList);
12729    type StablePtr = MemberListPtr;
12730    type Green = MemberListGreen;
12731    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
12732        MemberListGreen(
12733            Arc::new(GreenNode {
12734                kind: SyntaxKind::MemberList,
12735                details: GreenNodeDetails::Node { children: vec![], width: TextWidth::default() },
12736            })
12737            .intern(db),
12738        )
12739    }
12740    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
12741        Self(ElementList::new(node))
12742    }
12743    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
12744        if node.kind(db) == SyntaxKind::MemberList {
12745            Some(Self(ElementList::new(node)))
12746        } else {
12747            None
12748        }
12749    }
12750    fn as_syntax_node(&self) -> SyntaxNode {
12751        self.node.clone()
12752    }
12753    fn stable_ptr(&self) -> Self::StablePtr {
12754        MemberListPtr(self.node.0.stable_ptr)
12755    }
12756}
12757impl From<&MemberList> for SyntaxStablePtrId {
12758    fn from(node: &MemberList) -> Self {
12759        node.stable_ptr().untyped()
12760    }
12761}
12762#[derive(Clone, Debug, Eq, Hash, PartialEq)]
12763pub struct Variant {
12764    node: SyntaxNode,
12765    children: Arc<[SyntaxNode]>,
12766}
12767impl Variant {
12768    pub const INDEX_ATTRIBUTES: usize = 0;
12769    pub const INDEX_NAME: usize = 1;
12770    pub const INDEX_TYPE_CLAUSE: usize = 2;
12771    pub fn new_green(
12772        db: &dyn SyntaxGroup,
12773        attributes: AttributeListGreen,
12774        name: TerminalIdentifierGreen,
12775        type_clause: OptionTypeClauseGreen,
12776    ) -> VariantGreen {
12777        let children: Vec<GreenId> = vec![attributes.0, name.0, type_clause.0];
12778        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
12779        VariantGreen(
12780            Arc::new(GreenNode {
12781                kind: SyntaxKind::Variant,
12782                details: GreenNodeDetails::Node { children, width },
12783            })
12784            .intern(db),
12785        )
12786    }
12787}
12788impl Variant {
12789    pub fn attributes(&self, db: &dyn SyntaxGroup) -> AttributeList {
12790        AttributeList::from_syntax_node(db, self.children[0].clone())
12791    }
12792    pub fn name(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier {
12793        TerminalIdentifier::from_syntax_node(db, self.children[1].clone())
12794    }
12795    pub fn type_clause(&self, db: &dyn SyntaxGroup) -> OptionTypeClause {
12796        OptionTypeClause::from_syntax_node(db, self.children[2].clone())
12797    }
12798}
12799#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
12800pub struct VariantPtr(pub SyntaxStablePtrId);
12801impl VariantPtr {
12802    pub fn name_green(self, db: &dyn SyntaxGroup) -> TerminalIdentifierGreen {
12803        let ptr = self.0.lookup_intern(db);
12804        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
12805            TerminalIdentifierGreen(key_fields[0])
12806        } else {
12807            panic!("Unexpected key field query on root.");
12808        }
12809    }
12810}
12811impl TypedStablePtr for VariantPtr {
12812    type SyntaxNode = Variant;
12813    fn untyped(&self) -> SyntaxStablePtrId {
12814        self.0
12815    }
12816    fn lookup(&self, db: &dyn SyntaxGroup) -> Variant {
12817        Variant::from_syntax_node(db, self.0.lookup(db))
12818    }
12819}
12820impl From<VariantPtr> for SyntaxStablePtrId {
12821    fn from(ptr: VariantPtr) -> Self {
12822        ptr.untyped()
12823    }
12824}
12825#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
12826pub struct VariantGreen(pub GreenId);
12827impl TypedSyntaxNode for Variant {
12828    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::Variant);
12829    type StablePtr = VariantPtr;
12830    type Green = VariantGreen;
12831    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
12832        VariantGreen(
12833            Arc::new(GreenNode {
12834                kind: SyntaxKind::Variant,
12835                details: GreenNodeDetails::Node {
12836                    children: vec![
12837                        AttributeList::missing(db).0,
12838                        TerminalIdentifier::missing(db).0,
12839                        OptionTypeClause::missing(db).0,
12840                    ],
12841                    width: TextWidth::default(),
12842                },
12843            })
12844            .intern(db),
12845        )
12846    }
12847    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
12848        let kind = node.kind(db);
12849        assert_eq!(
12850            kind,
12851            SyntaxKind::Variant,
12852            "Unexpected SyntaxKind {:?}. Expected {:?}.",
12853            kind,
12854            SyntaxKind::Variant
12855        );
12856        let children = db.get_children(node.clone());
12857        Self { node, children }
12858    }
12859    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
12860        let kind = node.kind(db);
12861        if kind == SyntaxKind::Variant { Some(Self::from_syntax_node(db, node)) } else { None }
12862    }
12863    fn as_syntax_node(&self) -> SyntaxNode {
12864        self.node.clone()
12865    }
12866    fn stable_ptr(&self) -> Self::StablePtr {
12867        VariantPtr(self.node.0.stable_ptr)
12868    }
12869}
12870impl From<&Variant> for SyntaxStablePtrId {
12871    fn from(node: &Variant) -> Self {
12872        node.stable_ptr().untyped()
12873    }
12874}
12875#[derive(Clone, Debug, Eq, Hash, PartialEq)]
12876pub struct VariantList(ElementList<Variant, 2>);
12877impl Deref for VariantList {
12878    type Target = ElementList<Variant, 2>;
12879    fn deref(&self) -> &Self::Target {
12880        &self.0
12881    }
12882}
12883impl VariantList {
12884    pub fn new_green(
12885        db: &dyn SyntaxGroup,
12886        children: Vec<VariantListElementOrSeparatorGreen>,
12887    ) -> VariantListGreen {
12888        let width = children.iter().map(|id| id.id().lookup_intern(db).width()).sum();
12889        VariantListGreen(
12890            Arc::new(GreenNode {
12891                kind: SyntaxKind::VariantList,
12892                details: GreenNodeDetails::Node {
12893                    children: children.iter().map(|x| x.id()).collect(),
12894                    width,
12895                },
12896            })
12897            .intern(db),
12898        )
12899    }
12900}
12901#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
12902pub struct VariantListPtr(pub SyntaxStablePtrId);
12903impl TypedStablePtr for VariantListPtr {
12904    type SyntaxNode = VariantList;
12905    fn untyped(&self) -> SyntaxStablePtrId {
12906        self.0
12907    }
12908    fn lookup(&self, db: &dyn SyntaxGroup) -> VariantList {
12909        VariantList::from_syntax_node(db, self.0.lookup(db))
12910    }
12911}
12912impl From<VariantListPtr> for SyntaxStablePtrId {
12913    fn from(ptr: VariantListPtr) -> Self {
12914        ptr.untyped()
12915    }
12916}
12917#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
12918pub enum VariantListElementOrSeparatorGreen {
12919    Separator(TerminalCommaGreen),
12920    Element(VariantGreen),
12921}
12922impl From<TerminalCommaGreen> for VariantListElementOrSeparatorGreen {
12923    fn from(value: TerminalCommaGreen) -> Self {
12924        VariantListElementOrSeparatorGreen::Separator(value)
12925    }
12926}
12927impl From<VariantGreen> for VariantListElementOrSeparatorGreen {
12928    fn from(value: VariantGreen) -> Self {
12929        VariantListElementOrSeparatorGreen::Element(value)
12930    }
12931}
12932impl VariantListElementOrSeparatorGreen {
12933    fn id(&self) -> GreenId {
12934        match self {
12935            VariantListElementOrSeparatorGreen::Separator(green) => green.0,
12936            VariantListElementOrSeparatorGreen::Element(green) => green.0,
12937        }
12938    }
12939}
12940#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
12941pub struct VariantListGreen(pub GreenId);
12942impl TypedSyntaxNode for VariantList {
12943    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::VariantList);
12944    type StablePtr = VariantListPtr;
12945    type Green = VariantListGreen;
12946    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
12947        VariantListGreen(
12948            Arc::new(GreenNode {
12949                kind: SyntaxKind::VariantList,
12950                details: GreenNodeDetails::Node { children: vec![], width: TextWidth::default() },
12951            })
12952            .intern(db),
12953        )
12954    }
12955    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
12956        Self(ElementList::new(node))
12957    }
12958    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
12959        if node.kind(db) == SyntaxKind::VariantList {
12960            Some(Self(ElementList::new(node)))
12961        } else {
12962            None
12963        }
12964    }
12965    fn as_syntax_node(&self) -> SyntaxNode {
12966        self.node.clone()
12967    }
12968    fn stable_ptr(&self) -> Self::StablePtr {
12969        VariantListPtr(self.node.0.stable_ptr)
12970    }
12971}
12972impl From<&VariantList> for SyntaxStablePtrId {
12973    fn from(node: &VariantList) -> Self {
12974        node.stable_ptr().untyped()
12975    }
12976}
12977#[derive(Clone, Debug, Eq, Hash, PartialEq)]
12978pub enum ModuleItem {
12979    Constant(ItemConstant),
12980    Module(ItemModule),
12981    Use(ItemUse),
12982    FreeFunction(FunctionWithBody),
12983    ExternFunction(ItemExternFunction),
12984    ExternType(ItemExternType),
12985    Trait(ItemTrait),
12986    Impl(ItemImpl),
12987    ImplAlias(ItemImplAlias),
12988    Struct(ItemStruct),
12989    Enum(ItemEnum),
12990    TypeAlias(ItemTypeAlias),
12991    InlineMacro(ItemInlineMacro),
12992    HeaderDoc(ItemHeaderDoc),
12993    Missing(ModuleItemMissing),
12994}
12995#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
12996pub struct ModuleItemPtr(pub SyntaxStablePtrId);
12997impl TypedStablePtr for ModuleItemPtr {
12998    type SyntaxNode = ModuleItem;
12999    fn untyped(&self) -> SyntaxStablePtrId {
13000        self.0
13001    }
13002    fn lookup(&self, db: &dyn SyntaxGroup) -> ModuleItem {
13003        ModuleItem::from_syntax_node(db, self.0.lookup(db))
13004    }
13005}
13006impl From<ModuleItemPtr> for SyntaxStablePtrId {
13007    fn from(ptr: ModuleItemPtr) -> Self {
13008        ptr.untyped()
13009    }
13010}
13011impl From<ItemConstantPtr> for ModuleItemPtr {
13012    fn from(value: ItemConstantPtr) -> Self {
13013        Self(value.0)
13014    }
13015}
13016impl From<ItemModulePtr> for ModuleItemPtr {
13017    fn from(value: ItemModulePtr) -> Self {
13018        Self(value.0)
13019    }
13020}
13021impl From<ItemUsePtr> for ModuleItemPtr {
13022    fn from(value: ItemUsePtr) -> Self {
13023        Self(value.0)
13024    }
13025}
13026impl From<FunctionWithBodyPtr> for ModuleItemPtr {
13027    fn from(value: FunctionWithBodyPtr) -> Self {
13028        Self(value.0)
13029    }
13030}
13031impl From<ItemExternFunctionPtr> for ModuleItemPtr {
13032    fn from(value: ItemExternFunctionPtr) -> Self {
13033        Self(value.0)
13034    }
13035}
13036impl From<ItemExternTypePtr> for ModuleItemPtr {
13037    fn from(value: ItemExternTypePtr) -> Self {
13038        Self(value.0)
13039    }
13040}
13041impl From<ItemTraitPtr> for ModuleItemPtr {
13042    fn from(value: ItemTraitPtr) -> Self {
13043        Self(value.0)
13044    }
13045}
13046impl From<ItemImplPtr> for ModuleItemPtr {
13047    fn from(value: ItemImplPtr) -> Self {
13048        Self(value.0)
13049    }
13050}
13051impl From<ItemImplAliasPtr> for ModuleItemPtr {
13052    fn from(value: ItemImplAliasPtr) -> Self {
13053        Self(value.0)
13054    }
13055}
13056impl From<ItemStructPtr> for ModuleItemPtr {
13057    fn from(value: ItemStructPtr) -> Self {
13058        Self(value.0)
13059    }
13060}
13061impl From<ItemEnumPtr> for ModuleItemPtr {
13062    fn from(value: ItemEnumPtr) -> Self {
13063        Self(value.0)
13064    }
13065}
13066impl From<ItemTypeAliasPtr> for ModuleItemPtr {
13067    fn from(value: ItemTypeAliasPtr) -> Self {
13068        Self(value.0)
13069    }
13070}
13071impl From<ItemInlineMacroPtr> for ModuleItemPtr {
13072    fn from(value: ItemInlineMacroPtr) -> Self {
13073        Self(value.0)
13074    }
13075}
13076impl From<ItemHeaderDocPtr> for ModuleItemPtr {
13077    fn from(value: ItemHeaderDocPtr) -> Self {
13078        Self(value.0)
13079    }
13080}
13081impl From<ModuleItemMissingPtr> for ModuleItemPtr {
13082    fn from(value: ModuleItemMissingPtr) -> Self {
13083        Self(value.0)
13084    }
13085}
13086impl From<ItemConstantGreen> for ModuleItemGreen {
13087    fn from(value: ItemConstantGreen) -> Self {
13088        Self(value.0)
13089    }
13090}
13091impl From<ItemModuleGreen> for ModuleItemGreen {
13092    fn from(value: ItemModuleGreen) -> Self {
13093        Self(value.0)
13094    }
13095}
13096impl From<ItemUseGreen> for ModuleItemGreen {
13097    fn from(value: ItemUseGreen) -> Self {
13098        Self(value.0)
13099    }
13100}
13101impl From<FunctionWithBodyGreen> for ModuleItemGreen {
13102    fn from(value: FunctionWithBodyGreen) -> Self {
13103        Self(value.0)
13104    }
13105}
13106impl From<ItemExternFunctionGreen> for ModuleItemGreen {
13107    fn from(value: ItemExternFunctionGreen) -> Self {
13108        Self(value.0)
13109    }
13110}
13111impl From<ItemExternTypeGreen> for ModuleItemGreen {
13112    fn from(value: ItemExternTypeGreen) -> Self {
13113        Self(value.0)
13114    }
13115}
13116impl From<ItemTraitGreen> for ModuleItemGreen {
13117    fn from(value: ItemTraitGreen) -> Self {
13118        Self(value.0)
13119    }
13120}
13121impl From<ItemImplGreen> for ModuleItemGreen {
13122    fn from(value: ItemImplGreen) -> Self {
13123        Self(value.0)
13124    }
13125}
13126impl From<ItemImplAliasGreen> for ModuleItemGreen {
13127    fn from(value: ItemImplAliasGreen) -> Self {
13128        Self(value.0)
13129    }
13130}
13131impl From<ItemStructGreen> for ModuleItemGreen {
13132    fn from(value: ItemStructGreen) -> Self {
13133        Self(value.0)
13134    }
13135}
13136impl From<ItemEnumGreen> for ModuleItemGreen {
13137    fn from(value: ItemEnumGreen) -> Self {
13138        Self(value.0)
13139    }
13140}
13141impl From<ItemTypeAliasGreen> for ModuleItemGreen {
13142    fn from(value: ItemTypeAliasGreen) -> Self {
13143        Self(value.0)
13144    }
13145}
13146impl From<ItemInlineMacroGreen> for ModuleItemGreen {
13147    fn from(value: ItemInlineMacroGreen) -> Self {
13148        Self(value.0)
13149    }
13150}
13151impl From<ItemHeaderDocGreen> for ModuleItemGreen {
13152    fn from(value: ItemHeaderDocGreen) -> Self {
13153        Self(value.0)
13154    }
13155}
13156impl From<ModuleItemMissingGreen> for ModuleItemGreen {
13157    fn from(value: ModuleItemMissingGreen) -> Self {
13158        Self(value.0)
13159    }
13160}
13161#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
13162pub struct ModuleItemGreen(pub GreenId);
13163impl TypedSyntaxNode for ModuleItem {
13164    const OPTIONAL_KIND: Option<SyntaxKind> = None;
13165    type StablePtr = ModuleItemPtr;
13166    type Green = ModuleItemGreen;
13167    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
13168        ModuleItemGreen(ModuleItemMissing::missing(db).0)
13169    }
13170    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
13171        let kind = node.kind(db);
13172        match kind {
13173            SyntaxKind::ItemConstant => {
13174                ModuleItem::Constant(ItemConstant::from_syntax_node(db, node))
13175            }
13176            SyntaxKind::ItemModule => ModuleItem::Module(ItemModule::from_syntax_node(db, node)),
13177            SyntaxKind::ItemUse => ModuleItem::Use(ItemUse::from_syntax_node(db, node)),
13178            SyntaxKind::FunctionWithBody => {
13179                ModuleItem::FreeFunction(FunctionWithBody::from_syntax_node(db, node))
13180            }
13181            SyntaxKind::ItemExternFunction => {
13182                ModuleItem::ExternFunction(ItemExternFunction::from_syntax_node(db, node))
13183            }
13184            SyntaxKind::ItemExternType => {
13185                ModuleItem::ExternType(ItemExternType::from_syntax_node(db, node))
13186            }
13187            SyntaxKind::ItemTrait => ModuleItem::Trait(ItemTrait::from_syntax_node(db, node)),
13188            SyntaxKind::ItemImpl => ModuleItem::Impl(ItemImpl::from_syntax_node(db, node)),
13189            SyntaxKind::ItemImplAlias => {
13190                ModuleItem::ImplAlias(ItemImplAlias::from_syntax_node(db, node))
13191            }
13192            SyntaxKind::ItemStruct => ModuleItem::Struct(ItemStruct::from_syntax_node(db, node)),
13193            SyntaxKind::ItemEnum => ModuleItem::Enum(ItemEnum::from_syntax_node(db, node)),
13194            SyntaxKind::ItemTypeAlias => {
13195                ModuleItem::TypeAlias(ItemTypeAlias::from_syntax_node(db, node))
13196            }
13197            SyntaxKind::ItemInlineMacro => {
13198                ModuleItem::InlineMacro(ItemInlineMacro::from_syntax_node(db, node))
13199            }
13200            SyntaxKind::ItemHeaderDoc => {
13201                ModuleItem::HeaderDoc(ItemHeaderDoc::from_syntax_node(db, node))
13202            }
13203            SyntaxKind::ModuleItemMissing => {
13204                ModuleItem::Missing(ModuleItemMissing::from_syntax_node(db, node))
13205            }
13206            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "ModuleItem"),
13207        }
13208    }
13209    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
13210        let kind = node.kind(db);
13211        match kind {
13212            SyntaxKind::ItemConstant => {
13213                Some(ModuleItem::Constant(ItemConstant::from_syntax_node(db, node)))
13214            }
13215            SyntaxKind::ItemModule => {
13216                Some(ModuleItem::Module(ItemModule::from_syntax_node(db, node)))
13217            }
13218            SyntaxKind::ItemUse => Some(ModuleItem::Use(ItemUse::from_syntax_node(db, node))),
13219            SyntaxKind::FunctionWithBody => {
13220                Some(ModuleItem::FreeFunction(FunctionWithBody::from_syntax_node(db, node)))
13221            }
13222            SyntaxKind::ItemExternFunction => {
13223                Some(ModuleItem::ExternFunction(ItemExternFunction::from_syntax_node(db, node)))
13224            }
13225            SyntaxKind::ItemExternType => {
13226                Some(ModuleItem::ExternType(ItemExternType::from_syntax_node(db, node)))
13227            }
13228            SyntaxKind::ItemTrait => Some(ModuleItem::Trait(ItemTrait::from_syntax_node(db, node))),
13229            SyntaxKind::ItemImpl => Some(ModuleItem::Impl(ItemImpl::from_syntax_node(db, node))),
13230            SyntaxKind::ItemImplAlias => {
13231                Some(ModuleItem::ImplAlias(ItemImplAlias::from_syntax_node(db, node)))
13232            }
13233            SyntaxKind::ItemStruct => {
13234                Some(ModuleItem::Struct(ItemStruct::from_syntax_node(db, node)))
13235            }
13236            SyntaxKind::ItemEnum => Some(ModuleItem::Enum(ItemEnum::from_syntax_node(db, node))),
13237            SyntaxKind::ItemTypeAlias => {
13238                Some(ModuleItem::TypeAlias(ItemTypeAlias::from_syntax_node(db, node)))
13239            }
13240            SyntaxKind::ItemInlineMacro => {
13241                Some(ModuleItem::InlineMacro(ItemInlineMacro::from_syntax_node(db, node)))
13242            }
13243            SyntaxKind::ItemHeaderDoc => {
13244                Some(ModuleItem::HeaderDoc(ItemHeaderDoc::from_syntax_node(db, node)))
13245            }
13246            SyntaxKind::ModuleItemMissing => {
13247                Some(ModuleItem::Missing(ModuleItemMissing::from_syntax_node(db, node)))
13248            }
13249            _ => None,
13250        }
13251    }
13252    fn as_syntax_node(&self) -> SyntaxNode {
13253        match self {
13254            ModuleItem::Constant(x) => x.as_syntax_node(),
13255            ModuleItem::Module(x) => x.as_syntax_node(),
13256            ModuleItem::Use(x) => x.as_syntax_node(),
13257            ModuleItem::FreeFunction(x) => x.as_syntax_node(),
13258            ModuleItem::ExternFunction(x) => x.as_syntax_node(),
13259            ModuleItem::ExternType(x) => x.as_syntax_node(),
13260            ModuleItem::Trait(x) => x.as_syntax_node(),
13261            ModuleItem::Impl(x) => x.as_syntax_node(),
13262            ModuleItem::ImplAlias(x) => x.as_syntax_node(),
13263            ModuleItem::Struct(x) => x.as_syntax_node(),
13264            ModuleItem::Enum(x) => x.as_syntax_node(),
13265            ModuleItem::TypeAlias(x) => x.as_syntax_node(),
13266            ModuleItem::InlineMacro(x) => x.as_syntax_node(),
13267            ModuleItem::HeaderDoc(x) => x.as_syntax_node(),
13268            ModuleItem::Missing(x) => x.as_syntax_node(),
13269        }
13270    }
13271    fn stable_ptr(&self) -> Self::StablePtr {
13272        ModuleItemPtr(self.as_syntax_node().0.stable_ptr)
13273    }
13274}
13275impl From<&ModuleItem> for SyntaxStablePtrId {
13276    fn from(node: &ModuleItem) -> Self {
13277        node.stable_ptr().untyped()
13278    }
13279}
13280impl ModuleItem {
13281    /// Checks if a kind of a variant of [ModuleItem].
13282    pub fn is_variant(kind: SyntaxKind) -> bool {
13283        matches!(
13284            kind,
13285            SyntaxKind::ItemConstant
13286                | SyntaxKind::ItemModule
13287                | SyntaxKind::ItemUse
13288                | SyntaxKind::FunctionWithBody
13289                | SyntaxKind::ItemExternFunction
13290                | SyntaxKind::ItemExternType
13291                | SyntaxKind::ItemTrait
13292                | SyntaxKind::ItemImpl
13293                | SyntaxKind::ItemImplAlias
13294                | SyntaxKind::ItemStruct
13295                | SyntaxKind::ItemEnum
13296                | SyntaxKind::ItemTypeAlias
13297                | SyntaxKind::ItemInlineMacro
13298                | SyntaxKind::ItemHeaderDoc
13299                | SyntaxKind::ModuleItemMissing
13300        )
13301    }
13302}
13303#[derive(Clone, Debug, Eq, Hash, PartialEq)]
13304pub struct ModuleItemList(ElementList<ModuleItem, 1>);
13305impl Deref for ModuleItemList {
13306    type Target = ElementList<ModuleItem, 1>;
13307    fn deref(&self) -> &Self::Target {
13308        &self.0
13309    }
13310}
13311impl ModuleItemList {
13312    pub fn new_green(db: &dyn SyntaxGroup, children: Vec<ModuleItemGreen>) -> ModuleItemListGreen {
13313        let width = children.iter().map(|id| id.0.lookup_intern(db).width()).sum();
13314        ModuleItemListGreen(
13315            Arc::new(GreenNode {
13316                kind: SyntaxKind::ModuleItemList,
13317                details: GreenNodeDetails::Node {
13318                    children: children.iter().map(|x| x.0).collect(),
13319                    width,
13320                },
13321            })
13322            .intern(db),
13323        )
13324    }
13325}
13326#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
13327pub struct ModuleItemListPtr(pub SyntaxStablePtrId);
13328impl TypedStablePtr for ModuleItemListPtr {
13329    type SyntaxNode = ModuleItemList;
13330    fn untyped(&self) -> SyntaxStablePtrId {
13331        self.0
13332    }
13333    fn lookup(&self, db: &dyn SyntaxGroup) -> ModuleItemList {
13334        ModuleItemList::from_syntax_node(db, self.0.lookup(db))
13335    }
13336}
13337impl From<ModuleItemListPtr> for SyntaxStablePtrId {
13338    fn from(ptr: ModuleItemListPtr) -> Self {
13339        ptr.untyped()
13340    }
13341}
13342#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
13343pub struct ModuleItemListGreen(pub GreenId);
13344impl TypedSyntaxNode for ModuleItemList {
13345    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ModuleItemList);
13346    type StablePtr = ModuleItemListPtr;
13347    type Green = ModuleItemListGreen;
13348    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
13349        ModuleItemListGreen(
13350            Arc::new(GreenNode {
13351                kind: SyntaxKind::ModuleItemList,
13352                details: GreenNodeDetails::Node { children: vec![], width: TextWidth::default() },
13353            })
13354            .intern(db),
13355        )
13356    }
13357    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
13358        Self(ElementList::new(node))
13359    }
13360    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
13361        if node.kind(db) == SyntaxKind::ModuleItemList {
13362            Some(Self(ElementList::new(node)))
13363        } else {
13364            None
13365        }
13366    }
13367    fn as_syntax_node(&self) -> SyntaxNode {
13368        self.node.clone()
13369    }
13370    fn stable_ptr(&self) -> Self::StablePtr {
13371        ModuleItemListPtr(self.node.0.stable_ptr)
13372    }
13373}
13374impl From<&ModuleItemList> for SyntaxStablePtrId {
13375    fn from(node: &ModuleItemList) -> Self {
13376        node.stable_ptr().untyped()
13377    }
13378}
13379#[derive(Clone, Debug, Eq, Hash, PartialEq)]
13380pub struct ModuleItemMissing {
13381    node: SyntaxNode,
13382    children: Arc<[SyntaxNode]>,
13383}
13384impl ModuleItemMissing {
13385    pub fn new_green(db: &dyn SyntaxGroup) -> ModuleItemMissingGreen {
13386        let children: Vec<GreenId> = vec![];
13387        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
13388        ModuleItemMissingGreen(
13389            Arc::new(GreenNode {
13390                kind: SyntaxKind::ModuleItemMissing,
13391                details: GreenNodeDetails::Node { children, width },
13392            })
13393            .intern(db),
13394        )
13395    }
13396}
13397impl ModuleItemMissing {}
13398#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
13399pub struct ModuleItemMissingPtr(pub SyntaxStablePtrId);
13400impl ModuleItemMissingPtr {}
13401impl TypedStablePtr for ModuleItemMissingPtr {
13402    type SyntaxNode = ModuleItemMissing;
13403    fn untyped(&self) -> SyntaxStablePtrId {
13404        self.0
13405    }
13406    fn lookup(&self, db: &dyn SyntaxGroup) -> ModuleItemMissing {
13407        ModuleItemMissing::from_syntax_node(db, self.0.lookup(db))
13408    }
13409}
13410impl From<ModuleItemMissingPtr> for SyntaxStablePtrId {
13411    fn from(ptr: ModuleItemMissingPtr) -> Self {
13412        ptr.untyped()
13413    }
13414}
13415#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
13416pub struct ModuleItemMissingGreen(pub GreenId);
13417impl TypedSyntaxNode for ModuleItemMissing {
13418    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ModuleItemMissing);
13419    type StablePtr = ModuleItemMissingPtr;
13420    type Green = ModuleItemMissingGreen;
13421    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
13422        ModuleItemMissingGreen(
13423            Arc::new(GreenNode {
13424                kind: SyntaxKind::ModuleItemMissing,
13425                details: GreenNodeDetails::Node { children: vec![], width: TextWidth::default() },
13426            })
13427            .intern(db),
13428        )
13429    }
13430    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
13431        let kind = node.kind(db);
13432        assert_eq!(
13433            kind,
13434            SyntaxKind::ModuleItemMissing,
13435            "Unexpected SyntaxKind {:?}. Expected {:?}.",
13436            kind,
13437            SyntaxKind::ModuleItemMissing
13438        );
13439        let children = db.get_children(node.clone());
13440        Self { node, children }
13441    }
13442    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
13443        let kind = node.kind(db);
13444        if kind == SyntaxKind::ModuleItemMissing {
13445            Some(Self::from_syntax_node(db, node))
13446        } else {
13447            None
13448        }
13449    }
13450    fn as_syntax_node(&self) -> SyntaxNode {
13451        self.node.clone()
13452    }
13453    fn stable_ptr(&self) -> Self::StablePtr {
13454        ModuleItemMissingPtr(self.node.0.stable_ptr)
13455    }
13456}
13457impl From<&ModuleItemMissing> for SyntaxStablePtrId {
13458    fn from(node: &ModuleItemMissing) -> Self {
13459        node.stable_ptr().untyped()
13460    }
13461}
13462#[derive(Clone, Debug, Eq, Hash, PartialEq)]
13463pub struct Attribute {
13464    node: SyntaxNode,
13465    children: Arc<[SyntaxNode]>,
13466}
13467impl Attribute {
13468    pub const INDEX_HASH: usize = 0;
13469    pub const INDEX_LBRACK: usize = 1;
13470    pub const INDEX_ATTR: usize = 2;
13471    pub const INDEX_ARGUMENTS: usize = 3;
13472    pub const INDEX_RBRACK: usize = 4;
13473    pub fn new_green(
13474        db: &dyn SyntaxGroup,
13475        hash: TerminalHashGreen,
13476        lbrack: TerminalLBrackGreen,
13477        attr: ExprPathGreen,
13478        arguments: OptionArgListParenthesizedGreen,
13479        rbrack: TerminalRBrackGreen,
13480    ) -> AttributeGreen {
13481        let children: Vec<GreenId> = vec![hash.0, lbrack.0, attr.0, arguments.0, rbrack.0];
13482        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
13483        AttributeGreen(
13484            Arc::new(GreenNode {
13485                kind: SyntaxKind::Attribute,
13486                details: GreenNodeDetails::Node { children, width },
13487            })
13488            .intern(db),
13489        )
13490    }
13491}
13492impl Attribute {
13493    pub fn hash(&self, db: &dyn SyntaxGroup) -> TerminalHash {
13494        TerminalHash::from_syntax_node(db, self.children[0].clone())
13495    }
13496    pub fn lbrack(&self, db: &dyn SyntaxGroup) -> TerminalLBrack {
13497        TerminalLBrack::from_syntax_node(db, self.children[1].clone())
13498    }
13499    pub fn attr(&self, db: &dyn SyntaxGroup) -> ExprPath {
13500        ExprPath::from_syntax_node(db, self.children[2].clone())
13501    }
13502    pub fn arguments(&self, db: &dyn SyntaxGroup) -> OptionArgListParenthesized {
13503        OptionArgListParenthesized::from_syntax_node(db, self.children[3].clone())
13504    }
13505    pub fn rbrack(&self, db: &dyn SyntaxGroup) -> TerminalRBrack {
13506        TerminalRBrack::from_syntax_node(db, self.children[4].clone())
13507    }
13508}
13509#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
13510pub struct AttributePtr(pub SyntaxStablePtrId);
13511impl AttributePtr {}
13512impl TypedStablePtr for AttributePtr {
13513    type SyntaxNode = Attribute;
13514    fn untyped(&self) -> SyntaxStablePtrId {
13515        self.0
13516    }
13517    fn lookup(&self, db: &dyn SyntaxGroup) -> Attribute {
13518        Attribute::from_syntax_node(db, self.0.lookup(db))
13519    }
13520}
13521impl From<AttributePtr> for SyntaxStablePtrId {
13522    fn from(ptr: AttributePtr) -> Self {
13523        ptr.untyped()
13524    }
13525}
13526#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
13527pub struct AttributeGreen(pub GreenId);
13528impl TypedSyntaxNode for Attribute {
13529    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::Attribute);
13530    type StablePtr = AttributePtr;
13531    type Green = AttributeGreen;
13532    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
13533        AttributeGreen(
13534            Arc::new(GreenNode {
13535                kind: SyntaxKind::Attribute,
13536                details: GreenNodeDetails::Node {
13537                    children: vec![
13538                        TerminalHash::missing(db).0,
13539                        TerminalLBrack::missing(db).0,
13540                        ExprPath::missing(db).0,
13541                        OptionArgListParenthesized::missing(db).0,
13542                        TerminalRBrack::missing(db).0,
13543                    ],
13544                    width: TextWidth::default(),
13545                },
13546            })
13547            .intern(db),
13548        )
13549    }
13550    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
13551        let kind = node.kind(db);
13552        assert_eq!(
13553            kind,
13554            SyntaxKind::Attribute,
13555            "Unexpected SyntaxKind {:?}. Expected {:?}.",
13556            kind,
13557            SyntaxKind::Attribute
13558        );
13559        let children = db.get_children(node.clone());
13560        Self { node, children }
13561    }
13562    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
13563        let kind = node.kind(db);
13564        if kind == SyntaxKind::Attribute { Some(Self::from_syntax_node(db, node)) } else { None }
13565    }
13566    fn as_syntax_node(&self) -> SyntaxNode {
13567        self.node.clone()
13568    }
13569    fn stable_ptr(&self) -> Self::StablePtr {
13570        AttributePtr(self.node.0.stable_ptr)
13571    }
13572}
13573impl From<&Attribute> for SyntaxStablePtrId {
13574    fn from(node: &Attribute) -> Self {
13575        node.stable_ptr().untyped()
13576    }
13577}
13578#[derive(Clone, Debug, Eq, Hash, PartialEq)]
13579pub struct AttributeList(ElementList<Attribute, 1>);
13580impl Deref for AttributeList {
13581    type Target = ElementList<Attribute, 1>;
13582    fn deref(&self) -> &Self::Target {
13583        &self.0
13584    }
13585}
13586impl AttributeList {
13587    pub fn new_green(db: &dyn SyntaxGroup, children: Vec<AttributeGreen>) -> AttributeListGreen {
13588        let width = children.iter().map(|id| id.0.lookup_intern(db).width()).sum();
13589        AttributeListGreen(
13590            Arc::new(GreenNode {
13591                kind: SyntaxKind::AttributeList,
13592                details: GreenNodeDetails::Node {
13593                    children: children.iter().map(|x| x.0).collect(),
13594                    width,
13595                },
13596            })
13597            .intern(db),
13598        )
13599    }
13600}
13601#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
13602pub struct AttributeListPtr(pub SyntaxStablePtrId);
13603impl TypedStablePtr for AttributeListPtr {
13604    type SyntaxNode = AttributeList;
13605    fn untyped(&self) -> SyntaxStablePtrId {
13606        self.0
13607    }
13608    fn lookup(&self, db: &dyn SyntaxGroup) -> AttributeList {
13609        AttributeList::from_syntax_node(db, self.0.lookup(db))
13610    }
13611}
13612impl From<AttributeListPtr> for SyntaxStablePtrId {
13613    fn from(ptr: AttributeListPtr) -> Self {
13614        ptr.untyped()
13615    }
13616}
13617#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
13618pub struct AttributeListGreen(pub GreenId);
13619impl TypedSyntaxNode for AttributeList {
13620    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::AttributeList);
13621    type StablePtr = AttributeListPtr;
13622    type Green = AttributeListGreen;
13623    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
13624        AttributeListGreen(
13625            Arc::new(GreenNode {
13626                kind: SyntaxKind::AttributeList,
13627                details: GreenNodeDetails::Node { children: vec![], width: TextWidth::default() },
13628            })
13629            .intern(db),
13630        )
13631    }
13632    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
13633        Self(ElementList::new(node))
13634    }
13635    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
13636        if node.kind(db) == SyntaxKind::AttributeList {
13637            Some(Self(ElementList::new(node)))
13638        } else {
13639            None
13640        }
13641    }
13642    fn as_syntax_node(&self) -> SyntaxNode {
13643        self.node.clone()
13644    }
13645    fn stable_ptr(&self) -> Self::StablePtr {
13646        AttributeListPtr(self.node.0.stable_ptr)
13647    }
13648}
13649impl From<&AttributeList> for SyntaxStablePtrId {
13650    fn from(node: &AttributeList) -> Self {
13651        node.stable_ptr().untyped()
13652    }
13653}
13654#[derive(Clone, Debug, Eq, Hash, PartialEq)]
13655pub struct VisibilityDefault {
13656    node: SyntaxNode,
13657    children: Arc<[SyntaxNode]>,
13658}
13659impl VisibilityDefault {
13660    pub fn new_green(db: &dyn SyntaxGroup) -> VisibilityDefaultGreen {
13661        let children: Vec<GreenId> = vec![];
13662        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
13663        VisibilityDefaultGreen(
13664            Arc::new(GreenNode {
13665                kind: SyntaxKind::VisibilityDefault,
13666                details: GreenNodeDetails::Node { children, width },
13667            })
13668            .intern(db),
13669        )
13670    }
13671}
13672impl VisibilityDefault {}
13673#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
13674pub struct VisibilityDefaultPtr(pub SyntaxStablePtrId);
13675impl VisibilityDefaultPtr {}
13676impl TypedStablePtr for VisibilityDefaultPtr {
13677    type SyntaxNode = VisibilityDefault;
13678    fn untyped(&self) -> SyntaxStablePtrId {
13679        self.0
13680    }
13681    fn lookup(&self, db: &dyn SyntaxGroup) -> VisibilityDefault {
13682        VisibilityDefault::from_syntax_node(db, self.0.lookup(db))
13683    }
13684}
13685impl From<VisibilityDefaultPtr> for SyntaxStablePtrId {
13686    fn from(ptr: VisibilityDefaultPtr) -> Self {
13687        ptr.untyped()
13688    }
13689}
13690#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
13691pub struct VisibilityDefaultGreen(pub GreenId);
13692impl TypedSyntaxNode for VisibilityDefault {
13693    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::VisibilityDefault);
13694    type StablePtr = VisibilityDefaultPtr;
13695    type Green = VisibilityDefaultGreen;
13696    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
13697        VisibilityDefaultGreen(
13698            Arc::new(GreenNode {
13699                kind: SyntaxKind::VisibilityDefault,
13700                details: GreenNodeDetails::Node { children: vec![], width: TextWidth::default() },
13701            })
13702            .intern(db),
13703        )
13704    }
13705    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
13706        let kind = node.kind(db);
13707        assert_eq!(
13708            kind,
13709            SyntaxKind::VisibilityDefault,
13710            "Unexpected SyntaxKind {:?}. Expected {:?}.",
13711            kind,
13712            SyntaxKind::VisibilityDefault
13713        );
13714        let children = db.get_children(node.clone());
13715        Self { node, children }
13716    }
13717    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
13718        let kind = node.kind(db);
13719        if kind == SyntaxKind::VisibilityDefault {
13720            Some(Self::from_syntax_node(db, node))
13721        } else {
13722            None
13723        }
13724    }
13725    fn as_syntax_node(&self) -> SyntaxNode {
13726        self.node.clone()
13727    }
13728    fn stable_ptr(&self) -> Self::StablePtr {
13729        VisibilityDefaultPtr(self.node.0.stable_ptr)
13730    }
13731}
13732impl From<&VisibilityDefault> for SyntaxStablePtrId {
13733    fn from(node: &VisibilityDefault) -> Self {
13734        node.stable_ptr().untyped()
13735    }
13736}
13737#[derive(Clone, Debug, Eq, Hash, PartialEq)]
13738pub struct VisibilityPubArgumentClause {
13739    node: SyntaxNode,
13740    children: Arc<[SyntaxNode]>,
13741}
13742impl VisibilityPubArgumentClause {
13743    pub const INDEX_LPAREN: usize = 0;
13744    pub const INDEX_ARGUMENT: usize = 1;
13745    pub const INDEX_RPAREN: usize = 2;
13746    pub fn new_green(
13747        db: &dyn SyntaxGroup,
13748        lparen: TerminalLParenGreen,
13749        argument: TerminalIdentifierGreen,
13750        rparen: TerminalRParenGreen,
13751    ) -> VisibilityPubArgumentClauseGreen {
13752        let children: Vec<GreenId> = vec![lparen.0, argument.0, rparen.0];
13753        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
13754        VisibilityPubArgumentClauseGreen(
13755            Arc::new(GreenNode {
13756                kind: SyntaxKind::VisibilityPubArgumentClause,
13757                details: GreenNodeDetails::Node { children, width },
13758            })
13759            .intern(db),
13760        )
13761    }
13762}
13763impl VisibilityPubArgumentClause {
13764    pub fn lparen(&self, db: &dyn SyntaxGroup) -> TerminalLParen {
13765        TerminalLParen::from_syntax_node(db, self.children[0].clone())
13766    }
13767    pub fn argument(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier {
13768        TerminalIdentifier::from_syntax_node(db, self.children[1].clone())
13769    }
13770    pub fn rparen(&self, db: &dyn SyntaxGroup) -> TerminalRParen {
13771        TerminalRParen::from_syntax_node(db, self.children[2].clone())
13772    }
13773}
13774#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
13775pub struct VisibilityPubArgumentClausePtr(pub SyntaxStablePtrId);
13776impl VisibilityPubArgumentClausePtr {}
13777impl TypedStablePtr for VisibilityPubArgumentClausePtr {
13778    type SyntaxNode = VisibilityPubArgumentClause;
13779    fn untyped(&self) -> SyntaxStablePtrId {
13780        self.0
13781    }
13782    fn lookup(&self, db: &dyn SyntaxGroup) -> VisibilityPubArgumentClause {
13783        VisibilityPubArgumentClause::from_syntax_node(db, self.0.lookup(db))
13784    }
13785}
13786impl From<VisibilityPubArgumentClausePtr> for SyntaxStablePtrId {
13787    fn from(ptr: VisibilityPubArgumentClausePtr) -> Self {
13788        ptr.untyped()
13789    }
13790}
13791#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
13792pub struct VisibilityPubArgumentClauseGreen(pub GreenId);
13793impl TypedSyntaxNode for VisibilityPubArgumentClause {
13794    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::VisibilityPubArgumentClause);
13795    type StablePtr = VisibilityPubArgumentClausePtr;
13796    type Green = VisibilityPubArgumentClauseGreen;
13797    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
13798        VisibilityPubArgumentClauseGreen(
13799            Arc::new(GreenNode {
13800                kind: SyntaxKind::VisibilityPubArgumentClause,
13801                details: GreenNodeDetails::Node {
13802                    children: vec![
13803                        TerminalLParen::missing(db).0,
13804                        TerminalIdentifier::missing(db).0,
13805                        TerminalRParen::missing(db).0,
13806                    ],
13807                    width: TextWidth::default(),
13808                },
13809            })
13810            .intern(db),
13811        )
13812    }
13813    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
13814        let kind = node.kind(db);
13815        assert_eq!(
13816            kind,
13817            SyntaxKind::VisibilityPubArgumentClause,
13818            "Unexpected SyntaxKind {:?}. Expected {:?}.",
13819            kind,
13820            SyntaxKind::VisibilityPubArgumentClause
13821        );
13822        let children = db.get_children(node.clone());
13823        Self { node, children }
13824    }
13825    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
13826        let kind = node.kind(db);
13827        if kind == SyntaxKind::VisibilityPubArgumentClause {
13828            Some(Self::from_syntax_node(db, node))
13829        } else {
13830            None
13831        }
13832    }
13833    fn as_syntax_node(&self) -> SyntaxNode {
13834        self.node.clone()
13835    }
13836    fn stable_ptr(&self) -> Self::StablePtr {
13837        VisibilityPubArgumentClausePtr(self.node.0.stable_ptr)
13838    }
13839}
13840impl From<&VisibilityPubArgumentClause> for SyntaxStablePtrId {
13841    fn from(node: &VisibilityPubArgumentClause) -> Self {
13842        node.stable_ptr().untyped()
13843    }
13844}
13845#[derive(Clone, Debug, Eq, Hash, PartialEq)]
13846pub enum OptionVisibilityPubArgumentClause {
13847    Empty(OptionVisibilityPubArgumentClauseEmpty),
13848    VisibilityPubArgumentClause(VisibilityPubArgumentClause),
13849}
13850#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
13851pub struct OptionVisibilityPubArgumentClausePtr(pub SyntaxStablePtrId);
13852impl TypedStablePtr for OptionVisibilityPubArgumentClausePtr {
13853    type SyntaxNode = OptionVisibilityPubArgumentClause;
13854    fn untyped(&self) -> SyntaxStablePtrId {
13855        self.0
13856    }
13857    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionVisibilityPubArgumentClause {
13858        OptionVisibilityPubArgumentClause::from_syntax_node(db, self.0.lookup(db))
13859    }
13860}
13861impl From<OptionVisibilityPubArgumentClausePtr> for SyntaxStablePtrId {
13862    fn from(ptr: OptionVisibilityPubArgumentClausePtr) -> Self {
13863        ptr.untyped()
13864    }
13865}
13866impl From<OptionVisibilityPubArgumentClauseEmptyPtr> for OptionVisibilityPubArgumentClausePtr {
13867    fn from(value: OptionVisibilityPubArgumentClauseEmptyPtr) -> Self {
13868        Self(value.0)
13869    }
13870}
13871impl From<VisibilityPubArgumentClausePtr> for OptionVisibilityPubArgumentClausePtr {
13872    fn from(value: VisibilityPubArgumentClausePtr) -> Self {
13873        Self(value.0)
13874    }
13875}
13876impl From<OptionVisibilityPubArgumentClauseEmptyGreen> for OptionVisibilityPubArgumentClauseGreen {
13877    fn from(value: OptionVisibilityPubArgumentClauseEmptyGreen) -> Self {
13878        Self(value.0)
13879    }
13880}
13881impl From<VisibilityPubArgumentClauseGreen> for OptionVisibilityPubArgumentClauseGreen {
13882    fn from(value: VisibilityPubArgumentClauseGreen) -> Self {
13883        Self(value.0)
13884    }
13885}
13886#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
13887pub struct OptionVisibilityPubArgumentClauseGreen(pub GreenId);
13888impl TypedSyntaxNode for OptionVisibilityPubArgumentClause {
13889    const OPTIONAL_KIND: Option<SyntaxKind> = None;
13890    type StablePtr = OptionVisibilityPubArgumentClausePtr;
13891    type Green = OptionVisibilityPubArgumentClauseGreen;
13892    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
13893        panic!("No missing variant.");
13894    }
13895    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
13896        let kind = node.kind(db);
13897        match kind {
13898            SyntaxKind::OptionVisibilityPubArgumentClauseEmpty => {
13899                OptionVisibilityPubArgumentClause::Empty(
13900                    OptionVisibilityPubArgumentClauseEmpty::from_syntax_node(db, node),
13901                )
13902            }
13903            SyntaxKind::VisibilityPubArgumentClause => {
13904                OptionVisibilityPubArgumentClause::VisibilityPubArgumentClause(
13905                    VisibilityPubArgumentClause::from_syntax_node(db, node),
13906                )
13907            }
13908            _ => panic!(
13909                "Unexpected syntax kind {:?} when constructing {}.",
13910                kind, "OptionVisibilityPubArgumentClause"
13911            ),
13912        }
13913    }
13914    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
13915        let kind = node.kind(db);
13916        match kind {
13917            SyntaxKind::OptionVisibilityPubArgumentClauseEmpty => {
13918                Some(OptionVisibilityPubArgumentClause::Empty(
13919                    OptionVisibilityPubArgumentClauseEmpty::from_syntax_node(db, node),
13920                ))
13921            }
13922            SyntaxKind::VisibilityPubArgumentClause => {
13923                Some(OptionVisibilityPubArgumentClause::VisibilityPubArgumentClause(
13924                    VisibilityPubArgumentClause::from_syntax_node(db, node),
13925                ))
13926            }
13927            _ => None,
13928        }
13929    }
13930    fn as_syntax_node(&self) -> SyntaxNode {
13931        match self {
13932            OptionVisibilityPubArgumentClause::Empty(x) => x.as_syntax_node(),
13933            OptionVisibilityPubArgumentClause::VisibilityPubArgumentClause(x) => x.as_syntax_node(),
13934        }
13935    }
13936    fn stable_ptr(&self) -> Self::StablePtr {
13937        OptionVisibilityPubArgumentClausePtr(self.as_syntax_node().0.stable_ptr)
13938    }
13939}
13940impl From<&OptionVisibilityPubArgumentClause> for SyntaxStablePtrId {
13941    fn from(node: &OptionVisibilityPubArgumentClause) -> Self {
13942        node.stable_ptr().untyped()
13943    }
13944}
13945impl OptionVisibilityPubArgumentClause {
13946    /// Checks if a kind of a variant of [OptionVisibilityPubArgumentClause].
13947    pub fn is_variant(kind: SyntaxKind) -> bool {
13948        matches!(
13949            kind,
13950            SyntaxKind::OptionVisibilityPubArgumentClauseEmpty
13951                | SyntaxKind::VisibilityPubArgumentClause
13952        )
13953    }
13954}
13955#[derive(Clone, Debug, Eq, Hash, PartialEq)]
13956pub struct OptionVisibilityPubArgumentClauseEmpty {
13957    node: SyntaxNode,
13958    children: Arc<[SyntaxNode]>,
13959}
13960impl OptionVisibilityPubArgumentClauseEmpty {
13961    pub fn new_green(db: &dyn SyntaxGroup) -> OptionVisibilityPubArgumentClauseEmptyGreen {
13962        let children: Vec<GreenId> = vec![];
13963        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
13964        OptionVisibilityPubArgumentClauseEmptyGreen(
13965            Arc::new(GreenNode {
13966                kind: SyntaxKind::OptionVisibilityPubArgumentClauseEmpty,
13967                details: GreenNodeDetails::Node { children, width },
13968            })
13969            .intern(db),
13970        )
13971    }
13972}
13973impl OptionVisibilityPubArgumentClauseEmpty {}
13974#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
13975pub struct OptionVisibilityPubArgumentClauseEmptyPtr(pub SyntaxStablePtrId);
13976impl OptionVisibilityPubArgumentClauseEmptyPtr {}
13977impl TypedStablePtr for OptionVisibilityPubArgumentClauseEmptyPtr {
13978    type SyntaxNode = OptionVisibilityPubArgumentClauseEmpty;
13979    fn untyped(&self) -> SyntaxStablePtrId {
13980        self.0
13981    }
13982    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionVisibilityPubArgumentClauseEmpty {
13983        OptionVisibilityPubArgumentClauseEmpty::from_syntax_node(db, self.0.lookup(db))
13984    }
13985}
13986impl From<OptionVisibilityPubArgumentClauseEmptyPtr> for SyntaxStablePtrId {
13987    fn from(ptr: OptionVisibilityPubArgumentClauseEmptyPtr) -> Self {
13988        ptr.untyped()
13989    }
13990}
13991#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
13992pub struct OptionVisibilityPubArgumentClauseEmptyGreen(pub GreenId);
13993impl TypedSyntaxNode for OptionVisibilityPubArgumentClauseEmpty {
13994    const OPTIONAL_KIND: Option<SyntaxKind> =
13995        Some(SyntaxKind::OptionVisibilityPubArgumentClauseEmpty);
13996    type StablePtr = OptionVisibilityPubArgumentClauseEmptyPtr;
13997    type Green = OptionVisibilityPubArgumentClauseEmptyGreen;
13998    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
13999        OptionVisibilityPubArgumentClauseEmptyGreen(
14000            Arc::new(GreenNode {
14001                kind: SyntaxKind::OptionVisibilityPubArgumentClauseEmpty,
14002                details: GreenNodeDetails::Node { children: vec![], width: TextWidth::default() },
14003            })
14004            .intern(db),
14005        )
14006    }
14007    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
14008        let kind = node.kind(db);
14009        assert_eq!(
14010            kind,
14011            SyntaxKind::OptionVisibilityPubArgumentClauseEmpty,
14012            "Unexpected SyntaxKind {:?}. Expected {:?}.",
14013            kind,
14014            SyntaxKind::OptionVisibilityPubArgumentClauseEmpty
14015        );
14016        let children = db.get_children(node.clone());
14017        Self { node, children }
14018    }
14019    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
14020        let kind = node.kind(db);
14021        if kind == SyntaxKind::OptionVisibilityPubArgumentClauseEmpty {
14022            Some(Self::from_syntax_node(db, node))
14023        } else {
14024            None
14025        }
14026    }
14027    fn as_syntax_node(&self) -> SyntaxNode {
14028        self.node.clone()
14029    }
14030    fn stable_ptr(&self) -> Self::StablePtr {
14031        OptionVisibilityPubArgumentClauseEmptyPtr(self.node.0.stable_ptr)
14032    }
14033}
14034impl From<&OptionVisibilityPubArgumentClauseEmpty> for SyntaxStablePtrId {
14035    fn from(node: &OptionVisibilityPubArgumentClauseEmpty) -> Self {
14036        node.stable_ptr().untyped()
14037    }
14038}
14039#[derive(Clone, Debug, Eq, Hash, PartialEq)]
14040pub struct VisibilityPub {
14041    node: SyntaxNode,
14042    children: Arc<[SyntaxNode]>,
14043}
14044impl VisibilityPub {
14045    pub const INDEX_PUB_KW: usize = 0;
14046    pub const INDEX_ARGUMENT_CLAUSE: usize = 1;
14047    pub fn new_green(
14048        db: &dyn SyntaxGroup,
14049        pub_kw: TerminalPubGreen,
14050        argument_clause: OptionVisibilityPubArgumentClauseGreen,
14051    ) -> VisibilityPubGreen {
14052        let children: Vec<GreenId> = vec![pub_kw.0, argument_clause.0];
14053        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
14054        VisibilityPubGreen(
14055            Arc::new(GreenNode {
14056                kind: SyntaxKind::VisibilityPub,
14057                details: GreenNodeDetails::Node { children, width },
14058            })
14059            .intern(db),
14060        )
14061    }
14062}
14063impl VisibilityPub {
14064    pub fn pub_kw(&self, db: &dyn SyntaxGroup) -> TerminalPub {
14065        TerminalPub::from_syntax_node(db, self.children[0].clone())
14066    }
14067    pub fn argument_clause(&self, db: &dyn SyntaxGroup) -> OptionVisibilityPubArgumentClause {
14068        OptionVisibilityPubArgumentClause::from_syntax_node(db, self.children[1].clone())
14069    }
14070}
14071#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
14072pub struct VisibilityPubPtr(pub SyntaxStablePtrId);
14073impl VisibilityPubPtr {}
14074impl TypedStablePtr for VisibilityPubPtr {
14075    type SyntaxNode = VisibilityPub;
14076    fn untyped(&self) -> SyntaxStablePtrId {
14077        self.0
14078    }
14079    fn lookup(&self, db: &dyn SyntaxGroup) -> VisibilityPub {
14080        VisibilityPub::from_syntax_node(db, self.0.lookup(db))
14081    }
14082}
14083impl From<VisibilityPubPtr> for SyntaxStablePtrId {
14084    fn from(ptr: VisibilityPubPtr) -> Self {
14085        ptr.untyped()
14086    }
14087}
14088#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
14089pub struct VisibilityPubGreen(pub GreenId);
14090impl TypedSyntaxNode for VisibilityPub {
14091    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::VisibilityPub);
14092    type StablePtr = VisibilityPubPtr;
14093    type Green = VisibilityPubGreen;
14094    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
14095        VisibilityPubGreen(
14096            Arc::new(GreenNode {
14097                kind: SyntaxKind::VisibilityPub,
14098                details: GreenNodeDetails::Node {
14099                    children: vec![
14100                        TerminalPub::missing(db).0,
14101                        OptionVisibilityPubArgumentClause::missing(db).0,
14102                    ],
14103                    width: TextWidth::default(),
14104                },
14105            })
14106            .intern(db),
14107        )
14108    }
14109    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
14110        let kind = node.kind(db);
14111        assert_eq!(
14112            kind,
14113            SyntaxKind::VisibilityPub,
14114            "Unexpected SyntaxKind {:?}. Expected {:?}.",
14115            kind,
14116            SyntaxKind::VisibilityPub
14117        );
14118        let children = db.get_children(node.clone());
14119        Self { node, children }
14120    }
14121    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
14122        let kind = node.kind(db);
14123        if kind == SyntaxKind::VisibilityPub {
14124            Some(Self::from_syntax_node(db, node))
14125        } else {
14126            None
14127        }
14128    }
14129    fn as_syntax_node(&self) -> SyntaxNode {
14130        self.node.clone()
14131    }
14132    fn stable_ptr(&self) -> Self::StablePtr {
14133        VisibilityPubPtr(self.node.0.stable_ptr)
14134    }
14135}
14136impl From<&VisibilityPub> for SyntaxStablePtrId {
14137    fn from(node: &VisibilityPub) -> Self {
14138        node.stable_ptr().untyped()
14139    }
14140}
14141#[derive(Clone, Debug, Eq, Hash, PartialEq)]
14142pub enum Visibility {
14143    Default(VisibilityDefault),
14144    Pub(VisibilityPub),
14145}
14146#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
14147pub struct VisibilityPtr(pub SyntaxStablePtrId);
14148impl TypedStablePtr for VisibilityPtr {
14149    type SyntaxNode = Visibility;
14150    fn untyped(&self) -> SyntaxStablePtrId {
14151        self.0
14152    }
14153    fn lookup(&self, db: &dyn SyntaxGroup) -> Visibility {
14154        Visibility::from_syntax_node(db, self.0.lookup(db))
14155    }
14156}
14157impl From<VisibilityPtr> for SyntaxStablePtrId {
14158    fn from(ptr: VisibilityPtr) -> Self {
14159        ptr.untyped()
14160    }
14161}
14162impl From<VisibilityDefaultPtr> for VisibilityPtr {
14163    fn from(value: VisibilityDefaultPtr) -> Self {
14164        Self(value.0)
14165    }
14166}
14167impl From<VisibilityPubPtr> for VisibilityPtr {
14168    fn from(value: VisibilityPubPtr) -> Self {
14169        Self(value.0)
14170    }
14171}
14172impl From<VisibilityDefaultGreen> for VisibilityGreen {
14173    fn from(value: VisibilityDefaultGreen) -> Self {
14174        Self(value.0)
14175    }
14176}
14177impl From<VisibilityPubGreen> for VisibilityGreen {
14178    fn from(value: VisibilityPubGreen) -> Self {
14179        Self(value.0)
14180    }
14181}
14182#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
14183pub struct VisibilityGreen(pub GreenId);
14184impl TypedSyntaxNode for Visibility {
14185    const OPTIONAL_KIND: Option<SyntaxKind> = None;
14186    type StablePtr = VisibilityPtr;
14187    type Green = VisibilityGreen;
14188    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
14189        panic!("No missing variant.");
14190    }
14191    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
14192        let kind = node.kind(db);
14193        match kind {
14194            SyntaxKind::VisibilityDefault => {
14195                Visibility::Default(VisibilityDefault::from_syntax_node(db, node))
14196            }
14197            SyntaxKind::VisibilityPub => Visibility::Pub(VisibilityPub::from_syntax_node(db, node)),
14198            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "Visibility"),
14199        }
14200    }
14201    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
14202        let kind = node.kind(db);
14203        match kind {
14204            SyntaxKind::VisibilityDefault => {
14205                Some(Visibility::Default(VisibilityDefault::from_syntax_node(db, node)))
14206            }
14207            SyntaxKind::VisibilityPub => {
14208                Some(Visibility::Pub(VisibilityPub::from_syntax_node(db, node)))
14209            }
14210            _ => None,
14211        }
14212    }
14213    fn as_syntax_node(&self) -> SyntaxNode {
14214        match self {
14215            Visibility::Default(x) => x.as_syntax_node(),
14216            Visibility::Pub(x) => x.as_syntax_node(),
14217        }
14218    }
14219    fn stable_ptr(&self) -> Self::StablePtr {
14220        VisibilityPtr(self.as_syntax_node().0.stable_ptr)
14221    }
14222}
14223impl From<&Visibility> for SyntaxStablePtrId {
14224    fn from(node: &Visibility) -> Self {
14225        node.stable_ptr().untyped()
14226    }
14227}
14228impl Visibility {
14229    /// Checks if a kind of a variant of [Visibility].
14230    pub fn is_variant(kind: SyntaxKind) -> bool {
14231        matches!(kind, SyntaxKind::VisibilityDefault | SyntaxKind::VisibilityPub)
14232    }
14233}
14234#[derive(Clone, Debug, Eq, Hash, PartialEq)]
14235pub struct ItemModule {
14236    node: SyntaxNode,
14237    children: Arc<[SyntaxNode]>,
14238}
14239impl ItemModule {
14240    pub const INDEX_ATTRIBUTES: usize = 0;
14241    pub const INDEX_VISIBILITY: usize = 1;
14242    pub const INDEX_MODULE_KW: usize = 2;
14243    pub const INDEX_NAME: usize = 3;
14244    pub const INDEX_BODY: usize = 4;
14245    pub fn new_green(
14246        db: &dyn SyntaxGroup,
14247        attributes: AttributeListGreen,
14248        visibility: VisibilityGreen,
14249        module_kw: TerminalModuleGreen,
14250        name: TerminalIdentifierGreen,
14251        body: MaybeModuleBodyGreen,
14252    ) -> ItemModuleGreen {
14253        let children: Vec<GreenId> = vec![attributes.0, visibility.0, module_kw.0, name.0, body.0];
14254        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
14255        ItemModuleGreen(
14256            Arc::new(GreenNode {
14257                kind: SyntaxKind::ItemModule,
14258                details: GreenNodeDetails::Node { children, width },
14259            })
14260            .intern(db),
14261        )
14262    }
14263}
14264impl ItemModule {
14265    pub fn attributes(&self, db: &dyn SyntaxGroup) -> AttributeList {
14266        AttributeList::from_syntax_node(db, self.children[0].clone())
14267    }
14268    pub fn visibility(&self, db: &dyn SyntaxGroup) -> Visibility {
14269        Visibility::from_syntax_node(db, self.children[1].clone())
14270    }
14271    pub fn module_kw(&self, db: &dyn SyntaxGroup) -> TerminalModule {
14272        TerminalModule::from_syntax_node(db, self.children[2].clone())
14273    }
14274    pub fn name(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier {
14275        TerminalIdentifier::from_syntax_node(db, self.children[3].clone())
14276    }
14277    pub fn body(&self, db: &dyn SyntaxGroup) -> MaybeModuleBody {
14278        MaybeModuleBody::from_syntax_node(db, self.children[4].clone())
14279    }
14280}
14281#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
14282pub struct ItemModulePtr(pub SyntaxStablePtrId);
14283impl ItemModulePtr {
14284    pub fn name_green(self, db: &dyn SyntaxGroup) -> TerminalIdentifierGreen {
14285        let ptr = self.0.lookup_intern(db);
14286        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
14287            TerminalIdentifierGreen(key_fields[0])
14288        } else {
14289            panic!("Unexpected key field query on root.");
14290        }
14291    }
14292}
14293impl TypedStablePtr for ItemModulePtr {
14294    type SyntaxNode = ItemModule;
14295    fn untyped(&self) -> SyntaxStablePtrId {
14296        self.0
14297    }
14298    fn lookup(&self, db: &dyn SyntaxGroup) -> ItemModule {
14299        ItemModule::from_syntax_node(db, self.0.lookup(db))
14300    }
14301}
14302impl From<ItemModulePtr> for SyntaxStablePtrId {
14303    fn from(ptr: ItemModulePtr) -> Self {
14304        ptr.untyped()
14305    }
14306}
14307#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
14308pub struct ItemModuleGreen(pub GreenId);
14309impl TypedSyntaxNode for ItemModule {
14310    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemModule);
14311    type StablePtr = ItemModulePtr;
14312    type Green = ItemModuleGreen;
14313    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
14314        ItemModuleGreen(
14315            Arc::new(GreenNode {
14316                kind: SyntaxKind::ItemModule,
14317                details: GreenNodeDetails::Node {
14318                    children: vec![
14319                        AttributeList::missing(db).0,
14320                        Visibility::missing(db).0,
14321                        TerminalModule::missing(db).0,
14322                        TerminalIdentifier::missing(db).0,
14323                        MaybeModuleBody::missing(db).0,
14324                    ],
14325                    width: TextWidth::default(),
14326                },
14327            })
14328            .intern(db),
14329        )
14330    }
14331    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
14332        let kind = node.kind(db);
14333        assert_eq!(
14334            kind,
14335            SyntaxKind::ItemModule,
14336            "Unexpected SyntaxKind {:?}. Expected {:?}.",
14337            kind,
14338            SyntaxKind::ItemModule
14339        );
14340        let children = db.get_children(node.clone());
14341        Self { node, children }
14342    }
14343    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
14344        let kind = node.kind(db);
14345        if kind == SyntaxKind::ItemModule { Some(Self::from_syntax_node(db, node)) } else { None }
14346    }
14347    fn as_syntax_node(&self) -> SyntaxNode {
14348        self.node.clone()
14349    }
14350    fn stable_ptr(&self) -> Self::StablePtr {
14351        ItemModulePtr(self.node.0.stable_ptr)
14352    }
14353}
14354impl From<&ItemModule> for SyntaxStablePtrId {
14355    fn from(node: &ItemModule) -> Self {
14356        node.stable_ptr().untyped()
14357    }
14358}
14359#[derive(Clone, Debug, Eq, Hash, PartialEq)]
14360pub enum MaybeModuleBody {
14361    Some(ModuleBody),
14362    None(TerminalSemicolon),
14363}
14364#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
14365pub struct MaybeModuleBodyPtr(pub SyntaxStablePtrId);
14366impl TypedStablePtr for MaybeModuleBodyPtr {
14367    type SyntaxNode = MaybeModuleBody;
14368    fn untyped(&self) -> SyntaxStablePtrId {
14369        self.0
14370    }
14371    fn lookup(&self, db: &dyn SyntaxGroup) -> MaybeModuleBody {
14372        MaybeModuleBody::from_syntax_node(db, self.0.lookup(db))
14373    }
14374}
14375impl From<MaybeModuleBodyPtr> for SyntaxStablePtrId {
14376    fn from(ptr: MaybeModuleBodyPtr) -> Self {
14377        ptr.untyped()
14378    }
14379}
14380impl From<ModuleBodyPtr> for MaybeModuleBodyPtr {
14381    fn from(value: ModuleBodyPtr) -> Self {
14382        Self(value.0)
14383    }
14384}
14385impl From<TerminalSemicolonPtr> for MaybeModuleBodyPtr {
14386    fn from(value: TerminalSemicolonPtr) -> Self {
14387        Self(value.0)
14388    }
14389}
14390impl From<ModuleBodyGreen> for MaybeModuleBodyGreen {
14391    fn from(value: ModuleBodyGreen) -> Self {
14392        Self(value.0)
14393    }
14394}
14395impl From<TerminalSemicolonGreen> for MaybeModuleBodyGreen {
14396    fn from(value: TerminalSemicolonGreen) -> Self {
14397        Self(value.0)
14398    }
14399}
14400#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
14401pub struct MaybeModuleBodyGreen(pub GreenId);
14402impl TypedSyntaxNode for MaybeModuleBody {
14403    const OPTIONAL_KIND: Option<SyntaxKind> = None;
14404    type StablePtr = MaybeModuleBodyPtr;
14405    type Green = MaybeModuleBodyGreen;
14406    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
14407        panic!("No missing variant.");
14408    }
14409    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
14410        let kind = node.kind(db);
14411        match kind {
14412            SyntaxKind::ModuleBody => MaybeModuleBody::Some(ModuleBody::from_syntax_node(db, node)),
14413            SyntaxKind::TerminalSemicolon => {
14414                MaybeModuleBody::None(TerminalSemicolon::from_syntax_node(db, node))
14415            }
14416            _ => {
14417                panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "MaybeModuleBody")
14418            }
14419        }
14420    }
14421    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
14422        let kind = node.kind(db);
14423        match kind {
14424            SyntaxKind::ModuleBody => {
14425                Some(MaybeModuleBody::Some(ModuleBody::from_syntax_node(db, node)))
14426            }
14427            SyntaxKind::TerminalSemicolon => {
14428                Some(MaybeModuleBody::None(TerminalSemicolon::from_syntax_node(db, node)))
14429            }
14430            _ => None,
14431        }
14432    }
14433    fn as_syntax_node(&self) -> SyntaxNode {
14434        match self {
14435            MaybeModuleBody::Some(x) => x.as_syntax_node(),
14436            MaybeModuleBody::None(x) => x.as_syntax_node(),
14437        }
14438    }
14439    fn stable_ptr(&self) -> Self::StablePtr {
14440        MaybeModuleBodyPtr(self.as_syntax_node().0.stable_ptr)
14441    }
14442}
14443impl From<&MaybeModuleBody> for SyntaxStablePtrId {
14444    fn from(node: &MaybeModuleBody) -> Self {
14445        node.stable_ptr().untyped()
14446    }
14447}
14448impl MaybeModuleBody {
14449    /// Checks if a kind of a variant of [MaybeModuleBody].
14450    pub fn is_variant(kind: SyntaxKind) -> bool {
14451        matches!(kind, SyntaxKind::ModuleBody | SyntaxKind::TerminalSemicolon)
14452    }
14453}
14454#[derive(Clone, Debug, Eq, Hash, PartialEq)]
14455pub struct ModuleBody {
14456    node: SyntaxNode,
14457    children: Arc<[SyntaxNode]>,
14458}
14459impl ModuleBody {
14460    pub const INDEX_LBRACE: usize = 0;
14461    pub const INDEX_ITEMS: usize = 1;
14462    pub const INDEX_RBRACE: usize = 2;
14463    pub fn new_green(
14464        db: &dyn SyntaxGroup,
14465        lbrace: TerminalLBraceGreen,
14466        items: ModuleItemListGreen,
14467        rbrace: TerminalRBraceGreen,
14468    ) -> ModuleBodyGreen {
14469        let children: Vec<GreenId> = vec![lbrace.0, items.0, rbrace.0];
14470        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
14471        ModuleBodyGreen(
14472            Arc::new(GreenNode {
14473                kind: SyntaxKind::ModuleBody,
14474                details: GreenNodeDetails::Node { children, width },
14475            })
14476            .intern(db),
14477        )
14478    }
14479}
14480impl ModuleBody {
14481    pub fn lbrace(&self, db: &dyn SyntaxGroup) -> TerminalLBrace {
14482        TerminalLBrace::from_syntax_node(db, self.children[0].clone())
14483    }
14484    pub fn items(&self, db: &dyn SyntaxGroup) -> ModuleItemList {
14485        ModuleItemList::from_syntax_node(db, self.children[1].clone())
14486    }
14487    pub fn rbrace(&self, db: &dyn SyntaxGroup) -> TerminalRBrace {
14488        TerminalRBrace::from_syntax_node(db, self.children[2].clone())
14489    }
14490}
14491#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
14492pub struct ModuleBodyPtr(pub SyntaxStablePtrId);
14493impl ModuleBodyPtr {}
14494impl TypedStablePtr for ModuleBodyPtr {
14495    type SyntaxNode = ModuleBody;
14496    fn untyped(&self) -> SyntaxStablePtrId {
14497        self.0
14498    }
14499    fn lookup(&self, db: &dyn SyntaxGroup) -> ModuleBody {
14500        ModuleBody::from_syntax_node(db, self.0.lookup(db))
14501    }
14502}
14503impl From<ModuleBodyPtr> for SyntaxStablePtrId {
14504    fn from(ptr: ModuleBodyPtr) -> Self {
14505        ptr.untyped()
14506    }
14507}
14508#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
14509pub struct ModuleBodyGreen(pub GreenId);
14510impl TypedSyntaxNode for ModuleBody {
14511    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ModuleBody);
14512    type StablePtr = ModuleBodyPtr;
14513    type Green = ModuleBodyGreen;
14514    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
14515        ModuleBodyGreen(
14516            Arc::new(GreenNode {
14517                kind: SyntaxKind::ModuleBody,
14518                details: GreenNodeDetails::Node {
14519                    children: vec![
14520                        TerminalLBrace::missing(db).0,
14521                        ModuleItemList::missing(db).0,
14522                        TerminalRBrace::missing(db).0,
14523                    ],
14524                    width: TextWidth::default(),
14525                },
14526            })
14527            .intern(db),
14528        )
14529    }
14530    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
14531        let kind = node.kind(db);
14532        assert_eq!(
14533            kind,
14534            SyntaxKind::ModuleBody,
14535            "Unexpected SyntaxKind {:?}. Expected {:?}.",
14536            kind,
14537            SyntaxKind::ModuleBody
14538        );
14539        let children = db.get_children(node.clone());
14540        Self { node, children }
14541    }
14542    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
14543        let kind = node.kind(db);
14544        if kind == SyntaxKind::ModuleBody { Some(Self::from_syntax_node(db, node)) } else { None }
14545    }
14546    fn as_syntax_node(&self) -> SyntaxNode {
14547        self.node.clone()
14548    }
14549    fn stable_ptr(&self) -> Self::StablePtr {
14550        ModuleBodyPtr(self.node.0.stable_ptr)
14551    }
14552}
14553impl From<&ModuleBody> for SyntaxStablePtrId {
14554    fn from(node: &ModuleBody) -> Self {
14555        node.stable_ptr().untyped()
14556    }
14557}
14558#[derive(Clone, Debug, Eq, Hash, PartialEq)]
14559pub struct FunctionDeclaration {
14560    node: SyntaxNode,
14561    children: Arc<[SyntaxNode]>,
14562}
14563impl FunctionDeclaration {
14564    pub const INDEX_OPTIONAL_CONST: usize = 0;
14565    pub const INDEX_FUNCTION_KW: usize = 1;
14566    pub const INDEX_NAME: usize = 2;
14567    pub const INDEX_GENERIC_PARAMS: usize = 3;
14568    pub const INDEX_SIGNATURE: usize = 4;
14569    pub fn new_green(
14570        db: &dyn SyntaxGroup,
14571        optional_const: OptionTerminalConstGreen,
14572        function_kw: TerminalFunctionGreen,
14573        name: TerminalIdentifierGreen,
14574        generic_params: OptionWrappedGenericParamListGreen,
14575        signature: FunctionSignatureGreen,
14576    ) -> FunctionDeclarationGreen {
14577        let children: Vec<GreenId> =
14578            vec![optional_const.0, function_kw.0, name.0, generic_params.0, signature.0];
14579        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
14580        FunctionDeclarationGreen(
14581            Arc::new(GreenNode {
14582                kind: SyntaxKind::FunctionDeclaration,
14583                details: GreenNodeDetails::Node { children, width },
14584            })
14585            .intern(db),
14586        )
14587    }
14588}
14589impl FunctionDeclaration {
14590    pub fn optional_const(&self, db: &dyn SyntaxGroup) -> OptionTerminalConst {
14591        OptionTerminalConst::from_syntax_node(db, self.children[0].clone())
14592    }
14593    pub fn function_kw(&self, db: &dyn SyntaxGroup) -> TerminalFunction {
14594        TerminalFunction::from_syntax_node(db, self.children[1].clone())
14595    }
14596    pub fn name(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier {
14597        TerminalIdentifier::from_syntax_node(db, self.children[2].clone())
14598    }
14599    pub fn generic_params(&self, db: &dyn SyntaxGroup) -> OptionWrappedGenericParamList {
14600        OptionWrappedGenericParamList::from_syntax_node(db, self.children[3].clone())
14601    }
14602    pub fn signature(&self, db: &dyn SyntaxGroup) -> FunctionSignature {
14603        FunctionSignature::from_syntax_node(db, self.children[4].clone())
14604    }
14605}
14606#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
14607pub struct FunctionDeclarationPtr(pub SyntaxStablePtrId);
14608impl FunctionDeclarationPtr {
14609    pub fn name_green(self, db: &dyn SyntaxGroup) -> TerminalIdentifierGreen {
14610        let ptr = self.0.lookup_intern(db);
14611        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
14612            TerminalIdentifierGreen(key_fields[0])
14613        } else {
14614            panic!("Unexpected key field query on root.");
14615        }
14616    }
14617}
14618impl TypedStablePtr for FunctionDeclarationPtr {
14619    type SyntaxNode = FunctionDeclaration;
14620    fn untyped(&self) -> SyntaxStablePtrId {
14621        self.0
14622    }
14623    fn lookup(&self, db: &dyn SyntaxGroup) -> FunctionDeclaration {
14624        FunctionDeclaration::from_syntax_node(db, self.0.lookup(db))
14625    }
14626}
14627impl From<FunctionDeclarationPtr> for SyntaxStablePtrId {
14628    fn from(ptr: FunctionDeclarationPtr) -> Self {
14629        ptr.untyped()
14630    }
14631}
14632#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
14633pub struct FunctionDeclarationGreen(pub GreenId);
14634impl TypedSyntaxNode for FunctionDeclaration {
14635    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::FunctionDeclaration);
14636    type StablePtr = FunctionDeclarationPtr;
14637    type Green = FunctionDeclarationGreen;
14638    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
14639        FunctionDeclarationGreen(
14640            Arc::new(GreenNode {
14641                kind: SyntaxKind::FunctionDeclaration,
14642                details: GreenNodeDetails::Node {
14643                    children: vec![
14644                        OptionTerminalConst::missing(db).0,
14645                        TerminalFunction::missing(db).0,
14646                        TerminalIdentifier::missing(db).0,
14647                        OptionWrappedGenericParamList::missing(db).0,
14648                        FunctionSignature::missing(db).0,
14649                    ],
14650                    width: TextWidth::default(),
14651                },
14652            })
14653            .intern(db),
14654        )
14655    }
14656    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
14657        let kind = node.kind(db);
14658        assert_eq!(
14659            kind,
14660            SyntaxKind::FunctionDeclaration,
14661            "Unexpected SyntaxKind {:?}. Expected {:?}.",
14662            kind,
14663            SyntaxKind::FunctionDeclaration
14664        );
14665        let children = db.get_children(node.clone());
14666        Self { node, children }
14667    }
14668    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
14669        let kind = node.kind(db);
14670        if kind == SyntaxKind::FunctionDeclaration {
14671            Some(Self::from_syntax_node(db, node))
14672        } else {
14673            None
14674        }
14675    }
14676    fn as_syntax_node(&self) -> SyntaxNode {
14677        self.node.clone()
14678    }
14679    fn stable_ptr(&self) -> Self::StablePtr {
14680        FunctionDeclarationPtr(self.node.0.stable_ptr)
14681    }
14682}
14683impl From<&FunctionDeclaration> for SyntaxStablePtrId {
14684    fn from(node: &FunctionDeclaration) -> Self {
14685        node.stable_ptr().untyped()
14686    }
14687}
14688#[derive(Clone, Debug, Eq, Hash, PartialEq)]
14689pub struct ItemConstant {
14690    node: SyntaxNode,
14691    children: Arc<[SyntaxNode]>,
14692}
14693impl ItemConstant {
14694    pub const INDEX_ATTRIBUTES: usize = 0;
14695    pub const INDEX_VISIBILITY: usize = 1;
14696    pub const INDEX_CONST_KW: usize = 2;
14697    pub const INDEX_NAME: usize = 3;
14698    pub const INDEX_TYPE_CLAUSE: usize = 4;
14699    pub const INDEX_EQ: usize = 5;
14700    pub const INDEX_VALUE: usize = 6;
14701    pub const INDEX_SEMICOLON: usize = 7;
14702    pub fn new_green(
14703        db: &dyn SyntaxGroup,
14704        attributes: AttributeListGreen,
14705        visibility: VisibilityGreen,
14706        const_kw: TerminalConstGreen,
14707        name: TerminalIdentifierGreen,
14708        type_clause: TypeClauseGreen,
14709        eq: TerminalEqGreen,
14710        value: ExprGreen,
14711        semicolon: TerminalSemicolonGreen,
14712    ) -> ItemConstantGreen {
14713        let children: Vec<GreenId> = vec![
14714            attributes.0,
14715            visibility.0,
14716            const_kw.0,
14717            name.0,
14718            type_clause.0,
14719            eq.0,
14720            value.0,
14721            semicolon.0,
14722        ];
14723        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
14724        ItemConstantGreen(
14725            Arc::new(GreenNode {
14726                kind: SyntaxKind::ItemConstant,
14727                details: GreenNodeDetails::Node { children, width },
14728            })
14729            .intern(db),
14730        )
14731    }
14732}
14733impl ItemConstant {
14734    pub fn attributes(&self, db: &dyn SyntaxGroup) -> AttributeList {
14735        AttributeList::from_syntax_node(db, self.children[0].clone())
14736    }
14737    pub fn visibility(&self, db: &dyn SyntaxGroup) -> Visibility {
14738        Visibility::from_syntax_node(db, self.children[1].clone())
14739    }
14740    pub fn const_kw(&self, db: &dyn SyntaxGroup) -> TerminalConst {
14741        TerminalConst::from_syntax_node(db, self.children[2].clone())
14742    }
14743    pub fn name(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier {
14744        TerminalIdentifier::from_syntax_node(db, self.children[3].clone())
14745    }
14746    pub fn type_clause(&self, db: &dyn SyntaxGroup) -> TypeClause {
14747        TypeClause::from_syntax_node(db, self.children[4].clone())
14748    }
14749    pub fn eq(&self, db: &dyn SyntaxGroup) -> TerminalEq {
14750        TerminalEq::from_syntax_node(db, self.children[5].clone())
14751    }
14752    pub fn value(&self, db: &dyn SyntaxGroup) -> Expr {
14753        Expr::from_syntax_node(db, self.children[6].clone())
14754    }
14755    pub fn semicolon(&self, db: &dyn SyntaxGroup) -> TerminalSemicolon {
14756        TerminalSemicolon::from_syntax_node(db, self.children[7].clone())
14757    }
14758}
14759#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
14760pub struct ItemConstantPtr(pub SyntaxStablePtrId);
14761impl ItemConstantPtr {
14762    pub fn name_green(self, db: &dyn SyntaxGroup) -> TerminalIdentifierGreen {
14763        let ptr = self.0.lookup_intern(db);
14764        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
14765            TerminalIdentifierGreen(key_fields[0])
14766        } else {
14767            panic!("Unexpected key field query on root.");
14768        }
14769    }
14770}
14771impl TypedStablePtr for ItemConstantPtr {
14772    type SyntaxNode = ItemConstant;
14773    fn untyped(&self) -> SyntaxStablePtrId {
14774        self.0
14775    }
14776    fn lookup(&self, db: &dyn SyntaxGroup) -> ItemConstant {
14777        ItemConstant::from_syntax_node(db, self.0.lookup(db))
14778    }
14779}
14780impl From<ItemConstantPtr> for SyntaxStablePtrId {
14781    fn from(ptr: ItemConstantPtr) -> Self {
14782        ptr.untyped()
14783    }
14784}
14785#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
14786pub struct ItemConstantGreen(pub GreenId);
14787impl TypedSyntaxNode for ItemConstant {
14788    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemConstant);
14789    type StablePtr = ItemConstantPtr;
14790    type Green = ItemConstantGreen;
14791    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
14792        ItemConstantGreen(
14793            Arc::new(GreenNode {
14794                kind: SyntaxKind::ItemConstant,
14795                details: GreenNodeDetails::Node {
14796                    children: vec![
14797                        AttributeList::missing(db).0,
14798                        Visibility::missing(db).0,
14799                        TerminalConst::missing(db).0,
14800                        TerminalIdentifier::missing(db).0,
14801                        TypeClause::missing(db).0,
14802                        TerminalEq::missing(db).0,
14803                        Expr::missing(db).0,
14804                        TerminalSemicolon::missing(db).0,
14805                    ],
14806                    width: TextWidth::default(),
14807                },
14808            })
14809            .intern(db),
14810        )
14811    }
14812    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
14813        let kind = node.kind(db);
14814        assert_eq!(
14815            kind,
14816            SyntaxKind::ItemConstant,
14817            "Unexpected SyntaxKind {:?}. Expected {:?}.",
14818            kind,
14819            SyntaxKind::ItemConstant
14820        );
14821        let children = db.get_children(node.clone());
14822        Self { node, children }
14823    }
14824    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
14825        let kind = node.kind(db);
14826        if kind == SyntaxKind::ItemConstant { Some(Self::from_syntax_node(db, node)) } else { None }
14827    }
14828    fn as_syntax_node(&self) -> SyntaxNode {
14829        self.node.clone()
14830    }
14831    fn stable_ptr(&self) -> Self::StablePtr {
14832        ItemConstantPtr(self.node.0.stable_ptr)
14833    }
14834}
14835impl From<&ItemConstant> for SyntaxStablePtrId {
14836    fn from(node: &ItemConstant) -> Self {
14837        node.stable_ptr().untyped()
14838    }
14839}
14840#[derive(Clone, Debug, Eq, Hash, PartialEq)]
14841pub struct FunctionWithBody {
14842    node: SyntaxNode,
14843    children: Arc<[SyntaxNode]>,
14844}
14845impl FunctionWithBody {
14846    pub const INDEX_ATTRIBUTES: usize = 0;
14847    pub const INDEX_VISIBILITY: usize = 1;
14848    pub const INDEX_DECLARATION: usize = 2;
14849    pub const INDEX_BODY: usize = 3;
14850    pub fn new_green(
14851        db: &dyn SyntaxGroup,
14852        attributes: AttributeListGreen,
14853        visibility: VisibilityGreen,
14854        declaration: FunctionDeclarationGreen,
14855        body: ExprBlockGreen,
14856    ) -> FunctionWithBodyGreen {
14857        let children: Vec<GreenId> = vec![attributes.0, visibility.0, declaration.0, body.0];
14858        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
14859        FunctionWithBodyGreen(
14860            Arc::new(GreenNode {
14861                kind: SyntaxKind::FunctionWithBody,
14862                details: GreenNodeDetails::Node { children, width },
14863            })
14864            .intern(db),
14865        )
14866    }
14867}
14868impl FunctionWithBody {
14869    pub fn attributes(&self, db: &dyn SyntaxGroup) -> AttributeList {
14870        AttributeList::from_syntax_node(db, self.children[0].clone())
14871    }
14872    pub fn visibility(&self, db: &dyn SyntaxGroup) -> Visibility {
14873        Visibility::from_syntax_node(db, self.children[1].clone())
14874    }
14875    pub fn declaration(&self, db: &dyn SyntaxGroup) -> FunctionDeclaration {
14876        FunctionDeclaration::from_syntax_node(db, self.children[2].clone())
14877    }
14878    pub fn body(&self, db: &dyn SyntaxGroup) -> ExprBlock {
14879        ExprBlock::from_syntax_node(db, self.children[3].clone())
14880    }
14881}
14882#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
14883pub struct FunctionWithBodyPtr(pub SyntaxStablePtrId);
14884impl FunctionWithBodyPtr {
14885    pub fn declaration_green(self, db: &dyn SyntaxGroup) -> FunctionDeclarationGreen {
14886        let ptr = self.0.lookup_intern(db);
14887        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
14888            FunctionDeclarationGreen(key_fields[0])
14889        } else {
14890            panic!("Unexpected key field query on root.");
14891        }
14892    }
14893}
14894impl TypedStablePtr for FunctionWithBodyPtr {
14895    type SyntaxNode = FunctionWithBody;
14896    fn untyped(&self) -> SyntaxStablePtrId {
14897        self.0
14898    }
14899    fn lookup(&self, db: &dyn SyntaxGroup) -> FunctionWithBody {
14900        FunctionWithBody::from_syntax_node(db, self.0.lookup(db))
14901    }
14902}
14903impl From<FunctionWithBodyPtr> for SyntaxStablePtrId {
14904    fn from(ptr: FunctionWithBodyPtr) -> Self {
14905        ptr.untyped()
14906    }
14907}
14908#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
14909pub struct FunctionWithBodyGreen(pub GreenId);
14910impl TypedSyntaxNode for FunctionWithBody {
14911    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::FunctionWithBody);
14912    type StablePtr = FunctionWithBodyPtr;
14913    type Green = FunctionWithBodyGreen;
14914    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
14915        FunctionWithBodyGreen(
14916            Arc::new(GreenNode {
14917                kind: SyntaxKind::FunctionWithBody,
14918                details: GreenNodeDetails::Node {
14919                    children: vec![
14920                        AttributeList::missing(db).0,
14921                        Visibility::missing(db).0,
14922                        FunctionDeclaration::missing(db).0,
14923                        ExprBlock::missing(db).0,
14924                    ],
14925                    width: TextWidth::default(),
14926                },
14927            })
14928            .intern(db),
14929        )
14930    }
14931    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
14932        let kind = node.kind(db);
14933        assert_eq!(
14934            kind,
14935            SyntaxKind::FunctionWithBody,
14936            "Unexpected SyntaxKind {:?}. Expected {:?}.",
14937            kind,
14938            SyntaxKind::FunctionWithBody
14939        );
14940        let children = db.get_children(node.clone());
14941        Self { node, children }
14942    }
14943    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
14944        let kind = node.kind(db);
14945        if kind == SyntaxKind::FunctionWithBody {
14946            Some(Self::from_syntax_node(db, node))
14947        } else {
14948            None
14949        }
14950    }
14951    fn as_syntax_node(&self) -> SyntaxNode {
14952        self.node.clone()
14953    }
14954    fn stable_ptr(&self) -> Self::StablePtr {
14955        FunctionWithBodyPtr(self.node.0.stable_ptr)
14956    }
14957}
14958impl From<&FunctionWithBody> for SyntaxStablePtrId {
14959    fn from(node: &FunctionWithBody) -> Self {
14960        node.stable_ptr().untyped()
14961    }
14962}
14963#[derive(Clone, Debug, Eq, Hash, PartialEq)]
14964pub struct ItemExternFunction {
14965    node: SyntaxNode,
14966    children: Arc<[SyntaxNode]>,
14967}
14968impl ItemExternFunction {
14969    pub const INDEX_ATTRIBUTES: usize = 0;
14970    pub const INDEX_VISIBILITY: usize = 1;
14971    pub const INDEX_EXTERN_KW: usize = 2;
14972    pub const INDEX_DECLARATION: usize = 3;
14973    pub const INDEX_SEMICOLON: usize = 4;
14974    pub fn new_green(
14975        db: &dyn SyntaxGroup,
14976        attributes: AttributeListGreen,
14977        visibility: VisibilityGreen,
14978        extern_kw: TerminalExternGreen,
14979        declaration: FunctionDeclarationGreen,
14980        semicolon: TerminalSemicolonGreen,
14981    ) -> ItemExternFunctionGreen {
14982        let children: Vec<GreenId> =
14983            vec![attributes.0, visibility.0, extern_kw.0, declaration.0, semicolon.0];
14984        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
14985        ItemExternFunctionGreen(
14986            Arc::new(GreenNode {
14987                kind: SyntaxKind::ItemExternFunction,
14988                details: GreenNodeDetails::Node { children, width },
14989            })
14990            .intern(db),
14991        )
14992    }
14993}
14994impl ItemExternFunction {
14995    pub fn attributes(&self, db: &dyn SyntaxGroup) -> AttributeList {
14996        AttributeList::from_syntax_node(db, self.children[0].clone())
14997    }
14998    pub fn visibility(&self, db: &dyn SyntaxGroup) -> Visibility {
14999        Visibility::from_syntax_node(db, self.children[1].clone())
15000    }
15001    pub fn extern_kw(&self, db: &dyn SyntaxGroup) -> TerminalExtern {
15002        TerminalExtern::from_syntax_node(db, self.children[2].clone())
15003    }
15004    pub fn declaration(&self, db: &dyn SyntaxGroup) -> FunctionDeclaration {
15005        FunctionDeclaration::from_syntax_node(db, self.children[3].clone())
15006    }
15007    pub fn semicolon(&self, db: &dyn SyntaxGroup) -> TerminalSemicolon {
15008        TerminalSemicolon::from_syntax_node(db, self.children[4].clone())
15009    }
15010}
15011#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
15012pub struct ItemExternFunctionPtr(pub SyntaxStablePtrId);
15013impl ItemExternFunctionPtr {
15014    pub fn declaration_green(self, db: &dyn SyntaxGroup) -> FunctionDeclarationGreen {
15015        let ptr = self.0.lookup_intern(db);
15016        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
15017            FunctionDeclarationGreen(key_fields[0])
15018        } else {
15019            panic!("Unexpected key field query on root.");
15020        }
15021    }
15022}
15023impl TypedStablePtr for ItemExternFunctionPtr {
15024    type SyntaxNode = ItemExternFunction;
15025    fn untyped(&self) -> SyntaxStablePtrId {
15026        self.0
15027    }
15028    fn lookup(&self, db: &dyn SyntaxGroup) -> ItemExternFunction {
15029        ItemExternFunction::from_syntax_node(db, self.0.lookup(db))
15030    }
15031}
15032impl From<ItemExternFunctionPtr> for SyntaxStablePtrId {
15033    fn from(ptr: ItemExternFunctionPtr) -> Self {
15034        ptr.untyped()
15035    }
15036}
15037#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
15038pub struct ItemExternFunctionGreen(pub GreenId);
15039impl TypedSyntaxNode for ItemExternFunction {
15040    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemExternFunction);
15041    type StablePtr = ItemExternFunctionPtr;
15042    type Green = ItemExternFunctionGreen;
15043    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
15044        ItemExternFunctionGreen(
15045            Arc::new(GreenNode {
15046                kind: SyntaxKind::ItemExternFunction,
15047                details: GreenNodeDetails::Node {
15048                    children: vec![
15049                        AttributeList::missing(db).0,
15050                        Visibility::missing(db).0,
15051                        TerminalExtern::missing(db).0,
15052                        FunctionDeclaration::missing(db).0,
15053                        TerminalSemicolon::missing(db).0,
15054                    ],
15055                    width: TextWidth::default(),
15056                },
15057            })
15058            .intern(db),
15059        )
15060    }
15061    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
15062        let kind = node.kind(db);
15063        assert_eq!(
15064            kind,
15065            SyntaxKind::ItemExternFunction,
15066            "Unexpected SyntaxKind {:?}. Expected {:?}.",
15067            kind,
15068            SyntaxKind::ItemExternFunction
15069        );
15070        let children = db.get_children(node.clone());
15071        Self { node, children }
15072    }
15073    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
15074        let kind = node.kind(db);
15075        if kind == SyntaxKind::ItemExternFunction {
15076            Some(Self::from_syntax_node(db, node))
15077        } else {
15078            None
15079        }
15080    }
15081    fn as_syntax_node(&self) -> SyntaxNode {
15082        self.node.clone()
15083    }
15084    fn stable_ptr(&self) -> Self::StablePtr {
15085        ItemExternFunctionPtr(self.node.0.stable_ptr)
15086    }
15087}
15088impl From<&ItemExternFunction> for SyntaxStablePtrId {
15089    fn from(node: &ItemExternFunction) -> Self {
15090        node.stable_ptr().untyped()
15091    }
15092}
15093#[derive(Clone, Debug, Eq, Hash, PartialEq)]
15094pub struct ItemExternType {
15095    node: SyntaxNode,
15096    children: Arc<[SyntaxNode]>,
15097}
15098impl ItemExternType {
15099    pub const INDEX_ATTRIBUTES: usize = 0;
15100    pub const INDEX_VISIBILITY: usize = 1;
15101    pub const INDEX_EXTERN_KW: usize = 2;
15102    pub const INDEX_TYPE_KW: usize = 3;
15103    pub const INDEX_NAME: usize = 4;
15104    pub const INDEX_GENERIC_PARAMS: usize = 5;
15105    pub const INDEX_SEMICOLON: usize = 6;
15106    pub fn new_green(
15107        db: &dyn SyntaxGroup,
15108        attributes: AttributeListGreen,
15109        visibility: VisibilityGreen,
15110        extern_kw: TerminalExternGreen,
15111        type_kw: TerminalTypeGreen,
15112        name: TerminalIdentifierGreen,
15113        generic_params: OptionWrappedGenericParamListGreen,
15114        semicolon: TerminalSemicolonGreen,
15115    ) -> ItemExternTypeGreen {
15116        let children: Vec<GreenId> = vec![
15117            attributes.0,
15118            visibility.0,
15119            extern_kw.0,
15120            type_kw.0,
15121            name.0,
15122            generic_params.0,
15123            semicolon.0,
15124        ];
15125        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
15126        ItemExternTypeGreen(
15127            Arc::new(GreenNode {
15128                kind: SyntaxKind::ItemExternType,
15129                details: GreenNodeDetails::Node { children, width },
15130            })
15131            .intern(db),
15132        )
15133    }
15134}
15135impl ItemExternType {
15136    pub fn attributes(&self, db: &dyn SyntaxGroup) -> AttributeList {
15137        AttributeList::from_syntax_node(db, self.children[0].clone())
15138    }
15139    pub fn visibility(&self, db: &dyn SyntaxGroup) -> Visibility {
15140        Visibility::from_syntax_node(db, self.children[1].clone())
15141    }
15142    pub fn extern_kw(&self, db: &dyn SyntaxGroup) -> TerminalExtern {
15143        TerminalExtern::from_syntax_node(db, self.children[2].clone())
15144    }
15145    pub fn type_kw(&self, db: &dyn SyntaxGroup) -> TerminalType {
15146        TerminalType::from_syntax_node(db, self.children[3].clone())
15147    }
15148    pub fn name(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier {
15149        TerminalIdentifier::from_syntax_node(db, self.children[4].clone())
15150    }
15151    pub fn generic_params(&self, db: &dyn SyntaxGroup) -> OptionWrappedGenericParamList {
15152        OptionWrappedGenericParamList::from_syntax_node(db, self.children[5].clone())
15153    }
15154    pub fn semicolon(&self, db: &dyn SyntaxGroup) -> TerminalSemicolon {
15155        TerminalSemicolon::from_syntax_node(db, self.children[6].clone())
15156    }
15157}
15158#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
15159pub struct ItemExternTypePtr(pub SyntaxStablePtrId);
15160impl ItemExternTypePtr {
15161    pub fn name_green(self, db: &dyn SyntaxGroup) -> TerminalIdentifierGreen {
15162        let ptr = self.0.lookup_intern(db);
15163        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
15164            TerminalIdentifierGreen(key_fields[0])
15165        } else {
15166            panic!("Unexpected key field query on root.");
15167        }
15168    }
15169}
15170impl TypedStablePtr for ItemExternTypePtr {
15171    type SyntaxNode = ItemExternType;
15172    fn untyped(&self) -> SyntaxStablePtrId {
15173        self.0
15174    }
15175    fn lookup(&self, db: &dyn SyntaxGroup) -> ItemExternType {
15176        ItemExternType::from_syntax_node(db, self.0.lookup(db))
15177    }
15178}
15179impl From<ItemExternTypePtr> for SyntaxStablePtrId {
15180    fn from(ptr: ItemExternTypePtr) -> Self {
15181        ptr.untyped()
15182    }
15183}
15184#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
15185pub struct ItemExternTypeGreen(pub GreenId);
15186impl TypedSyntaxNode for ItemExternType {
15187    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemExternType);
15188    type StablePtr = ItemExternTypePtr;
15189    type Green = ItemExternTypeGreen;
15190    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
15191        ItemExternTypeGreen(
15192            Arc::new(GreenNode {
15193                kind: SyntaxKind::ItemExternType,
15194                details: GreenNodeDetails::Node {
15195                    children: vec![
15196                        AttributeList::missing(db).0,
15197                        Visibility::missing(db).0,
15198                        TerminalExtern::missing(db).0,
15199                        TerminalType::missing(db).0,
15200                        TerminalIdentifier::missing(db).0,
15201                        OptionWrappedGenericParamList::missing(db).0,
15202                        TerminalSemicolon::missing(db).0,
15203                    ],
15204                    width: TextWidth::default(),
15205                },
15206            })
15207            .intern(db),
15208        )
15209    }
15210    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
15211        let kind = node.kind(db);
15212        assert_eq!(
15213            kind,
15214            SyntaxKind::ItemExternType,
15215            "Unexpected SyntaxKind {:?}. Expected {:?}.",
15216            kind,
15217            SyntaxKind::ItemExternType
15218        );
15219        let children = db.get_children(node.clone());
15220        Self { node, children }
15221    }
15222    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
15223        let kind = node.kind(db);
15224        if kind == SyntaxKind::ItemExternType {
15225            Some(Self::from_syntax_node(db, node))
15226        } else {
15227            None
15228        }
15229    }
15230    fn as_syntax_node(&self) -> SyntaxNode {
15231        self.node.clone()
15232    }
15233    fn stable_ptr(&self) -> Self::StablePtr {
15234        ItemExternTypePtr(self.node.0.stable_ptr)
15235    }
15236}
15237impl From<&ItemExternType> for SyntaxStablePtrId {
15238    fn from(node: &ItemExternType) -> Self {
15239        node.stable_ptr().untyped()
15240    }
15241}
15242#[derive(Clone, Debug, Eq, Hash, PartialEq)]
15243pub struct ItemTrait {
15244    node: SyntaxNode,
15245    children: Arc<[SyntaxNode]>,
15246}
15247impl ItemTrait {
15248    pub const INDEX_ATTRIBUTES: usize = 0;
15249    pub const INDEX_VISIBILITY: usize = 1;
15250    pub const INDEX_TRAIT_KW: usize = 2;
15251    pub const INDEX_NAME: usize = 3;
15252    pub const INDEX_GENERIC_PARAMS: usize = 4;
15253    pub const INDEX_BODY: usize = 5;
15254    pub fn new_green(
15255        db: &dyn SyntaxGroup,
15256        attributes: AttributeListGreen,
15257        visibility: VisibilityGreen,
15258        trait_kw: TerminalTraitGreen,
15259        name: TerminalIdentifierGreen,
15260        generic_params: OptionWrappedGenericParamListGreen,
15261        body: MaybeTraitBodyGreen,
15262    ) -> ItemTraitGreen {
15263        let children: Vec<GreenId> =
15264            vec![attributes.0, visibility.0, trait_kw.0, name.0, generic_params.0, body.0];
15265        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
15266        ItemTraitGreen(
15267            Arc::new(GreenNode {
15268                kind: SyntaxKind::ItemTrait,
15269                details: GreenNodeDetails::Node { children, width },
15270            })
15271            .intern(db),
15272        )
15273    }
15274}
15275impl ItemTrait {
15276    pub fn attributes(&self, db: &dyn SyntaxGroup) -> AttributeList {
15277        AttributeList::from_syntax_node(db, self.children[0].clone())
15278    }
15279    pub fn visibility(&self, db: &dyn SyntaxGroup) -> Visibility {
15280        Visibility::from_syntax_node(db, self.children[1].clone())
15281    }
15282    pub fn trait_kw(&self, db: &dyn SyntaxGroup) -> TerminalTrait {
15283        TerminalTrait::from_syntax_node(db, self.children[2].clone())
15284    }
15285    pub fn name(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier {
15286        TerminalIdentifier::from_syntax_node(db, self.children[3].clone())
15287    }
15288    pub fn generic_params(&self, db: &dyn SyntaxGroup) -> OptionWrappedGenericParamList {
15289        OptionWrappedGenericParamList::from_syntax_node(db, self.children[4].clone())
15290    }
15291    pub fn body(&self, db: &dyn SyntaxGroup) -> MaybeTraitBody {
15292        MaybeTraitBody::from_syntax_node(db, self.children[5].clone())
15293    }
15294}
15295#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
15296pub struct ItemTraitPtr(pub SyntaxStablePtrId);
15297impl ItemTraitPtr {
15298    pub fn name_green(self, db: &dyn SyntaxGroup) -> TerminalIdentifierGreen {
15299        let ptr = self.0.lookup_intern(db);
15300        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
15301            TerminalIdentifierGreen(key_fields[0])
15302        } else {
15303            panic!("Unexpected key field query on root.");
15304        }
15305    }
15306}
15307impl TypedStablePtr for ItemTraitPtr {
15308    type SyntaxNode = ItemTrait;
15309    fn untyped(&self) -> SyntaxStablePtrId {
15310        self.0
15311    }
15312    fn lookup(&self, db: &dyn SyntaxGroup) -> ItemTrait {
15313        ItemTrait::from_syntax_node(db, self.0.lookup(db))
15314    }
15315}
15316impl From<ItemTraitPtr> for SyntaxStablePtrId {
15317    fn from(ptr: ItemTraitPtr) -> Self {
15318        ptr.untyped()
15319    }
15320}
15321#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
15322pub struct ItemTraitGreen(pub GreenId);
15323impl TypedSyntaxNode for ItemTrait {
15324    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemTrait);
15325    type StablePtr = ItemTraitPtr;
15326    type Green = ItemTraitGreen;
15327    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
15328        ItemTraitGreen(
15329            Arc::new(GreenNode {
15330                kind: SyntaxKind::ItemTrait,
15331                details: GreenNodeDetails::Node {
15332                    children: vec![
15333                        AttributeList::missing(db).0,
15334                        Visibility::missing(db).0,
15335                        TerminalTrait::missing(db).0,
15336                        TerminalIdentifier::missing(db).0,
15337                        OptionWrappedGenericParamList::missing(db).0,
15338                        MaybeTraitBody::missing(db).0,
15339                    ],
15340                    width: TextWidth::default(),
15341                },
15342            })
15343            .intern(db),
15344        )
15345    }
15346    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
15347        let kind = node.kind(db);
15348        assert_eq!(
15349            kind,
15350            SyntaxKind::ItemTrait,
15351            "Unexpected SyntaxKind {:?}. Expected {:?}.",
15352            kind,
15353            SyntaxKind::ItemTrait
15354        );
15355        let children = db.get_children(node.clone());
15356        Self { node, children }
15357    }
15358    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
15359        let kind = node.kind(db);
15360        if kind == SyntaxKind::ItemTrait { Some(Self::from_syntax_node(db, node)) } else { None }
15361    }
15362    fn as_syntax_node(&self) -> SyntaxNode {
15363        self.node.clone()
15364    }
15365    fn stable_ptr(&self) -> Self::StablePtr {
15366        ItemTraitPtr(self.node.0.stable_ptr)
15367    }
15368}
15369impl From<&ItemTrait> for SyntaxStablePtrId {
15370    fn from(node: &ItemTrait) -> Self {
15371        node.stable_ptr().untyped()
15372    }
15373}
15374#[derive(Clone, Debug, Eq, Hash, PartialEq)]
15375pub enum MaybeTraitBody {
15376    Some(TraitBody),
15377    None(TerminalSemicolon),
15378}
15379#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
15380pub struct MaybeTraitBodyPtr(pub SyntaxStablePtrId);
15381impl TypedStablePtr for MaybeTraitBodyPtr {
15382    type SyntaxNode = MaybeTraitBody;
15383    fn untyped(&self) -> SyntaxStablePtrId {
15384        self.0
15385    }
15386    fn lookup(&self, db: &dyn SyntaxGroup) -> MaybeTraitBody {
15387        MaybeTraitBody::from_syntax_node(db, self.0.lookup(db))
15388    }
15389}
15390impl From<MaybeTraitBodyPtr> for SyntaxStablePtrId {
15391    fn from(ptr: MaybeTraitBodyPtr) -> Self {
15392        ptr.untyped()
15393    }
15394}
15395impl From<TraitBodyPtr> for MaybeTraitBodyPtr {
15396    fn from(value: TraitBodyPtr) -> Self {
15397        Self(value.0)
15398    }
15399}
15400impl From<TerminalSemicolonPtr> for MaybeTraitBodyPtr {
15401    fn from(value: TerminalSemicolonPtr) -> Self {
15402        Self(value.0)
15403    }
15404}
15405impl From<TraitBodyGreen> for MaybeTraitBodyGreen {
15406    fn from(value: TraitBodyGreen) -> Self {
15407        Self(value.0)
15408    }
15409}
15410impl From<TerminalSemicolonGreen> for MaybeTraitBodyGreen {
15411    fn from(value: TerminalSemicolonGreen) -> Self {
15412        Self(value.0)
15413    }
15414}
15415#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
15416pub struct MaybeTraitBodyGreen(pub GreenId);
15417impl TypedSyntaxNode for MaybeTraitBody {
15418    const OPTIONAL_KIND: Option<SyntaxKind> = None;
15419    type StablePtr = MaybeTraitBodyPtr;
15420    type Green = MaybeTraitBodyGreen;
15421    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
15422        panic!("No missing variant.");
15423    }
15424    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
15425        let kind = node.kind(db);
15426        match kind {
15427            SyntaxKind::TraitBody => MaybeTraitBody::Some(TraitBody::from_syntax_node(db, node)),
15428            SyntaxKind::TerminalSemicolon => {
15429                MaybeTraitBody::None(TerminalSemicolon::from_syntax_node(db, node))
15430            }
15431            _ => {
15432                panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "MaybeTraitBody")
15433            }
15434        }
15435    }
15436    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
15437        let kind = node.kind(db);
15438        match kind {
15439            SyntaxKind::TraitBody => {
15440                Some(MaybeTraitBody::Some(TraitBody::from_syntax_node(db, node)))
15441            }
15442            SyntaxKind::TerminalSemicolon => {
15443                Some(MaybeTraitBody::None(TerminalSemicolon::from_syntax_node(db, node)))
15444            }
15445            _ => None,
15446        }
15447    }
15448    fn as_syntax_node(&self) -> SyntaxNode {
15449        match self {
15450            MaybeTraitBody::Some(x) => x.as_syntax_node(),
15451            MaybeTraitBody::None(x) => x.as_syntax_node(),
15452        }
15453    }
15454    fn stable_ptr(&self) -> Self::StablePtr {
15455        MaybeTraitBodyPtr(self.as_syntax_node().0.stable_ptr)
15456    }
15457}
15458impl From<&MaybeTraitBody> for SyntaxStablePtrId {
15459    fn from(node: &MaybeTraitBody) -> Self {
15460        node.stable_ptr().untyped()
15461    }
15462}
15463impl MaybeTraitBody {
15464    /// Checks if a kind of a variant of [MaybeTraitBody].
15465    pub fn is_variant(kind: SyntaxKind) -> bool {
15466        matches!(kind, SyntaxKind::TraitBody | SyntaxKind::TerminalSemicolon)
15467    }
15468}
15469#[derive(Clone, Debug, Eq, Hash, PartialEq)]
15470pub struct TraitBody {
15471    node: SyntaxNode,
15472    children: Arc<[SyntaxNode]>,
15473}
15474impl TraitBody {
15475    pub const INDEX_LBRACE: usize = 0;
15476    pub const INDEX_ITEMS: usize = 1;
15477    pub const INDEX_RBRACE: usize = 2;
15478    pub fn new_green(
15479        db: &dyn SyntaxGroup,
15480        lbrace: TerminalLBraceGreen,
15481        items: TraitItemListGreen,
15482        rbrace: TerminalRBraceGreen,
15483    ) -> TraitBodyGreen {
15484        let children: Vec<GreenId> = vec![lbrace.0, items.0, rbrace.0];
15485        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
15486        TraitBodyGreen(
15487            Arc::new(GreenNode {
15488                kind: SyntaxKind::TraitBody,
15489                details: GreenNodeDetails::Node { children, width },
15490            })
15491            .intern(db),
15492        )
15493    }
15494}
15495impl TraitBody {
15496    pub fn lbrace(&self, db: &dyn SyntaxGroup) -> TerminalLBrace {
15497        TerminalLBrace::from_syntax_node(db, self.children[0].clone())
15498    }
15499    pub fn items(&self, db: &dyn SyntaxGroup) -> TraitItemList {
15500        TraitItemList::from_syntax_node(db, self.children[1].clone())
15501    }
15502    pub fn rbrace(&self, db: &dyn SyntaxGroup) -> TerminalRBrace {
15503        TerminalRBrace::from_syntax_node(db, self.children[2].clone())
15504    }
15505}
15506#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
15507pub struct TraitBodyPtr(pub SyntaxStablePtrId);
15508impl TraitBodyPtr {}
15509impl TypedStablePtr for TraitBodyPtr {
15510    type SyntaxNode = TraitBody;
15511    fn untyped(&self) -> SyntaxStablePtrId {
15512        self.0
15513    }
15514    fn lookup(&self, db: &dyn SyntaxGroup) -> TraitBody {
15515        TraitBody::from_syntax_node(db, self.0.lookup(db))
15516    }
15517}
15518impl From<TraitBodyPtr> for SyntaxStablePtrId {
15519    fn from(ptr: TraitBodyPtr) -> Self {
15520        ptr.untyped()
15521    }
15522}
15523#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
15524pub struct TraitBodyGreen(pub GreenId);
15525impl TypedSyntaxNode for TraitBody {
15526    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TraitBody);
15527    type StablePtr = TraitBodyPtr;
15528    type Green = TraitBodyGreen;
15529    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
15530        TraitBodyGreen(
15531            Arc::new(GreenNode {
15532                kind: SyntaxKind::TraitBody,
15533                details: GreenNodeDetails::Node {
15534                    children: vec![
15535                        TerminalLBrace::missing(db).0,
15536                        TraitItemList::missing(db).0,
15537                        TerminalRBrace::missing(db).0,
15538                    ],
15539                    width: TextWidth::default(),
15540                },
15541            })
15542            .intern(db),
15543        )
15544    }
15545    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
15546        let kind = node.kind(db);
15547        assert_eq!(
15548            kind,
15549            SyntaxKind::TraitBody,
15550            "Unexpected SyntaxKind {:?}. Expected {:?}.",
15551            kind,
15552            SyntaxKind::TraitBody
15553        );
15554        let children = db.get_children(node.clone());
15555        Self { node, children }
15556    }
15557    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
15558        let kind = node.kind(db);
15559        if kind == SyntaxKind::TraitBody { Some(Self::from_syntax_node(db, node)) } else { None }
15560    }
15561    fn as_syntax_node(&self) -> SyntaxNode {
15562        self.node.clone()
15563    }
15564    fn stable_ptr(&self) -> Self::StablePtr {
15565        TraitBodyPtr(self.node.0.stable_ptr)
15566    }
15567}
15568impl From<&TraitBody> for SyntaxStablePtrId {
15569    fn from(node: &TraitBody) -> Self {
15570        node.stable_ptr().untyped()
15571    }
15572}
15573#[derive(Clone, Debug, Eq, Hash, PartialEq)]
15574pub struct TraitItemList(ElementList<TraitItem, 1>);
15575impl Deref for TraitItemList {
15576    type Target = ElementList<TraitItem, 1>;
15577    fn deref(&self) -> &Self::Target {
15578        &self.0
15579    }
15580}
15581impl TraitItemList {
15582    pub fn new_green(db: &dyn SyntaxGroup, children: Vec<TraitItemGreen>) -> TraitItemListGreen {
15583        let width = children.iter().map(|id| id.0.lookup_intern(db).width()).sum();
15584        TraitItemListGreen(
15585            Arc::new(GreenNode {
15586                kind: SyntaxKind::TraitItemList,
15587                details: GreenNodeDetails::Node {
15588                    children: children.iter().map(|x| x.0).collect(),
15589                    width,
15590                },
15591            })
15592            .intern(db),
15593        )
15594    }
15595}
15596#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
15597pub struct TraitItemListPtr(pub SyntaxStablePtrId);
15598impl TypedStablePtr for TraitItemListPtr {
15599    type SyntaxNode = TraitItemList;
15600    fn untyped(&self) -> SyntaxStablePtrId {
15601        self.0
15602    }
15603    fn lookup(&self, db: &dyn SyntaxGroup) -> TraitItemList {
15604        TraitItemList::from_syntax_node(db, self.0.lookup(db))
15605    }
15606}
15607impl From<TraitItemListPtr> for SyntaxStablePtrId {
15608    fn from(ptr: TraitItemListPtr) -> Self {
15609        ptr.untyped()
15610    }
15611}
15612#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
15613pub struct TraitItemListGreen(pub GreenId);
15614impl TypedSyntaxNode for TraitItemList {
15615    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TraitItemList);
15616    type StablePtr = TraitItemListPtr;
15617    type Green = TraitItemListGreen;
15618    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
15619        TraitItemListGreen(
15620            Arc::new(GreenNode {
15621                kind: SyntaxKind::TraitItemList,
15622                details: GreenNodeDetails::Node { children: vec![], width: TextWidth::default() },
15623            })
15624            .intern(db),
15625        )
15626    }
15627    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
15628        Self(ElementList::new(node))
15629    }
15630    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
15631        if node.kind(db) == SyntaxKind::TraitItemList {
15632            Some(Self(ElementList::new(node)))
15633        } else {
15634            None
15635        }
15636    }
15637    fn as_syntax_node(&self) -> SyntaxNode {
15638        self.node.clone()
15639    }
15640    fn stable_ptr(&self) -> Self::StablePtr {
15641        TraitItemListPtr(self.node.0.stable_ptr)
15642    }
15643}
15644impl From<&TraitItemList> for SyntaxStablePtrId {
15645    fn from(node: &TraitItemList) -> Self {
15646        node.stable_ptr().untyped()
15647    }
15648}
15649#[derive(Clone, Debug, Eq, Hash, PartialEq)]
15650pub enum TraitItem {
15651    Function(TraitItemFunction),
15652    Type(TraitItemType),
15653    Constant(TraitItemConstant),
15654    Impl(TraitItemImpl),
15655    Missing(TraitItemMissing),
15656}
15657#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
15658pub struct TraitItemPtr(pub SyntaxStablePtrId);
15659impl TypedStablePtr for TraitItemPtr {
15660    type SyntaxNode = TraitItem;
15661    fn untyped(&self) -> SyntaxStablePtrId {
15662        self.0
15663    }
15664    fn lookup(&self, db: &dyn SyntaxGroup) -> TraitItem {
15665        TraitItem::from_syntax_node(db, self.0.lookup(db))
15666    }
15667}
15668impl From<TraitItemPtr> for SyntaxStablePtrId {
15669    fn from(ptr: TraitItemPtr) -> Self {
15670        ptr.untyped()
15671    }
15672}
15673impl From<TraitItemFunctionPtr> for TraitItemPtr {
15674    fn from(value: TraitItemFunctionPtr) -> Self {
15675        Self(value.0)
15676    }
15677}
15678impl From<TraitItemTypePtr> for TraitItemPtr {
15679    fn from(value: TraitItemTypePtr) -> Self {
15680        Self(value.0)
15681    }
15682}
15683impl From<TraitItemConstantPtr> for TraitItemPtr {
15684    fn from(value: TraitItemConstantPtr) -> Self {
15685        Self(value.0)
15686    }
15687}
15688impl From<TraitItemImplPtr> for TraitItemPtr {
15689    fn from(value: TraitItemImplPtr) -> Self {
15690        Self(value.0)
15691    }
15692}
15693impl From<TraitItemMissingPtr> for TraitItemPtr {
15694    fn from(value: TraitItemMissingPtr) -> Self {
15695        Self(value.0)
15696    }
15697}
15698impl From<TraitItemFunctionGreen> for TraitItemGreen {
15699    fn from(value: TraitItemFunctionGreen) -> Self {
15700        Self(value.0)
15701    }
15702}
15703impl From<TraitItemTypeGreen> for TraitItemGreen {
15704    fn from(value: TraitItemTypeGreen) -> Self {
15705        Self(value.0)
15706    }
15707}
15708impl From<TraitItemConstantGreen> for TraitItemGreen {
15709    fn from(value: TraitItemConstantGreen) -> Self {
15710        Self(value.0)
15711    }
15712}
15713impl From<TraitItemImplGreen> for TraitItemGreen {
15714    fn from(value: TraitItemImplGreen) -> Self {
15715        Self(value.0)
15716    }
15717}
15718impl From<TraitItemMissingGreen> for TraitItemGreen {
15719    fn from(value: TraitItemMissingGreen) -> Self {
15720        Self(value.0)
15721    }
15722}
15723#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
15724pub struct TraitItemGreen(pub GreenId);
15725impl TypedSyntaxNode for TraitItem {
15726    const OPTIONAL_KIND: Option<SyntaxKind> = None;
15727    type StablePtr = TraitItemPtr;
15728    type Green = TraitItemGreen;
15729    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
15730        TraitItemGreen(TraitItemMissing::missing(db).0)
15731    }
15732    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
15733        let kind = node.kind(db);
15734        match kind {
15735            SyntaxKind::TraitItemFunction => {
15736                TraitItem::Function(TraitItemFunction::from_syntax_node(db, node))
15737            }
15738            SyntaxKind::TraitItemType => TraitItem::Type(TraitItemType::from_syntax_node(db, node)),
15739            SyntaxKind::TraitItemConstant => {
15740                TraitItem::Constant(TraitItemConstant::from_syntax_node(db, node))
15741            }
15742            SyntaxKind::TraitItemImpl => TraitItem::Impl(TraitItemImpl::from_syntax_node(db, node)),
15743            SyntaxKind::TraitItemMissing => {
15744                TraitItem::Missing(TraitItemMissing::from_syntax_node(db, node))
15745            }
15746            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "TraitItem"),
15747        }
15748    }
15749    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
15750        let kind = node.kind(db);
15751        match kind {
15752            SyntaxKind::TraitItemFunction => {
15753                Some(TraitItem::Function(TraitItemFunction::from_syntax_node(db, node)))
15754            }
15755            SyntaxKind::TraitItemType => {
15756                Some(TraitItem::Type(TraitItemType::from_syntax_node(db, node)))
15757            }
15758            SyntaxKind::TraitItemConstant => {
15759                Some(TraitItem::Constant(TraitItemConstant::from_syntax_node(db, node)))
15760            }
15761            SyntaxKind::TraitItemImpl => {
15762                Some(TraitItem::Impl(TraitItemImpl::from_syntax_node(db, node)))
15763            }
15764            SyntaxKind::TraitItemMissing => {
15765                Some(TraitItem::Missing(TraitItemMissing::from_syntax_node(db, node)))
15766            }
15767            _ => None,
15768        }
15769    }
15770    fn as_syntax_node(&self) -> SyntaxNode {
15771        match self {
15772            TraitItem::Function(x) => x.as_syntax_node(),
15773            TraitItem::Type(x) => x.as_syntax_node(),
15774            TraitItem::Constant(x) => x.as_syntax_node(),
15775            TraitItem::Impl(x) => x.as_syntax_node(),
15776            TraitItem::Missing(x) => x.as_syntax_node(),
15777        }
15778    }
15779    fn stable_ptr(&self) -> Self::StablePtr {
15780        TraitItemPtr(self.as_syntax_node().0.stable_ptr)
15781    }
15782}
15783impl From<&TraitItem> for SyntaxStablePtrId {
15784    fn from(node: &TraitItem) -> Self {
15785        node.stable_ptr().untyped()
15786    }
15787}
15788impl TraitItem {
15789    /// Checks if a kind of a variant of [TraitItem].
15790    pub fn is_variant(kind: SyntaxKind) -> bool {
15791        matches!(
15792            kind,
15793            SyntaxKind::TraitItemFunction
15794                | SyntaxKind::TraitItemType
15795                | SyntaxKind::TraitItemConstant
15796                | SyntaxKind::TraitItemImpl
15797                | SyntaxKind::TraitItemMissing
15798        )
15799    }
15800}
15801#[derive(Clone, Debug, Eq, Hash, PartialEq)]
15802pub struct TraitItemMissing {
15803    node: SyntaxNode,
15804    children: Arc<[SyntaxNode]>,
15805}
15806impl TraitItemMissing {
15807    pub fn new_green(db: &dyn SyntaxGroup) -> TraitItemMissingGreen {
15808        let children: Vec<GreenId> = vec![];
15809        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
15810        TraitItemMissingGreen(
15811            Arc::new(GreenNode {
15812                kind: SyntaxKind::TraitItemMissing,
15813                details: GreenNodeDetails::Node { children, width },
15814            })
15815            .intern(db),
15816        )
15817    }
15818}
15819impl TraitItemMissing {}
15820#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
15821pub struct TraitItemMissingPtr(pub SyntaxStablePtrId);
15822impl TraitItemMissingPtr {}
15823impl TypedStablePtr for TraitItemMissingPtr {
15824    type SyntaxNode = TraitItemMissing;
15825    fn untyped(&self) -> SyntaxStablePtrId {
15826        self.0
15827    }
15828    fn lookup(&self, db: &dyn SyntaxGroup) -> TraitItemMissing {
15829        TraitItemMissing::from_syntax_node(db, self.0.lookup(db))
15830    }
15831}
15832impl From<TraitItemMissingPtr> for SyntaxStablePtrId {
15833    fn from(ptr: TraitItemMissingPtr) -> Self {
15834        ptr.untyped()
15835    }
15836}
15837#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
15838pub struct TraitItemMissingGreen(pub GreenId);
15839impl TypedSyntaxNode for TraitItemMissing {
15840    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TraitItemMissing);
15841    type StablePtr = TraitItemMissingPtr;
15842    type Green = TraitItemMissingGreen;
15843    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
15844        TraitItemMissingGreen(
15845            Arc::new(GreenNode {
15846                kind: SyntaxKind::TraitItemMissing,
15847                details: GreenNodeDetails::Node { children: vec![], width: TextWidth::default() },
15848            })
15849            .intern(db),
15850        )
15851    }
15852    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
15853        let kind = node.kind(db);
15854        assert_eq!(
15855            kind,
15856            SyntaxKind::TraitItemMissing,
15857            "Unexpected SyntaxKind {:?}. Expected {:?}.",
15858            kind,
15859            SyntaxKind::TraitItemMissing
15860        );
15861        let children = db.get_children(node.clone());
15862        Self { node, children }
15863    }
15864    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
15865        let kind = node.kind(db);
15866        if kind == SyntaxKind::TraitItemMissing {
15867            Some(Self::from_syntax_node(db, node))
15868        } else {
15869            None
15870        }
15871    }
15872    fn as_syntax_node(&self) -> SyntaxNode {
15873        self.node.clone()
15874    }
15875    fn stable_ptr(&self) -> Self::StablePtr {
15876        TraitItemMissingPtr(self.node.0.stable_ptr)
15877    }
15878}
15879impl From<&TraitItemMissing> for SyntaxStablePtrId {
15880    fn from(node: &TraitItemMissing) -> Self {
15881        node.stable_ptr().untyped()
15882    }
15883}
15884#[derive(Clone, Debug, Eq, Hash, PartialEq)]
15885pub struct TraitItemFunction {
15886    node: SyntaxNode,
15887    children: Arc<[SyntaxNode]>,
15888}
15889impl TraitItemFunction {
15890    pub const INDEX_ATTRIBUTES: usize = 0;
15891    pub const INDEX_DECLARATION: usize = 1;
15892    pub const INDEX_BODY: usize = 2;
15893    pub fn new_green(
15894        db: &dyn SyntaxGroup,
15895        attributes: AttributeListGreen,
15896        declaration: FunctionDeclarationGreen,
15897        body: MaybeTraitFunctionBodyGreen,
15898    ) -> TraitItemFunctionGreen {
15899        let children: Vec<GreenId> = vec![attributes.0, declaration.0, body.0];
15900        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
15901        TraitItemFunctionGreen(
15902            Arc::new(GreenNode {
15903                kind: SyntaxKind::TraitItemFunction,
15904                details: GreenNodeDetails::Node { children, width },
15905            })
15906            .intern(db),
15907        )
15908    }
15909}
15910impl TraitItemFunction {
15911    pub fn attributes(&self, db: &dyn SyntaxGroup) -> AttributeList {
15912        AttributeList::from_syntax_node(db, self.children[0].clone())
15913    }
15914    pub fn declaration(&self, db: &dyn SyntaxGroup) -> FunctionDeclaration {
15915        FunctionDeclaration::from_syntax_node(db, self.children[1].clone())
15916    }
15917    pub fn body(&self, db: &dyn SyntaxGroup) -> MaybeTraitFunctionBody {
15918        MaybeTraitFunctionBody::from_syntax_node(db, self.children[2].clone())
15919    }
15920}
15921#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
15922pub struct TraitItemFunctionPtr(pub SyntaxStablePtrId);
15923impl TraitItemFunctionPtr {
15924    pub fn declaration_green(self, db: &dyn SyntaxGroup) -> FunctionDeclarationGreen {
15925        let ptr = self.0.lookup_intern(db);
15926        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
15927            FunctionDeclarationGreen(key_fields[0])
15928        } else {
15929            panic!("Unexpected key field query on root.");
15930        }
15931    }
15932}
15933impl TypedStablePtr for TraitItemFunctionPtr {
15934    type SyntaxNode = TraitItemFunction;
15935    fn untyped(&self) -> SyntaxStablePtrId {
15936        self.0
15937    }
15938    fn lookup(&self, db: &dyn SyntaxGroup) -> TraitItemFunction {
15939        TraitItemFunction::from_syntax_node(db, self.0.lookup(db))
15940    }
15941}
15942impl From<TraitItemFunctionPtr> for SyntaxStablePtrId {
15943    fn from(ptr: TraitItemFunctionPtr) -> Self {
15944        ptr.untyped()
15945    }
15946}
15947#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
15948pub struct TraitItemFunctionGreen(pub GreenId);
15949impl TypedSyntaxNode for TraitItemFunction {
15950    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TraitItemFunction);
15951    type StablePtr = TraitItemFunctionPtr;
15952    type Green = TraitItemFunctionGreen;
15953    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
15954        TraitItemFunctionGreen(
15955            Arc::new(GreenNode {
15956                kind: SyntaxKind::TraitItemFunction,
15957                details: GreenNodeDetails::Node {
15958                    children: vec![
15959                        AttributeList::missing(db).0,
15960                        FunctionDeclaration::missing(db).0,
15961                        MaybeTraitFunctionBody::missing(db).0,
15962                    ],
15963                    width: TextWidth::default(),
15964                },
15965            })
15966            .intern(db),
15967        )
15968    }
15969    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
15970        let kind = node.kind(db);
15971        assert_eq!(
15972            kind,
15973            SyntaxKind::TraitItemFunction,
15974            "Unexpected SyntaxKind {:?}. Expected {:?}.",
15975            kind,
15976            SyntaxKind::TraitItemFunction
15977        );
15978        let children = db.get_children(node.clone());
15979        Self { node, children }
15980    }
15981    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
15982        let kind = node.kind(db);
15983        if kind == SyntaxKind::TraitItemFunction {
15984            Some(Self::from_syntax_node(db, node))
15985        } else {
15986            None
15987        }
15988    }
15989    fn as_syntax_node(&self) -> SyntaxNode {
15990        self.node.clone()
15991    }
15992    fn stable_ptr(&self) -> Self::StablePtr {
15993        TraitItemFunctionPtr(self.node.0.stable_ptr)
15994    }
15995}
15996impl From<&TraitItemFunction> for SyntaxStablePtrId {
15997    fn from(node: &TraitItemFunction) -> Self {
15998        node.stable_ptr().untyped()
15999    }
16000}
16001#[derive(Clone, Debug, Eq, Hash, PartialEq)]
16002pub struct TraitItemType {
16003    node: SyntaxNode,
16004    children: Arc<[SyntaxNode]>,
16005}
16006impl TraitItemType {
16007    pub const INDEX_ATTRIBUTES: usize = 0;
16008    pub const INDEX_TYPE_KW: usize = 1;
16009    pub const INDEX_NAME: usize = 2;
16010    pub const INDEX_GENERIC_PARAMS: usize = 3;
16011    pub const INDEX_SEMICOLON: usize = 4;
16012    pub fn new_green(
16013        db: &dyn SyntaxGroup,
16014        attributes: AttributeListGreen,
16015        type_kw: TerminalTypeGreen,
16016        name: TerminalIdentifierGreen,
16017        generic_params: OptionWrappedGenericParamListGreen,
16018        semicolon: TerminalSemicolonGreen,
16019    ) -> TraitItemTypeGreen {
16020        let children: Vec<GreenId> =
16021            vec![attributes.0, type_kw.0, name.0, generic_params.0, semicolon.0];
16022        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
16023        TraitItemTypeGreen(
16024            Arc::new(GreenNode {
16025                kind: SyntaxKind::TraitItemType,
16026                details: GreenNodeDetails::Node { children, width },
16027            })
16028            .intern(db),
16029        )
16030    }
16031}
16032impl TraitItemType {
16033    pub fn attributes(&self, db: &dyn SyntaxGroup) -> AttributeList {
16034        AttributeList::from_syntax_node(db, self.children[0].clone())
16035    }
16036    pub fn type_kw(&self, db: &dyn SyntaxGroup) -> TerminalType {
16037        TerminalType::from_syntax_node(db, self.children[1].clone())
16038    }
16039    pub fn name(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier {
16040        TerminalIdentifier::from_syntax_node(db, self.children[2].clone())
16041    }
16042    pub fn generic_params(&self, db: &dyn SyntaxGroup) -> OptionWrappedGenericParamList {
16043        OptionWrappedGenericParamList::from_syntax_node(db, self.children[3].clone())
16044    }
16045    pub fn semicolon(&self, db: &dyn SyntaxGroup) -> TerminalSemicolon {
16046        TerminalSemicolon::from_syntax_node(db, self.children[4].clone())
16047    }
16048}
16049#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
16050pub struct TraitItemTypePtr(pub SyntaxStablePtrId);
16051impl TraitItemTypePtr {
16052    pub fn name_green(self, db: &dyn SyntaxGroup) -> TerminalIdentifierGreen {
16053        let ptr = self.0.lookup_intern(db);
16054        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
16055            TerminalIdentifierGreen(key_fields[0])
16056        } else {
16057            panic!("Unexpected key field query on root.");
16058        }
16059    }
16060}
16061impl TypedStablePtr for TraitItemTypePtr {
16062    type SyntaxNode = TraitItemType;
16063    fn untyped(&self) -> SyntaxStablePtrId {
16064        self.0
16065    }
16066    fn lookup(&self, db: &dyn SyntaxGroup) -> TraitItemType {
16067        TraitItemType::from_syntax_node(db, self.0.lookup(db))
16068    }
16069}
16070impl From<TraitItemTypePtr> for SyntaxStablePtrId {
16071    fn from(ptr: TraitItemTypePtr) -> Self {
16072        ptr.untyped()
16073    }
16074}
16075#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
16076pub struct TraitItemTypeGreen(pub GreenId);
16077impl TypedSyntaxNode for TraitItemType {
16078    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TraitItemType);
16079    type StablePtr = TraitItemTypePtr;
16080    type Green = TraitItemTypeGreen;
16081    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
16082        TraitItemTypeGreen(
16083            Arc::new(GreenNode {
16084                kind: SyntaxKind::TraitItemType,
16085                details: GreenNodeDetails::Node {
16086                    children: vec![
16087                        AttributeList::missing(db).0,
16088                        TerminalType::missing(db).0,
16089                        TerminalIdentifier::missing(db).0,
16090                        OptionWrappedGenericParamList::missing(db).0,
16091                        TerminalSemicolon::missing(db).0,
16092                    ],
16093                    width: TextWidth::default(),
16094                },
16095            })
16096            .intern(db),
16097        )
16098    }
16099    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
16100        let kind = node.kind(db);
16101        assert_eq!(
16102            kind,
16103            SyntaxKind::TraitItemType,
16104            "Unexpected SyntaxKind {:?}. Expected {:?}.",
16105            kind,
16106            SyntaxKind::TraitItemType
16107        );
16108        let children = db.get_children(node.clone());
16109        Self { node, children }
16110    }
16111    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
16112        let kind = node.kind(db);
16113        if kind == SyntaxKind::TraitItemType {
16114            Some(Self::from_syntax_node(db, node))
16115        } else {
16116            None
16117        }
16118    }
16119    fn as_syntax_node(&self) -> SyntaxNode {
16120        self.node.clone()
16121    }
16122    fn stable_ptr(&self) -> Self::StablePtr {
16123        TraitItemTypePtr(self.node.0.stable_ptr)
16124    }
16125}
16126impl From<&TraitItemType> for SyntaxStablePtrId {
16127    fn from(node: &TraitItemType) -> Self {
16128        node.stable_ptr().untyped()
16129    }
16130}
16131#[derive(Clone, Debug, Eq, Hash, PartialEq)]
16132pub struct TraitItemConstant {
16133    node: SyntaxNode,
16134    children: Arc<[SyntaxNode]>,
16135}
16136impl TraitItemConstant {
16137    pub const INDEX_ATTRIBUTES: usize = 0;
16138    pub const INDEX_CONST_KW: usize = 1;
16139    pub const INDEX_NAME: usize = 2;
16140    pub const INDEX_TYPE_CLAUSE: usize = 3;
16141    pub const INDEX_SEMICOLON: usize = 4;
16142    pub fn new_green(
16143        db: &dyn SyntaxGroup,
16144        attributes: AttributeListGreen,
16145        const_kw: TerminalConstGreen,
16146        name: TerminalIdentifierGreen,
16147        type_clause: TypeClauseGreen,
16148        semicolon: TerminalSemicolonGreen,
16149    ) -> TraitItemConstantGreen {
16150        let children: Vec<GreenId> =
16151            vec![attributes.0, const_kw.0, name.0, type_clause.0, semicolon.0];
16152        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
16153        TraitItemConstantGreen(
16154            Arc::new(GreenNode {
16155                kind: SyntaxKind::TraitItemConstant,
16156                details: GreenNodeDetails::Node { children, width },
16157            })
16158            .intern(db),
16159        )
16160    }
16161}
16162impl TraitItemConstant {
16163    pub fn attributes(&self, db: &dyn SyntaxGroup) -> AttributeList {
16164        AttributeList::from_syntax_node(db, self.children[0].clone())
16165    }
16166    pub fn const_kw(&self, db: &dyn SyntaxGroup) -> TerminalConst {
16167        TerminalConst::from_syntax_node(db, self.children[1].clone())
16168    }
16169    pub fn name(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier {
16170        TerminalIdentifier::from_syntax_node(db, self.children[2].clone())
16171    }
16172    pub fn type_clause(&self, db: &dyn SyntaxGroup) -> TypeClause {
16173        TypeClause::from_syntax_node(db, self.children[3].clone())
16174    }
16175    pub fn semicolon(&self, db: &dyn SyntaxGroup) -> TerminalSemicolon {
16176        TerminalSemicolon::from_syntax_node(db, self.children[4].clone())
16177    }
16178}
16179#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
16180pub struct TraitItemConstantPtr(pub SyntaxStablePtrId);
16181impl TraitItemConstantPtr {
16182    pub fn name_green(self, db: &dyn SyntaxGroup) -> TerminalIdentifierGreen {
16183        let ptr = self.0.lookup_intern(db);
16184        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
16185            TerminalIdentifierGreen(key_fields[0])
16186        } else {
16187            panic!("Unexpected key field query on root.");
16188        }
16189    }
16190}
16191impl TypedStablePtr for TraitItemConstantPtr {
16192    type SyntaxNode = TraitItemConstant;
16193    fn untyped(&self) -> SyntaxStablePtrId {
16194        self.0
16195    }
16196    fn lookup(&self, db: &dyn SyntaxGroup) -> TraitItemConstant {
16197        TraitItemConstant::from_syntax_node(db, self.0.lookup(db))
16198    }
16199}
16200impl From<TraitItemConstantPtr> for SyntaxStablePtrId {
16201    fn from(ptr: TraitItemConstantPtr) -> Self {
16202        ptr.untyped()
16203    }
16204}
16205#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
16206pub struct TraitItemConstantGreen(pub GreenId);
16207impl TypedSyntaxNode for TraitItemConstant {
16208    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TraitItemConstant);
16209    type StablePtr = TraitItemConstantPtr;
16210    type Green = TraitItemConstantGreen;
16211    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
16212        TraitItemConstantGreen(
16213            Arc::new(GreenNode {
16214                kind: SyntaxKind::TraitItemConstant,
16215                details: GreenNodeDetails::Node {
16216                    children: vec![
16217                        AttributeList::missing(db).0,
16218                        TerminalConst::missing(db).0,
16219                        TerminalIdentifier::missing(db).0,
16220                        TypeClause::missing(db).0,
16221                        TerminalSemicolon::missing(db).0,
16222                    ],
16223                    width: TextWidth::default(),
16224                },
16225            })
16226            .intern(db),
16227        )
16228    }
16229    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
16230        let kind = node.kind(db);
16231        assert_eq!(
16232            kind,
16233            SyntaxKind::TraitItemConstant,
16234            "Unexpected SyntaxKind {:?}. Expected {:?}.",
16235            kind,
16236            SyntaxKind::TraitItemConstant
16237        );
16238        let children = db.get_children(node.clone());
16239        Self { node, children }
16240    }
16241    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
16242        let kind = node.kind(db);
16243        if kind == SyntaxKind::TraitItemConstant {
16244            Some(Self::from_syntax_node(db, node))
16245        } else {
16246            None
16247        }
16248    }
16249    fn as_syntax_node(&self) -> SyntaxNode {
16250        self.node.clone()
16251    }
16252    fn stable_ptr(&self) -> Self::StablePtr {
16253        TraitItemConstantPtr(self.node.0.stable_ptr)
16254    }
16255}
16256impl From<&TraitItemConstant> for SyntaxStablePtrId {
16257    fn from(node: &TraitItemConstant) -> Self {
16258        node.stable_ptr().untyped()
16259    }
16260}
16261#[derive(Clone, Debug, Eq, Hash, PartialEq)]
16262pub struct TraitItemImpl {
16263    node: SyntaxNode,
16264    children: Arc<[SyntaxNode]>,
16265}
16266impl TraitItemImpl {
16267    pub const INDEX_ATTRIBUTES: usize = 0;
16268    pub const INDEX_IMPL_KW: usize = 1;
16269    pub const INDEX_NAME: usize = 2;
16270    pub const INDEX_COLON: usize = 3;
16271    pub const INDEX_TRAIT_PATH: usize = 4;
16272    pub const INDEX_SEMICOLON: usize = 5;
16273    pub fn new_green(
16274        db: &dyn SyntaxGroup,
16275        attributes: AttributeListGreen,
16276        impl_kw: TerminalImplGreen,
16277        name: TerminalIdentifierGreen,
16278        colon: TerminalColonGreen,
16279        trait_path: ExprPathGreen,
16280        semicolon: TerminalSemicolonGreen,
16281    ) -> TraitItemImplGreen {
16282        let children: Vec<GreenId> =
16283            vec![attributes.0, impl_kw.0, name.0, colon.0, trait_path.0, semicolon.0];
16284        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
16285        TraitItemImplGreen(
16286            Arc::new(GreenNode {
16287                kind: SyntaxKind::TraitItemImpl,
16288                details: GreenNodeDetails::Node { children, width },
16289            })
16290            .intern(db),
16291        )
16292    }
16293}
16294impl TraitItemImpl {
16295    pub fn attributes(&self, db: &dyn SyntaxGroup) -> AttributeList {
16296        AttributeList::from_syntax_node(db, self.children[0].clone())
16297    }
16298    pub fn impl_kw(&self, db: &dyn SyntaxGroup) -> TerminalImpl {
16299        TerminalImpl::from_syntax_node(db, self.children[1].clone())
16300    }
16301    pub fn name(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier {
16302        TerminalIdentifier::from_syntax_node(db, self.children[2].clone())
16303    }
16304    pub fn colon(&self, db: &dyn SyntaxGroup) -> TerminalColon {
16305        TerminalColon::from_syntax_node(db, self.children[3].clone())
16306    }
16307    pub fn trait_path(&self, db: &dyn SyntaxGroup) -> ExprPath {
16308        ExprPath::from_syntax_node(db, self.children[4].clone())
16309    }
16310    pub fn semicolon(&self, db: &dyn SyntaxGroup) -> TerminalSemicolon {
16311        TerminalSemicolon::from_syntax_node(db, self.children[5].clone())
16312    }
16313}
16314#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
16315pub struct TraitItemImplPtr(pub SyntaxStablePtrId);
16316impl TraitItemImplPtr {
16317    pub fn name_green(self, db: &dyn SyntaxGroup) -> TerminalIdentifierGreen {
16318        let ptr = self.0.lookup_intern(db);
16319        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
16320            TerminalIdentifierGreen(key_fields[0])
16321        } else {
16322            panic!("Unexpected key field query on root.");
16323        }
16324    }
16325}
16326impl TypedStablePtr for TraitItemImplPtr {
16327    type SyntaxNode = TraitItemImpl;
16328    fn untyped(&self) -> SyntaxStablePtrId {
16329        self.0
16330    }
16331    fn lookup(&self, db: &dyn SyntaxGroup) -> TraitItemImpl {
16332        TraitItemImpl::from_syntax_node(db, self.0.lookup(db))
16333    }
16334}
16335impl From<TraitItemImplPtr> for SyntaxStablePtrId {
16336    fn from(ptr: TraitItemImplPtr) -> Self {
16337        ptr.untyped()
16338    }
16339}
16340#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
16341pub struct TraitItemImplGreen(pub GreenId);
16342impl TypedSyntaxNode for TraitItemImpl {
16343    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TraitItemImpl);
16344    type StablePtr = TraitItemImplPtr;
16345    type Green = TraitItemImplGreen;
16346    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
16347        TraitItemImplGreen(
16348            Arc::new(GreenNode {
16349                kind: SyntaxKind::TraitItemImpl,
16350                details: GreenNodeDetails::Node {
16351                    children: vec![
16352                        AttributeList::missing(db).0,
16353                        TerminalImpl::missing(db).0,
16354                        TerminalIdentifier::missing(db).0,
16355                        TerminalColon::missing(db).0,
16356                        ExprPath::missing(db).0,
16357                        TerminalSemicolon::missing(db).0,
16358                    ],
16359                    width: TextWidth::default(),
16360                },
16361            })
16362            .intern(db),
16363        )
16364    }
16365    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
16366        let kind = node.kind(db);
16367        assert_eq!(
16368            kind,
16369            SyntaxKind::TraitItemImpl,
16370            "Unexpected SyntaxKind {:?}. Expected {:?}.",
16371            kind,
16372            SyntaxKind::TraitItemImpl
16373        );
16374        let children = db.get_children(node.clone());
16375        Self { node, children }
16376    }
16377    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
16378        let kind = node.kind(db);
16379        if kind == SyntaxKind::TraitItemImpl {
16380            Some(Self::from_syntax_node(db, node))
16381        } else {
16382            None
16383        }
16384    }
16385    fn as_syntax_node(&self) -> SyntaxNode {
16386        self.node.clone()
16387    }
16388    fn stable_ptr(&self) -> Self::StablePtr {
16389        TraitItemImplPtr(self.node.0.stable_ptr)
16390    }
16391}
16392impl From<&TraitItemImpl> for SyntaxStablePtrId {
16393    fn from(node: &TraitItemImpl) -> Self {
16394        node.stable_ptr().untyped()
16395    }
16396}
16397#[derive(Clone, Debug, Eq, Hash, PartialEq)]
16398pub enum MaybeTraitFunctionBody {
16399    Some(ExprBlock),
16400    None(TerminalSemicolon),
16401}
16402#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
16403pub struct MaybeTraitFunctionBodyPtr(pub SyntaxStablePtrId);
16404impl TypedStablePtr for MaybeTraitFunctionBodyPtr {
16405    type SyntaxNode = MaybeTraitFunctionBody;
16406    fn untyped(&self) -> SyntaxStablePtrId {
16407        self.0
16408    }
16409    fn lookup(&self, db: &dyn SyntaxGroup) -> MaybeTraitFunctionBody {
16410        MaybeTraitFunctionBody::from_syntax_node(db, self.0.lookup(db))
16411    }
16412}
16413impl From<MaybeTraitFunctionBodyPtr> for SyntaxStablePtrId {
16414    fn from(ptr: MaybeTraitFunctionBodyPtr) -> Self {
16415        ptr.untyped()
16416    }
16417}
16418impl From<ExprBlockPtr> for MaybeTraitFunctionBodyPtr {
16419    fn from(value: ExprBlockPtr) -> Self {
16420        Self(value.0)
16421    }
16422}
16423impl From<TerminalSemicolonPtr> for MaybeTraitFunctionBodyPtr {
16424    fn from(value: TerminalSemicolonPtr) -> Self {
16425        Self(value.0)
16426    }
16427}
16428impl From<ExprBlockGreen> for MaybeTraitFunctionBodyGreen {
16429    fn from(value: ExprBlockGreen) -> Self {
16430        Self(value.0)
16431    }
16432}
16433impl From<TerminalSemicolonGreen> for MaybeTraitFunctionBodyGreen {
16434    fn from(value: TerminalSemicolonGreen) -> Self {
16435        Self(value.0)
16436    }
16437}
16438#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
16439pub struct MaybeTraitFunctionBodyGreen(pub GreenId);
16440impl TypedSyntaxNode for MaybeTraitFunctionBody {
16441    const OPTIONAL_KIND: Option<SyntaxKind> = None;
16442    type StablePtr = MaybeTraitFunctionBodyPtr;
16443    type Green = MaybeTraitFunctionBodyGreen;
16444    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
16445        panic!("No missing variant.");
16446    }
16447    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
16448        let kind = node.kind(db);
16449        match kind {
16450            SyntaxKind::ExprBlock => {
16451                MaybeTraitFunctionBody::Some(ExprBlock::from_syntax_node(db, node))
16452            }
16453            SyntaxKind::TerminalSemicolon => {
16454                MaybeTraitFunctionBody::None(TerminalSemicolon::from_syntax_node(db, node))
16455            }
16456            _ => panic!(
16457                "Unexpected syntax kind {:?} when constructing {}.",
16458                kind, "MaybeTraitFunctionBody"
16459            ),
16460        }
16461    }
16462    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
16463        let kind = node.kind(db);
16464        match kind {
16465            SyntaxKind::ExprBlock => {
16466                Some(MaybeTraitFunctionBody::Some(ExprBlock::from_syntax_node(db, node)))
16467            }
16468            SyntaxKind::TerminalSemicolon => {
16469                Some(MaybeTraitFunctionBody::None(TerminalSemicolon::from_syntax_node(db, node)))
16470            }
16471            _ => None,
16472        }
16473    }
16474    fn as_syntax_node(&self) -> SyntaxNode {
16475        match self {
16476            MaybeTraitFunctionBody::Some(x) => x.as_syntax_node(),
16477            MaybeTraitFunctionBody::None(x) => x.as_syntax_node(),
16478        }
16479    }
16480    fn stable_ptr(&self) -> Self::StablePtr {
16481        MaybeTraitFunctionBodyPtr(self.as_syntax_node().0.stable_ptr)
16482    }
16483}
16484impl From<&MaybeTraitFunctionBody> for SyntaxStablePtrId {
16485    fn from(node: &MaybeTraitFunctionBody) -> Self {
16486        node.stable_ptr().untyped()
16487    }
16488}
16489impl MaybeTraitFunctionBody {
16490    /// Checks if a kind of a variant of [MaybeTraitFunctionBody].
16491    pub fn is_variant(kind: SyntaxKind) -> bool {
16492        matches!(kind, SyntaxKind::ExprBlock | SyntaxKind::TerminalSemicolon)
16493    }
16494}
16495#[derive(Clone, Debug, Eq, Hash, PartialEq)]
16496pub struct ItemImpl {
16497    node: SyntaxNode,
16498    children: Arc<[SyntaxNode]>,
16499}
16500impl ItemImpl {
16501    pub const INDEX_ATTRIBUTES: usize = 0;
16502    pub const INDEX_VISIBILITY: usize = 1;
16503    pub const INDEX_IMPL_KW: usize = 2;
16504    pub const INDEX_NAME: usize = 3;
16505    pub const INDEX_GENERIC_PARAMS: usize = 4;
16506    pub const INDEX_OF_KW: usize = 5;
16507    pub const INDEX_TRAIT_PATH: usize = 6;
16508    pub const INDEX_BODY: usize = 7;
16509    pub fn new_green(
16510        db: &dyn SyntaxGroup,
16511        attributes: AttributeListGreen,
16512        visibility: VisibilityGreen,
16513        impl_kw: TerminalImplGreen,
16514        name: TerminalIdentifierGreen,
16515        generic_params: OptionWrappedGenericParamListGreen,
16516        of_kw: TerminalOfGreen,
16517        trait_path: ExprPathGreen,
16518        body: MaybeImplBodyGreen,
16519    ) -> ItemImplGreen {
16520        let children: Vec<GreenId> = vec![
16521            attributes.0,
16522            visibility.0,
16523            impl_kw.0,
16524            name.0,
16525            generic_params.0,
16526            of_kw.0,
16527            trait_path.0,
16528            body.0,
16529        ];
16530        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
16531        ItemImplGreen(
16532            Arc::new(GreenNode {
16533                kind: SyntaxKind::ItemImpl,
16534                details: GreenNodeDetails::Node { children, width },
16535            })
16536            .intern(db),
16537        )
16538    }
16539}
16540impl ItemImpl {
16541    pub fn attributes(&self, db: &dyn SyntaxGroup) -> AttributeList {
16542        AttributeList::from_syntax_node(db, self.children[0].clone())
16543    }
16544    pub fn visibility(&self, db: &dyn SyntaxGroup) -> Visibility {
16545        Visibility::from_syntax_node(db, self.children[1].clone())
16546    }
16547    pub fn impl_kw(&self, db: &dyn SyntaxGroup) -> TerminalImpl {
16548        TerminalImpl::from_syntax_node(db, self.children[2].clone())
16549    }
16550    pub fn name(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier {
16551        TerminalIdentifier::from_syntax_node(db, self.children[3].clone())
16552    }
16553    pub fn generic_params(&self, db: &dyn SyntaxGroup) -> OptionWrappedGenericParamList {
16554        OptionWrappedGenericParamList::from_syntax_node(db, self.children[4].clone())
16555    }
16556    pub fn of_kw(&self, db: &dyn SyntaxGroup) -> TerminalOf {
16557        TerminalOf::from_syntax_node(db, self.children[5].clone())
16558    }
16559    pub fn trait_path(&self, db: &dyn SyntaxGroup) -> ExprPath {
16560        ExprPath::from_syntax_node(db, self.children[6].clone())
16561    }
16562    pub fn body(&self, db: &dyn SyntaxGroup) -> MaybeImplBody {
16563        MaybeImplBody::from_syntax_node(db, self.children[7].clone())
16564    }
16565}
16566#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
16567pub struct ItemImplPtr(pub SyntaxStablePtrId);
16568impl ItemImplPtr {
16569    pub fn name_green(self, db: &dyn SyntaxGroup) -> TerminalIdentifierGreen {
16570        let ptr = self.0.lookup_intern(db);
16571        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
16572            TerminalIdentifierGreen(key_fields[0])
16573        } else {
16574            panic!("Unexpected key field query on root.");
16575        }
16576    }
16577}
16578impl TypedStablePtr for ItemImplPtr {
16579    type SyntaxNode = ItemImpl;
16580    fn untyped(&self) -> SyntaxStablePtrId {
16581        self.0
16582    }
16583    fn lookup(&self, db: &dyn SyntaxGroup) -> ItemImpl {
16584        ItemImpl::from_syntax_node(db, self.0.lookup(db))
16585    }
16586}
16587impl From<ItemImplPtr> for SyntaxStablePtrId {
16588    fn from(ptr: ItemImplPtr) -> Self {
16589        ptr.untyped()
16590    }
16591}
16592#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
16593pub struct ItemImplGreen(pub GreenId);
16594impl TypedSyntaxNode for ItemImpl {
16595    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemImpl);
16596    type StablePtr = ItemImplPtr;
16597    type Green = ItemImplGreen;
16598    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
16599        ItemImplGreen(
16600            Arc::new(GreenNode {
16601                kind: SyntaxKind::ItemImpl,
16602                details: GreenNodeDetails::Node {
16603                    children: vec![
16604                        AttributeList::missing(db).0,
16605                        Visibility::missing(db).0,
16606                        TerminalImpl::missing(db).0,
16607                        TerminalIdentifier::missing(db).0,
16608                        OptionWrappedGenericParamList::missing(db).0,
16609                        TerminalOf::missing(db).0,
16610                        ExprPath::missing(db).0,
16611                        MaybeImplBody::missing(db).0,
16612                    ],
16613                    width: TextWidth::default(),
16614                },
16615            })
16616            .intern(db),
16617        )
16618    }
16619    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
16620        let kind = node.kind(db);
16621        assert_eq!(
16622            kind,
16623            SyntaxKind::ItemImpl,
16624            "Unexpected SyntaxKind {:?}. Expected {:?}.",
16625            kind,
16626            SyntaxKind::ItemImpl
16627        );
16628        let children = db.get_children(node.clone());
16629        Self { node, children }
16630    }
16631    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
16632        let kind = node.kind(db);
16633        if kind == SyntaxKind::ItemImpl { Some(Self::from_syntax_node(db, node)) } else { None }
16634    }
16635    fn as_syntax_node(&self) -> SyntaxNode {
16636        self.node.clone()
16637    }
16638    fn stable_ptr(&self) -> Self::StablePtr {
16639        ItemImplPtr(self.node.0.stable_ptr)
16640    }
16641}
16642impl From<&ItemImpl> for SyntaxStablePtrId {
16643    fn from(node: &ItemImpl) -> Self {
16644        node.stable_ptr().untyped()
16645    }
16646}
16647#[derive(Clone, Debug, Eq, Hash, PartialEq)]
16648pub struct ItemInlineMacro {
16649    node: SyntaxNode,
16650    children: Arc<[SyntaxNode]>,
16651}
16652impl ItemInlineMacro {
16653    pub const INDEX_ATTRIBUTES: usize = 0;
16654    pub const INDEX_NAME: usize = 1;
16655    pub const INDEX_BANG: usize = 2;
16656    pub const INDEX_ARGUMENTS: usize = 3;
16657    pub const INDEX_SEMICOLON: usize = 4;
16658    pub fn new_green(
16659        db: &dyn SyntaxGroup,
16660        attributes: AttributeListGreen,
16661        name: TerminalIdentifierGreen,
16662        bang: TerminalNotGreen,
16663        arguments: WrappedArgListGreen,
16664        semicolon: TerminalSemicolonGreen,
16665    ) -> ItemInlineMacroGreen {
16666        let children: Vec<GreenId> = vec![attributes.0, name.0, bang.0, arguments.0, semicolon.0];
16667        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
16668        ItemInlineMacroGreen(
16669            Arc::new(GreenNode {
16670                kind: SyntaxKind::ItemInlineMacro,
16671                details: GreenNodeDetails::Node { children, width },
16672            })
16673            .intern(db),
16674        )
16675    }
16676}
16677impl ItemInlineMacro {
16678    pub fn attributes(&self, db: &dyn SyntaxGroup) -> AttributeList {
16679        AttributeList::from_syntax_node(db, self.children[0].clone())
16680    }
16681    pub fn name(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier {
16682        TerminalIdentifier::from_syntax_node(db, self.children[1].clone())
16683    }
16684    pub fn bang(&self, db: &dyn SyntaxGroup) -> TerminalNot {
16685        TerminalNot::from_syntax_node(db, self.children[2].clone())
16686    }
16687    pub fn arguments(&self, db: &dyn SyntaxGroup) -> WrappedArgList {
16688        WrappedArgList::from_syntax_node(db, self.children[3].clone())
16689    }
16690    pub fn semicolon(&self, db: &dyn SyntaxGroup) -> TerminalSemicolon {
16691        TerminalSemicolon::from_syntax_node(db, self.children[4].clone())
16692    }
16693}
16694#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
16695pub struct ItemInlineMacroPtr(pub SyntaxStablePtrId);
16696impl ItemInlineMacroPtr {}
16697impl TypedStablePtr for ItemInlineMacroPtr {
16698    type SyntaxNode = ItemInlineMacro;
16699    fn untyped(&self) -> SyntaxStablePtrId {
16700        self.0
16701    }
16702    fn lookup(&self, db: &dyn SyntaxGroup) -> ItemInlineMacro {
16703        ItemInlineMacro::from_syntax_node(db, self.0.lookup(db))
16704    }
16705}
16706impl From<ItemInlineMacroPtr> for SyntaxStablePtrId {
16707    fn from(ptr: ItemInlineMacroPtr) -> Self {
16708        ptr.untyped()
16709    }
16710}
16711#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
16712pub struct ItemInlineMacroGreen(pub GreenId);
16713impl TypedSyntaxNode for ItemInlineMacro {
16714    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemInlineMacro);
16715    type StablePtr = ItemInlineMacroPtr;
16716    type Green = ItemInlineMacroGreen;
16717    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
16718        ItemInlineMacroGreen(
16719            Arc::new(GreenNode {
16720                kind: SyntaxKind::ItemInlineMacro,
16721                details: GreenNodeDetails::Node {
16722                    children: vec![
16723                        AttributeList::missing(db).0,
16724                        TerminalIdentifier::missing(db).0,
16725                        TerminalNot::missing(db).0,
16726                        WrappedArgList::missing(db).0,
16727                        TerminalSemicolon::missing(db).0,
16728                    ],
16729                    width: TextWidth::default(),
16730                },
16731            })
16732            .intern(db),
16733        )
16734    }
16735    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
16736        let kind = node.kind(db);
16737        assert_eq!(
16738            kind,
16739            SyntaxKind::ItemInlineMacro,
16740            "Unexpected SyntaxKind {:?}. Expected {:?}.",
16741            kind,
16742            SyntaxKind::ItemInlineMacro
16743        );
16744        let children = db.get_children(node.clone());
16745        Self { node, children }
16746    }
16747    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
16748        let kind = node.kind(db);
16749        if kind == SyntaxKind::ItemInlineMacro {
16750            Some(Self::from_syntax_node(db, node))
16751        } else {
16752            None
16753        }
16754    }
16755    fn as_syntax_node(&self) -> SyntaxNode {
16756        self.node.clone()
16757    }
16758    fn stable_ptr(&self) -> Self::StablePtr {
16759        ItemInlineMacroPtr(self.node.0.stable_ptr)
16760    }
16761}
16762impl From<&ItemInlineMacro> for SyntaxStablePtrId {
16763    fn from(node: &ItemInlineMacro) -> Self {
16764        node.stable_ptr().untyped()
16765    }
16766}
16767#[derive(Clone, Debug, Eq, Hash, PartialEq)]
16768pub struct ItemHeaderDoc {
16769    node: SyntaxNode,
16770    children: Arc<[SyntaxNode]>,
16771}
16772impl ItemHeaderDoc {
16773    pub const INDEX_EMPTY: usize = 0;
16774    pub fn new_green(db: &dyn SyntaxGroup, empty: TerminalEmptyGreen) -> ItemHeaderDocGreen {
16775        let children: Vec<GreenId> = vec![empty.0];
16776        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
16777        ItemHeaderDocGreen(
16778            Arc::new(GreenNode {
16779                kind: SyntaxKind::ItemHeaderDoc,
16780                details: GreenNodeDetails::Node { children, width },
16781            })
16782            .intern(db),
16783        )
16784    }
16785}
16786impl ItemHeaderDoc {
16787    pub fn empty(&self, db: &dyn SyntaxGroup) -> TerminalEmpty {
16788        TerminalEmpty::from_syntax_node(db, self.children[0].clone())
16789    }
16790}
16791#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
16792pub struct ItemHeaderDocPtr(pub SyntaxStablePtrId);
16793impl ItemHeaderDocPtr {}
16794impl TypedStablePtr for ItemHeaderDocPtr {
16795    type SyntaxNode = ItemHeaderDoc;
16796    fn untyped(&self) -> SyntaxStablePtrId {
16797        self.0
16798    }
16799    fn lookup(&self, db: &dyn SyntaxGroup) -> ItemHeaderDoc {
16800        ItemHeaderDoc::from_syntax_node(db, self.0.lookup(db))
16801    }
16802}
16803impl From<ItemHeaderDocPtr> for SyntaxStablePtrId {
16804    fn from(ptr: ItemHeaderDocPtr) -> Self {
16805        ptr.untyped()
16806    }
16807}
16808#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
16809pub struct ItemHeaderDocGreen(pub GreenId);
16810impl TypedSyntaxNode for ItemHeaderDoc {
16811    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemHeaderDoc);
16812    type StablePtr = ItemHeaderDocPtr;
16813    type Green = ItemHeaderDocGreen;
16814    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
16815        ItemHeaderDocGreen(
16816            Arc::new(GreenNode {
16817                kind: SyntaxKind::ItemHeaderDoc,
16818                details: GreenNodeDetails::Node {
16819                    children: vec![TerminalEmpty::missing(db).0],
16820                    width: TextWidth::default(),
16821                },
16822            })
16823            .intern(db),
16824        )
16825    }
16826    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
16827        let kind = node.kind(db);
16828        assert_eq!(
16829            kind,
16830            SyntaxKind::ItemHeaderDoc,
16831            "Unexpected SyntaxKind {:?}. Expected {:?}.",
16832            kind,
16833            SyntaxKind::ItemHeaderDoc
16834        );
16835        let children = db.get_children(node.clone());
16836        Self { node, children }
16837    }
16838    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
16839        let kind = node.kind(db);
16840        if kind == SyntaxKind::ItemHeaderDoc {
16841            Some(Self::from_syntax_node(db, node))
16842        } else {
16843            None
16844        }
16845    }
16846    fn as_syntax_node(&self) -> SyntaxNode {
16847        self.node.clone()
16848    }
16849    fn stable_ptr(&self) -> Self::StablePtr {
16850        ItemHeaderDocPtr(self.node.0.stable_ptr)
16851    }
16852}
16853impl From<&ItemHeaderDoc> for SyntaxStablePtrId {
16854    fn from(node: &ItemHeaderDoc) -> Self {
16855        node.stable_ptr().untyped()
16856    }
16857}
16858#[derive(Clone, Debug, Eq, Hash, PartialEq)]
16859pub enum MaybeImplBody {
16860    Some(ImplBody),
16861    None(TerminalSemicolon),
16862}
16863#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
16864pub struct MaybeImplBodyPtr(pub SyntaxStablePtrId);
16865impl TypedStablePtr for MaybeImplBodyPtr {
16866    type SyntaxNode = MaybeImplBody;
16867    fn untyped(&self) -> SyntaxStablePtrId {
16868        self.0
16869    }
16870    fn lookup(&self, db: &dyn SyntaxGroup) -> MaybeImplBody {
16871        MaybeImplBody::from_syntax_node(db, self.0.lookup(db))
16872    }
16873}
16874impl From<MaybeImplBodyPtr> for SyntaxStablePtrId {
16875    fn from(ptr: MaybeImplBodyPtr) -> Self {
16876        ptr.untyped()
16877    }
16878}
16879impl From<ImplBodyPtr> for MaybeImplBodyPtr {
16880    fn from(value: ImplBodyPtr) -> Self {
16881        Self(value.0)
16882    }
16883}
16884impl From<TerminalSemicolonPtr> for MaybeImplBodyPtr {
16885    fn from(value: TerminalSemicolonPtr) -> Self {
16886        Self(value.0)
16887    }
16888}
16889impl From<ImplBodyGreen> for MaybeImplBodyGreen {
16890    fn from(value: ImplBodyGreen) -> Self {
16891        Self(value.0)
16892    }
16893}
16894impl From<TerminalSemicolonGreen> for MaybeImplBodyGreen {
16895    fn from(value: TerminalSemicolonGreen) -> Self {
16896        Self(value.0)
16897    }
16898}
16899#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
16900pub struct MaybeImplBodyGreen(pub GreenId);
16901impl TypedSyntaxNode for MaybeImplBody {
16902    const OPTIONAL_KIND: Option<SyntaxKind> = None;
16903    type StablePtr = MaybeImplBodyPtr;
16904    type Green = MaybeImplBodyGreen;
16905    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
16906        panic!("No missing variant.");
16907    }
16908    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
16909        let kind = node.kind(db);
16910        match kind {
16911            SyntaxKind::ImplBody => MaybeImplBody::Some(ImplBody::from_syntax_node(db, node)),
16912            SyntaxKind::TerminalSemicolon => {
16913                MaybeImplBody::None(TerminalSemicolon::from_syntax_node(db, node))
16914            }
16915            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "MaybeImplBody"),
16916        }
16917    }
16918    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
16919        let kind = node.kind(db);
16920        match kind {
16921            SyntaxKind::ImplBody => Some(MaybeImplBody::Some(ImplBody::from_syntax_node(db, node))),
16922            SyntaxKind::TerminalSemicolon => {
16923                Some(MaybeImplBody::None(TerminalSemicolon::from_syntax_node(db, node)))
16924            }
16925            _ => None,
16926        }
16927    }
16928    fn as_syntax_node(&self) -> SyntaxNode {
16929        match self {
16930            MaybeImplBody::Some(x) => x.as_syntax_node(),
16931            MaybeImplBody::None(x) => x.as_syntax_node(),
16932        }
16933    }
16934    fn stable_ptr(&self) -> Self::StablePtr {
16935        MaybeImplBodyPtr(self.as_syntax_node().0.stable_ptr)
16936    }
16937}
16938impl From<&MaybeImplBody> for SyntaxStablePtrId {
16939    fn from(node: &MaybeImplBody) -> Self {
16940        node.stable_ptr().untyped()
16941    }
16942}
16943impl MaybeImplBody {
16944    /// Checks if a kind of a variant of [MaybeImplBody].
16945    pub fn is_variant(kind: SyntaxKind) -> bool {
16946        matches!(kind, SyntaxKind::ImplBody | SyntaxKind::TerminalSemicolon)
16947    }
16948}
16949#[derive(Clone, Debug, Eq, Hash, PartialEq)]
16950pub struct ImplBody {
16951    node: SyntaxNode,
16952    children: Arc<[SyntaxNode]>,
16953}
16954impl ImplBody {
16955    pub const INDEX_LBRACE: usize = 0;
16956    pub const INDEX_ITEMS: usize = 1;
16957    pub const INDEX_RBRACE: usize = 2;
16958    pub fn new_green(
16959        db: &dyn SyntaxGroup,
16960        lbrace: TerminalLBraceGreen,
16961        items: ImplItemListGreen,
16962        rbrace: TerminalRBraceGreen,
16963    ) -> ImplBodyGreen {
16964        let children: Vec<GreenId> = vec![lbrace.0, items.0, rbrace.0];
16965        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
16966        ImplBodyGreen(
16967            Arc::new(GreenNode {
16968                kind: SyntaxKind::ImplBody,
16969                details: GreenNodeDetails::Node { children, width },
16970            })
16971            .intern(db),
16972        )
16973    }
16974}
16975impl ImplBody {
16976    pub fn lbrace(&self, db: &dyn SyntaxGroup) -> TerminalLBrace {
16977        TerminalLBrace::from_syntax_node(db, self.children[0].clone())
16978    }
16979    pub fn items(&self, db: &dyn SyntaxGroup) -> ImplItemList {
16980        ImplItemList::from_syntax_node(db, self.children[1].clone())
16981    }
16982    pub fn rbrace(&self, db: &dyn SyntaxGroup) -> TerminalRBrace {
16983        TerminalRBrace::from_syntax_node(db, self.children[2].clone())
16984    }
16985}
16986#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
16987pub struct ImplBodyPtr(pub SyntaxStablePtrId);
16988impl ImplBodyPtr {}
16989impl TypedStablePtr for ImplBodyPtr {
16990    type SyntaxNode = ImplBody;
16991    fn untyped(&self) -> SyntaxStablePtrId {
16992        self.0
16993    }
16994    fn lookup(&self, db: &dyn SyntaxGroup) -> ImplBody {
16995        ImplBody::from_syntax_node(db, self.0.lookup(db))
16996    }
16997}
16998impl From<ImplBodyPtr> for SyntaxStablePtrId {
16999    fn from(ptr: ImplBodyPtr) -> Self {
17000        ptr.untyped()
17001    }
17002}
17003#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
17004pub struct ImplBodyGreen(pub GreenId);
17005impl TypedSyntaxNode for ImplBody {
17006    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ImplBody);
17007    type StablePtr = ImplBodyPtr;
17008    type Green = ImplBodyGreen;
17009    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
17010        ImplBodyGreen(
17011            Arc::new(GreenNode {
17012                kind: SyntaxKind::ImplBody,
17013                details: GreenNodeDetails::Node {
17014                    children: vec![
17015                        TerminalLBrace::missing(db).0,
17016                        ImplItemList::missing(db).0,
17017                        TerminalRBrace::missing(db).0,
17018                    ],
17019                    width: TextWidth::default(),
17020                },
17021            })
17022            .intern(db),
17023        )
17024    }
17025    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
17026        let kind = node.kind(db);
17027        assert_eq!(
17028            kind,
17029            SyntaxKind::ImplBody,
17030            "Unexpected SyntaxKind {:?}. Expected {:?}.",
17031            kind,
17032            SyntaxKind::ImplBody
17033        );
17034        let children = db.get_children(node.clone());
17035        Self { node, children }
17036    }
17037    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
17038        let kind = node.kind(db);
17039        if kind == SyntaxKind::ImplBody { Some(Self::from_syntax_node(db, node)) } else { None }
17040    }
17041    fn as_syntax_node(&self) -> SyntaxNode {
17042        self.node.clone()
17043    }
17044    fn stable_ptr(&self) -> Self::StablePtr {
17045        ImplBodyPtr(self.node.0.stable_ptr)
17046    }
17047}
17048impl From<&ImplBody> for SyntaxStablePtrId {
17049    fn from(node: &ImplBody) -> Self {
17050        node.stable_ptr().untyped()
17051    }
17052}
17053#[derive(Clone, Debug, Eq, Hash, PartialEq)]
17054pub struct ImplItemList(ElementList<ImplItem, 1>);
17055impl Deref for ImplItemList {
17056    type Target = ElementList<ImplItem, 1>;
17057    fn deref(&self) -> &Self::Target {
17058        &self.0
17059    }
17060}
17061impl ImplItemList {
17062    pub fn new_green(db: &dyn SyntaxGroup, children: Vec<ImplItemGreen>) -> ImplItemListGreen {
17063        let width = children.iter().map(|id| id.0.lookup_intern(db).width()).sum();
17064        ImplItemListGreen(
17065            Arc::new(GreenNode {
17066                kind: SyntaxKind::ImplItemList,
17067                details: GreenNodeDetails::Node {
17068                    children: children.iter().map(|x| x.0).collect(),
17069                    width,
17070                },
17071            })
17072            .intern(db),
17073        )
17074    }
17075}
17076#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
17077pub struct ImplItemListPtr(pub SyntaxStablePtrId);
17078impl TypedStablePtr for ImplItemListPtr {
17079    type SyntaxNode = ImplItemList;
17080    fn untyped(&self) -> SyntaxStablePtrId {
17081        self.0
17082    }
17083    fn lookup(&self, db: &dyn SyntaxGroup) -> ImplItemList {
17084        ImplItemList::from_syntax_node(db, self.0.lookup(db))
17085    }
17086}
17087impl From<ImplItemListPtr> for SyntaxStablePtrId {
17088    fn from(ptr: ImplItemListPtr) -> Self {
17089        ptr.untyped()
17090    }
17091}
17092#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
17093pub struct ImplItemListGreen(pub GreenId);
17094impl TypedSyntaxNode for ImplItemList {
17095    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ImplItemList);
17096    type StablePtr = ImplItemListPtr;
17097    type Green = ImplItemListGreen;
17098    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
17099        ImplItemListGreen(
17100            Arc::new(GreenNode {
17101                kind: SyntaxKind::ImplItemList,
17102                details: GreenNodeDetails::Node { children: vec![], width: TextWidth::default() },
17103            })
17104            .intern(db),
17105        )
17106    }
17107    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
17108        Self(ElementList::new(node))
17109    }
17110    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
17111        if node.kind(db) == SyntaxKind::ImplItemList {
17112            Some(Self(ElementList::new(node)))
17113        } else {
17114            None
17115        }
17116    }
17117    fn as_syntax_node(&self) -> SyntaxNode {
17118        self.node.clone()
17119    }
17120    fn stable_ptr(&self) -> Self::StablePtr {
17121        ImplItemListPtr(self.node.0.stable_ptr)
17122    }
17123}
17124impl From<&ImplItemList> for SyntaxStablePtrId {
17125    fn from(node: &ImplItemList) -> Self {
17126        node.stable_ptr().untyped()
17127    }
17128}
17129#[derive(Clone, Debug, Eq, Hash, PartialEq)]
17130pub enum ImplItem {
17131    Function(FunctionWithBody),
17132    Type(ItemTypeAlias),
17133    Constant(ItemConstant),
17134    Impl(ItemImplAlias),
17135    Module(ItemModule),
17136    Use(ItemUse),
17137    ExternFunction(ItemExternFunction),
17138    ExternType(ItemExternType),
17139    Trait(ItemTrait),
17140    Struct(ItemStruct),
17141    Enum(ItemEnum),
17142    Missing(ImplItemMissing),
17143}
17144#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
17145pub struct ImplItemPtr(pub SyntaxStablePtrId);
17146impl TypedStablePtr for ImplItemPtr {
17147    type SyntaxNode = ImplItem;
17148    fn untyped(&self) -> SyntaxStablePtrId {
17149        self.0
17150    }
17151    fn lookup(&self, db: &dyn SyntaxGroup) -> ImplItem {
17152        ImplItem::from_syntax_node(db, self.0.lookup(db))
17153    }
17154}
17155impl From<ImplItemPtr> for SyntaxStablePtrId {
17156    fn from(ptr: ImplItemPtr) -> Self {
17157        ptr.untyped()
17158    }
17159}
17160impl From<FunctionWithBodyPtr> for ImplItemPtr {
17161    fn from(value: FunctionWithBodyPtr) -> Self {
17162        Self(value.0)
17163    }
17164}
17165impl From<ItemTypeAliasPtr> for ImplItemPtr {
17166    fn from(value: ItemTypeAliasPtr) -> Self {
17167        Self(value.0)
17168    }
17169}
17170impl From<ItemConstantPtr> for ImplItemPtr {
17171    fn from(value: ItemConstantPtr) -> Self {
17172        Self(value.0)
17173    }
17174}
17175impl From<ItemImplAliasPtr> for ImplItemPtr {
17176    fn from(value: ItemImplAliasPtr) -> Self {
17177        Self(value.0)
17178    }
17179}
17180impl From<ItemModulePtr> for ImplItemPtr {
17181    fn from(value: ItemModulePtr) -> Self {
17182        Self(value.0)
17183    }
17184}
17185impl From<ItemUsePtr> for ImplItemPtr {
17186    fn from(value: ItemUsePtr) -> Self {
17187        Self(value.0)
17188    }
17189}
17190impl From<ItemExternFunctionPtr> for ImplItemPtr {
17191    fn from(value: ItemExternFunctionPtr) -> Self {
17192        Self(value.0)
17193    }
17194}
17195impl From<ItemExternTypePtr> for ImplItemPtr {
17196    fn from(value: ItemExternTypePtr) -> Self {
17197        Self(value.0)
17198    }
17199}
17200impl From<ItemTraitPtr> for ImplItemPtr {
17201    fn from(value: ItemTraitPtr) -> Self {
17202        Self(value.0)
17203    }
17204}
17205impl From<ItemStructPtr> for ImplItemPtr {
17206    fn from(value: ItemStructPtr) -> Self {
17207        Self(value.0)
17208    }
17209}
17210impl From<ItemEnumPtr> for ImplItemPtr {
17211    fn from(value: ItemEnumPtr) -> Self {
17212        Self(value.0)
17213    }
17214}
17215impl From<ImplItemMissingPtr> for ImplItemPtr {
17216    fn from(value: ImplItemMissingPtr) -> Self {
17217        Self(value.0)
17218    }
17219}
17220impl From<FunctionWithBodyGreen> for ImplItemGreen {
17221    fn from(value: FunctionWithBodyGreen) -> Self {
17222        Self(value.0)
17223    }
17224}
17225impl From<ItemTypeAliasGreen> for ImplItemGreen {
17226    fn from(value: ItemTypeAliasGreen) -> Self {
17227        Self(value.0)
17228    }
17229}
17230impl From<ItemConstantGreen> for ImplItemGreen {
17231    fn from(value: ItemConstantGreen) -> Self {
17232        Self(value.0)
17233    }
17234}
17235impl From<ItemImplAliasGreen> for ImplItemGreen {
17236    fn from(value: ItemImplAliasGreen) -> Self {
17237        Self(value.0)
17238    }
17239}
17240impl From<ItemModuleGreen> for ImplItemGreen {
17241    fn from(value: ItemModuleGreen) -> Self {
17242        Self(value.0)
17243    }
17244}
17245impl From<ItemUseGreen> for ImplItemGreen {
17246    fn from(value: ItemUseGreen) -> Self {
17247        Self(value.0)
17248    }
17249}
17250impl From<ItemExternFunctionGreen> for ImplItemGreen {
17251    fn from(value: ItemExternFunctionGreen) -> Self {
17252        Self(value.0)
17253    }
17254}
17255impl From<ItemExternTypeGreen> for ImplItemGreen {
17256    fn from(value: ItemExternTypeGreen) -> Self {
17257        Self(value.0)
17258    }
17259}
17260impl From<ItemTraitGreen> for ImplItemGreen {
17261    fn from(value: ItemTraitGreen) -> Self {
17262        Self(value.0)
17263    }
17264}
17265impl From<ItemStructGreen> for ImplItemGreen {
17266    fn from(value: ItemStructGreen) -> Self {
17267        Self(value.0)
17268    }
17269}
17270impl From<ItemEnumGreen> for ImplItemGreen {
17271    fn from(value: ItemEnumGreen) -> Self {
17272        Self(value.0)
17273    }
17274}
17275impl From<ImplItemMissingGreen> for ImplItemGreen {
17276    fn from(value: ImplItemMissingGreen) -> Self {
17277        Self(value.0)
17278    }
17279}
17280#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
17281pub struct ImplItemGreen(pub GreenId);
17282impl TypedSyntaxNode for ImplItem {
17283    const OPTIONAL_KIND: Option<SyntaxKind> = None;
17284    type StablePtr = ImplItemPtr;
17285    type Green = ImplItemGreen;
17286    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
17287        ImplItemGreen(ImplItemMissing::missing(db).0)
17288    }
17289    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
17290        let kind = node.kind(db);
17291        match kind {
17292            SyntaxKind::FunctionWithBody => {
17293                ImplItem::Function(FunctionWithBody::from_syntax_node(db, node))
17294            }
17295            SyntaxKind::ItemTypeAlias => ImplItem::Type(ItemTypeAlias::from_syntax_node(db, node)),
17296            SyntaxKind::ItemConstant => {
17297                ImplItem::Constant(ItemConstant::from_syntax_node(db, node))
17298            }
17299            SyntaxKind::ItemImplAlias => ImplItem::Impl(ItemImplAlias::from_syntax_node(db, node)),
17300            SyntaxKind::ItemModule => ImplItem::Module(ItemModule::from_syntax_node(db, node)),
17301            SyntaxKind::ItemUse => ImplItem::Use(ItemUse::from_syntax_node(db, node)),
17302            SyntaxKind::ItemExternFunction => {
17303                ImplItem::ExternFunction(ItemExternFunction::from_syntax_node(db, node))
17304            }
17305            SyntaxKind::ItemExternType => {
17306                ImplItem::ExternType(ItemExternType::from_syntax_node(db, node))
17307            }
17308            SyntaxKind::ItemTrait => ImplItem::Trait(ItemTrait::from_syntax_node(db, node)),
17309            SyntaxKind::ItemStruct => ImplItem::Struct(ItemStruct::from_syntax_node(db, node)),
17310            SyntaxKind::ItemEnum => ImplItem::Enum(ItemEnum::from_syntax_node(db, node)),
17311            SyntaxKind::ImplItemMissing => {
17312                ImplItem::Missing(ImplItemMissing::from_syntax_node(db, node))
17313            }
17314            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "ImplItem"),
17315        }
17316    }
17317    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
17318        let kind = node.kind(db);
17319        match kind {
17320            SyntaxKind::FunctionWithBody => {
17321                Some(ImplItem::Function(FunctionWithBody::from_syntax_node(db, node)))
17322            }
17323            SyntaxKind::ItemTypeAlias => {
17324                Some(ImplItem::Type(ItemTypeAlias::from_syntax_node(db, node)))
17325            }
17326            SyntaxKind::ItemConstant => {
17327                Some(ImplItem::Constant(ItemConstant::from_syntax_node(db, node)))
17328            }
17329            SyntaxKind::ItemImplAlias => {
17330                Some(ImplItem::Impl(ItemImplAlias::from_syntax_node(db, node)))
17331            }
17332            SyntaxKind::ItemModule => {
17333                Some(ImplItem::Module(ItemModule::from_syntax_node(db, node)))
17334            }
17335            SyntaxKind::ItemUse => Some(ImplItem::Use(ItemUse::from_syntax_node(db, node))),
17336            SyntaxKind::ItemExternFunction => {
17337                Some(ImplItem::ExternFunction(ItemExternFunction::from_syntax_node(db, node)))
17338            }
17339            SyntaxKind::ItemExternType => {
17340                Some(ImplItem::ExternType(ItemExternType::from_syntax_node(db, node)))
17341            }
17342            SyntaxKind::ItemTrait => Some(ImplItem::Trait(ItemTrait::from_syntax_node(db, node))),
17343            SyntaxKind::ItemStruct => {
17344                Some(ImplItem::Struct(ItemStruct::from_syntax_node(db, node)))
17345            }
17346            SyntaxKind::ItemEnum => Some(ImplItem::Enum(ItemEnum::from_syntax_node(db, node))),
17347            SyntaxKind::ImplItemMissing => {
17348                Some(ImplItem::Missing(ImplItemMissing::from_syntax_node(db, node)))
17349            }
17350            _ => None,
17351        }
17352    }
17353    fn as_syntax_node(&self) -> SyntaxNode {
17354        match self {
17355            ImplItem::Function(x) => x.as_syntax_node(),
17356            ImplItem::Type(x) => x.as_syntax_node(),
17357            ImplItem::Constant(x) => x.as_syntax_node(),
17358            ImplItem::Impl(x) => x.as_syntax_node(),
17359            ImplItem::Module(x) => x.as_syntax_node(),
17360            ImplItem::Use(x) => x.as_syntax_node(),
17361            ImplItem::ExternFunction(x) => x.as_syntax_node(),
17362            ImplItem::ExternType(x) => x.as_syntax_node(),
17363            ImplItem::Trait(x) => x.as_syntax_node(),
17364            ImplItem::Struct(x) => x.as_syntax_node(),
17365            ImplItem::Enum(x) => x.as_syntax_node(),
17366            ImplItem::Missing(x) => x.as_syntax_node(),
17367        }
17368    }
17369    fn stable_ptr(&self) -> Self::StablePtr {
17370        ImplItemPtr(self.as_syntax_node().0.stable_ptr)
17371    }
17372}
17373impl From<&ImplItem> for SyntaxStablePtrId {
17374    fn from(node: &ImplItem) -> Self {
17375        node.stable_ptr().untyped()
17376    }
17377}
17378impl ImplItem {
17379    /// Checks if a kind of a variant of [ImplItem].
17380    pub fn is_variant(kind: SyntaxKind) -> bool {
17381        matches!(
17382            kind,
17383            SyntaxKind::FunctionWithBody
17384                | SyntaxKind::ItemTypeAlias
17385                | SyntaxKind::ItemConstant
17386                | SyntaxKind::ItemImplAlias
17387                | SyntaxKind::ItemModule
17388                | SyntaxKind::ItemUse
17389                | SyntaxKind::ItemExternFunction
17390                | SyntaxKind::ItemExternType
17391                | SyntaxKind::ItemTrait
17392                | SyntaxKind::ItemStruct
17393                | SyntaxKind::ItemEnum
17394                | SyntaxKind::ImplItemMissing
17395        )
17396    }
17397}
17398#[derive(Clone, Debug, Eq, Hash, PartialEq)]
17399pub struct ImplItemMissing {
17400    node: SyntaxNode,
17401    children: Arc<[SyntaxNode]>,
17402}
17403impl ImplItemMissing {
17404    pub fn new_green(db: &dyn SyntaxGroup) -> ImplItemMissingGreen {
17405        let children: Vec<GreenId> = vec![];
17406        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
17407        ImplItemMissingGreen(
17408            Arc::new(GreenNode {
17409                kind: SyntaxKind::ImplItemMissing,
17410                details: GreenNodeDetails::Node { children, width },
17411            })
17412            .intern(db),
17413        )
17414    }
17415}
17416impl ImplItemMissing {}
17417#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
17418pub struct ImplItemMissingPtr(pub SyntaxStablePtrId);
17419impl ImplItemMissingPtr {}
17420impl TypedStablePtr for ImplItemMissingPtr {
17421    type SyntaxNode = ImplItemMissing;
17422    fn untyped(&self) -> SyntaxStablePtrId {
17423        self.0
17424    }
17425    fn lookup(&self, db: &dyn SyntaxGroup) -> ImplItemMissing {
17426        ImplItemMissing::from_syntax_node(db, self.0.lookup(db))
17427    }
17428}
17429impl From<ImplItemMissingPtr> for SyntaxStablePtrId {
17430    fn from(ptr: ImplItemMissingPtr) -> Self {
17431        ptr.untyped()
17432    }
17433}
17434#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
17435pub struct ImplItemMissingGreen(pub GreenId);
17436impl TypedSyntaxNode for ImplItemMissing {
17437    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ImplItemMissing);
17438    type StablePtr = ImplItemMissingPtr;
17439    type Green = ImplItemMissingGreen;
17440    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
17441        ImplItemMissingGreen(
17442            Arc::new(GreenNode {
17443                kind: SyntaxKind::ImplItemMissing,
17444                details: GreenNodeDetails::Node { children: vec![], width: TextWidth::default() },
17445            })
17446            .intern(db),
17447        )
17448    }
17449    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
17450        let kind = node.kind(db);
17451        assert_eq!(
17452            kind,
17453            SyntaxKind::ImplItemMissing,
17454            "Unexpected SyntaxKind {:?}. Expected {:?}.",
17455            kind,
17456            SyntaxKind::ImplItemMissing
17457        );
17458        let children = db.get_children(node.clone());
17459        Self { node, children }
17460    }
17461    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
17462        let kind = node.kind(db);
17463        if kind == SyntaxKind::ImplItemMissing {
17464            Some(Self::from_syntax_node(db, node))
17465        } else {
17466            None
17467        }
17468    }
17469    fn as_syntax_node(&self) -> SyntaxNode {
17470        self.node.clone()
17471    }
17472    fn stable_ptr(&self) -> Self::StablePtr {
17473        ImplItemMissingPtr(self.node.0.stable_ptr)
17474    }
17475}
17476impl From<&ImplItemMissing> for SyntaxStablePtrId {
17477    fn from(node: &ImplItemMissing) -> Self {
17478        node.stable_ptr().untyped()
17479    }
17480}
17481#[derive(Clone, Debug, Eq, Hash, PartialEq)]
17482pub struct ItemImplAlias {
17483    node: SyntaxNode,
17484    children: Arc<[SyntaxNode]>,
17485}
17486impl ItemImplAlias {
17487    pub const INDEX_ATTRIBUTES: usize = 0;
17488    pub const INDEX_VISIBILITY: usize = 1;
17489    pub const INDEX_IMPL_KW: usize = 2;
17490    pub const INDEX_NAME: usize = 3;
17491    pub const INDEX_GENERIC_PARAMS: usize = 4;
17492    pub const INDEX_EQ: usize = 5;
17493    pub const INDEX_IMPL_PATH: usize = 6;
17494    pub const INDEX_SEMICOLON: usize = 7;
17495    pub fn new_green(
17496        db: &dyn SyntaxGroup,
17497        attributes: AttributeListGreen,
17498        visibility: VisibilityGreen,
17499        impl_kw: TerminalImplGreen,
17500        name: TerminalIdentifierGreen,
17501        generic_params: OptionWrappedGenericParamListGreen,
17502        eq: TerminalEqGreen,
17503        impl_path: ExprPathGreen,
17504        semicolon: TerminalSemicolonGreen,
17505    ) -> ItemImplAliasGreen {
17506        let children: Vec<GreenId> = vec![
17507            attributes.0,
17508            visibility.0,
17509            impl_kw.0,
17510            name.0,
17511            generic_params.0,
17512            eq.0,
17513            impl_path.0,
17514            semicolon.0,
17515        ];
17516        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
17517        ItemImplAliasGreen(
17518            Arc::new(GreenNode {
17519                kind: SyntaxKind::ItemImplAlias,
17520                details: GreenNodeDetails::Node { children, width },
17521            })
17522            .intern(db),
17523        )
17524    }
17525}
17526impl ItemImplAlias {
17527    pub fn attributes(&self, db: &dyn SyntaxGroup) -> AttributeList {
17528        AttributeList::from_syntax_node(db, self.children[0].clone())
17529    }
17530    pub fn visibility(&self, db: &dyn SyntaxGroup) -> Visibility {
17531        Visibility::from_syntax_node(db, self.children[1].clone())
17532    }
17533    pub fn impl_kw(&self, db: &dyn SyntaxGroup) -> TerminalImpl {
17534        TerminalImpl::from_syntax_node(db, self.children[2].clone())
17535    }
17536    pub fn name(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier {
17537        TerminalIdentifier::from_syntax_node(db, self.children[3].clone())
17538    }
17539    pub fn generic_params(&self, db: &dyn SyntaxGroup) -> OptionWrappedGenericParamList {
17540        OptionWrappedGenericParamList::from_syntax_node(db, self.children[4].clone())
17541    }
17542    pub fn eq(&self, db: &dyn SyntaxGroup) -> TerminalEq {
17543        TerminalEq::from_syntax_node(db, self.children[5].clone())
17544    }
17545    pub fn impl_path(&self, db: &dyn SyntaxGroup) -> ExprPath {
17546        ExprPath::from_syntax_node(db, self.children[6].clone())
17547    }
17548    pub fn semicolon(&self, db: &dyn SyntaxGroup) -> TerminalSemicolon {
17549        TerminalSemicolon::from_syntax_node(db, self.children[7].clone())
17550    }
17551}
17552#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
17553pub struct ItemImplAliasPtr(pub SyntaxStablePtrId);
17554impl ItemImplAliasPtr {
17555    pub fn name_green(self, db: &dyn SyntaxGroup) -> TerminalIdentifierGreen {
17556        let ptr = self.0.lookup_intern(db);
17557        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
17558            TerminalIdentifierGreen(key_fields[0])
17559        } else {
17560            panic!("Unexpected key field query on root.");
17561        }
17562    }
17563}
17564impl TypedStablePtr for ItemImplAliasPtr {
17565    type SyntaxNode = ItemImplAlias;
17566    fn untyped(&self) -> SyntaxStablePtrId {
17567        self.0
17568    }
17569    fn lookup(&self, db: &dyn SyntaxGroup) -> ItemImplAlias {
17570        ItemImplAlias::from_syntax_node(db, self.0.lookup(db))
17571    }
17572}
17573impl From<ItemImplAliasPtr> for SyntaxStablePtrId {
17574    fn from(ptr: ItemImplAliasPtr) -> Self {
17575        ptr.untyped()
17576    }
17577}
17578#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
17579pub struct ItemImplAliasGreen(pub GreenId);
17580impl TypedSyntaxNode for ItemImplAlias {
17581    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemImplAlias);
17582    type StablePtr = ItemImplAliasPtr;
17583    type Green = ItemImplAliasGreen;
17584    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
17585        ItemImplAliasGreen(
17586            Arc::new(GreenNode {
17587                kind: SyntaxKind::ItemImplAlias,
17588                details: GreenNodeDetails::Node {
17589                    children: vec![
17590                        AttributeList::missing(db).0,
17591                        Visibility::missing(db).0,
17592                        TerminalImpl::missing(db).0,
17593                        TerminalIdentifier::missing(db).0,
17594                        OptionWrappedGenericParamList::missing(db).0,
17595                        TerminalEq::missing(db).0,
17596                        ExprPath::missing(db).0,
17597                        TerminalSemicolon::missing(db).0,
17598                    ],
17599                    width: TextWidth::default(),
17600                },
17601            })
17602            .intern(db),
17603        )
17604    }
17605    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
17606        let kind = node.kind(db);
17607        assert_eq!(
17608            kind,
17609            SyntaxKind::ItemImplAlias,
17610            "Unexpected SyntaxKind {:?}. Expected {:?}.",
17611            kind,
17612            SyntaxKind::ItemImplAlias
17613        );
17614        let children = db.get_children(node.clone());
17615        Self { node, children }
17616    }
17617    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
17618        let kind = node.kind(db);
17619        if kind == SyntaxKind::ItemImplAlias {
17620            Some(Self::from_syntax_node(db, node))
17621        } else {
17622            None
17623        }
17624    }
17625    fn as_syntax_node(&self) -> SyntaxNode {
17626        self.node.clone()
17627    }
17628    fn stable_ptr(&self) -> Self::StablePtr {
17629        ItemImplAliasPtr(self.node.0.stable_ptr)
17630    }
17631}
17632impl From<&ItemImplAlias> for SyntaxStablePtrId {
17633    fn from(node: &ItemImplAlias) -> Self {
17634        node.stable_ptr().untyped()
17635    }
17636}
17637#[derive(Clone, Debug, Eq, Hash, PartialEq)]
17638pub struct ItemStruct {
17639    node: SyntaxNode,
17640    children: Arc<[SyntaxNode]>,
17641}
17642impl ItemStruct {
17643    pub const INDEX_ATTRIBUTES: usize = 0;
17644    pub const INDEX_VISIBILITY: usize = 1;
17645    pub const INDEX_STRUCT_KW: usize = 2;
17646    pub const INDEX_NAME: usize = 3;
17647    pub const INDEX_GENERIC_PARAMS: usize = 4;
17648    pub const INDEX_LBRACE: usize = 5;
17649    pub const INDEX_MEMBERS: usize = 6;
17650    pub const INDEX_RBRACE: usize = 7;
17651    pub fn new_green(
17652        db: &dyn SyntaxGroup,
17653        attributes: AttributeListGreen,
17654        visibility: VisibilityGreen,
17655        struct_kw: TerminalStructGreen,
17656        name: TerminalIdentifierGreen,
17657        generic_params: OptionWrappedGenericParamListGreen,
17658        lbrace: TerminalLBraceGreen,
17659        members: MemberListGreen,
17660        rbrace: TerminalRBraceGreen,
17661    ) -> ItemStructGreen {
17662        let children: Vec<GreenId> = vec![
17663            attributes.0,
17664            visibility.0,
17665            struct_kw.0,
17666            name.0,
17667            generic_params.0,
17668            lbrace.0,
17669            members.0,
17670            rbrace.0,
17671        ];
17672        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
17673        ItemStructGreen(
17674            Arc::new(GreenNode {
17675                kind: SyntaxKind::ItemStruct,
17676                details: GreenNodeDetails::Node { children, width },
17677            })
17678            .intern(db),
17679        )
17680    }
17681}
17682impl ItemStruct {
17683    pub fn attributes(&self, db: &dyn SyntaxGroup) -> AttributeList {
17684        AttributeList::from_syntax_node(db, self.children[0].clone())
17685    }
17686    pub fn visibility(&self, db: &dyn SyntaxGroup) -> Visibility {
17687        Visibility::from_syntax_node(db, self.children[1].clone())
17688    }
17689    pub fn struct_kw(&self, db: &dyn SyntaxGroup) -> TerminalStruct {
17690        TerminalStruct::from_syntax_node(db, self.children[2].clone())
17691    }
17692    pub fn name(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier {
17693        TerminalIdentifier::from_syntax_node(db, self.children[3].clone())
17694    }
17695    pub fn generic_params(&self, db: &dyn SyntaxGroup) -> OptionWrappedGenericParamList {
17696        OptionWrappedGenericParamList::from_syntax_node(db, self.children[4].clone())
17697    }
17698    pub fn lbrace(&self, db: &dyn SyntaxGroup) -> TerminalLBrace {
17699        TerminalLBrace::from_syntax_node(db, self.children[5].clone())
17700    }
17701    pub fn members(&self, db: &dyn SyntaxGroup) -> MemberList {
17702        MemberList::from_syntax_node(db, self.children[6].clone())
17703    }
17704    pub fn rbrace(&self, db: &dyn SyntaxGroup) -> TerminalRBrace {
17705        TerminalRBrace::from_syntax_node(db, self.children[7].clone())
17706    }
17707}
17708#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
17709pub struct ItemStructPtr(pub SyntaxStablePtrId);
17710impl ItemStructPtr {
17711    pub fn name_green(self, db: &dyn SyntaxGroup) -> TerminalIdentifierGreen {
17712        let ptr = self.0.lookup_intern(db);
17713        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
17714            TerminalIdentifierGreen(key_fields[0])
17715        } else {
17716            panic!("Unexpected key field query on root.");
17717        }
17718    }
17719}
17720impl TypedStablePtr for ItemStructPtr {
17721    type SyntaxNode = ItemStruct;
17722    fn untyped(&self) -> SyntaxStablePtrId {
17723        self.0
17724    }
17725    fn lookup(&self, db: &dyn SyntaxGroup) -> ItemStruct {
17726        ItemStruct::from_syntax_node(db, self.0.lookup(db))
17727    }
17728}
17729impl From<ItemStructPtr> for SyntaxStablePtrId {
17730    fn from(ptr: ItemStructPtr) -> Self {
17731        ptr.untyped()
17732    }
17733}
17734#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
17735pub struct ItemStructGreen(pub GreenId);
17736impl TypedSyntaxNode for ItemStruct {
17737    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemStruct);
17738    type StablePtr = ItemStructPtr;
17739    type Green = ItemStructGreen;
17740    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
17741        ItemStructGreen(
17742            Arc::new(GreenNode {
17743                kind: SyntaxKind::ItemStruct,
17744                details: GreenNodeDetails::Node {
17745                    children: vec![
17746                        AttributeList::missing(db).0,
17747                        Visibility::missing(db).0,
17748                        TerminalStruct::missing(db).0,
17749                        TerminalIdentifier::missing(db).0,
17750                        OptionWrappedGenericParamList::missing(db).0,
17751                        TerminalLBrace::missing(db).0,
17752                        MemberList::missing(db).0,
17753                        TerminalRBrace::missing(db).0,
17754                    ],
17755                    width: TextWidth::default(),
17756                },
17757            })
17758            .intern(db),
17759        )
17760    }
17761    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
17762        let kind = node.kind(db);
17763        assert_eq!(
17764            kind,
17765            SyntaxKind::ItemStruct,
17766            "Unexpected SyntaxKind {:?}. Expected {:?}.",
17767            kind,
17768            SyntaxKind::ItemStruct
17769        );
17770        let children = db.get_children(node.clone());
17771        Self { node, children }
17772    }
17773    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
17774        let kind = node.kind(db);
17775        if kind == SyntaxKind::ItemStruct { Some(Self::from_syntax_node(db, node)) } else { None }
17776    }
17777    fn as_syntax_node(&self) -> SyntaxNode {
17778        self.node.clone()
17779    }
17780    fn stable_ptr(&self) -> Self::StablePtr {
17781        ItemStructPtr(self.node.0.stable_ptr)
17782    }
17783}
17784impl From<&ItemStruct> for SyntaxStablePtrId {
17785    fn from(node: &ItemStruct) -> Self {
17786        node.stable_ptr().untyped()
17787    }
17788}
17789#[derive(Clone, Debug, Eq, Hash, PartialEq)]
17790pub struct ItemEnum {
17791    node: SyntaxNode,
17792    children: Arc<[SyntaxNode]>,
17793}
17794impl ItemEnum {
17795    pub const INDEX_ATTRIBUTES: usize = 0;
17796    pub const INDEX_VISIBILITY: usize = 1;
17797    pub const INDEX_ENUM_KW: usize = 2;
17798    pub const INDEX_NAME: usize = 3;
17799    pub const INDEX_GENERIC_PARAMS: usize = 4;
17800    pub const INDEX_LBRACE: usize = 5;
17801    pub const INDEX_VARIANTS: usize = 6;
17802    pub const INDEX_RBRACE: usize = 7;
17803    pub fn new_green(
17804        db: &dyn SyntaxGroup,
17805        attributes: AttributeListGreen,
17806        visibility: VisibilityGreen,
17807        enum_kw: TerminalEnumGreen,
17808        name: TerminalIdentifierGreen,
17809        generic_params: OptionWrappedGenericParamListGreen,
17810        lbrace: TerminalLBraceGreen,
17811        variants: VariantListGreen,
17812        rbrace: TerminalRBraceGreen,
17813    ) -> ItemEnumGreen {
17814        let children: Vec<GreenId> = vec![
17815            attributes.0,
17816            visibility.0,
17817            enum_kw.0,
17818            name.0,
17819            generic_params.0,
17820            lbrace.0,
17821            variants.0,
17822            rbrace.0,
17823        ];
17824        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
17825        ItemEnumGreen(
17826            Arc::new(GreenNode {
17827                kind: SyntaxKind::ItemEnum,
17828                details: GreenNodeDetails::Node { children, width },
17829            })
17830            .intern(db),
17831        )
17832    }
17833}
17834impl ItemEnum {
17835    pub fn attributes(&self, db: &dyn SyntaxGroup) -> AttributeList {
17836        AttributeList::from_syntax_node(db, self.children[0].clone())
17837    }
17838    pub fn visibility(&self, db: &dyn SyntaxGroup) -> Visibility {
17839        Visibility::from_syntax_node(db, self.children[1].clone())
17840    }
17841    pub fn enum_kw(&self, db: &dyn SyntaxGroup) -> TerminalEnum {
17842        TerminalEnum::from_syntax_node(db, self.children[2].clone())
17843    }
17844    pub fn name(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier {
17845        TerminalIdentifier::from_syntax_node(db, self.children[3].clone())
17846    }
17847    pub fn generic_params(&self, db: &dyn SyntaxGroup) -> OptionWrappedGenericParamList {
17848        OptionWrappedGenericParamList::from_syntax_node(db, self.children[4].clone())
17849    }
17850    pub fn lbrace(&self, db: &dyn SyntaxGroup) -> TerminalLBrace {
17851        TerminalLBrace::from_syntax_node(db, self.children[5].clone())
17852    }
17853    pub fn variants(&self, db: &dyn SyntaxGroup) -> VariantList {
17854        VariantList::from_syntax_node(db, self.children[6].clone())
17855    }
17856    pub fn rbrace(&self, db: &dyn SyntaxGroup) -> TerminalRBrace {
17857        TerminalRBrace::from_syntax_node(db, self.children[7].clone())
17858    }
17859}
17860#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
17861pub struct ItemEnumPtr(pub SyntaxStablePtrId);
17862impl ItemEnumPtr {
17863    pub fn name_green(self, db: &dyn SyntaxGroup) -> TerminalIdentifierGreen {
17864        let ptr = self.0.lookup_intern(db);
17865        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
17866            TerminalIdentifierGreen(key_fields[0])
17867        } else {
17868            panic!("Unexpected key field query on root.");
17869        }
17870    }
17871}
17872impl TypedStablePtr for ItemEnumPtr {
17873    type SyntaxNode = ItemEnum;
17874    fn untyped(&self) -> SyntaxStablePtrId {
17875        self.0
17876    }
17877    fn lookup(&self, db: &dyn SyntaxGroup) -> ItemEnum {
17878        ItemEnum::from_syntax_node(db, self.0.lookup(db))
17879    }
17880}
17881impl From<ItemEnumPtr> for SyntaxStablePtrId {
17882    fn from(ptr: ItemEnumPtr) -> Self {
17883        ptr.untyped()
17884    }
17885}
17886#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
17887pub struct ItemEnumGreen(pub GreenId);
17888impl TypedSyntaxNode for ItemEnum {
17889    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemEnum);
17890    type StablePtr = ItemEnumPtr;
17891    type Green = ItemEnumGreen;
17892    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
17893        ItemEnumGreen(
17894            Arc::new(GreenNode {
17895                kind: SyntaxKind::ItemEnum,
17896                details: GreenNodeDetails::Node {
17897                    children: vec![
17898                        AttributeList::missing(db).0,
17899                        Visibility::missing(db).0,
17900                        TerminalEnum::missing(db).0,
17901                        TerminalIdentifier::missing(db).0,
17902                        OptionWrappedGenericParamList::missing(db).0,
17903                        TerminalLBrace::missing(db).0,
17904                        VariantList::missing(db).0,
17905                        TerminalRBrace::missing(db).0,
17906                    ],
17907                    width: TextWidth::default(),
17908                },
17909            })
17910            .intern(db),
17911        )
17912    }
17913    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
17914        let kind = node.kind(db);
17915        assert_eq!(
17916            kind,
17917            SyntaxKind::ItemEnum,
17918            "Unexpected SyntaxKind {:?}. Expected {:?}.",
17919            kind,
17920            SyntaxKind::ItemEnum
17921        );
17922        let children = db.get_children(node.clone());
17923        Self { node, children }
17924    }
17925    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
17926        let kind = node.kind(db);
17927        if kind == SyntaxKind::ItemEnum { Some(Self::from_syntax_node(db, node)) } else { None }
17928    }
17929    fn as_syntax_node(&self) -> SyntaxNode {
17930        self.node.clone()
17931    }
17932    fn stable_ptr(&self) -> Self::StablePtr {
17933        ItemEnumPtr(self.node.0.stable_ptr)
17934    }
17935}
17936impl From<&ItemEnum> for SyntaxStablePtrId {
17937    fn from(node: &ItemEnum) -> Self {
17938        node.stable_ptr().untyped()
17939    }
17940}
17941#[derive(Clone, Debug, Eq, Hash, PartialEq)]
17942pub struct ItemTypeAlias {
17943    node: SyntaxNode,
17944    children: Arc<[SyntaxNode]>,
17945}
17946impl ItemTypeAlias {
17947    pub const INDEX_ATTRIBUTES: usize = 0;
17948    pub const INDEX_VISIBILITY: usize = 1;
17949    pub const INDEX_TYPE_KW: usize = 2;
17950    pub const INDEX_NAME: usize = 3;
17951    pub const INDEX_GENERIC_PARAMS: usize = 4;
17952    pub const INDEX_EQ: usize = 5;
17953    pub const INDEX_TY: usize = 6;
17954    pub const INDEX_SEMICOLON: usize = 7;
17955    pub fn new_green(
17956        db: &dyn SyntaxGroup,
17957        attributes: AttributeListGreen,
17958        visibility: VisibilityGreen,
17959        type_kw: TerminalTypeGreen,
17960        name: TerminalIdentifierGreen,
17961        generic_params: OptionWrappedGenericParamListGreen,
17962        eq: TerminalEqGreen,
17963        ty: ExprGreen,
17964        semicolon: TerminalSemicolonGreen,
17965    ) -> ItemTypeAliasGreen {
17966        let children: Vec<GreenId> = vec![
17967            attributes.0,
17968            visibility.0,
17969            type_kw.0,
17970            name.0,
17971            generic_params.0,
17972            eq.0,
17973            ty.0,
17974            semicolon.0,
17975        ];
17976        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
17977        ItemTypeAliasGreen(
17978            Arc::new(GreenNode {
17979                kind: SyntaxKind::ItemTypeAlias,
17980                details: GreenNodeDetails::Node { children, width },
17981            })
17982            .intern(db),
17983        )
17984    }
17985}
17986impl ItemTypeAlias {
17987    pub fn attributes(&self, db: &dyn SyntaxGroup) -> AttributeList {
17988        AttributeList::from_syntax_node(db, self.children[0].clone())
17989    }
17990    pub fn visibility(&self, db: &dyn SyntaxGroup) -> Visibility {
17991        Visibility::from_syntax_node(db, self.children[1].clone())
17992    }
17993    pub fn type_kw(&self, db: &dyn SyntaxGroup) -> TerminalType {
17994        TerminalType::from_syntax_node(db, self.children[2].clone())
17995    }
17996    pub fn name(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier {
17997        TerminalIdentifier::from_syntax_node(db, self.children[3].clone())
17998    }
17999    pub fn generic_params(&self, db: &dyn SyntaxGroup) -> OptionWrappedGenericParamList {
18000        OptionWrappedGenericParamList::from_syntax_node(db, self.children[4].clone())
18001    }
18002    pub fn eq(&self, db: &dyn SyntaxGroup) -> TerminalEq {
18003        TerminalEq::from_syntax_node(db, self.children[5].clone())
18004    }
18005    pub fn ty(&self, db: &dyn SyntaxGroup) -> Expr {
18006        Expr::from_syntax_node(db, self.children[6].clone())
18007    }
18008    pub fn semicolon(&self, db: &dyn SyntaxGroup) -> TerminalSemicolon {
18009        TerminalSemicolon::from_syntax_node(db, self.children[7].clone())
18010    }
18011}
18012#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
18013pub struct ItemTypeAliasPtr(pub SyntaxStablePtrId);
18014impl ItemTypeAliasPtr {
18015    pub fn name_green(self, db: &dyn SyntaxGroup) -> TerminalIdentifierGreen {
18016        let ptr = self.0.lookup_intern(db);
18017        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
18018            TerminalIdentifierGreen(key_fields[0])
18019        } else {
18020            panic!("Unexpected key field query on root.");
18021        }
18022    }
18023}
18024impl TypedStablePtr for ItemTypeAliasPtr {
18025    type SyntaxNode = ItemTypeAlias;
18026    fn untyped(&self) -> SyntaxStablePtrId {
18027        self.0
18028    }
18029    fn lookup(&self, db: &dyn SyntaxGroup) -> ItemTypeAlias {
18030        ItemTypeAlias::from_syntax_node(db, self.0.lookup(db))
18031    }
18032}
18033impl From<ItemTypeAliasPtr> for SyntaxStablePtrId {
18034    fn from(ptr: ItemTypeAliasPtr) -> Self {
18035        ptr.untyped()
18036    }
18037}
18038#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
18039pub struct ItemTypeAliasGreen(pub GreenId);
18040impl TypedSyntaxNode for ItemTypeAlias {
18041    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemTypeAlias);
18042    type StablePtr = ItemTypeAliasPtr;
18043    type Green = ItemTypeAliasGreen;
18044    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
18045        ItemTypeAliasGreen(
18046            Arc::new(GreenNode {
18047                kind: SyntaxKind::ItemTypeAlias,
18048                details: GreenNodeDetails::Node {
18049                    children: vec![
18050                        AttributeList::missing(db).0,
18051                        Visibility::missing(db).0,
18052                        TerminalType::missing(db).0,
18053                        TerminalIdentifier::missing(db).0,
18054                        OptionWrappedGenericParamList::missing(db).0,
18055                        TerminalEq::missing(db).0,
18056                        Expr::missing(db).0,
18057                        TerminalSemicolon::missing(db).0,
18058                    ],
18059                    width: TextWidth::default(),
18060                },
18061            })
18062            .intern(db),
18063        )
18064    }
18065    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
18066        let kind = node.kind(db);
18067        assert_eq!(
18068            kind,
18069            SyntaxKind::ItemTypeAlias,
18070            "Unexpected SyntaxKind {:?}. Expected {:?}.",
18071            kind,
18072            SyntaxKind::ItemTypeAlias
18073        );
18074        let children = db.get_children(node.clone());
18075        Self { node, children }
18076    }
18077    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
18078        let kind = node.kind(db);
18079        if kind == SyntaxKind::ItemTypeAlias {
18080            Some(Self::from_syntax_node(db, node))
18081        } else {
18082            None
18083        }
18084    }
18085    fn as_syntax_node(&self) -> SyntaxNode {
18086        self.node.clone()
18087    }
18088    fn stable_ptr(&self) -> Self::StablePtr {
18089        ItemTypeAliasPtr(self.node.0.stable_ptr)
18090    }
18091}
18092impl From<&ItemTypeAlias> for SyntaxStablePtrId {
18093    fn from(node: &ItemTypeAlias) -> Self {
18094        node.stable_ptr().untyped()
18095    }
18096}
18097#[derive(Clone, Debug, Eq, Hash, PartialEq)]
18098pub struct ItemUse {
18099    node: SyntaxNode,
18100    children: Arc<[SyntaxNode]>,
18101}
18102impl ItemUse {
18103    pub const INDEX_ATTRIBUTES: usize = 0;
18104    pub const INDEX_VISIBILITY: usize = 1;
18105    pub const INDEX_USE_KW: usize = 2;
18106    pub const INDEX_USE_PATH: usize = 3;
18107    pub const INDEX_SEMICOLON: usize = 4;
18108    pub fn new_green(
18109        db: &dyn SyntaxGroup,
18110        attributes: AttributeListGreen,
18111        visibility: VisibilityGreen,
18112        use_kw: TerminalUseGreen,
18113        use_path: UsePathGreen,
18114        semicolon: TerminalSemicolonGreen,
18115    ) -> ItemUseGreen {
18116        let children: Vec<GreenId> =
18117            vec![attributes.0, visibility.0, use_kw.0, use_path.0, semicolon.0];
18118        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
18119        ItemUseGreen(
18120            Arc::new(GreenNode {
18121                kind: SyntaxKind::ItemUse,
18122                details: GreenNodeDetails::Node { children, width },
18123            })
18124            .intern(db),
18125        )
18126    }
18127}
18128impl ItemUse {
18129    pub fn attributes(&self, db: &dyn SyntaxGroup) -> AttributeList {
18130        AttributeList::from_syntax_node(db, self.children[0].clone())
18131    }
18132    pub fn visibility(&self, db: &dyn SyntaxGroup) -> Visibility {
18133        Visibility::from_syntax_node(db, self.children[1].clone())
18134    }
18135    pub fn use_kw(&self, db: &dyn SyntaxGroup) -> TerminalUse {
18136        TerminalUse::from_syntax_node(db, self.children[2].clone())
18137    }
18138    pub fn use_path(&self, db: &dyn SyntaxGroup) -> UsePath {
18139        UsePath::from_syntax_node(db, self.children[3].clone())
18140    }
18141    pub fn semicolon(&self, db: &dyn SyntaxGroup) -> TerminalSemicolon {
18142        TerminalSemicolon::from_syntax_node(db, self.children[4].clone())
18143    }
18144}
18145#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
18146pub struct ItemUsePtr(pub SyntaxStablePtrId);
18147impl ItemUsePtr {
18148    pub fn use_path_green(self, db: &dyn SyntaxGroup) -> UsePathGreen {
18149        let ptr = self.0.lookup_intern(db);
18150        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
18151            UsePathGreen(key_fields[0])
18152        } else {
18153            panic!("Unexpected key field query on root.");
18154        }
18155    }
18156}
18157impl TypedStablePtr for ItemUsePtr {
18158    type SyntaxNode = ItemUse;
18159    fn untyped(&self) -> SyntaxStablePtrId {
18160        self.0
18161    }
18162    fn lookup(&self, db: &dyn SyntaxGroup) -> ItemUse {
18163        ItemUse::from_syntax_node(db, self.0.lookup(db))
18164    }
18165}
18166impl From<ItemUsePtr> for SyntaxStablePtrId {
18167    fn from(ptr: ItemUsePtr) -> Self {
18168        ptr.untyped()
18169    }
18170}
18171#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
18172pub struct ItemUseGreen(pub GreenId);
18173impl TypedSyntaxNode for ItemUse {
18174    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemUse);
18175    type StablePtr = ItemUsePtr;
18176    type Green = ItemUseGreen;
18177    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
18178        ItemUseGreen(
18179            Arc::new(GreenNode {
18180                kind: SyntaxKind::ItemUse,
18181                details: GreenNodeDetails::Node {
18182                    children: vec![
18183                        AttributeList::missing(db).0,
18184                        Visibility::missing(db).0,
18185                        TerminalUse::missing(db).0,
18186                        UsePath::missing(db).0,
18187                        TerminalSemicolon::missing(db).0,
18188                    ],
18189                    width: TextWidth::default(),
18190                },
18191            })
18192            .intern(db),
18193        )
18194    }
18195    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
18196        let kind = node.kind(db);
18197        assert_eq!(
18198            kind,
18199            SyntaxKind::ItemUse,
18200            "Unexpected SyntaxKind {:?}. Expected {:?}.",
18201            kind,
18202            SyntaxKind::ItemUse
18203        );
18204        let children = db.get_children(node.clone());
18205        Self { node, children }
18206    }
18207    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
18208        let kind = node.kind(db);
18209        if kind == SyntaxKind::ItemUse { Some(Self::from_syntax_node(db, node)) } else { None }
18210    }
18211    fn as_syntax_node(&self) -> SyntaxNode {
18212        self.node.clone()
18213    }
18214    fn stable_ptr(&self) -> Self::StablePtr {
18215        ItemUsePtr(self.node.0.stable_ptr)
18216    }
18217}
18218impl From<&ItemUse> for SyntaxStablePtrId {
18219    fn from(node: &ItemUse) -> Self {
18220        node.stable_ptr().untyped()
18221    }
18222}
18223#[derive(Clone, Debug, Eq, Hash, PartialEq)]
18224pub enum UsePath {
18225    Leaf(UsePathLeaf),
18226    Single(UsePathSingle),
18227    Multi(UsePathMulti),
18228    Star(UsePathStar),
18229}
18230#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
18231pub struct UsePathPtr(pub SyntaxStablePtrId);
18232impl TypedStablePtr for UsePathPtr {
18233    type SyntaxNode = UsePath;
18234    fn untyped(&self) -> SyntaxStablePtrId {
18235        self.0
18236    }
18237    fn lookup(&self, db: &dyn SyntaxGroup) -> UsePath {
18238        UsePath::from_syntax_node(db, self.0.lookup(db))
18239    }
18240}
18241impl From<UsePathPtr> for SyntaxStablePtrId {
18242    fn from(ptr: UsePathPtr) -> Self {
18243        ptr.untyped()
18244    }
18245}
18246impl From<UsePathLeafPtr> for UsePathPtr {
18247    fn from(value: UsePathLeafPtr) -> Self {
18248        Self(value.0)
18249    }
18250}
18251impl From<UsePathSinglePtr> for UsePathPtr {
18252    fn from(value: UsePathSinglePtr) -> Self {
18253        Self(value.0)
18254    }
18255}
18256impl From<UsePathMultiPtr> for UsePathPtr {
18257    fn from(value: UsePathMultiPtr) -> Self {
18258        Self(value.0)
18259    }
18260}
18261impl From<UsePathStarPtr> for UsePathPtr {
18262    fn from(value: UsePathStarPtr) -> Self {
18263        Self(value.0)
18264    }
18265}
18266impl From<UsePathLeafGreen> for UsePathGreen {
18267    fn from(value: UsePathLeafGreen) -> Self {
18268        Self(value.0)
18269    }
18270}
18271impl From<UsePathSingleGreen> for UsePathGreen {
18272    fn from(value: UsePathSingleGreen) -> Self {
18273        Self(value.0)
18274    }
18275}
18276impl From<UsePathMultiGreen> for UsePathGreen {
18277    fn from(value: UsePathMultiGreen) -> Self {
18278        Self(value.0)
18279    }
18280}
18281impl From<UsePathStarGreen> for UsePathGreen {
18282    fn from(value: UsePathStarGreen) -> Self {
18283        Self(value.0)
18284    }
18285}
18286#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
18287pub struct UsePathGreen(pub GreenId);
18288impl TypedSyntaxNode for UsePath {
18289    const OPTIONAL_KIND: Option<SyntaxKind> = None;
18290    type StablePtr = UsePathPtr;
18291    type Green = UsePathGreen;
18292    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
18293        panic!("No missing variant.");
18294    }
18295    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
18296        let kind = node.kind(db);
18297        match kind {
18298            SyntaxKind::UsePathLeaf => UsePath::Leaf(UsePathLeaf::from_syntax_node(db, node)),
18299            SyntaxKind::UsePathSingle => UsePath::Single(UsePathSingle::from_syntax_node(db, node)),
18300            SyntaxKind::UsePathMulti => UsePath::Multi(UsePathMulti::from_syntax_node(db, node)),
18301            SyntaxKind::UsePathStar => UsePath::Star(UsePathStar::from_syntax_node(db, node)),
18302            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "UsePath"),
18303        }
18304    }
18305    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
18306        let kind = node.kind(db);
18307        match kind {
18308            SyntaxKind::UsePathLeaf => Some(UsePath::Leaf(UsePathLeaf::from_syntax_node(db, node))),
18309            SyntaxKind::UsePathSingle => {
18310                Some(UsePath::Single(UsePathSingle::from_syntax_node(db, node)))
18311            }
18312            SyntaxKind::UsePathMulti => {
18313                Some(UsePath::Multi(UsePathMulti::from_syntax_node(db, node)))
18314            }
18315            SyntaxKind::UsePathStar => Some(UsePath::Star(UsePathStar::from_syntax_node(db, node))),
18316            _ => None,
18317        }
18318    }
18319    fn as_syntax_node(&self) -> SyntaxNode {
18320        match self {
18321            UsePath::Leaf(x) => x.as_syntax_node(),
18322            UsePath::Single(x) => x.as_syntax_node(),
18323            UsePath::Multi(x) => x.as_syntax_node(),
18324            UsePath::Star(x) => x.as_syntax_node(),
18325        }
18326    }
18327    fn stable_ptr(&self) -> Self::StablePtr {
18328        UsePathPtr(self.as_syntax_node().0.stable_ptr)
18329    }
18330}
18331impl From<&UsePath> for SyntaxStablePtrId {
18332    fn from(node: &UsePath) -> Self {
18333        node.stable_ptr().untyped()
18334    }
18335}
18336impl UsePath {
18337    /// Checks if a kind of a variant of [UsePath].
18338    pub fn is_variant(kind: SyntaxKind) -> bool {
18339        matches!(
18340            kind,
18341            SyntaxKind::UsePathLeaf
18342                | SyntaxKind::UsePathSingle
18343                | SyntaxKind::UsePathMulti
18344                | SyntaxKind::UsePathStar
18345        )
18346    }
18347}
18348#[derive(Clone, Debug, Eq, Hash, PartialEq)]
18349pub struct UsePathLeaf {
18350    node: SyntaxNode,
18351    children: Arc<[SyntaxNode]>,
18352}
18353impl UsePathLeaf {
18354    pub const INDEX_IDENT: usize = 0;
18355    pub const INDEX_ALIAS_CLAUSE: usize = 1;
18356    pub fn new_green(
18357        db: &dyn SyntaxGroup,
18358        ident: PathSegmentGreen,
18359        alias_clause: OptionAliasClauseGreen,
18360    ) -> UsePathLeafGreen {
18361        let children: Vec<GreenId> = vec![ident.0, alias_clause.0];
18362        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
18363        UsePathLeafGreen(
18364            Arc::new(GreenNode {
18365                kind: SyntaxKind::UsePathLeaf,
18366                details: GreenNodeDetails::Node { children, width },
18367            })
18368            .intern(db),
18369        )
18370    }
18371}
18372impl UsePathLeaf {
18373    pub fn ident(&self, db: &dyn SyntaxGroup) -> PathSegment {
18374        PathSegment::from_syntax_node(db, self.children[0].clone())
18375    }
18376    pub fn alias_clause(&self, db: &dyn SyntaxGroup) -> OptionAliasClause {
18377        OptionAliasClause::from_syntax_node(db, self.children[1].clone())
18378    }
18379}
18380#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
18381pub struct UsePathLeafPtr(pub SyntaxStablePtrId);
18382impl UsePathLeafPtr {
18383    pub fn ident_green(self, db: &dyn SyntaxGroup) -> PathSegmentGreen {
18384        let ptr = self.0.lookup_intern(db);
18385        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
18386            PathSegmentGreen(key_fields[0])
18387        } else {
18388            panic!("Unexpected key field query on root.");
18389        }
18390    }
18391    pub fn alias_clause_green(self, db: &dyn SyntaxGroup) -> OptionAliasClauseGreen {
18392        let ptr = self.0.lookup_intern(db);
18393        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
18394            OptionAliasClauseGreen(key_fields[1])
18395        } else {
18396            panic!("Unexpected key field query on root.");
18397        }
18398    }
18399}
18400impl TypedStablePtr for UsePathLeafPtr {
18401    type SyntaxNode = UsePathLeaf;
18402    fn untyped(&self) -> SyntaxStablePtrId {
18403        self.0
18404    }
18405    fn lookup(&self, db: &dyn SyntaxGroup) -> UsePathLeaf {
18406        UsePathLeaf::from_syntax_node(db, self.0.lookup(db))
18407    }
18408}
18409impl From<UsePathLeafPtr> for SyntaxStablePtrId {
18410    fn from(ptr: UsePathLeafPtr) -> Self {
18411        ptr.untyped()
18412    }
18413}
18414#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
18415pub struct UsePathLeafGreen(pub GreenId);
18416impl TypedSyntaxNode for UsePathLeaf {
18417    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::UsePathLeaf);
18418    type StablePtr = UsePathLeafPtr;
18419    type Green = UsePathLeafGreen;
18420    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
18421        UsePathLeafGreen(
18422            Arc::new(GreenNode {
18423                kind: SyntaxKind::UsePathLeaf,
18424                details: GreenNodeDetails::Node {
18425                    children: vec![PathSegment::missing(db).0, OptionAliasClause::missing(db).0],
18426                    width: TextWidth::default(),
18427                },
18428            })
18429            .intern(db),
18430        )
18431    }
18432    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
18433        let kind = node.kind(db);
18434        assert_eq!(
18435            kind,
18436            SyntaxKind::UsePathLeaf,
18437            "Unexpected SyntaxKind {:?}. Expected {:?}.",
18438            kind,
18439            SyntaxKind::UsePathLeaf
18440        );
18441        let children = db.get_children(node.clone());
18442        Self { node, children }
18443    }
18444    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
18445        let kind = node.kind(db);
18446        if kind == SyntaxKind::UsePathLeaf { Some(Self::from_syntax_node(db, node)) } else { None }
18447    }
18448    fn as_syntax_node(&self) -> SyntaxNode {
18449        self.node.clone()
18450    }
18451    fn stable_ptr(&self) -> Self::StablePtr {
18452        UsePathLeafPtr(self.node.0.stable_ptr)
18453    }
18454}
18455impl From<&UsePathLeaf> for SyntaxStablePtrId {
18456    fn from(node: &UsePathLeaf) -> Self {
18457        node.stable_ptr().untyped()
18458    }
18459}
18460#[derive(Clone, Debug, Eq, Hash, PartialEq)]
18461pub struct UsePathSingle {
18462    node: SyntaxNode,
18463    children: Arc<[SyntaxNode]>,
18464}
18465impl UsePathSingle {
18466    pub const INDEX_IDENT: usize = 0;
18467    pub const INDEX_COLON_COLON: usize = 1;
18468    pub const INDEX_USE_PATH: usize = 2;
18469    pub fn new_green(
18470        db: &dyn SyntaxGroup,
18471        ident: PathSegmentGreen,
18472        colon_colon: TerminalColonColonGreen,
18473        use_path: UsePathGreen,
18474    ) -> UsePathSingleGreen {
18475        let children: Vec<GreenId> = vec![ident.0, colon_colon.0, use_path.0];
18476        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
18477        UsePathSingleGreen(
18478            Arc::new(GreenNode {
18479                kind: SyntaxKind::UsePathSingle,
18480                details: GreenNodeDetails::Node { children, width },
18481            })
18482            .intern(db),
18483        )
18484    }
18485}
18486impl UsePathSingle {
18487    pub fn ident(&self, db: &dyn SyntaxGroup) -> PathSegment {
18488        PathSegment::from_syntax_node(db, self.children[0].clone())
18489    }
18490    pub fn colon_colon(&self, db: &dyn SyntaxGroup) -> TerminalColonColon {
18491        TerminalColonColon::from_syntax_node(db, self.children[1].clone())
18492    }
18493    pub fn use_path(&self, db: &dyn SyntaxGroup) -> UsePath {
18494        UsePath::from_syntax_node(db, self.children[2].clone())
18495    }
18496}
18497#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
18498pub struct UsePathSinglePtr(pub SyntaxStablePtrId);
18499impl UsePathSinglePtr {}
18500impl TypedStablePtr for UsePathSinglePtr {
18501    type SyntaxNode = UsePathSingle;
18502    fn untyped(&self) -> SyntaxStablePtrId {
18503        self.0
18504    }
18505    fn lookup(&self, db: &dyn SyntaxGroup) -> UsePathSingle {
18506        UsePathSingle::from_syntax_node(db, self.0.lookup(db))
18507    }
18508}
18509impl From<UsePathSinglePtr> for SyntaxStablePtrId {
18510    fn from(ptr: UsePathSinglePtr) -> Self {
18511        ptr.untyped()
18512    }
18513}
18514#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
18515pub struct UsePathSingleGreen(pub GreenId);
18516impl TypedSyntaxNode for UsePathSingle {
18517    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::UsePathSingle);
18518    type StablePtr = UsePathSinglePtr;
18519    type Green = UsePathSingleGreen;
18520    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
18521        UsePathSingleGreen(
18522            Arc::new(GreenNode {
18523                kind: SyntaxKind::UsePathSingle,
18524                details: GreenNodeDetails::Node {
18525                    children: vec![
18526                        PathSegment::missing(db).0,
18527                        TerminalColonColon::missing(db).0,
18528                        UsePath::missing(db).0,
18529                    ],
18530                    width: TextWidth::default(),
18531                },
18532            })
18533            .intern(db),
18534        )
18535    }
18536    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
18537        let kind = node.kind(db);
18538        assert_eq!(
18539            kind,
18540            SyntaxKind::UsePathSingle,
18541            "Unexpected SyntaxKind {:?}. Expected {:?}.",
18542            kind,
18543            SyntaxKind::UsePathSingle
18544        );
18545        let children = db.get_children(node.clone());
18546        Self { node, children }
18547    }
18548    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
18549        let kind = node.kind(db);
18550        if kind == SyntaxKind::UsePathSingle {
18551            Some(Self::from_syntax_node(db, node))
18552        } else {
18553            None
18554        }
18555    }
18556    fn as_syntax_node(&self) -> SyntaxNode {
18557        self.node.clone()
18558    }
18559    fn stable_ptr(&self) -> Self::StablePtr {
18560        UsePathSinglePtr(self.node.0.stable_ptr)
18561    }
18562}
18563impl From<&UsePathSingle> for SyntaxStablePtrId {
18564    fn from(node: &UsePathSingle) -> Self {
18565        node.stable_ptr().untyped()
18566    }
18567}
18568#[derive(Clone, Debug, Eq, Hash, PartialEq)]
18569pub struct UsePathMulti {
18570    node: SyntaxNode,
18571    children: Arc<[SyntaxNode]>,
18572}
18573impl UsePathMulti {
18574    pub const INDEX_LBRACE: usize = 0;
18575    pub const INDEX_USE_PATHS: usize = 1;
18576    pub const INDEX_RBRACE: usize = 2;
18577    pub fn new_green(
18578        db: &dyn SyntaxGroup,
18579        lbrace: TerminalLBraceGreen,
18580        use_paths: UsePathListGreen,
18581        rbrace: TerminalRBraceGreen,
18582    ) -> UsePathMultiGreen {
18583        let children: Vec<GreenId> = vec![lbrace.0, use_paths.0, rbrace.0];
18584        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
18585        UsePathMultiGreen(
18586            Arc::new(GreenNode {
18587                kind: SyntaxKind::UsePathMulti,
18588                details: GreenNodeDetails::Node { children, width },
18589            })
18590            .intern(db),
18591        )
18592    }
18593}
18594impl UsePathMulti {
18595    pub fn lbrace(&self, db: &dyn SyntaxGroup) -> TerminalLBrace {
18596        TerminalLBrace::from_syntax_node(db, self.children[0].clone())
18597    }
18598    pub fn use_paths(&self, db: &dyn SyntaxGroup) -> UsePathList {
18599        UsePathList::from_syntax_node(db, self.children[1].clone())
18600    }
18601    pub fn rbrace(&self, db: &dyn SyntaxGroup) -> TerminalRBrace {
18602        TerminalRBrace::from_syntax_node(db, self.children[2].clone())
18603    }
18604}
18605#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
18606pub struct UsePathMultiPtr(pub SyntaxStablePtrId);
18607impl UsePathMultiPtr {}
18608impl TypedStablePtr for UsePathMultiPtr {
18609    type SyntaxNode = UsePathMulti;
18610    fn untyped(&self) -> SyntaxStablePtrId {
18611        self.0
18612    }
18613    fn lookup(&self, db: &dyn SyntaxGroup) -> UsePathMulti {
18614        UsePathMulti::from_syntax_node(db, self.0.lookup(db))
18615    }
18616}
18617impl From<UsePathMultiPtr> for SyntaxStablePtrId {
18618    fn from(ptr: UsePathMultiPtr) -> Self {
18619        ptr.untyped()
18620    }
18621}
18622#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
18623pub struct UsePathMultiGreen(pub GreenId);
18624impl TypedSyntaxNode for UsePathMulti {
18625    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::UsePathMulti);
18626    type StablePtr = UsePathMultiPtr;
18627    type Green = UsePathMultiGreen;
18628    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
18629        UsePathMultiGreen(
18630            Arc::new(GreenNode {
18631                kind: SyntaxKind::UsePathMulti,
18632                details: GreenNodeDetails::Node {
18633                    children: vec![
18634                        TerminalLBrace::missing(db).0,
18635                        UsePathList::missing(db).0,
18636                        TerminalRBrace::missing(db).0,
18637                    ],
18638                    width: TextWidth::default(),
18639                },
18640            })
18641            .intern(db),
18642        )
18643    }
18644    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
18645        let kind = node.kind(db);
18646        assert_eq!(
18647            kind,
18648            SyntaxKind::UsePathMulti,
18649            "Unexpected SyntaxKind {:?}. Expected {:?}.",
18650            kind,
18651            SyntaxKind::UsePathMulti
18652        );
18653        let children = db.get_children(node.clone());
18654        Self { node, children }
18655    }
18656    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
18657        let kind = node.kind(db);
18658        if kind == SyntaxKind::UsePathMulti { Some(Self::from_syntax_node(db, node)) } else { None }
18659    }
18660    fn as_syntax_node(&self) -> SyntaxNode {
18661        self.node.clone()
18662    }
18663    fn stable_ptr(&self) -> Self::StablePtr {
18664        UsePathMultiPtr(self.node.0.stable_ptr)
18665    }
18666}
18667impl From<&UsePathMulti> for SyntaxStablePtrId {
18668    fn from(node: &UsePathMulti) -> Self {
18669        node.stable_ptr().untyped()
18670    }
18671}
18672#[derive(Clone, Debug, Eq, Hash, PartialEq)]
18673pub struct UsePathStar {
18674    node: SyntaxNode,
18675    children: Arc<[SyntaxNode]>,
18676}
18677impl UsePathStar {
18678    pub const INDEX_STAR: usize = 0;
18679    pub fn new_green(db: &dyn SyntaxGroup, star: TerminalMulGreen) -> UsePathStarGreen {
18680        let children: Vec<GreenId> = vec![star.0];
18681        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
18682        UsePathStarGreen(
18683            Arc::new(GreenNode {
18684                kind: SyntaxKind::UsePathStar,
18685                details: GreenNodeDetails::Node { children, width },
18686            })
18687            .intern(db),
18688        )
18689    }
18690}
18691impl UsePathStar {
18692    pub fn star(&self, db: &dyn SyntaxGroup) -> TerminalMul {
18693        TerminalMul::from_syntax_node(db, self.children[0].clone())
18694    }
18695}
18696#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
18697pub struct UsePathStarPtr(pub SyntaxStablePtrId);
18698impl UsePathStarPtr {}
18699impl TypedStablePtr for UsePathStarPtr {
18700    type SyntaxNode = UsePathStar;
18701    fn untyped(&self) -> SyntaxStablePtrId {
18702        self.0
18703    }
18704    fn lookup(&self, db: &dyn SyntaxGroup) -> UsePathStar {
18705        UsePathStar::from_syntax_node(db, self.0.lookup(db))
18706    }
18707}
18708impl From<UsePathStarPtr> for SyntaxStablePtrId {
18709    fn from(ptr: UsePathStarPtr) -> Self {
18710        ptr.untyped()
18711    }
18712}
18713#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
18714pub struct UsePathStarGreen(pub GreenId);
18715impl TypedSyntaxNode for UsePathStar {
18716    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::UsePathStar);
18717    type StablePtr = UsePathStarPtr;
18718    type Green = UsePathStarGreen;
18719    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
18720        UsePathStarGreen(
18721            Arc::new(GreenNode {
18722                kind: SyntaxKind::UsePathStar,
18723                details: GreenNodeDetails::Node {
18724                    children: vec![TerminalMul::missing(db).0],
18725                    width: TextWidth::default(),
18726                },
18727            })
18728            .intern(db),
18729        )
18730    }
18731    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
18732        let kind = node.kind(db);
18733        assert_eq!(
18734            kind,
18735            SyntaxKind::UsePathStar,
18736            "Unexpected SyntaxKind {:?}. Expected {:?}.",
18737            kind,
18738            SyntaxKind::UsePathStar
18739        );
18740        let children = db.get_children(node.clone());
18741        Self { node, children }
18742    }
18743    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
18744        let kind = node.kind(db);
18745        if kind == SyntaxKind::UsePathStar { Some(Self::from_syntax_node(db, node)) } else { None }
18746    }
18747    fn as_syntax_node(&self) -> SyntaxNode {
18748        self.node.clone()
18749    }
18750    fn stable_ptr(&self) -> Self::StablePtr {
18751        UsePathStarPtr(self.node.0.stable_ptr)
18752    }
18753}
18754impl From<&UsePathStar> for SyntaxStablePtrId {
18755    fn from(node: &UsePathStar) -> Self {
18756        node.stable_ptr().untyped()
18757    }
18758}
18759#[derive(Clone, Debug, Eq, Hash, PartialEq)]
18760pub struct UsePathList(ElementList<UsePath, 2>);
18761impl Deref for UsePathList {
18762    type Target = ElementList<UsePath, 2>;
18763    fn deref(&self) -> &Self::Target {
18764        &self.0
18765    }
18766}
18767impl UsePathList {
18768    pub fn new_green(
18769        db: &dyn SyntaxGroup,
18770        children: Vec<UsePathListElementOrSeparatorGreen>,
18771    ) -> UsePathListGreen {
18772        let width = children.iter().map(|id| id.id().lookup_intern(db).width()).sum();
18773        UsePathListGreen(
18774            Arc::new(GreenNode {
18775                kind: SyntaxKind::UsePathList,
18776                details: GreenNodeDetails::Node {
18777                    children: children.iter().map(|x| x.id()).collect(),
18778                    width,
18779                },
18780            })
18781            .intern(db),
18782        )
18783    }
18784}
18785#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
18786pub struct UsePathListPtr(pub SyntaxStablePtrId);
18787impl TypedStablePtr for UsePathListPtr {
18788    type SyntaxNode = UsePathList;
18789    fn untyped(&self) -> SyntaxStablePtrId {
18790        self.0
18791    }
18792    fn lookup(&self, db: &dyn SyntaxGroup) -> UsePathList {
18793        UsePathList::from_syntax_node(db, self.0.lookup(db))
18794    }
18795}
18796impl From<UsePathListPtr> for SyntaxStablePtrId {
18797    fn from(ptr: UsePathListPtr) -> Self {
18798        ptr.untyped()
18799    }
18800}
18801#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
18802pub enum UsePathListElementOrSeparatorGreen {
18803    Separator(TerminalCommaGreen),
18804    Element(UsePathGreen),
18805}
18806impl From<TerminalCommaGreen> for UsePathListElementOrSeparatorGreen {
18807    fn from(value: TerminalCommaGreen) -> Self {
18808        UsePathListElementOrSeparatorGreen::Separator(value)
18809    }
18810}
18811impl From<UsePathGreen> for UsePathListElementOrSeparatorGreen {
18812    fn from(value: UsePathGreen) -> Self {
18813        UsePathListElementOrSeparatorGreen::Element(value)
18814    }
18815}
18816impl UsePathListElementOrSeparatorGreen {
18817    fn id(&self) -> GreenId {
18818        match self {
18819            UsePathListElementOrSeparatorGreen::Separator(green) => green.0,
18820            UsePathListElementOrSeparatorGreen::Element(green) => green.0,
18821        }
18822    }
18823}
18824#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
18825pub struct UsePathListGreen(pub GreenId);
18826impl TypedSyntaxNode for UsePathList {
18827    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::UsePathList);
18828    type StablePtr = UsePathListPtr;
18829    type Green = UsePathListGreen;
18830    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
18831        UsePathListGreen(
18832            Arc::new(GreenNode {
18833                kind: SyntaxKind::UsePathList,
18834                details: GreenNodeDetails::Node { children: vec![], width: TextWidth::default() },
18835            })
18836            .intern(db),
18837        )
18838    }
18839    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
18840        Self(ElementList::new(node))
18841    }
18842    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
18843        if node.kind(db) == SyntaxKind::UsePathList {
18844            Some(Self(ElementList::new(node)))
18845        } else {
18846            None
18847        }
18848    }
18849    fn as_syntax_node(&self) -> SyntaxNode {
18850        self.node.clone()
18851    }
18852    fn stable_ptr(&self) -> Self::StablePtr {
18853        UsePathListPtr(self.node.0.stable_ptr)
18854    }
18855}
18856impl From<&UsePathList> for SyntaxStablePtrId {
18857    fn from(node: &UsePathList) -> Self {
18858        node.stable_ptr().untyped()
18859    }
18860}
18861#[derive(Clone, Debug, Eq, Hash, PartialEq)]
18862pub struct AliasClause {
18863    node: SyntaxNode,
18864    children: Arc<[SyntaxNode]>,
18865}
18866impl AliasClause {
18867    pub const INDEX_AS_KW: usize = 0;
18868    pub const INDEX_ALIAS: usize = 1;
18869    pub fn new_green(
18870        db: &dyn SyntaxGroup,
18871        as_kw: TerminalAsGreen,
18872        alias: TerminalIdentifierGreen,
18873    ) -> AliasClauseGreen {
18874        let children: Vec<GreenId> = vec![as_kw.0, alias.0];
18875        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
18876        AliasClauseGreen(
18877            Arc::new(GreenNode {
18878                kind: SyntaxKind::AliasClause,
18879                details: GreenNodeDetails::Node { children, width },
18880            })
18881            .intern(db),
18882        )
18883    }
18884}
18885impl AliasClause {
18886    pub fn as_kw(&self, db: &dyn SyntaxGroup) -> TerminalAs {
18887        TerminalAs::from_syntax_node(db, self.children[0].clone())
18888    }
18889    pub fn alias(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier {
18890        TerminalIdentifier::from_syntax_node(db, self.children[1].clone())
18891    }
18892}
18893#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
18894pub struct AliasClausePtr(pub SyntaxStablePtrId);
18895impl AliasClausePtr {
18896    pub fn alias_green(self, db: &dyn SyntaxGroup) -> TerminalIdentifierGreen {
18897        let ptr = self.0.lookup_intern(db);
18898        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
18899            TerminalIdentifierGreen(key_fields[0])
18900        } else {
18901            panic!("Unexpected key field query on root.");
18902        }
18903    }
18904}
18905impl TypedStablePtr for AliasClausePtr {
18906    type SyntaxNode = AliasClause;
18907    fn untyped(&self) -> SyntaxStablePtrId {
18908        self.0
18909    }
18910    fn lookup(&self, db: &dyn SyntaxGroup) -> AliasClause {
18911        AliasClause::from_syntax_node(db, self.0.lookup(db))
18912    }
18913}
18914impl From<AliasClausePtr> for SyntaxStablePtrId {
18915    fn from(ptr: AliasClausePtr) -> Self {
18916        ptr.untyped()
18917    }
18918}
18919#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
18920pub struct AliasClauseGreen(pub GreenId);
18921impl TypedSyntaxNode for AliasClause {
18922    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::AliasClause);
18923    type StablePtr = AliasClausePtr;
18924    type Green = AliasClauseGreen;
18925    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
18926        AliasClauseGreen(
18927            Arc::new(GreenNode {
18928                kind: SyntaxKind::AliasClause,
18929                details: GreenNodeDetails::Node {
18930                    children: vec![TerminalAs::missing(db).0, TerminalIdentifier::missing(db).0],
18931                    width: TextWidth::default(),
18932                },
18933            })
18934            .intern(db),
18935        )
18936    }
18937    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
18938        let kind = node.kind(db);
18939        assert_eq!(
18940            kind,
18941            SyntaxKind::AliasClause,
18942            "Unexpected SyntaxKind {:?}. Expected {:?}.",
18943            kind,
18944            SyntaxKind::AliasClause
18945        );
18946        let children = db.get_children(node.clone());
18947        Self { node, children }
18948    }
18949    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
18950        let kind = node.kind(db);
18951        if kind == SyntaxKind::AliasClause { Some(Self::from_syntax_node(db, node)) } else { None }
18952    }
18953    fn as_syntax_node(&self) -> SyntaxNode {
18954        self.node.clone()
18955    }
18956    fn stable_ptr(&self) -> Self::StablePtr {
18957        AliasClausePtr(self.node.0.stable_ptr)
18958    }
18959}
18960impl From<&AliasClause> for SyntaxStablePtrId {
18961    fn from(node: &AliasClause) -> Self {
18962        node.stable_ptr().untyped()
18963    }
18964}
18965#[derive(Clone, Debug, Eq, Hash, PartialEq)]
18966pub enum OptionAliasClause {
18967    Empty(OptionAliasClauseEmpty),
18968    AliasClause(AliasClause),
18969}
18970#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
18971pub struct OptionAliasClausePtr(pub SyntaxStablePtrId);
18972impl TypedStablePtr for OptionAliasClausePtr {
18973    type SyntaxNode = OptionAliasClause;
18974    fn untyped(&self) -> SyntaxStablePtrId {
18975        self.0
18976    }
18977    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionAliasClause {
18978        OptionAliasClause::from_syntax_node(db, self.0.lookup(db))
18979    }
18980}
18981impl From<OptionAliasClausePtr> for SyntaxStablePtrId {
18982    fn from(ptr: OptionAliasClausePtr) -> Self {
18983        ptr.untyped()
18984    }
18985}
18986impl From<OptionAliasClauseEmptyPtr> for OptionAliasClausePtr {
18987    fn from(value: OptionAliasClauseEmptyPtr) -> Self {
18988        Self(value.0)
18989    }
18990}
18991impl From<AliasClausePtr> for OptionAliasClausePtr {
18992    fn from(value: AliasClausePtr) -> Self {
18993        Self(value.0)
18994    }
18995}
18996impl From<OptionAliasClauseEmptyGreen> for OptionAliasClauseGreen {
18997    fn from(value: OptionAliasClauseEmptyGreen) -> Self {
18998        Self(value.0)
18999    }
19000}
19001impl From<AliasClauseGreen> for OptionAliasClauseGreen {
19002    fn from(value: AliasClauseGreen) -> Self {
19003        Self(value.0)
19004    }
19005}
19006#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
19007pub struct OptionAliasClauseGreen(pub GreenId);
19008impl TypedSyntaxNode for OptionAliasClause {
19009    const OPTIONAL_KIND: Option<SyntaxKind> = None;
19010    type StablePtr = OptionAliasClausePtr;
19011    type Green = OptionAliasClauseGreen;
19012    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
19013        panic!("No missing variant.");
19014    }
19015    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
19016        let kind = node.kind(db);
19017        match kind {
19018            SyntaxKind::OptionAliasClauseEmpty => {
19019                OptionAliasClause::Empty(OptionAliasClauseEmpty::from_syntax_node(db, node))
19020            }
19021            SyntaxKind::AliasClause => {
19022                OptionAliasClause::AliasClause(AliasClause::from_syntax_node(db, node))
19023            }
19024            _ => panic!(
19025                "Unexpected syntax kind {:?} when constructing {}.",
19026                kind, "OptionAliasClause"
19027            ),
19028        }
19029    }
19030    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
19031        let kind = node.kind(db);
19032        match kind {
19033            SyntaxKind::OptionAliasClauseEmpty => {
19034                Some(OptionAliasClause::Empty(OptionAliasClauseEmpty::from_syntax_node(db, node)))
19035            }
19036            SyntaxKind::AliasClause => {
19037                Some(OptionAliasClause::AliasClause(AliasClause::from_syntax_node(db, node)))
19038            }
19039            _ => None,
19040        }
19041    }
19042    fn as_syntax_node(&self) -> SyntaxNode {
19043        match self {
19044            OptionAliasClause::Empty(x) => x.as_syntax_node(),
19045            OptionAliasClause::AliasClause(x) => x.as_syntax_node(),
19046        }
19047    }
19048    fn stable_ptr(&self) -> Self::StablePtr {
19049        OptionAliasClausePtr(self.as_syntax_node().0.stable_ptr)
19050    }
19051}
19052impl From<&OptionAliasClause> for SyntaxStablePtrId {
19053    fn from(node: &OptionAliasClause) -> Self {
19054        node.stable_ptr().untyped()
19055    }
19056}
19057impl OptionAliasClause {
19058    /// Checks if a kind of a variant of [OptionAliasClause].
19059    pub fn is_variant(kind: SyntaxKind) -> bool {
19060        matches!(kind, SyntaxKind::OptionAliasClauseEmpty | SyntaxKind::AliasClause)
19061    }
19062}
19063#[derive(Clone, Debug, Eq, Hash, PartialEq)]
19064pub struct OptionAliasClauseEmpty {
19065    node: SyntaxNode,
19066    children: Arc<[SyntaxNode]>,
19067}
19068impl OptionAliasClauseEmpty {
19069    pub fn new_green(db: &dyn SyntaxGroup) -> OptionAliasClauseEmptyGreen {
19070        let children: Vec<GreenId> = vec![];
19071        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
19072        OptionAliasClauseEmptyGreen(
19073            Arc::new(GreenNode {
19074                kind: SyntaxKind::OptionAliasClauseEmpty,
19075                details: GreenNodeDetails::Node { children, width },
19076            })
19077            .intern(db),
19078        )
19079    }
19080}
19081impl OptionAliasClauseEmpty {}
19082#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
19083pub struct OptionAliasClauseEmptyPtr(pub SyntaxStablePtrId);
19084impl OptionAliasClauseEmptyPtr {}
19085impl TypedStablePtr for OptionAliasClauseEmptyPtr {
19086    type SyntaxNode = OptionAliasClauseEmpty;
19087    fn untyped(&self) -> SyntaxStablePtrId {
19088        self.0
19089    }
19090    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionAliasClauseEmpty {
19091        OptionAliasClauseEmpty::from_syntax_node(db, self.0.lookup(db))
19092    }
19093}
19094impl From<OptionAliasClauseEmptyPtr> for SyntaxStablePtrId {
19095    fn from(ptr: OptionAliasClauseEmptyPtr) -> Self {
19096        ptr.untyped()
19097    }
19098}
19099#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
19100pub struct OptionAliasClauseEmptyGreen(pub GreenId);
19101impl TypedSyntaxNode for OptionAliasClauseEmpty {
19102    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionAliasClauseEmpty);
19103    type StablePtr = OptionAliasClauseEmptyPtr;
19104    type Green = OptionAliasClauseEmptyGreen;
19105    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
19106        OptionAliasClauseEmptyGreen(
19107            Arc::new(GreenNode {
19108                kind: SyntaxKind::OptionAliasClauseEmpty,
19109                details: GreenNodeDetails::Node { children: vec![], width: TextWidth::default() },
19110            })
19111            .intern(db),
19112        )
19113    }
19114    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
19115        let kind = node.kind(db);
19116        assert_eq!(
19117            kind,
19118            SyntaxKind::OptionAliasClauseEmpty,
19119            "Unexpected SyntaxKind {:?}. Expected {:?}.",
19120            kind,
19121            SyntaxKind::OptionAliasClauseEmpty
19122        );
19123        let children = db.get_children(node.clone());
19124        Self { node, children }
19125    }
19126    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
19127        let kind = node.kind(db);
19128        if kind == SyntaxKind::OptionAliasClauseEmpty {
19129            Some(Self::from_syntax_node(db, node))
19130        } else {
19131            None
19132        }
19133    }
19134    fn as_syntax_node(&self) -> SyntaxNode {
19135        self.node.clone()
19136    }
19137    fn stable_ptr(&self) -> Self::StablePtr {
19138        OptionAliasClauseEmptyPtr(self.node.0.stable_ptr)
19139    }
19140}
19141impl From<&OptionAliasClauseEmpty> for SyntaxStablePtrId {
19142    fn from(node: &OptionAliasClauseEmpty) -> Self {
19143        node.stable_ptr().untyped()
19144    }
19145}
19146#[derive(Clone, Debug, Eq, Hash, PartialEq)]
19147pub enum GenericArg {
19148    Unnamed(GenericArgUnnamed),
19149    Named(GenericArgNamed),
19150}
19151#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
19152pub struct GenericArgPtr(pub SyntaxStablePtrId);
19153impl TypedStablePtr for GenericArgPtr {
19154    type SyntaxNode = GenericArg;
19155    fn untyped(&self) -> SyntaxStablePtrId {
19156        self.0
19157    }
19158    fn lookup(&self, db: &dyn SyntaxGroup) -> GenericArg {
19159        GenericArg::from_syntax_node(db, self.0.lookup(db))
19160    }
19161}
19162impl From<GenericArgPtr> for SyntaxStablePtrId {
19163    fn from(ptr: GenericArgPtr) -> Self {
19164        ptr.untyped()
19165    }
19166}
19167impl From<GenericArgUnnamedPtr> for GenericArgPtr {
19168    fn from(value: GenericArgUnnamedPtr) -> Self {
19169        Self(value.0)
19170    }
19171}
19172impl From<GenericArgNamedPtr> for GenericArgPtr {
19173    fn from(value: GenericArgNamedPtr) -> Self {
19174        Self(value.0)
19175    }
19176}
19177impl From<GenericArgUnnamedGreen> for GenericArgGreen {
19178    fn from(value: GenericArgUnnamedGreen) -> Self {
19179        Self(value.0)
19180    }
19181}
19182impl From<GenericArgNamedGreen> for GenericArgGreen {
19183    fn from(value: GenericArgNamedGreen) -> Self {
19184        Self(value.0)
19185    }
19186}
19187#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
19188pub struct GenericArgGreen(pub GreenId);
19189impl TypedSyntaxNode for GenericArg {
19190    const OPTIONAL_KIND: Option<SyntaxKind> = None;
19191    type StablePtr = GenericArgPtr;
19192    type Green = GenericArgGreen;
19193    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
19194        panic!("No missing variant.");
19195    }
19196    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
19197        let kind = node.kind(db);
19198        match kind {
19199            SyntaxKind::GenericArgUnnamed => {
19200                GenericArg::Unnamed(GenericArgUnnamed::from_syntax_node(db, node))
19201            }
19202            SyntaxKind::GenericArgNamed => {
19203                GenericArg::Named(GenericArgNamed::from_syntax_node(db, node))
19204            }
19205            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "GenericArg"),
19206        }
19207    }
19208    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
19209        let kind = node.kind(db);
19210        match kind {
19211            SyntaxKind::GenericArgUnnamed => {
19212                Some(GenericArg::Unnamed(GenericArgUnnamed::from_syntax_node(db, node)))
19213            }
19214            SyntaxKind::GenericArgNamed => {
19215                Some(GenericArg::Named(GenericArgNamed::from_syntax_node(db, node)))
19216            }
19217            _ => None,
19218        }
19219    }
19220    fn as_syntax_node(&self) -> SyntaxNode {
19221        match self {
19222            GenericArg::Unnamed(x) => x.as_syntax_node(),
19223            GenericArg::Named(x) => x.as_syntax_node(),
19224        }
19225    }
19226    fn stable_ptr(&self) -> Self::StablePtr {
19227        GenericArgPtr(self.as_syntax_node().0.stable_ptr)
19228    }
19229}
19230impl From<&GenericArg> for SyntaxStablePtrId {
19231    fn from(node: &GenericArg) -> Self {
19232        node.stable_ptr().untyped()
19233    }
19234}
19235impl GenericArg {
19236    /// Checks if a kind of a variant of [GenericArg].
19237    pub fn is_variant(kind: SyntaxKind) -> bool {
19238        matches!(kind, SyntaxKind::GenericArgUnnamed | SyntaxKind::GenericArgNamed)
19239    }
19240}
19241#[derive(Clone, Debug, Eq, Hash, PartialEq)]
19242pub struct GenericArgNamed {
19243    node: SyntaxNode,
19244    children: Arc<[SyntaxNode]>,
19245}
19246impl GenericArgNamed {
19247    pub const INDEX_NAME: usize = 0;
19248    pub const INDEX_COLON: usize = 1;
19249    pub const INDEX_VALUE: usize = 2;
19250    pub fn new_green(
19251        db: &dyn SyntaxGroup,
19252        name: TerminalIdentifierGreen,
19253        colon: TerminalColonGreen,
19254        value: GenericArgValueGreen,
19255    ) -> GenericArgNamedGreen {
19256        let children: Vec<GreenId> = vec![name.0, colon.0, value.0];
19257        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
19258        GenericArgNamedGreen(
19259            Arc::new(GreenNode {
19260                kind: SyntaxKind::GenericArgNamed,
19261                details: GreenNodeDetails::Node { children, width },
19262            })
19263            .intern(db),
19264        )
19265    }
19266}
19267impl GenericArgNamed {
19268    pub fn name(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier {
19269        TerminalIdentifier::from_syntax_node(db, self.children[0].clone())
19270    }
19271    pub fn colon(&self, db: &dyn SyntaxGroup) -> TerminalColon {
19272        TerminalColon::from_syntax_node(db, self.children[1].clone())
19273    }
19274    pub fn value(&self, db: &dyn SyntaxGroup) -> GenericArgValue {
19275        GenericArgValue::from_syntax_node(db, self.children[2].clone())
19276    }
19277}
19278#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
19279pub struct GenericArgNamedPtr(pub SyntaxStablePtrId);
19280impl GenericArgNamedPtr {}
19281impl TypedStablePtr for GenericArgNamedPtr {
19282    type SyntaxNode = GenericArgNamed;
19283    fn untyped(&self) -> SyntaxStablePtrId {
19284        self.0
19285    }
19286    fn lookup(&self, db: &dyn SyntaxGroup) -> GenericArgNamed {
19287        GenericArgNamed::from_syntax_node(db, self.0.lookup(db))
19288    }
19289}
19290impl From<GenericArgNamedPtr> for SyntaxStablePtrId {
19291    fn from(ptr: GenericArgNamedPtr) -> Self {
19292        ptr.untyped()
19293    }
19294}
19295#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
19296pub struct GenericArgNamedGreen(pub GreenId);
19297impl TypedSyntaxNode for GenericArgNamed {
19298    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::GenericArgNamed);
19299    type StablePtr = GenericArgNamedPtr;
19300    type Green = GenericArgNamedGreen;
19301    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
19302        GenericArgNamedGreen(
19303            Arc::new(GreenNode {
19304                kind: SyntaxKind::GenericArgNamed,
19305                details: GreenNodeDetails::Node {
19306                    children: vec![
19307                        TerminalIdentifier::missing(db).0,
19308                        TerminalColon::missing(db).0,
19309                        GenericArgValue::missing(db).0,
19310                    ],
19311                    width: TextWidth::default(),
19312                },
19313            })
19314            .intern(db),
19315        )
19316    }
19317    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
19318        let kind = node.kind(db);
19319        assert_eq!(
19320            kind,
19321            SyntaxKind::GenericArgNamed,
19322            "Unexpected SyntaxKind {:?}. Expected {:?}.",
19323            kind,
19324            SyntaxKind::GenericArgNamed
19325        );
19326        let children = db.get_children(node.clone());
19327        Self { node, children }
19328    }
19329    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
19330        let kind = node.kind(db);
19331        if kind == SyntaxKind::GenericArgNamed {
19332            Some(Self::from_syntax_node(db, node))
19333        } else {
19334            None
19335        }
19336    }
19337    fn as_syntax_node(&self) -> SyntaxNode {
19338        self.node.clone()
19339    }
19340    fn stable_ptr(&self) -> Self::StablePtr {
19341        GenericArgNamedPtr(self.node.0.stable_ptr)
19342    }
19343}
19344impl From<&GenericArgNamed> for SyntaxStablePtrId {
19345    fn from(node: &GenericArgNamed) -> Self {
19346        node.stable_ptr().untyped()
19347    }
19348}
19349#[derive(Clone, Debug, Eq, Hash, PartialEq)]
19350pub struct GenericArgUnnamed {
19351    node: SyntaxNode,
19352    children: Arc<[SyntaxNode]>,
19353}
19354impl GenericArgUnnamed {
19355    pub const INDEX_VALUE: usize = 0;
19356    pub fn new_green(db: &dyn SyntaxGroup, value: GenericArgValueGreen) -> GenericArgUnnamedGreen {
19357        let children: Vec<GreenId> = vec![value.0];
19358        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
19359        GenericArgUnnamedGreen(
19360            Arc::new(GreenNode {
19361                kind: SyntaxKind::GenericArgUnnamed,
19362                details: GreenNodeDetails::Node { children, width },
19363            })
19364            .intern(db),
19365        )
19366    }
19367}
19368impl GenericArgUnnamed {
19369    pub fn value(&self, db: &dyn SyntaxGroup) -> GenericArgValue {
19370        GenericArgValue::from_syntax_node(db, self.children[0].clone())
19371    }
19372}
19373#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
19374pub struct GenericArgUnnamedPtr(pub SyntaxStablePtrId);
19375impl GenericArgUnnamedPtr {}
19376impl TypedStablePtr for GenericArgUnnamedPtr {
19377    type SyntaxNode = GenericArgUnnamed;
19378    fn untyped(&self) -> SyntaxStablePtrId {
19379        self.0
19380    }
19381    fn lookup(&self, db: &dyn SyntaxGroup) -> GenericArgUnnamed {
19382        GenericArgUnnamed::from_syntax_node(db, self.0.lookup(db))
19383    }
19384}
19385impl From<GenericArgUnnamedPtr> for SyntaxStablePtrId {
19386    fn from(ptr: GenericArgUnnamedPtr) -> Self {
19387        ptr.untyped()
19388    }
19389}
19390#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
19391pub struct GenericArgUnnamedGreen(pub GreenId);
19392impl TypedSyntaxNode for GenericArgUnnamed {
19393    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::GenericArgUnnamed);
19394    type StablePtr = GenericArgUnnamedPtr;
19395    type Green = GenericArgUnnamedGreen;
19396    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
19397        GenericArgUnnamedGreen(
19398            Arc::new(GreenNode {
19399                kind: SyntaxKind::GenericArgUnnamed,
19400                details: GreenNodeDetails::Node {
19401                    children: vec![GenericArgValue::missing(db).0],
19402                    width: TextWidth::default(),
19403                },
19404            })
19405            .intern(db),
19406        )
19407    }
19408    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
19409        let kind = node.kind(db);
19410        assert_eq!(
19411            kind,
19412            SyntaxKind::GenericArgUnnamed,
19413            "Unexpected SyntaxKind {:?}. Expected {:?}.",
19414            kind,
19415            SyntaxKind::GenericArgUnnamed
19416        );
19417        let children = db.get_children(node.clone());
19418        Self { node, children }
19419    }
19420    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
19421        let kind = node.kind(db);
19422        if kind == SyntaxKind::GenericArgUnnamed {
19423            Some(Self::from_syntax_node(db, node))
19424        } else {
19425            None
19426        }
19427    }
19428    fn as_syntax_node(&self) -> SyntaxNode {
19429        self.node.clone()
19430    }
19431    fn stable_ptr(&self) -> Self::StablePtr {
19432        GenericArgUnnamedPtr(self.node.0.stable_ptr)
19433    }
19434}
19435impl From<&GenericArgUnnamed> for SyntaxStablePtrId {
19436    fn from(node: &GenericArgUnnamed) -> Self {
19437        node.stable_ptr().untyped()
19438    }
19439}
19440#[derive(Clone, Debug, Eq, Hash, PartialEq)]
19441pub enum GenericArgValue {
19442    Expr(GenericArgValueExpr),
19443    Underscore(TerminalUnderscore),
19444}
19445#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
19446pub struct GenericArgValuePtr(pub SyntaxStablePtrId);
19447impl TypedStablePtr for GenericArgValuePtr {
19448    type SyntaxNode = GenericArgValue;
19449    fn untyped(&self) -> SyntaxStablePtrId {
19450        self.0
19451    }
19452    fn lookup(&self, db: &dyn SyntaxGroup) -> GenericArgValue {
19453        GenericArgValue::from_syntax_node(db, self.0.lookup(db))
19454    }
19455}
19456impl From<GenericArgValuePtr> for SyntaxStablePtrId {
19457    fn from(ptr: GenericArgValuePtr) -> Self {
19458        ptr.untyped()
19459    }
19460}
19461impl From<GenericArgValueExprPtr> for GenericArgValuePtr {
19462    fn from(value: GenericArgValueExprPtr) -> Self {
19463        Self(value.0)
19464    }
19465}
19466impl From<TerminalUnderscorePtr> for GenericArgValuePtr {
19467    fn from(value: TerminalUnderscorePtr) -> Self {
19468        Self(value.0)
19469    }
19470}
19471impl From<GenericArgValueExprGreen> for GenericArgValueGreen {
19472    fn from(value: GenericArgValueExprGreen) -> Self {
19473        Self(value.0)
19474    }
19475}
19476impl From<TerminalUnderscoreGreen> for GenericArgValueGreen {
19477    fn from(value: TerminalUnderscoreGreen) -> Self {
19478        Self(value.0)
19479    }
19480}
19481#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
19482pub struct GenericArgValueGreen(pub GreenId);
19483impl TypedSyntaxNode for GenericArgValue {
19484    const OPTIONAL_KIND: Option<SyntaxKind> = None;
19485    type StablePtr = GenericArgValuePtr;
19486    type Green = GenericArgValueGreen;
19487    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
19488        panic!("No missing variant.");
19489    }
19490    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
19491        let kind = node.kind(db);
19492        match kind {
19493            SyntaxKind::GenericArgValueExpr => {
19494                GenericArgValue::Expr(GenericArgValueExpr::from_syntax_node(db, node))
19495            }
19496            SyntaxKind::TerminalUnderscore => {
19497                GenericArgValue::Underscore(TerminalUnderscore::from_syntax_node(db, node))
19498            }
19499            _ => {
19500                panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "GenericArgValue")
19501            }
19502        }
19503    }
19504    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
19505        let kind = node.kind(db);
19506        match kind {
19507            SyntaxKind::GenericArgValueExpr => {
19508                Some(GenericArgValue::Expr(GenericArgValueExpr::from_syntax_node(db, node)))
19509            }
19510            SyntaxKind::TerminalUnderscore => {
19511                Some(GenericArgValue::Underscore(TerminalUnderscore::from_syntax_node(db, node)))
19512            }
19513            _ => None,
19514        }
19515    }
19516    fn as_syntax_node(&self) -> SyntaxNode {
19517        match self {
19518            GenericArgValue::Expr(x) => x.as_syntax_node(),
19519            GenericArgValue::Underscore(x) => x.as_syntax_node(),
19520        }
19521    }
19522    fn stable_ptr(&self) -> Self::StablePtr {
19523        GenericArgValuePtr(self.as_syntax_node().0.stable_ptr)
19524    }
19525}
19526impl From<&GenericArgValue> for SyntaxStablePtrId {
19527    fn from(node: &GenericArgValue) -> Self {
19528        node.stable_ptr().untyped()
19529    }
19530}
19531impl GenericArgValue {
19532    /// Checks if a kind of a variant of [GenericArgValue].
19533    pub fn is_variant(kind: SyntaxKind) -> bool {
19534        matches!(kind, SyntaxKind::GenericArgValueExpr | SyntaxKind::TerminalUnderscore)
19535    }
19536}
19537#[derive(Clone, Debug, Eq, Hash, PartialEq)]
19538pub struct GenericArgValueExpr {
19539    node: SyntaxNode,
19540    children: Arc<[SyntaxNode]>,
19541}
19542impl GenericArgValueExpr {
19543    pub const INDEX_EXPR: usize = 0;
19544    pub fn new_green(db: &dyn SyntaxGroup, expr: ExprGreen) -> GenericArgValueExprGreen {
19545        let children: Vec<GreenId> = vec![expr.0];
19546        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
19547        GenericArgValueExprGreen(
19548            Arc::new(GreenNode {
19549                kind: SyntaxKind::GenericArgValueExpr,
19550                details: GreenNodeDetails::Node { children, width },
19551            })
19552            .intern(db),
19553        )
19554    }
19555}
19556impl GenericArgValueExpr {
19557    pub fn expr(&self, db: &dyn SyntaxGroup) -> Expr {
19558        Expr::from_syntax_node(db, self.children[0].clone())
19559    }
19560}
19561#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
19562pub struct GenericArgValueExprPtr(pub SyntaxStablePtrId);
19563impl GenericArgValueExprPtr {}
19564impl TypedStablePtr for GenericArgValueExprPtr {
19565    type SyntaxNode = GenericArgValueExpr;
19566    fn untyped(&self) -> SyntaxStablePtrId {
19567        self.0
19568    }
19569    fn lookup(&self, db: &dyn SyntaxGroup) -> GenericArgValueExpr {
19570        GenericArgValueExpr::from_syntax_node(db, self.0.lookup(db))
19571    }
19572}
19573impl From<GenericArgValueExprPtr> for SyntaxStablePtrId {
19574    fn from(ptr: GenericArgValueExprPtr) -> Self {
19575        ptr.untyped()
19576    }
19577}
19578#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
19579pub struct GenericArgValueExprGreen(pub GreenId);
19580impl TypedSyntaxNode for GenericArgValueExpr {
19581    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::GenericArgValueExpr);
19582    type StablePtr = GenericArgValueExprPtr;
19583    type Green = GenericArgValueExprGreen;
19584    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
19585        GenericArgValueExprGreen(
19586            Arc::new(GreenNode {
19587                kind: SyntaxKind::GenericArgValueExpr,
19588                details: GreenNodeDetails::Node {
19589                    children: vec![Expr::missing(db).0],
19590                    width: TextWidth::default(),
19591                },
19592            })
19593            .intern(db),
19594        )
19595    }
19596    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
19597        let kind = node.kind(db);
19598        assert_eq!(
19599            kind,
19600            SyntaxKind::GenericArgValueExpr,
19601            "Unexpected SyntaxKind {:?}. Expected {:?}.",
19602            kind,
19603            SyntaxKind::GenericArgValueExpr
19604        );
19605        let children = db.get_children(node.clone());
19606        Self { node, children }
19607    }
19608    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
19609        let kind = node.kind(db);
19610        if kind == SyntaxKind::GenericArgValueExpr {
19611            Some(Self::from_syntax_node(db, node))
19612        } else {
19613            None
19614        }
19615    }
19616    fn as_syntax_node(&self) -> SyntaxNode {
19617        self.node.clone()
19618    }
19619    fn stable_ptr(&self) -> Self::StablePtr {
19620        GenericArgValueExprPtr(self.node.0.stable_ptr)
19621    }
19622}
19623impl From<&GenericArgValueExpr> for SyntaxStablePtrId {
19624    fn from(node: &GenericArgValueExpr) -> Self {
19625        node.stable_ptr().untyped()
19626    }
19627}
19628#[derive(Clone, Debug, Eq, Hash, PartialEq)]
19629pub struct GenericArgs {
19630    node: SyntaxNode,
19631    children: Arc<[SyntaxNode]>,
19632}
19633impl GenericArgs {
19634    pub const INDEX_LANGLE: usize = 0;
19635    pub const INDEX_GENERIC_ARGS: usize = 1;
19636    pub const INDEX_RANGLE: usize = 2;
19637    pub fn new_green(
19638        db: &dyn SyntaxGroup,
19639        langle: TerminalLTGreen,
19640        generic_args: GenericArgListGreen,
19641        rangle: TerminalGTGreen,
19642    ) -> GenericArgsGreen {
19643        let children: Vec<GreenId> = vec![langle.0, generic_args.0, rangle.0];
19644        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
19645        GenericArgsGreen(
19646            Arc::new(GreenNode {
19647                kind: SyntaxKind::GenericArgs,
19648                details: GreenNodeDetails::Node { children, width },
19649            })
19650            .intern(db),
19651        )
19652    }
19653}
19654impl GenericArgs {
19655    pub fn langle(&self, db: &dyn SyntaxGroup) -> TerminalLT {
19656        TerminalLT::from_syntax_node(db, self.children[0].clone())
19657    }
19658    pub fn generic_args(&self, db: &dyn SyntaxGroup) -> GenericArgList {
19659        GenericArgList::from_syntax_node(db, self.children[1].clone())
19660    }
19661    pub fn rangle(&self, db: &dyn SyntaxGroup) -> TerminalGT {
19662        TerminalGT::from_syntax_node(db, self.children[2].clone())
19663    }
19664}
19665#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
19666pub struct GenericArgsPtr(pub SyntaxStablePtrId);
19667impl GenericArgsPtr {}
19668impl TypedStablePtr for GenericArgsPtr {
19669    type SyntaxNode = GenericArgs;
19670    fn untyped(&self) -> SyntaxStablePtrId {
19671        self.0
19672    }
19673    fn lookup(&self, db: &dyn SyntaxGroup) -> GenericArgs {
19674        GenericArgs::from_syntax_node(db, self.0.lookup(db))
19675    }
19676}
19677impl From<GenericArgsPtr> for SyntaxStablePtrId {
19678    fn from(ptr: GenericArgsPtr) -> Self {
19679        ptr.untyped()
19680    }
19681}
19682#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
19683pub struct GenericArgsGreen(pub GreenId);
19684impl TypedSyntaxNode for GenericArgs {
19685    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::GenericArgs);
19686    type StablePtr = GenericArgsPtr;
19687    type Green = GenericArgsGreen;
19688    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
19689        GenericArgsGreen(
19690            Arc::new(GreenNode {
19691                kind: SyntaxKind::GenericArgs,
19692                details: GreenNodeDetails::Node {
19693                    children: vec![
19694                        TerminalLT::missing(db).0,
19695                        GenericArgList::missing(db).0,
19696                        TerminalGT::missing(db).0,
19697                    ],
19698                    width: TextWidth::default(),
19699                },
19700            })
19701            .intern(db),
19702        )
19703    }
19704    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
19705        let kind = node.kind(db);
19706        assert_eq!(
19707            kind,
19708            SyntaxKind::GenericArgs,
19709            "Unexpected SyntaxKind {:?}. Expected {:?}.",
19710            kind,
19711            SyntaxKind::GenericArgs
19712        );
19713        let children = db.get_children(node.clone());
19714        Self { node, children }
19715    }
19716    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
19717        let kind = node.kind(db);
19718        if kind == SyntaxKind::GenericArgs { Some(Self::from_syntax_node(db, node)) } else { None }
19719    }
19720    fn as_syntax_node(&self) -> SyntaxNode {
19721        self.node.clone()
19722    }
19723    fn stable_ptr(&self) -> Self::StablePtr {
19724        GenericArgsPtr(self.node.0.stable_ptr)
19725    }
19726}
19727impl From<&GenericArgs> for SyntaxStablePtrId {
19728    fn from(node: &GenericArgs) -> Self {
19729        node.stable_ptr().untyped()
19730    }
19731}
19732#[derive(Clone, Debug, Eq, Hash, PartialEq)]
19733pub struct GenericArgList(ElementList<GenericArg, 2>);
19734impl Deref for GenericArgList {
19735    type Target = ElementList<GenericArg, 2>;
19736    fn deref(&self) -> &Self::Target {
19737        &self.0
19738    }
19739}
19740impl GenericArgList {
19741    pub fn new_green(
19742        db: &dyn SyntaxGroup,
19743        children: Vec<GenericArgListElementOrSeparatorGreen>,
19744    ) -> GenericArgListGreen {
19745        let width = children.iter().map(|id| id.id().lookup_intern(db).width()).sum();
19746        GenericArgListGreen(
19747            Arc::new(GreenNode {
19748                kind: SyntaxKind::GenericArgList,
19749                details: GreenNodeDetails::Node {
19750                    children: children.iter().map(|x| x.id()).collect(),
19751                    width,
19752                },
19753            })
19754            .intern(db),
19755        )
19756    }
19757}
19758#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
19759pub struct GenericArgListPtr(pub SyntaxStablePtrId);
19760impl TypedStablePtr for GenericArgListPtr {
19761    type SyntaxNode = GenericArgList;
19762    fn untyped(&self) -> SyntaxStablePtrId {
19763        self.0
19764    }
19765    fn lookup(&self, db: &dyn SyntaxGroup) -> GenericArgList {
19766        GenericArgList::from_syntax_node(db, self.0.lookup(db))
19767    }
19768}
19769impl From<GenericArgListPtr> for SyntaxStablePtrId {
19770    fn from(ptr: GenericArgListPtr) -> Self {
19771        ptr.untyped()
19772    }
19773}
19774#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
19775pub enum GenericArgListElementOrSeparatorGreen {
19776    Separator(TerminalCommaGreen),
19777    Element(GenericArgGreen),
19778}
19779impl From<TerminalCommaGreen> for GenericArgListElementOrSeparatorGreen {
19780    fn from(value: TerminalCommaGreen) -> Self {
19781        GenericArgListElementOrSeparatorGreen::Separator(value)
19782    }
19783}
19784impl From<GenericArgGreen> for GenericArgListElementOrSeparatorGreen {
19785    fn from(value: GenericArgGreen) -> Self {
19786        GenericArgListElementOrSeparatorGreen::Element(value)
19787    }
19788}
19789impl GenericArgListElementOrSeparatorGreen {
19790    fn id(&self) -> GreenId {
19791        match self {
19792            GenericArgListElementOrSeparatorGreen::Separator(green) => green.0,
19793            GenericArgListElementOrSeparatorGreen::Element(green) => green.0,
19794        }
19795    }
19796}
19797#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
19798pub struct GenericArgListGreen(pub GreenId);
19799impl TypedSyntaxNode for GenericArgList {
19800    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::GenericArgList);
19801    type StablePtr = GenericArgListPtr;
19802    type Green = GenericArgListGreen;
19803    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
19804        GenericArgListGreen(
19805            Arc::new(GreenNode {
19806                kind: SyntaxKind::GenericArgList,
19807                details: GreenNodeDetails::Node { children: vec![], width: TextWidth::default() },
19808            })
19809            .intern(db),
19810        )
19811    }
19812    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
19813        Self(ElementList::new(node))
19814    }
19815    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
19816        if node.kind(db) == SyntaxKind::GenericArgList {
19817            Some(Self(ElementList::new(node)))
19818        } else {
19819            None
19820        }
19821    }
19822    fn as_syntax_node(&self) -> SyntaxNode {
19823        self.node.clone()
19824    }
19825    fn stable_ptr(&self) -> Self::StablePtr {
19826        GenericArgListPtr(self.node.0.stable_ptr)
19827    }
19828}
19829impl From<&GenericArgList> for SyntaxStablePtrId {
19830    fn from(node: &GenericArgList) -> Self {
19831        node.stable_ptr().untyped()
19832    }
19833}
19834#[derive(Clone, Debug, Eq, Hash, PartialEq)]
19835pub struct AssociatedItemConstraint {
19836    node: SyntaxNode,
19837    children: Arc<[SyntaxNode]>,
19838}
19839impl AssociatedItemConstraint {
19840    pub const INDEX_ITEM: usize = 0;
19841    pub const INDEX_COLON: usize = 1;
19842    pub const INDEX_VALUE: usize = 2;
19843    pub fn new_green(
19844        db: &dyn SyntaxGroup,
19845        item: TerminalIdentifierGreen,
19846        colon: TerminalColonGreen,
19847        value: ExprGreen,
19848    ) -> AssociatedItemConstraintGreen {
19849        let children: Vec<GreenId> = vec![item.0, colon.0, value.0];
19850        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
19851        AssociatedItemConstraintGreen(
19852            Arc::new(GreenNode {
19853                kind: SyntaxKind::AssociatedItemConstraint,
19854                details: GreenNodeDetails::Node { children, width },
19855            })
19856            .intern(db),
19857        )
19858    }
19859}
19860impl AssociatedItemConstraint {
19861    pub fn item(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier {
19862        TerminalIdentifier::from_syntax_node(db, self.children[0].clone())
19863    }
19864    pub fn colon(&self, db: &dyn SyntaxGroup) -> TerminalColon {
19865        TerminalColon::from_syntax_node(db, self.children[1].clone())
19866    }
19867    pub fn value(&self, db: &dyn SyntaxGroup) -> Expr {
19868        Expr::from_syntax_node(db, self.children[2].clone())
19869    }
19870}
19871#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
19872pub struct AssociatedItemConstraintPtr(pub SyntaxStablePtrId);
19873impl AssociatedItemConstraintPtr {}
19874impl TypedStablePtr for AssociatedItemConstraintPtr {
19875    type SyntaxNode = AssociatedItemConstraint;
19876    fn untyped(&self) -> SyntaxStablePtrId {
19877        self.0
19878    }
19879    fn lookup(&self, db: &dyn SyntaxGroup) -> AssociatedItemConstraint {
19880        AssociatedItemConstraint::from_syntax_node(db, self.0.lookup(db))
19881    }
19882}
19883impl From<AssociatedItemConstraintPtr> for SyntaxStablePtrId {
19884    fn from(ptr: AssociatedItemConstraintPtr) -> Self {
19885        ptr.untyped()
19886    }
19887}
19888#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
19889pub struct AssociatedItemConstraintGreen(pub GreenId);
19890impl TypedSyntaxNode for AssociatedItemConstraint {
19891    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::AssociatedItemConstraint);
19892    type StablePtr = AssociatedItemConstraintPtr;
19893    type Green = AssociatedItemConstraintGreen;
19894    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
19895        AssociatedItemConstraintGreen(
19896            Arc::new(GreenNode {
19897                kind: SyntaxKind::AssociatedItemConstraint,
19898                details: GreenNodeDetails::Node {
19899                    children: vec![
19900                        TerminalIdentifier::missing(db).0,
19901                        TerminalColon::missing(db).0,
19902                        Expr::missing(db).0,
19903                    ],
19904                    width: TextWidth::default(),
19905                },
19906            })
19907            .intern(db),
19908        )
19909    }
19910    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
19911        let kind = node.kind(db);
19912        assert_eq!(
19913            kind,
19914            SyntaxKind::AssociatedItemConstraint,
19915            "Unexpected SyntaxKind {:?}. Expected {:?}.",
19916            kind,
19917            SyntaxKind::AssociatedItemConstraint
19918        );
19919        let children = db.get_children(node.clone());
19920        Self { node, children }
19921    }
19922    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
19923        let kind = node.kind(db);
19924        if kind == SyntaxKind::AssociatedItemConstraint {
19925            Some(Self::from_syntax_node(db, node))
19926        } else {
19927            None
19928        }
19929    }
19930    fn as_syntax_node(&self) -> SyntaxNode {
19931        self.node.clone()
19932    }
19933    fn stable_ptr(&self) -> Self::StablePtr {
19934        AssociatedItemConstraintPtr(self.node.0.stable_ptr)
19935    }
19936}
19937impl From<&AssociatedItemConstraint> for SyntaxStablePtrId {
19938    fn from(node: &AssociatedItemConstraint) -> Self {
19939        node.stable_ptr().untyped()
19940    }
19941}
19942#[derive(Clone, Debug, Eq, Hash, PartialEq)]
19943pub struct AssociatedItemConstraints {
19944    node: SyntaxNode,
19945    children: Arc<[SyntaxNode]>,
19946}
19947impl AssociatedItemConstraints {
19948    pub const INDEX_LBRACK: usize = 0;
19949    pub const INDEX_ASSOCIATED_ITEM_CONSTRAINTS: usize = 1;
19950    pub const INDEX_RBRACK: usize = 2;
19951    pub fn new_green(
19952        db: &dyn SyntaxGroup,
19953        lbrack: TerminalLBrackGreen,
19954        associated_item_constraints: AssociatedItemConstraintListGreen,
19955        rbrack: TerminalRBrackGreen,
19956    ) -> AssociatedItemConstraintsGreen {
19957        let children: Vec<GreenId> = vec![lbrack.0, associated_item_constraints.0, rbrack.0];
19958        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
19959        AssociatedItemConstraintsGreen(
19960            Arc::new(GreenNode {
19961                kind: SyntaxKind::AssociatedItemConstraints,
19962                details: GreenNodeDetails::Node { children, width },
19963            })
19964            .intern(db),
19965        )
19966    }
19967}
19968impl AssociatedItemConstraints {
19969    pub fn lbrack(&self, db: &dyn SyntaxGroup) -> TerminalLBrack {
19970        TerminalLBrack::from_syntax_node(db, self.children[0].clone())
19971    }
19972    pub fn associated_item_constraints(
19973        &self,
19974        db: &dyn SyntaxGroup,
19975    ) -> AssociatedItemConstraintList {
19976        AssociatedItemConstraintList::from_syntax_node(db, self.children[1].clone())
19977    }
19978    pub fn rbrack(&self, db: &dyn SyntaxGroup) -> TerminalRBrack {
19979        TerminalRBrack::from_syntax_node(db, self.children[2].clone())
19980    }
19981}
19982#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
19983pub struct AssociatedItemConstraintsPtr(pub SyntaxStablePtrId);
19984impl AssociatedItemConstraintsPtr {}
19985impl TypedStablePtr for AssociatedItemConstraintsPtr {
19986    type SyntaxNode = AssociatedItemConstraints;
19987    fn untyped(&self) -> SyntaxStablePtrId {
19988        self.0
19989    }
19990    fn lookup(&self, db: &dyn SyntaxGroup) -> AssociatedItemConstraints {
19991        AssociatedItemConstraints::from_syntax_node(db, self.0.lookup(db))
19992    }
19993}
19994impl From<AssociatedItemConstraintsPtr> for SyntaxStablePtrId {
19995    fn from(ptr: AssociatedItemConstraintsPtr) -> Self {
19996        ptr.untyped()
19997    }
19998}
19999#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
20000pub struct AssociatedItemConstraintsGreen(pub GreenId);
20001impl TypedSyntaxNode for AssociatedItemConstraints {
20002    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::AssociatedItemConstraints);
20003    type StablePtr = AssociatedItemConstraintsPtr;
20004    type Green = AssociatedItemConstraintsGreen;
20005    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
20006        AssociatedItemConstraintsGreen(
20007            Arc::new(GreenNode {
20008                kind: SyntaxKind::AssociatedItemConstraints,
20009                details: GreenNodeDetails::Node {
20010                    children: vec![
20011                        TerminalLBrack::missing(db).0,
20012                        AssociatedItemConstraintList::missing(db).0,
20013                        TerminalRBrack::missing(db).0,
20014                    ],
20015                    width: TextWidth::default(),
20016                },
20017            })
20018            .intern(db),
20019        )
20020    }
20021    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
20022        let kind = node.kind(db);
20023        assert_eq!(
20024            kind,
20025            SyntaxKind::AssociatedItemConstraints,
20026            "Unexpected SyntaxKind {:?}. Expected {:?}.",
20027            kind,
20028            SyntaxKind::AssociatedItemConstraints
20029        );
20030        let children = db.get_children(node.clone());
20031        Self { node, children }
20032    }
20033    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
20034        let kind = node.kind(db);
20035        if kind == SyntaxKind::AssociatedItemConstraints {
20036            Some(Self::from_syntax_node(db, node))
20037        } else {
20038            None
20039        }
20040    }
20041    fn as_syntax_node(&self) -> SyntaxNode {
20042        self.node.clone()
20043    }
20044    fn stable_ptr(&self) -> Self::StablePtr {
20045        AssociatedItemConstraintsPtr(self.node.0.stable_ptr)
20046    }
20047}
20048impl From<&AssociatedItemConstraints> for SyntaxStablePtrId {
20049    fn from(node: &AssociatedItemConstraints) -> Self {
20050        node.stable_ptr().untyped()
20051    }
20052}
20053#[derive(Clone, Debug, Eq, Hash, PartialEq)]
20054pub struct AssociatedItemConstraintList(ElementList<AssociatedItemConstraint, 2>);
20055impl Deref for AssociatedItemConstraintList {
20056    type Target = ElementList<AssociatedItemConstraint, 2>;
20057    fn deref(&self) -> &Self::Target {
20058        &self.0
20059    }
20060}
20061impl AssociatedItemConstraintList {
20062    pub fn new_green(
20063        db: &dyn SyntaxGroup,
20064        children: Vec<AssociatedItemConstraintListElementOrSeparatorGreen>,
20065    ) -> AssociatedItemConstraintListGreen {
20066        let width = children.iter().map(|id| id.id().lookup_intern(db).width()).sum();
20067        AssociatedItemConstraintListGreen(
20068            Arc::new(GreenNode {
20069                kind: SyntaxKind::AssociatedItemConstraintList,
20070                details: GreenNodeDetails::Node {
20071                    children: children.iter().map(|x| x.id()).collect(),
20072                    width,
20073                },
20074            })
20075            .intern(db),
20076        )
20077    }
20078}
20079#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
20080pub struct AssociatedItemConstraintListPtr(pub SyntaxStablePtrId);
20081impl TypedStablePtr for AssociatedItemConstraintListPtr {
20082    type SyntaxNode = AssociatedItemConstraintList;
20083    fn untyped(&self) -> SyntaxStablePtrId {
20084        self.0
20085    }
20086    fn lookup(&self, db: &dyn SyntaxGroup) -> AssociatedItemConstraintList {
20087        AssociatedItemConstraintList::from_syntax_node(db, self.0.lookup(db))
20088    }
20089}
20090impl From<AssociatedItemConstraintListPtr> for SyntaxStablePtrId {
20091    fn from(ptr: AssociatedItemConstraintListPtr) -> Self {
20092        ptr.untyped()
20093    }
20094}
20095#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
20096pub enum AssociatedItemConstraintListElementOrSeparatorGreen {
20097    Separator(TerminalCommaGreen),
20098    Element(AssociatedItemConstraintGreen),
20099}
20100impl From<TerminalCommaGreen> for AssociatedItemConstraintListElementOrSeparatorGreen {
20101    fn from(value: TerminalCommaGreen) -> Self {
20102        AssociatedItemConstraintListElementOrSeparatorGreen::Separator(value)
20103    }
20104}
20105impl From<AssociatedItemConstraintGreen> for AssociatedItemConstraintListElementOrSeparatorGreen {
20106    fn from(value: AssociatedItemConstraintGreen) -> Self {
20107        AssociatedItemConstraintListElementOrSeparatorGreen::Element(value)
20108    }
20109}
20110impl AssociatedItemConstraintListElementOrSeparatorGreen {
20111    fn id(&self) -> GreenId {
20112        match self {
20113            AssociatedItemConstraintListElementOrSeparatorGreen::Separator(green) => green.0,
20114            AssociatedItemConstraintListElementOrSeparatorGreen::Element(green) => green.0,
20115        }
20116    }
20117}
20118#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
20119pub struct AssociatedItemConstraintListGreen(pub GreenId);
20120impl TypedSyntaxNode for AssociatedItemConstraintList {
20121    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::AssociatedItemConstraintList);
20122    type StablePtr = AssociatedItemConstraintListPtr;
20123    type Green = AssociatedItemConstraintListGreen;
20124    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
20125        AssociatedItemConstraintListGreen(
20126            Arc::new(GreenNode {
20127                kind: SyntaxKind::AssociatedItemConstraintList,
20128                details: GreenNodeDetails::Node { children: vec![], width: TextWidth::default() },
20129            })
20130            .intern(db),
20131        )
20132    }
20133    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
20134        Self(ElementList::new(node))
20135    }
20136    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
20137        if node.kind(db) == SyntaxKind::AssociatedItemConstraintList {
20138            Some(Self(ElementList::new(node)))
20139        } else {
20140            None
20141        }
20142    }
20143    fn as_syntax_node(&self) -> SyntaxNode {
20144        self.node.clone()
20145    }
20146    fn stable_ptr(&self) -> Self::StablePtr {
20147        AssociatedItemConstraintListPtr(self.node.0.stable_ptr)
20148    }
20149}
20150impl From<&AssociatedItemConstraintList> for SyntaxStablePtrId {
20151    fn from(node: &AssociatedItemConstraintList) -> Self {
20152        node.stable_ptr().untyped()
20153    }
20154}
20155#[derive(Clone, Debug, Eq, Hash, PartialEq)]
20156pub enum OptionAssociatedItemConstraints {
20157    Empty(OptionAssociatedItemConstraintsEmpty),
20158    AssociatedItemConstraints(AssociatedItemConstraints),
20159}
20160#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
20161pub struct OptionAssociatedItemConstraintsPtr(pub SyntaxStablePtrId);
20162impl TypedStablePtr for OptionAssociatedItemConstraintsPtr {
20163    type SyntaxNode = OptionAssociatedItemConstraints;
20164    fn untyped(&self) -> SyntaxStablePtrId {
20165        self.0
20166    }
20167    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionAssociatedItemConstraints {
20168        OptionAssociatedItemConstraints::from_syntax_node(db, self.0.lookup(db))
20169    }
20170}
20171impl From<OptionAssociatedItemConstraintsPtr> for SyntaxStablePtrId {
20172    fn from(ptr: OptionAssociatedItemConstraintsPtr) -> Self {
20173        ptr.untyped()
20174    }
20175}
20176impl From<OptionAssociatedItemConstraintsEmptyPtr> for OptionAssociatedItemConstraintsPtr {
20177    fn from(value: OptionAssociatedItemConstraintsEmptyPtr) -> Self {
20178        Self(value.0)
20179    }
20180}
20181impl From<AssociatedItemConstraintsPtr> for OptionAssociatedItemConstraintsPtr {
20182    fn from(value: AssociatedItemConstraintsPtr) -> Self {
20183        Self(value.0)
20184    }
20185}
20186impl From<OptionAssociatedItemConstraintsEmptyGreen> for OptionAssociatedItemConstraintsGreen {
20187    fn from(value: OptionAssociatedItemConstraintsEmptyGreen) -> Self {
20188        Self(value.0)
20189    }
20190}
20191impl From<AssociatedItemConstraintsGreen> for OptionAssociatedItemConstraintsGreen {
20192    fn from(value: AssociatedItemConstraintsGreen) -> Self {
20193        Self(value.0)
20194    }
20195}
20196#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
20197pub struct OptionAssociatedItemConstraintsGreen(pub GreenId);
20198impl TypedSyntaxNode for OptionAssociatedItemConstraints {
20199    const OPTIONAL_KIND: Option<SyntaxKind> = None;
20200    type StablePtr = OptionAssociatedItemConstraintsPtr;
20201    type Green = OptionAssociatedItemConstraintsGreen;
20202    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
20203        panic!("No missing variant.");
20204    }
20205    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
20206        let kind = node.kind(db);
20207        match kind {
20208            SyntaxKind::OptionAssociatedItemConstraintsEmpty => {
20209                OptionAssociatedItemConstraints::Empty(
20210                    OptionAssociatedItemConstraintsEmpty::from_syntax_node(db, node),
20211                )
20212            }
20213            SyntaxKind::AssociatedItemConstraints => {
20214                OptionAssociatedItemConstraints::AssociatedItemConstraints(
20215                    AssociatedItemConstraints::from_syntax_node(db, node),
20216                )
20217            }
20218            _ => panic!(
20219                "Unexpected syntax kind {:?} when constructing {}.",
20220                kind, "OptionAssociatedItemConstraints"
20221            ),
20222        }
20223    }
20224    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
20225        let kind = node.kind(db);
20226        match kind {
20227            SyntaxKind::OptionAssociatedItemConstraintsEmpty => {
20228                Some(OptionAssociatedItemConstraints::Empty(
20229                    OptionAssociatedItemConstraintsEmpty::from_syntax_node(db, node),
20230                ))
20231            }
20232            SyntaxKind::AssociatedItemConstraints => {
20233                Some(OptionAssociatedItemConstraints::AssociatedItemConstraints(
20234                    AssociatedItemConstraints::from_syntax_node(db, node),
20235                ))
20236            }
20237            _ => None,
20238        }
20239    }
20240    fn as_syntax_node(&self) -> SyntaxNode {
20241        match self {
20242            OptionAssociatedItemConstraints::Empty(x) => x.as_syntax_node(),
20243            OptionAssociatedItemConstraints::AssociatedItemConstraints(x) => x.as_syntax_node(),
20244        }
20245    }
20246    fn stable_ptr(&self) -> Self::StablePtr {
20247        OptionAssociatedItemConstraintsPtr(self.as_syntax_node().0.stable_ptr)
20248    }
20249}
20250impl From<&OptionAssociatedItemConstraints> for SyntaxStablePtrId {
20251    fn from(node: &OptionAssociatedItemConstraints) -> Self {
20252        node.stable_ptr().untyped()
20253    }
20254}
20255impl OptionAssociatedItemConstraints {
20256    /// Checks if a kind of a variant of [OptionAssociatedItemConstraints].
20257    pub fn is_variant(kind: SyntaxKind) -> bool {
20258        matches!(
20259            kind,
20260            SyntaxKind::OptionAssociatedItemConstraintsEmpty
20261                | SyntaxKind::AssociatedItemConstraints
20262        )
20263    }
20264}
20265#[derive(Clone, Debug, Eq, Hash, PartialEq)]
20266pub struct OptionAssociatedItemConstraintsEmpty {
20267    node: SyntaxNode,
20268    children: Arc<[SyntaxNode]>,
20269}
20270impl OptionAssociatedItemConstraintsEmpty {
20271    pub fn new_green(db: &dyn SyntaxGroup) -> OptionAssociatedItemConstraintsEmptyGreen {
20272        let children: Vec<GreenId> = vec![];
20273        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
20274        OptionAssociatedItemConstraintsEmptyGreen(
20275            Arc::new(GreenNode {
20276                kind: SyntaxKind::OptionAssociatedItemConstraintsEmpty,
20277                details: GreenNodeDetails::Node { children, width },
20278            })
20279            .intern(db),
20280        )
20281    }
20282}
20283impl OptionAssociatedItemConstraintsEmpty {}
20284#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
20285pub struct OptionAssociatedItemConstraintsEmptyPtr(pub SyntaxStablePtrId);
20286impl OptionAssociatedItemConstraintsEmptyPtr {}
20287impl TypedStablePtr for OptionAssociatedItemConstraintsEmptyPtr {
20288    type SyntaxNode = OptionAssociatedItemConstraintsEmpty;
20289    fn untyped(&self) -> SyntaxStablePtrId {
20290        self.0
20291    }
20292    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionAssociatedItemConstraintsEmpty {
20293        OptionAssociatedItemConstraintsEmpty::from_syntax_node(db, self.0.lookup(db))
20294    }
20295}
20296impl From<OptionAssociatedItemConstraintsEmptyPtr> for SyntaxStablePtrId {
20297    fn from(ptr: OptionAssociatedItemConstraintsEmptyPtr) -> Self {
20298        ptr.untyped()
20299    }
20300}
20301#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
20302pub struct OptionAssociatedItemConstraintsEmptyGreen(pub GreenId);
20303impl TypedSyntaxNode for OptionAssociatedItemConstraintsEmpty {
20304    const OPTIONAL_KIND: Option<SyntaxKind> =
20305        Some(SyntaxKind::OptionAssociatedItemConstraintsEmpty);
20306    type StablePtr = OptionAssociatedItemConstraintsEmptyPtr;
20307    type Green = OptionAssociatedItemConstraintsEmptyGreen;
20308    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
20309        OptionAssociatedItemConstraintsEmptyGreen(
20310            Arc::new(GreenNode {
20311                kind: SyntaxKind::OptionAssociatedItemConstraintsEmpty,
20312                details: GreenNodeDetails::Node { children: vec![], width: TextWidth::default() },
20313            })
20314            .intern(db),
20315        )
20316    }
20317    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
20318        let kind = node.kind(db);
20319        assert_eq!(
20320            kind,
20321            SyntaxKind::OptionAssociatedItemConstraintsEmpty,
20322            "Unexpected SyntaxKind {:?}. Expected {:?}.",
20323            kind,
20324            SyntaxKind::OptionAssociatedItemConstraintsEmpty
20325        );
20326        let children = db.get_children(node.clone());
20327        Self { node, children }
20328    }
20329    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
20330        let kind = node.kind(db);
20331        if kind == SyntaxKind::OptionAssociatedItemConstraintsEmpty {
20332            Some(Self::from_syntax_node(db, node))
20333        } else {
20334            None
20335        }
20336    }
20337    fn as_syntax_node(&self) -> SyntaxNode {
20338        self.node.clone()
20339    }
20340    fn stable_ptr(&self) -> Self::StablePtr {
20341        OptionAssociatedItemConstraintsEmptyPtr(self.node.0.stable_ptr)
20342    }
20343}
20344impl From<&OptionAssociatedItemConstraintsEmpty> for SyntaxStablePtrId {
20345    fn from(node: &OptionAssociatedItemConstraintsEmpty) -> Self {
20346        node.stable_ptr().untyped()
20347    }
20348}
20349#[derive(Clone, Debug, Eq, Hash, PartialEq)]
20350pub enum OptionWrappedGenericParamList {
20351    Empty(OptionWrappedGenericParamListEmpty),
20352    WrappedGenericParamList(WrappedGenericParamList),
20353}
20354#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
20355pub struct OptionWrappedGenericParamListPtr(pub SyntaxStablePtrId);
20356impl TypedStablePtr for OptionWrappedGenericParamListPtr {
20357    type SyntaxNode = OptionWrappedGenericParamList;
20358    fn untyped(&self) -> SyntaxStablePtrId {
20359        self.0
20360    }
20361    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionWrappedGenericParamList {
20362        OptionWrappedGenericParamList::from_syntax_node(db, self.0.lookup(db))
20363    }
20364}
20365impl From<OptionWrappedGenericParamListPtr> for SyntaxStablePtrId {
20366    fn from(ptr: OptionWrappedGenericParamListPtr) -> Self {
20367        ptr.untyped()
20368    }
20369}
20370impl From<OptionWrappedGenericParamListEmptyPtr> for OptionWrappedGenericParamListPtr {
20371    fn from(value: OptionWrappedGenericParamListEmptyPtr) -> Self {
20372        Self(value.0)
20373    }
20374}
20375impl From<WrappedGenericParamListPtr> for OptionWrappedGenericParamListPtr {
20376    fn from(value: WrappedGenericParamListPtr) -> Self {
20377        Self(value.0)
20378    }
20379}
20380impl From<OptionWrappedGenericParamListEmptyGreen> for OptionWrappedGenericParamListGreen {
20381    fn from(value: OptionWrappedGenericParamListEmptyGreen) -> Self {
20382        Self(value.0)
20383    }
20384}
20385impl From<WrappedGenericParamListGreen> for OptionWrappedGenericParamListGreen {
20386    fn from(value: WrappedGenericParamListGreen) -> Self {
20387        Self(value.0)
20388    }
20389}
20390#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
20391pub struct OptionWrappedGenericParamListGreen(pub GreenId);
20392impl TypedSyntaxNode for OptionWrappedGenericParamList {
20393    const OPTIONAL_KIND: Option<SyntaxKind> = None;
20394    type StablePtr = OptionWrappedGenericParamListPtr;
20395    type Green = OptionWrappedGenericParamListGreen;
20396    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
20397        panic!("No missing variant.");
20398    }
20399    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
20400        let kind = node.kind(db);
20401        match kind {
20402            SyntaxKind::OptionWrappedGenericParamListEmpty => OptionWrappedGenericParamList::Empty(
20403                OptionWrappedGenericParamListEmpty::from_syntax_node(db, node),
20404            ),
20405            SyntaxKind::WrappedGenericParamList => {
20406                OptionWrappedGenericParamList::WrappedGenericParamList(
20407                    WrappedGenericParamList::from_syntax_node(db, node),
20408                )
20409            }
20410            _ => panic!(
20411                "Unexpected syntax kind {:?} when constructing {}.",
20412                kind, "OptionWrappedGenericParamList"
20413            ),
20414        }
20415    }
20416    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
20417        let kind = node.kind(db);
20418        match kind {
20419            SyntaxKind::OptionWrappedGenericParamListEmpty => {
20420                Some(OptionWrappedGenericParamList::Empty(
20421                    OptionWrappedGenericParamListEmpty::from_syntax_node(db, node),
20422                ))
20423            }
20424            SyntaxKind::WrappedGenericParamList => {
20425                Some(OptionWrappedGenericParamList::WrappedGenericParamList(
20426                    WrappedGenericParamList::from_syntax_node(db, node),
20427                ))
20428            }
20429            _ => None,
20430        }
20431    }
20432    fn as_syntax_node(&self) -> SyntaxNode {
20433        match self {
20434            OptionWrappedGenericParamList::Empty(x) => x.as_syntax_node(),
20435            OptionWrappedGenericParamList::WrappedGenericParamList(x) => x.as_syntax_node(),
20436        }
20437    }
20438    fn stable_ptr(&self) -> Self::StablePtr {
20439        OptionWrappedGenericParamListPtr(self.as_syntax_node().0.stable_ptr)
20440    }
20441}
20442impl From<&OptionWrappedGenericParamList> for SyntaxStablePtrId {
20443    fn from(node: &OptionWrappedGenericParamList) -> Self {
20444        node.stable_ptr().untyped()
20445    }
20446}
20447impl OptionWrappedGenericParamList {
20448    /// Checks if a kind of a variant of [OptionWrappedGenericParamList].
20449    pub fn is_variant(kind: SyntaxKind) -> bool {
20450        matches!(
20451            kind,
20452            SyntaxKind::OptionWrappedGenericParamListEmpty | SyntaxKind::WrappedGenericParamList
20453        )
20454    }
20455}
20456#[derive(Clone, Debug, Eq, Hash, PartialEq)]
20457pub struct OptionWrappedGenericParamListEmpty {
20458    node: SyntaxNode,
20459    children: Arc<[SyntaxNode]>,
20460}
20461impl OptionWrappedGenericParamListEmpty {
20462    pub fn new_green(db: &dyn SyntaxGroup) -> OptionWrappedGenericParamListEmptyGreen {
20463        let children: Vec<GreenId> = vec![];
20464        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
20465        OptionWrappedGenericParamListEmptyGreen(
20466            Arc::new(GreenNode {
20467                kind: SyntaxKind::OptionWrappedGenericParamListEmpty,
20468                details: GreenNodeDetails::Node { children, width },
20469            })
20470            .intern(db),
20471        )
20472    }
20473}
20474impl OptionWrappedGenericParamListEmpty {}
20475#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
20476pub struct OptionWrappedGenericParamListEmptyPtr(pub SyntaxStablePtrId);
20477impl OptionWrappedGenericParamListEmptyPtr {}
20478impl TypedStablePtr for OptionWrappedGenericParamListEmptyPtr {
20479    type SyntaxNode = OptionWrappedGenericParamListEmpty;
20480    fn untyped(&self) -> SyntaxStablePtrId {
20481        self.0
20482    }
20483    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionWrappedGenericParamListEmpty {
20484        OptionWrappedGenericParamListEmpty::from_syntax_node(db, self.0.lookup(db))
20485    }
20486}
20487impl From<OptionWrappedGenericParamListEmptyPtr> for SyntaxStablePtrId {
20488    fn from(ptr: OptionWrappedGenericParamListEmptyPtr) -> Self {
20489        ptr.untyped()
20490    }
20491}
20492#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
20493pub struct OptionWrappedGenericParamListEmptyGreen(pub GreenId);
20494impl TypedSyntaxNode for OptionWrappedGenericParamListEmpty {
20495    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionWrappedGenericParamListEmpty);
20496    type StablePtr = OptionWrappedGenericParamListEmptyPtr;
20497    type Green = OptionWrappedGenericParamListEmptyGreen;
20498    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
20499        OptionWrappedGenericParamListEmptyGreen(
20500            Arc::new(GreenNode {
20501                kind: SyntaxKind::OptionWrappedGenericParamListEmpty,
20502                details: GreenNodeDetails::Node { children: vec![], width: TextWidth::default() },
20503            })
20504            .intern(db),
20505        )
20506    }
20507    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
20508        let kind = node.kind(db);
20509        assert_eq!(
20510            kind,
20511            SyntaxKind::OptionWrappedGenericParamListEmpty,
20512            "Unexpected SyntaxKind {:?}. Expected {:?}.",
20513            kind,
20514            SyntaxKind::OptionWrappedGenericParamListEmpty
20515        );
20516        let children = db.get_children(node.clone());
20517        Self { node, children }
20518    }
20519    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
20520        let kind = node.kind(db);
20521        if kind == SyntaxKind::OptionWrappedGenericParamListEmpty {
20522            Some(Self::from_syntax_node(db, node))
20523        } else {
20524            None
20525        }
20526    }
20527    fn as_syntax_node(&self) -> SyntaxNode {
20528        self.node.clone()
20529    }
20530    fn stable_ptr(&self) -> Self::StablePtr {
20531        OptionWrappedGenericParamListEmptyPtr(self.node.0.stable_ptr)
20532    }
20533}
20534impl From<&OptionWrappedGenericParamListEmpty> for SyntaxStablePtrId {
20535    fn from(node: &OptionWrappedGenericParamListEmpty) -> Self {
20536        node.stable_ptr().untyped()
20537    }
20538}
20539#[derive(Clone, Debug, Eq, Hash, PartialEq)]
20540pub struct WrappedGenericParamList {
20541    node: SyntaxNode,
20542    children: Arc<[SyntaxNode]>,
20543}
20544impl WrappedGenericParamList {
20545    pub const INDEX_LANGLE: usize = 0;
20546    pub const INDEX_GENERIC_PARAMS: usize = 1;
20547    pub const INDEX_RANGLE: usize = 2;
20548    pub fn new_green(
20549        db: &dyn SyntaxGroup,
20550        langle: TerminalLTGreen,
20551        generic_params: GenericParamListGreen,
20552        rangle: TerminalGTGreen,
20553    ) -> WrappedGenericParamListGreen {
20554        let children: Vec<GreenId> = vec![langle.0, generic_params.0, rangle.0];
20555        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
20556        WrappedGenericParamListGreen(
20557            Arc::new(GreenNode {
20558                kind: SyntaxKind::WrappedGenericParamList,
20559                details: GreenNodeDetails::Node { children, width },
20560            })
20561            .intern(db),
20562        )
20563    }
20564}
20565impl WrappedGenericParamList {
20566    pub fn langle(&self, db: &dyn SyntaxGroup) -> TerminalLT {
20567        TerminalLT::from_syntax_node(db, self.children[0].clone())
20568    }
20569    pub fn generic_params(&self, db: &dyn SyntaxGroup) -> GenericParamList {
20570        GenericParamList::from_syntax_node(db, self.children[1].clone())
20571    }
20572    pub fn rangle(&self, db: &dyn SyntaxGroup) -> TerminalGT {
20573        TerminalGT::from_syntax_node(db, self.children[2].clone())
20574    }
20575}
20576#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
20577pub struct WrappedGenericParamListPtr(pub SyntaxStablePtrId);
20578impl WrappedGenericParamListPtr {}
20579impl TypedStablePtr for WrappedGenericParamListPtr {
20580    type SyntaxNode = WrappedGenericParamList;
20581    fn untyped(&self) -> SyntaxStablePtrId {
20582        self.0
20583    }
20584    fn lookup(&self, db: &dyn SyntaxGroup) -> WrappedGenericParamList {
20585        WrappedGenericParamList::from_syntax_node(db, self.0.lookup(db))
20586    }
20587}
20588impl From<WrappedGenericParamListPtr> for SyntaxStablePtrId {
20589    fn from(ptr: WrappedGenericParamListPtr) -> Self {
20590        ptr.untyped()
20591    }
20592}
20593#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
20594pub struct WrappedGenericParamListGreen(pub GreenId);
20595impl TypedSyntaxNode for WrappedGenericParamList {
20596    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::WrappedGenericParamList);
20597    type StablePtr = WrappedGenericParamListPtr;
20598    type Green = WrappedGenericParamListGreen;
20599    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
20600        WrappedGenericParamListGreen(
20601            Arc::new(GreenNode {
20602                kind: SyntaxKind::WrappedGenericParamList,
20603                details: GreenNodeDetails::Node {
20604                    children: vec![
20605                        TerminalLT::missing(db).0,
20606                        GenericParamList::missing(db).0,
20607                        TerminalGT::missing(db).0,
20608                    ],
20609                    width: TextWidth::default(),
20610                },
20611            })
20612            .intern(db),
20613        )
20614    }
20615    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
20616        let kind = node.kind(db);
20617        assert_eq!(
20618            kind,
20619            SyntaxKind::WrappedGenericParamList,
20620            "Unexpected SyntaxKind {:?}. Expected {:?}.",
20621            kind,
20622            SyntaxKind::WrappedGenericParamList
20623        );
20624        let children = db.get_children(node.clone());
20625        Self { node, children }
20626    }
20627    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
20628        let kind = node.kind(db);
20629        if kind == SyntaxKind::WrappedGenericParamList {
20630            Some(Self::from_syntax_node(db, node))
20631        } else {
20632            None
20633        }
20634    }
20635    fn as_syntax_node(&self) -> SyntaxNode {
20636        self.node.clone()
20637    }
20638    fn stable_ptr(&self) -> Self::StablePtr {
20639        WrappedGenericParamListPtr(self.node.0.stable_ptr)
20640    }
20641}
20642impl From<&WrappedGenericParamList> for SyntaxStablePtrId {
20643    fn from(node: &WrappedGenericParamList) -> Self {
20644        node.stable_ptr().untyped()
20645    }
20646}
20647#[derive(Clone, Debug, Eq, Hash, PartialEq)]
20648pub struct GenericParamList(ElementList<GenericParam, 2>);
20649impl Deref for GenericParamList {
20650    type Target = ElementList<GenericParam, 2>;
20651    fn deref(&self) -> &Self::Target {
20652        &self.0
20653    }
20654}
20655impl GenericParamList {
20656    pub fn new_green(
20657        db: &dyn SyntaxGroup,
20658        children: Vec<GenericParamListElementOrSeparatorGreen>,
20659    ) -> GenericParamListGreen {
20660        let width = children.iter().map(|id| id.id().lookup_intern(db).width()).sum();
20661        GenericParamListGreen(
20662            Arc::new(GreenNode {
20663                kind: SyntaxKind::GenericParamList,
20664                details: GreenNodeDetails::Node {
20665                    children: children.iter().map(|x| x.id()).collect(),
20666                    width,
20667                },
20668            })
20669            .intern(db),
20670        )
20671    }
20672}
20673#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
20674pub struct GenericParamListPtr(pub SyntaxStablePtrId);
20675impl TypedStablePtr for GenericParamListPtr {
20676    type SyntaxNode = GenericParamList;
20677    fn untyped(&self) -> SyntaxStablePtrId {
20678        self.0
20679    }
20680    fn lookup(&self, db: &dyn SyntaxGroup) -> GenericParamList {
20681        GenericParamList::from_syntax_node(db, self.0.lookup(db))
20682    }
20683}
20684impl From<GenericParamListPtr> for SyntaxStablePtrId {
20685    fn from(ptr: GenericParamListPtr) -> Self {
20686        ptr.untyped()
20687    }
20688}
20689#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
20690pub enum GenericParamListElementOrSeparatorGreen {
20691    Separator(TerminalCommaGreen),
20692    Element(GenericParamGreen),
20693}
20694impl From<TerminalCommaGreen> for GenericParamListElementOrSeparatorGreen {
20695    fn from(value: TerminalCommaGreen) -> Self {
20696        GenericParamListElementOrSeparatorGreen::Separator(value)
20697    }
20698}
20699impl From<GenericParamGreen> for GenericParamListElementOrSeparatorGreen {
20700    fn from(value: GenericParamGreen) -> Self {
20701        GenericParamListElementOrSeparatorGreen::Element(value)
20702    }
20703}
20704impl GenericParamListElementOrSeparatorGreen {
20705    fn id(&self) -> GreenId {
20706        match self {
20707            GenericParamListElementOrSeparatorGreen::Separator(green) => green.0,
20708            GenericParamListElementOrSeparatorGreen::Element(green) => green.0,
20709        }
20710    }
20711}
20712#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
20713pub struct GenericParamListGreen(pub GreenId);
20714impl TypedSyntaxNode for GenericParamList {
20715    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::GenericParamList);
20716    type StablePtr = GenericParamListPtr;
20717    type Green = GenericParamListGreen;
20718    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
20719        GenericParamListGreen(
20720            Arc::new(GreenNode {
20721                kind: SyntaxKind::GenericParamList,
20722                details: GreenNodeDetails::Node { children: vec![], width: TextWidth::default() },
20723            })
20724            .intern(db),
20725        )
20726    }
20727    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
20728        Self(ElementList::new(node))
20729    }
20730    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
20731        if node.kind(db) == SyntaxKind::GenericParamList {
20732            Some(Self(ElementList::new(node)))
20733        } else {
20734            None
20735        }
20736    }
20737    fn as_syntax_node(&self) -> SyntaxNode {
20738        self.node.clone()
20739    }
20740    fn stable_ptr(&self) -> Self::StablePtr {
20741        GenericParamListPtr(self.node.0.stable_ptr)
20742    }
20743}
20744impl From<&GenericParamList> for SyntaxStablePtrId {
20745    fn from(node: &GenericParamList) -> Self {
20746        node.stable_ptr().untyped()
20747    }
20748}
20749#[derive(Clone, Debug, Eq, Hash, PartialEq)]
20750pub enum GenericParam {
20751    Type(GenericParamType),
20752    Const(GenericParamConst),
20753    ImplNamed(GenericParamImplNamed),
20754    ImplAnonymous(GenericParamImplAnonymous),
20755    NegativeImpl(GenericParamNegativeImpl),
20756}
20757#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
20758pub struct GenericParamPtr(pub SyntaxStablePtrId);
20759impl TypedStablePtr for GenericParamPtr {
20760    type SyntaxNode = GenericParam;
20761    fn untyped(&self) -> SyntaxStablePtrId {
20762        self.0
20763    }
20764    fn lookup(&self, db: &dyn SyntaxGroup) -> GenericParam {
20765        GenericParam::from_syntax_node(db, self.0.lookup(db))
20766    }
20767}
20768impl From<GenericParamPtr> for SyntaxStablePtrId {
20769    fn from(ptr: GenericParamPtr) -> Self {
20770        ptr.untyped()
20771    }
20772}
20773impl From<GenericParamTypePtr> for GenericParamPtr {
20774    fn from(value: GenericParamTypePtr) -> Self {
20775        Self(value.0)
20776    }
20777}
20778impl From<GenericParamConstPtr> for GenericParamPtr {
20779    fn from(value: GenericParamConstPtr) -> Self {
20780        Self(value.0)
20781    }
20782}
20783impl From<GenericParamImplNamedPtr> for GenericParamPtr {
20784    fn from(value: GenericParamImplNamedPtr) -> Self {
20785        Self(value.0)
20786    }
20787}
20788impl From<GenericParamImplAnonymousPtr> for GenericParamPtr {
20789    fn from(value: GenericParamImplAnonymousPtr) -> Self {
20790        Self(value.0)
20791    }
20792}
20793impl From<GenericParamNegativeImplPtr> for GenericParamPtr {
20794    fn from(value: GenericParamNegativeImplPtr) -> Self {
20795        Self(value.0)
20796    }
20797}
20798impl From<GenericParamTypeGreen> for GenericParamGreen {
20799    fn from(value: GenericParamTypeGreen) -> Self {
20800        Self(value.0)
20801    }
20802}
20803impl From<GenericParamConstGreen> for GenericParamGreen {
20804    fn from(value: GenericParamConstGreen) -> Self {
20805        Self(value.0)
20806    }
20807}
20808impl From<GenericParamImplNamedGreen> for GenericParamGreen {
20809    fn from(value: GenericParamImplNamedGreen) -> Self {
20810        Self(value.0)
20811    }
20812}
20813impl From<GenericParamImplAnonymousGreen> for GenericParamGreen {
20814    fn from(value: GenericParamImplAnonymousGreen) -> Self {
20815        Self(value.0)
20816    }
20817}
20818impl From<GenericParamNegativeImplGreen> for GenericParamGreen {
20819    fn from(value: GenericParamNegativeImplGreen) -> Self {
20820        Self(value.0)
20821    }
20822}
20823#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
20824pub struct GenericParamGreen(pub GreenId);
20825impl TypedSyntaxNode for GenericParam {
20826    const OPTIONAL_KIND: Option<SyntaxKind> = None;
20827    type StablePtr = GenericParamPtr;
20828    type Green = GenericParamGreen;
20829    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
20830        panic!("No missing variant.");
20831    }
20832    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
20833        let kind = node.kind(db);
20834        match kind {
20835            SyntaxKind::GenericParamType => {
20836                GenericParam::Type(GenericParamType::from_syntax_node(db, node))
20837            }
20838            SyntaxKind::GenericParamConst => {
20839                GenericParam::Const(GenericParamConst::from_syntax_node(db, node))
20840            }
20841            SyntaxKind::GenericParamImplNamed => {
20842                GenericParam::ImplNamed(GenericParamImplNamed::from_syntax_node(db, node))
20843            }
20844            SyntaxKind::GenericParamImplAnonymous => {
20845                GenericParam::ImplAnonymous(GenericParamImplAnonymous::from_syntax_node(db, node))
20846            }
20847            SyntaxKind::GenericParamNegativeImpl => {
20848                GenericParam::NegativeImpl(GenericParamNegativeImpl::from_syntax_node(db, node))
20849            }
20850            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "GenericParam"),
20851        }
20852    }
20853    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
20854        let kind = node.kind(db);
20855        match kind {
20856            SyntaxKind::GenericParamType => {
20857                Some(GenericParam::Type(GenericParamType::from_syntax_node(db, node)))
20858            }
20859            SyntaxKind::GenericParamConst => {
20860                Some(GenericParam::Const(GenericParamConst::from_syntax_node(db, node)))
20861            }
20862            SyntaxKind::GenericParamImplNamed => {
20863                Some(GenericParam::ImplNamed(GenericParamImplNamed::from_syntax_node(db, node)))
20864            }
20865            SyntaxKind::GenericParamImplAnonymous => Some(GenericParam::ImplAnonymous(
20866                GenericParamImplAnonymous::from_syntax_node(db, node),
20867            )),
20868            SyntaxKind::GenericParamNegativeImpl => Some(GenericParam::NegativeImpl(
20869                GenericParamNegativeImpl::from_syntax_node(db, node),
20870            )),
20871            _ => None,
20872        }
20873    }
20874    fn as_syntax_node(&self) -> SyntaxNode {
20875        match self {
20876            GenericParam::Type(x) => x.as_syntax_node(),
20877            GenericParam::Const(x) => x.as_syntax_node(),
20878            GenericParam::ImplNamed(x) => x.as_syntax_node(),
20879            GenericParam::ImplAnonymous(x) => x.as_syntax_node(),
20880            GenericParam::NegativeImpl(x) => x.as_syntax_node(),
20881        }
20882    }
20883    fn stable_ptr(&self) -> Self::StablePtr {
20884        GenericParamPtr(self.as_syntax_node().0.stable_ptr)
20885    }
20886}
20887impl From<&GenericParam> for SyntaxStablePtrId {
20888    fn from(node: &GenericParam) -> Self {
20889        node.stable_ptr().untyped()
20890    }
20891}
20892impl GenericParam {
20893    /// Checks if a kind of a variant of [GenericParam].
20894    pub fn is_variant(kind: SyntaxKind) -> bool {
20895        matches!(
20896            kind,
20897            SyntaxKind::GenericParamType
20898                | SyntaxKind::GenericParamConst
20899                | SyntaxKind::GenericParamImplNamed
20900                | SyntaxKind::GenericParamImplAnonymous
20901                | SyntaxKind::GenericParamNegativeImpl
20902        )
20903    }
20904}
20905#[derive(Clone, Debug, Eq, Hash, PartialEq)]
20906pub struct GenericParamType {
20907    node: SyntaxNode,
20908    children: Arc<[SyntaxNode]>,
20909}
20910impl GenericParamType {
20911    pub const INDEX_NAME: usize = 0;
20912    pub fn new_green(db: &dyn SyntaxGroup, name: TerminalIdentifierGreen) -> GenericParamTypeGreen {
20913        let children: Vec<GreenId> = vec![name.0];
20914        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
20915        GenericParamTypeGreen(
20916            Arc::new(GreenNode {
20917                kind: SyntaxKind::GenericParamType,
20918                details: GreenNodeDetails::Node { children, width },
20919            })
20920            .intern(db),
20921        )
20922    }
20923}
20924impl GenericParamType {
20925    pub fn name(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier {
20926        TerminalIdentifier::from_syntax_node(db, self.children[0].clone())
20927    }
20928}
20929#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
20930pub struct GenericParamTypePtr(pub SyntaxStablePtrId);
20931impl GenericParamTypePtr {
20932    pub fn name_green(self, db: &dyn SyntaxGroup) -> TerminalIdentifierGreen {
20933        let ptr = self.0.lookup_intern(db);
20934        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
20935            TerminalIdentifierGreen(key_fields[0])
20936        } else {
20937            panic!("Unexpected key field query on root.");
20938        }
20939    }
20940}
20941impl TypedStablePtr for GenericParamTypePtr {
20942    type SyntaxNode = GenericParamType;
20943    fn untyped(&self) -> SyntaxStablePtrId {
20944        self.0
20945    }
20946    fn lookup(&self, db: &dyn SyntaxGroup) -> GenericParamType {
20947        GenericParamType::from_syntax_node(db, self.0.lookup(db))
20948    }
20949}
20950impl From<GenericParamTypePtr> for SyntaxStablePtrId {
20951    fn from(ptr: GenericParamTypePtr) -> Self {
20952        ptr.untyped()
20953    }
20954}
20955#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
20956pub struct GenericParamTypeGreen(pub GreenId);
20957impl TypedSyntaxNode for GenericParamType {
20958    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::GenericParamType);
20959    type StablePtr = GenericParamTypePtr;
20960    type Green = GenericParamTypeGreen;
20961    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
20962        GenericParamTypeGreen(
20963            Arc::new(GreenNode {
20964                kind: SyntaxKind::GenericParamType,
20965                details: GreenNodeDetails::Node {
20966                    children: vec![TerminalIdentifier::missing(db).0],
20967                    width: TextWidth::default(),
20968                },
20969            })
20970            .intern(db),
20971        )
20972    }
20973    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
20974        let kind = node.kind(db);
20975        assert_eq!(
20976            kind,
20977            SyntaxKind::GenericParamType,
20978            "Unexpected SyntaxKind {:?}. Expected {:?}.",
20979            kind,
20980            SyntaxKind::GenericParamType
20981        );
20982        let children = db.get_children(node.clone());
20983        Self { node, children }
20984    }
20985    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
20986        let kind = node.kind(db);
20987        if kind == SyntaxKind::GenericParamType {
20988            Some(Self::from_syntax_node(db, node))
20989        } else {
20990            None
20991        }
20992    }
20993    fn as_syntax_node(&self) -> SyntaxNode {
20994        self.node.clone()
20995    }
20996    fn stable_ptr(&self) -> Self::StablePtr {
20997        GenericParamTypePtr(self.node.0.stable_ptr)
20998    }
20999}
21000impl From<&GenericParamType> for SyntaxStablePtrId {
21001    fn from(node: &GenericParamType) -> Self {
21002        node.stable_ptr().untyped()
21003    }
21004}
21005#[derive(Clone, Debug, Eq, Hash, PartialEq)]
21006pub struct GenericParamConst {
21007    node: SyntaxNode,
21008    children: Arc<[SyntaxNode]>,
21009}
21010impl GenericParamConst {
21011    pub const INDEX_CONST_KW: usize = 0;
21012    pub const INDEX_NAME: usize = 1;
21013    pub const INDEX_COLON: usize = 2;
21014    pub const INDEX_TY: usize = 3;
21015    pub fn new_green(
21016        db: &dyn SyntaxGroup,
21017        const_kw: TerminalConstGreen,
21018        name: TerminalIdentifierGreen,
21019        colon: TerminalColonGreen,
21020        ty: ExprGreen,
21021    ) -> GenericParamConstGreen {
21022        let children: Vec<GreenId> = vec![const_kw.0, name.0, colon.0, ty.0];
21023        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
21024        GenericParamConstGreen(
21025            Arc::new(GreenNode {
21026                kind: SyntaxKind::GenericParamConst,
21027                details: GreenNodeDetails::Node { children, width },
21028            })
21029            .intern(db),
21030        )
21031    }
21032}
21033impl GenericParamConst {
21034    pub fn const_kw(&self, db: &dyn SyntaxGroup) -> TerminalConst {
21035        TerminalConst::from_syntax_node(db, self.children[0].clone())
21036    }
21037    pub fn name(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier {
21038        TerminalIdentifier::from_syntax_node(db, self.children[1].clone())
21039    }
21040    pub fn colon(&self, db: &dyn SyntaxGroup) -> TerminalColon {
21041        TerminalColon::from_syntax_node(db, self.children[2].clone())
21042    }
21043    pub fn ty(&self, db: &dyn SyntaxGroup) -> Expr {
21044        Expr::from_syntax_node(db, self.children[3].clone())
21045    }
21046}
21047#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
21048pub struct GenericParamConstPtr(pub SyntaxStablePtrId);
21049impl GenericParamConstPtr {
21050    pub fn name_green(self, db: &dyn SyntaxGroup) -> TerminalIdentifierGreen {
21051        let ptr = self.0.lookup_intern(db);
21052        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
21053            TerminalIdentifierGreen(key_fields[0])
21054        } else {
21055            panic!("Unexpected key field query on root.");
21056        }
21057    }
21058}
21059impl TypedStablePtr for GenericParamConstPtr {
21060    type SyntaxNode = GenericParamConst;
21061    fn untyped(&self) -> SyntaxStablePtrId {
21062        self.0
21063    }
21064    fn lookup(&self, db: &dyn SyntaxGroup) -> GenericParamConst {
21065        GenericParamConst::from_syntax_node(db, self.0.lookup(db))
21066    }
21067}
21068impl From<GenericParamConstPtr> for SyntaxStablePtrId {
21069    fn from(ptr: GenericParamConstPtr) -> Self {
21070        ptr.untyped()
21071    }
21072}
21073#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
21074pub struct GenericParamConstGreen(pub GreenId);
21075impl TypedSyntaxNode for GenericParamConst {
21076    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::GenericParamConst);
21077    type StablePtr = GenericParamConstPtr;
21078    type Green = GenericParamConstGreen;
21079    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
21080        GenericParamConstGreen(
21081            Arc::new(GreenNode {
21082                kind: SyntaxKind::GenericParamConst,
21083                details: GreenNodeDetails::Node {
21084                    children: vec![
21085                        TerminalConst::missing(db).0,
21086                        TerminalIdentifier::missing(db).0,
21087                        TerminalColon::missing(db).0,
21088                        Expr::missing(db).0,
21089                    ],
21090                    width: TextWidth::default(),
21091                },
21092            })
21093            .intern(db),
21094        )
21095    }
21096    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
21097        let kind = node.kind(db);
21098        assert_eq!(
21099            kind,
21100            SyntaxKind::GenericParamConst,
21101            "Unexpected SyntaxKind {:?}. Expected {:?}.",
21102            kind,
21103            SyntaxKind::GenericParamConst
21104        );
21105        let children = db.get_children(node.clone());
21106        Self { node, children }
21107    }
21108    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
21109        let kind = node.kind(db);
21110        if kind == SyntaxKind::GenericParamConst {
21111            Some(Self::from_syntax_node(db, node))
21112        } else {
21113            None
21114        }
21115    }
21116    fn as_syntax_node(&self) -> SyntaxNode {
21117        self.node.clone()
21118    }
21119    fn stable_ptr(&self) -> Self::StablePtr {
21120        GenericParamConstPtr(self.node.0.stable_ptr)
21121    }
21122}
21123impl From<&GenericParamConst> for SyntaxStablePtrId {
21124    fn from(node: &GenericParamConst) -> Self {
21125        node.stable_ptr().untyped()
21126    }
21127}
21128#[derive(Clone, Debug, Eq, Hash, PartialEq)]
21129pub struct GenericParamImplNamed {
21130    node: SyntaxNode,
21131    children: Arc<[SyntaxNode]>,
21132}
21133impl GenericParamImplNamed {
21134    pub const INDEX_IMPL_KW: usize = 0;
21135    pub const INDEX_NAME: usize = 1;
21136    pub const INDEX_COLON: usize = 2;
21137    pub const INDEX_TRAIT_PATH: usize = 3;
21138    pub const INDEX_TYPE_CONSTRAINS: usize = 4;
21139    pub fn new_green(
21140        db: &dyn SyntaxGroup,
21141        impl_kw: TerminalImplGreen,
21142        name: TerminalIdentifierGreen,
21143        colon: TerminalColonGreen,
21144        trait_path: ExprPathGreen,
21145        type_constrains: OptionAssociatedItemConstraintsGreen,
21146    ) -> GenericParamImplNamedGreen {
21147        let children: Vec<GreenId> =
21148            vec![impl_kw.0, name.0, colon.0, trait_path.0, type_constrains.0];
21149        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
21150        GenericParamImplNamedGreen(
21151            Arc::new(GreenNode {
21152                kind: SyntaxKind::GenericParamImplNamed,
21153                details: GreenNodeDetails::Node { children, width },
21154            })
21155            .intern(db),
21156        )
21157    }
21158}
21159impl GenericParamImplNamed {
21160    pub fn impl_kw(&self, db: &dyn SyntaxGroup) -> TerminalImpl {
21161        TerminalImpl::from_syntax_node(db, self.children[0].clone())
21162    }
21163    pub fn name(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier {
21164        TerminalIdentifier::from_syntax_node(db, self.children[1].clone())
21165    }
21166    pub fn colon(&self, db: &dyn SyntaxGroup) -> TerminalColon {
21167        TerminalColon::from_syntax_node(db, self.children[2].clone())
21168    }
21169    pub fn trait_path(&self, db: &dyn SyntaxGroup) -> ExprPath {
21170        ExprPath::from_syntax_node(db, self.children[3].clone())
21171    }
21172    pub fn type_constrains(&self, db: &dyn SyntaxGroup) -> OptionAssociatedItemConstraints {
21173        OptionAssociatedItemConstraints::from_syntax_node(db, self.children[4].clone())
21174    }
21175}
21176#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
21177pub struct GenericParamImplNamedPtr(pub SyntaxStablePtrId);
21178impl GenericParamImplNamedPtr {
21179    pub fn name_green(self, db: &dyn SyntaxGroup) -> TerminalIdentifierGreen {
21180        let ptr = self.0.lookup_intern(db);
21181        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
21182            TerminalIdentifierGreen(key_fields[0])
21183        } else {
21184            panic!("Unexpected key field query on root.");
21185        }
21186    }
21187}
21188impl TypedStablePtr for GenericParamImplNamedPtr {
21189    type SyntaxNode = GenericParamImplNamed;
21190    fn untyped(&self) -> SyntaxStablePtrId {
21191        self.0
21192    }
21193    fn lookup(&self, db: &dyn SyntaxGroup) -> GenericParamImplNamed {
21194        GenericParamImplNamed::from_syntax_node(db, self.0.lookup(db))
21195    }
21196}
21197impl From<GenericParamImplNamedPtr> for SyntaxStablePtrId {
21198    fn from(ptr: GenericParamImplNamedPtr) -> Self {
21199        ptr.untyped()
21200    }
21201}
21202#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
21203pub struct GenericParamImplNamedGreen(pub GreenId);
21204impl TypedSyntaxNode for GenericParamImplNamed {
21205    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::GenericParamImplNamed);
21206    type StablePtr = GenericParamImplNamedPtr;
21207    type Green = GenericParamImplNamedGreen;
21208    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
21209        GenericParamImplNamedGreen(
21210            Arc::new(GreenNode {
21211                kind: SyntaxKind::GenericParamImplNamed,
21212                details: GreenNodeDetails::Node {
21213                    children: vec![
21214                        TerminalImpl::missing(db).0,
21215                        TerminalIdentifier::missing(db).0,
21216                        TerminalColon::missing(db).0,
21217                        ExprPath::missing(db).0,
21218                        OptionAssociatedItemConstraints::missing(db).0,
21219                    ],
21220                    width: TextWidth::default(),
21221                },
21222            })
21223            .intern(db),
21224        )
21225    }
21226    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
21227        let kind = node.kind(db);
21228        assert_eq!(
21229            kind,
21230            SyntaxKind::GenericParamImplNamed,
21231            "Unexpected SyntaxKind {:?}. Expected {:?}.",
21232            kind,
21233            SyntaxKind::GenericParamImplNamed
21234        );
21235        let children = db.get_children(node.clone());
21236        Self { node, children }
21237    }
21238    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
21239        let kind = node.kind(db);
21240        if kind == SyntaxKind::GenericParamImplNamed {
21241            Some(Self::from_syntax_node(db, node))
21242        } else {
21243            None
21244        }
21245    }
21246    fn as_syntax_node(&self) -> SyntaxNode {
21247        self.node.clone()
21248    }
21249    fn stable_ptr(&self) -> Self::StablePtr {
21250        GenericParamImplNamedPtr(self.node.0.stable_ptr)
21251    }
21252}
21253impl From<&GenericParamImplNamed> for SyntaxStablePtrId {
21254    fn from(node: &GenericParamImplNamed) -> Self {
21255        node.stable_ptr().untyped()
21256    }
21257}
21258#[derive(Clone, Debug, Eq, Hash, PartialEq)]
21259pub struct GenericParamImplAnonymous {
21260    node: SyntaxNode,
21261    children: Arc<[SyntaxNode]>,
21262}
21263impl GenericParamImplAnonymous {
21264    pub const INDEX_PLUS: usize = 0;
21265    pub const INDEX_TRAIT_PATH: usize = 1;
21266    pub const INDEX_TYPE_CONSTRAINS: usize = 2;
21267    pub fn new_green(
21268        db: &dyn SyntaxGroup,
21269        plus: TerminalPlusGreen,
21270        trait_path: ExprPathGreen,
21271        type_constrains: OptionAssociatedItemConstraintsGreen,
21272    ) -> GenericParamImplAnonymousGreen {
21273        let children: Vec<GreenId> = vec![plus.0, trait_path.0, type_constrains.0];
21274        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
21275        GenericParamImplAnonymousGreen(
21276            Arc::new(GreenNode {
21277                kind: SyntaxKind::GenericParamImplAnonymous,
21278                details: GreenNodeDetails::Node { children, width },
21279            })
21280            .intern(db),
21281        )
21282    }
21283}
21284impl GenericParamImplAnonymous {
21285    pub fn plus(&self, db: &dyn SyntaxGroup) -> TerminalPlus {
21286        TerminalPlus::from_syntax_node(db, self.children[0].clone())
21287    }
21288    pub fn trait_path(&self, db: &dyn SyntaxGroup) -> ExprPath {
21289        ExprPath::from_syntax_node(db, self.children[1].clone())
21290    }
21291    pub fn type_constrains(&self, db: &dyn SyntaxGroup) -> OptionAssociatedItemConstraints {
21292        OptionAssociatedItemConstraints::from_syntax_node(db, self.children[2].clone())
21293    }
21294}
21295#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
21296pub struct GenericParamImplAnonymousPtr(pub SyntaxStablePtrId);
21297impl GenericParamImplAnonymousPtr {}
21298impl TypedStablePtr for GenericParamImplAnonymousPtr {
21299    type SyntaxNode = GenericParamImplAnonymous;
21300    fn untyped(&self) -> SyntaxStablePtrId {
21301        self.0
21302    }
21303    fn lookup(&self, db: &dyn SyntaxGroup) -> GenericParamImplAnonymous {
21304        GenericParamImplAnonymous::from_syntax_node(db, self.0.lookup(db))
21305    }
21306}
21307impl From<GenericParamImplAnonymousPtr> for SyntaxStablePtrId {
21308    fn from(ptr: GenericParamImplAnonymousPtr) -> Self {
21309        ptr.untyped()
21310    }
21311}
21312#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
21313pub struct GenericParamImplAnonymousGreen(pub GreenId);
21314impl TypedSyntaxNode for GenericParamImplAnonymous {
21315    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::GenericParamImplAnonymous);
21316    type StablePtr = GenericParamImplAnonymousPtr;
21317    type Green = GenericParamImplAnonymousGreen;
21318    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
21319        GenericParamImplAnonymousGreen(
21320            Arc::new(GreenNode {
21321                kind: SyntaxKind::GenericParamImplAnonymous,
21322                details: GreenNodeDetails::Node {
21323                    children: vec![
21324                        TerminalPlus::missing(db).0,
21325                        ExprPath::missing(db).0,
21326                        OptionAssociatedItemConstraints::missing(db).0,
21327                    ],
21328                    width: TextWidth::default(),
21329                },
21330            })
21331            .intern(db),
21332        )
21333    }
21334    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
21335        let kind = node.kind(db);
21336        assert_eq!(
21337            kind,
21338            SyntaxKind::GenericParamImplAnonymous,
21339            "Unexpected SyntaxKind {:?}. Expected {:?}.",
21340            kind,
21341            SyntaxKind::GenericParamImplAnonymous
21342        );
21343        let children = db.get_children(node.clone());
21344        Self { node, children }
21345    }
21346    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
21347        let kind = node.kind(db);
21348        if kind == SyntaxKind::GenericParamImplAnonymous {
21349            Some(Self::from_syntax_node(db, node))
21350        } else {
21351            None
21352        }
21353    }
21354    fn as_syntax_node(&self) -> SyntaxNode {
21355        self.node.clone()
21356    }
21357    fn stable_ptr(&self) -> Self::StablePtr {
21358        GenericParamImplAnonymousPtr(self.node.0.stable_ptr)
21359    }
21360}
21361impl From<&GenericParamImplAnonymous> for SyntaxStablePtrId {
21362    fn from(node: &GenericParamImplAnonymous) -> Self {
21363        node.stable_ptr().untyped()
21364    }
21365}
21366#[derive(Clone, Debug, Eq, Hash, PartialEq)]
21367pub struct GenericParamNegativeImpl {
21368    node: SyntaxNode,
21369    children: Arc<[SyntaxNode]>,
21370}
21371impl GenericParamNegativeImpl {
21372    pub const INDEX_MINUS: usize = 0;
21373    pub const INDEX_TRAIT_PATH: usize = 1;
21374    pub fn new_green(
21375        db: &dyn SyntaxGroup,
21376        minus: TerminalMinusGreen,
21377        trait_path: ExprPathGreen,
21378    ) -> GenericParamNegativeImplGreen {
21379        let children: Vec<GreenId> = vec![minus.0, trait_path.0];
21380        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
21381        GenericParamNegativeImplGreen(
21382            Arc::new(GreenNode {
21383                kind: SyntaxKind::GenericParamNegativeImpl,
21384                details: GreenNodeDetails::Node { children, width },
21385            })
21386            .intern(db),
21387        )
21388    }
21389}
21390impl GenericParamNegativeImpl {
21391    pub fn minus(&self, db: &dyn SyntaxGroup) -> TerminalMinus {
21392        TerminalMinus::from_syntax_node(db, self.children[0].clone())
21393    }
21394    pub fn trait_path(&self, db: &dyn SyntaxGroup) -> ExprPath {
21395        ExprPath::from_syntax_node(db, self.children[1].clone())
21396    }
21397}
21398#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
21399pub struct GenericParamNegativeImplPtr(pub SyntaxStablePtrId);
21400impl GenericParamNegativeImplPtr {}
21401impl TypedStablePtr for GenericParamNegativeImplPtr {
21402    type SyntaxNode = GenericParamNegativeImpl;
21403    fn untyped(&self) -> SyntaxStablePtrId {
21404        self.0
21405    }
21406    fn lookup(&self, db: &dyn SyntaxGroup) -> GenericParamNegativeImpl {
21407        GenericParamNegativeImpl::from_syntax_node(db, self.0.lookup(db))
21408    }
21409}
21410impl From<GenericParamNegativeImplPtr> for SyntaxStablePtrId {
21411    fn from(ptr: GenericParamNegativeImplPtr) -> Self {
21412        ptr.untyped()
21413    }
21414}
21415#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
21416pub struct GenericParamNegativeImplGreen(pub GreenId);
21417impl TypedSyntaxNode for GenericParamNegativeImpl {
21418    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::GenericParamNegativeImpl);
21419    type StablePtr = GenericParamNegativeImplPtr;
21420    type Green = GenericParamNegativeImplGreen;
21421    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
21422        GenericParamNegativeImplGreen(
21423            Arc::new(GreenNode {
21424                kind: SyntaxKind::GenericParamNegativeImpl,
21425                details: GreenNodeDetails::Node {
21426                    children: vec![TerminalMinus::missing(db).0, ExprPath::missing(db).0],
21427                    width: TextWidth::default(),
21428                },
21429            })
21430            .intern(db),
21431        )
21432    }
21433    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
21434        let kind = node.kind(db);
21435        assert_eq!(
21436            kind,
21437            SyntaxKind::GenericParamNegativeImpl,
21438            "Unexpected SyntaxKind {:?}. Expected {:?}.",
21439            kind,
21440            SyntaxKind::GenericParamNegativeImpl
21441        );
21442        let children = db.get_children(node.clone());
21443        Self { node, children }
21444    }
21445    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
21446        let kind = node.kind(db);
21447        if kind == SyntaxKind::GenericParamNegativeImpl {
21448            Some(Self::from_syntax_node(db, node))
21449        } else {
21450            None
21451        }
21452    }
21453    fn as_syntax_node(&self) -> SyntaxNode {
21454        self.node.clone()
21455    }
21456    fn stable_ptr(&self) -> Self::StablePtr {
21457        GenericParamNegativeImplPtr(self.node.0.stable_ptr)
21458    }
21459}
21460impl From<&GenericParamNegativeImpl> for SyntaxStablePtrId {
21461    fn from(node: &GenericParamNegativeImpl) -> Self {
21462        node.stable_ptr().untyped()
21463    }
21464}
21465#[derive(Clone, Debug, Eq, Hash, PartialEq)]
21466pub struct TriviumSkippedNode {
21467    node: SyntaxNode,
21468    children: Arc<[SyntaxNode]>,
21469}
21470impl TriviumSkippedNode {
21471    pub const INDEX_NODE: usize = 0;
21472    pub fn new_green(db: &dyn SyntaxGroup, node: SkippedNodeGreen) -> TriviumSkippedNodeGreen {
21473        let children: Vec<GreenId> = vec![node.0];
21474        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
21475        TriviumSkippedNodeGreen(
21476            Arc::new(GreenNode {
21477                kind: SyntaxKind::TriviumSkippedNode,
21478                details: GreenNodeDetails::Node { children, width },
21479            })
21480            .intern(db),
21481        )
21482    }
21483}
21484impl TriviumSkippedNode {
21485    pub fn node(&self, db: &dyn SyntaxGroup) -> SkippedNode {
21486        SkippedNode::from_syntax_node(db, self.children[0].clone())
21487    }
21488}
21489#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
21490pub struct TriviumSkippedNodePtr(pub SyntaxStablePtrId);
21491impl TriviumSkippedNodePtr {}
21492impl TypedStablePtr for TriviumSkippedNodePtr {
21493    type SyntaxNode = TriviumSkippedNode;
21494    fn untyped(&self) -> SyntaxStablePtrId {
21495        self.0
21496    }
21497    fn lookup(&self, db: &dyn SyntaxGroup) -> TriviumSkippedNode {
21498        TriviumSkippedNode::from_syntax_node(db, self.0.lookup(db))
21499    }
21500}
21501impl From<TriviumSkippedNodePtr> for SyntaxStablePtrId {
21502    fn from(ptr: TriviumSkippedNodePtr) -> Self {
21503        ptr.untyped()
21504    }
21505}
21506#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
21507pub struct TriviumSkippedNodeGreen(pub GreenId);
21508impl TypedSyntaxNode for TriviumSkippedNode {
21509    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TriviumSkippedNode);
21510    type StablePtr = TriviumSkippedNodePtr;
21511    type Green = TriviumSkippedNodeGreen;
21512    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
21513        TriviumSkippedNodeGreen(
21514            Arc::new(GreenNode {
21515                kind: SyntaxKind::TriviumSkippedNode,
21516                details: GreenNodeDetails::Node {
21517                    children: vec![SkippedNode::missing(db).0],
21518                    width: TextWidth::default(),
21519                },
21520            })
21521            .intern(db),
21522        )
21523    }
21524    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
21525        let kind = node.kind(db);
21526        assert_eq!(
21527            kind,
21528            SyntaxKind::TriviumSkippedNode,
21529            "Unexpected SyntaxKind {:?}. Expected {:?}.",
21530            kind,
21531            SyntaxKind::TriviumSkippedNode
21532        );
21533        let children = db.get_children(node.clone());
21534        Self { node, children }
21535    }
21536    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
21537        let kind = node.kind(db);
21538        if kind == SyntaxKind::TriviumSkippedNode {
21539            Some(Self::from_syntax_node(db, node))
21540        } else {
21541            None
21542        }
21543    }
21544    fn as_syntax_node(&self) -> SyntaxNode {
21545        self.node.clone()
21546    }
21547    fn stable_ptr(&self) -> Self::StablePtr {
21548        TriviumSkippedNodePtr(self.node.0.stable_ptr)
21549    }
21550}
21551impl From<&TriviumSkippedNode> for SyntaxStablePtrId {
21552    fn from(node: &TriviumSkippedNode) -> Self {
21553        node.stable_ptr().untyped()
21554    }
21555}
21556#[derive(Clone, Debug, Eq, Hash, PartialEq)]
21557pub enum SkippedNode {
21558    AttributeList(AttributeList),
21559    VisibilityPub(VisibilityPub),
21560}
21561#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
21562pub struct SkippedNodePtr(pub SyntaxStablePtrId);
21563impl TypedStablePtr for SkippedNodePtr {
21564    type SyntaxNode = SkippedNode;
21565    fn untyped(&self) -> SyntaxStablePtrId {
21566        self.0
21567    }
21568    fn lookup(&self, db: &dyn SyntaxGroup) -> SkippedNode {
21569        SkippedNode::from_syntax_node(db, self.0.lookup(db))
21570    }
21571}
21572impl From<SkippedNodePtr> for SyntaxStablePtrId {
21573    fn from(ptr: SkippedNodePtr) -> Self {
21574        ptr.untyped()
21575    }
21576}
21577impl From<AttributeListPtr> for SkippedNodePtr {
21578    fn from(value: AttributeListPtr) -> Self {
21579        Self(value.0)
21580    }
21581}
21582impl From<VisibilityPubPtr> for SkippedNodePtr {
21583    fn from(value: VisibilityPubPtr) -> Self {
21584        Self(value.0)
21585    }
21586}
21587impl From<AttributeListGreen> for SkippedNodeGreen {
21588    fn from(value: AttributeListGreen) -> Self {
21589        Self(value.0)
21590    }
21591}
21592impl From<VisibilityPubGreen> for SkippedNodeGreen {
21593    fn from(value: VisibilityPubGreen) -> Self {
21594        Self(value.0)
21595    }
21596}
21597#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
21598pub struct SkippedNodeGreen(pub GreenId);
21599impl TypedSyntaxNode for SkippedNode {
21600    const OPTIONAL_KIND: Option<SyntaxKind> = None;
21601    type StablePtr = SkippedNodePtr;
21602    type Green = SkippedNodeGreen;
21603    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
21604        panic!("No missing variant.");
21605    }
21606    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
21607        let kind = node.kind(db);
21608        match kind {
21609            SyntaxKind::AttributeList => {
21610                SkippedNode::AttributeList(AttributeList::from_syntax_node(db, node))
21611            }
21612            SyntaxKind::VisibilityPub => {
21613                SkippedNode::VisibilityPub(VisibilityPub::from_syntax_node(db, node))
21614            }
21615            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "SkippedNode"),
21616        }
21617    }
21618    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
21619        let kind = node.kind(db);
21620        match kind {
21621            SyntaxKind::AttributeList => {
21622                Some(SkippedNode::AttributeList(AttributeList::from_syntax_node(db, node)))
21623            }
21624            SyntaxKind::VisibilityPub => {
21625                Some(SkippedNode::VisibilityPub(VisibilityPub::from_syntax_node(db, node)))
21626            }
21627            _ => None,
21628        }
21629    }
21630    fn as_syntax_node(&self) -> SyntaxNode {
21631        match self {
21632            SkippedNode::AttributeList(x) => x.as_syntax_node(),
21633            SkippedNode::VisibilityPub(x) => x.as_syntax_node(),
21634        }
21635    }
21636    fn stable_ptr(&self) -> Self::StablePtr {
21637        SkippedNodePtr(self.as_syntax_node().0.stable_ptr)
21638    }
21639}
21640impl From<&SkippedNode> for SyntaxStablePtrId {
21641    fn from(node: &SkippedNode) -> Self {
21642        node.stable_ptr().untyped()
21643    }
21644}
21645impl SkippedNode {
21646    /// Checks if a kind of a variant of [SkippedNode].
21647    pub fn is_variant(kind: SyntaxKind) -> bool {
21648        matches!(kind, SyntaxKind::AttributeList | SyntaxKind::VisibilityPub)
21649    }
21650}
21651#[derive(Clone, Debug, Eq, Hash, PartialEq)]
21652pub struct TokenIdentifier {
21653    node: SyntaxNode,
21654}
21655impl Token for TokenIdentifier {
21656    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
21657        TokenIdentifierGreen(
21658            Arc::new(GreenNode {
21659                kind: SyntaxKind::TokenIdentifier,
21660                details: GreenNodeDetails::Token(text),
21661            })
21662            .intern(db),
21663        )
21664    }
21665    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
21666        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
21667            .clone()
21668    }
21669}
21670#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
21671pub struct TokenIdentifierPtr(pub SyntaxStablePtrId);
21672impl TypedStablePtr for TokenIdentifierPtr {
21673    type SyntaxNode = TokenIdentifier;
21674    fn untyped(&self) -> SyntaxStablePtrId {
21675        self.0
21676    }
21677    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenIdentifier {
21678        TokenIdentifier::from_syntax_node(db, self.0.lookup(db))
21679    }
21680}
21681impl From<TokenIdentifierPtr> for SyntaxStablePtrId {
21682    fn from(ptr: TokenIdentifierPtr) -> Self {
21683        ptr.untyped()
21684    }
21685}
21686#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
21687pub struct TokenIdentifierGreen(pub GreenId);
21688impl TokenIdentifierGreen {
21689    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
21690        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
21691    }
21692}
21693impl TypedSyntaxNode for TokenIdentifier {
21694    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenIdentifier);
21695    type StablePtr = TokenIdentifierPtr;
21696    type Green = TokenIdentifierGreen;
21697    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
21698        TokenIdentifierGreen(
21699            Arc::new(GreenNode {
21700                kind: SyntaxKind::TokenMissing,
21701                details: GreenNodeDetails::Token("".into()),
21702            })
21703            .intern(db),
21704        )
21705    }
21706    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
21707        match node.0.green.lookup_intern(db).details {
21708            GreenNodeDetails::Token(_) => Self { node },
21709            GreenNodeDetails::Node { .. } => {
21710                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenIdentifier)
21711            }
21712        }
21713    }
21714    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
21715        match node.0.green.lookup_intern(db).details {
21716            GreenNodeDetails::Token(_) => Some(Self { node }),
21717            GreenNodeDetails::Node { .. } => None,
21718        }
21719    }
21720    fn as_syntax_node(&self) -> SyntaxNode {
21721        self.node.clone()
21722    }
21723    fn stable_ptr(&self) -> Self::StablePtr {
21724        TokenIdentifierPtr(self.node.0.stable_ptr)
21725    }
21726}
21727impl From<&TokenIdentifier> for SyntaxStablePtrId {
21728    fn from(node: &TokenIdentifier) -> Self {
21729        node.stable_ptr().untyped()
21730    }
21731}
21732#[derive(Clone, Debug, Eq, Hash, PartialEq)]
21733pub struct TerminalIdentifier {
21734    node: SyntaxNode,
21735    children: Arc<[SyntaxNode]>,
21736}
21737impl Terminal for TerminalIdentifier {
21738    const KIND: SyntaxKind = SyntaxKind::TerminalIdentifier;
21739    type TokenType = TokenIdentifier;
21740    fn new_green(
21741        db: &dyn SyntaxGroup,
21742        leading_trivia: TriviaGreen,
21743        token: <<TerminalIdentifier as Terminal>::TokenType as TypedSyntaxNode>::Green,
21744        trailing_trivia: TriviaGreen,
21745    ) -> Self::Green {
21746        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
21747        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
21748        TerminalIdentifierGreen(
21749            Arc::new(GreenNode {
21750                kind: SyntaxKind::TerminalIdentifier,
21751                details: GreenNodeDetails::Node { children, width },
21752            })
21753            .intern(db),
21754        )
21755    }
21756    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
21757        self.token(db).text(db)
21758    }
21759}
21760impl TerminalIdentifier {
21761    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
21762        Trivia::from_syntax_node(db, self.children[0].clone())
21763    }
21764    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenIdentifier {
21765        TokenIdentifier::from_syntax_node(db, self.children[1].clone())
21766    }
21767    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
21768        Trivia::from_syntax_node(db, self.children[2].clone())
21769    }
21770}
21771#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
21772pub struct TerminalIdentifierPtr(pub SyntaxStablePtrId);
21773impl TerminalIdentifierPtr {}
21774impl TypedStablePtr for TerminalIdentifierPtr {
21775    type SyntaxNode = TerminalIdentifier;
21776    fn untyped(&self) -> SyntaxStablePtrId {
21777        self.0
21778    }
21779    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier {
21780        TerminalIdentifier::from_syntax_node(db, self.0.lookup(db))
21781    }
21782}
21783impl From<TerminalIdentifierPtr> for SyntaxStablePtrId {
21784    fn from(ptr: TerminalIdentifierPtr) -> Self {
21785        ptr.untyped()
21786    }
21787}
21788#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
21789pub struct TerminalIdentifierGreen(pub GreenId);
21790impl TypedSyntaxNode for TerminalIdentifier {
21791    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalIdentifier);
21792    type StablePtr = TerminalIdentifierPtr;
21793    type Green = TerminalIdentifierGreen;
21794    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
21795        TerminalIdentifierGreen(
21796            Arc::new(GreenNode {
21797                kind: SyntaxKind::TerminalIdentifier,
21798                details: GreenNodeDetails::Node {
21799                    children: vec![
21800                        Trivia::missing(db).0,
21801                        TokenIdentifier::missing(db).0,
21802                        Trivia::missing(db).0,
21803                    ],
21804                    width: TextWidth::default(),
21805                },
21806            })
21807            .intern(db),
21808        )
21809    }
21810    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
21811        let kind = node.kind(db);
21812        assert_eq!(
21813            kind,
21814            SyntaxKind::TerminalIdentifier,
21815            "Unexpected SyntaxKind {:?}. Expected {:?}.",
21816            kind,
21817            SyntaxKind::TerminalIdentifier
21818        );
21819        let children = db.get_children(node.clone());
21820        Self { node, children }
21821    }
21822    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
21823        let kind = node.kind(db);
21824        if kind == SyntaxKind::TerminalIdentifier {
21825            Some(Self::from_syntax_node(db, node))
21826        } else {
21827            None
21828        }
21829    }
21830    fn as_syntax_node(&self) -> SyntaxNode {
21831        self.node.clone()
21832    }
21833    fn stable_ptr(&self) -> Self::StablePtr {
21834        TerminalIdentifierPtr(self.node.0.stable_ptr)
21835    }
21836}
21837impl From<&TerminalIdentifier> for SyntaxStablePtrId {
21838    fn from(node: &TerminalIdentifier) -> Self {
21839        node.stable_ptr().untyped()
21840    }
21841}
21842#[derive(Clone, Debug, Eq, Hash, PartialEq)]
21843pub struct TokenLiteralNumber {
21844    node: SyntaxNode,
21845}
21846impl Token for TokenLiteralNumber {
21847    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
21848        TokenLiteralNumberGreen(
21849            Arc::new(GreenNode {
21850                kind: SyntaxKind::TokenLiteralNumber,
21851                details: GreenNodeDetails::Token(text),
21852            })
21853            .intern(db),
21854        )
21855    }
21856    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
21857        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
21858            .clone()
21859    }
21860}
21861#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
21862pub struct TokenLiteralNumberPtr(pub SyntaxStablePtrId);
21863impl TypedStablePtr for TokenLiteralNumberPtr {
21864    type SyntaxNode = TokenLiteralNumber;
21865    fn untyped(&self) -> SyntaxStablePtrId {
21866        self.0
21867    }
21868    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenLiteralNumber {
21869        TokenLiteralNumber::from_syntax_node(db, self.0.lookup(db))
21870    }
21871}
21872impl From<TokenLiteralNumberPtr> for SyntaxStablePtrId {
21873    fn from(ptr: TokenLiteralNumberPtr) -> Self {
21874        ptr.untyped()
21875    }
21876}
21877#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
21878pub struct TokenLiteralNumberGreen(pub GreenId);
21879impl TokenLiteralNumberGreen {
21880    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
21881        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
21882    }
21883}
21884impl TypedSyntaxNode for TokenLiteralNumber {
21885    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenLiteralNumber);
21886    type StablePtr = TokenLiteralNumberPtr;
21887    type Green = TokenLiteralNumberGreen;
21888    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
21889        TokenLiteralNumberGreen(
21890            Arc::new(GreenNode {
21891                kind: SyntaxKind::TokenMissing,
21892                details: GreenNodeDetails::Token("".into()),
21893            })
21894            .intern(db),
21895        )
21896    }
21897    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
21898        match node.0.green.lookup_intern(db).details {
21899            GreenNodeDetails::Token(_) => Self { node },
21900            GreenNodeDetails::Node { .. } => panic!(
21901                "Expected a token {:?}, not an internal node",
21902                SyntaxKind::TokenLiteralNumber
21903            ),
21904        }
21905    }
21906    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
21907        match node.0.green.lookup_intern(db).details {
21908            GreenNodeDetails::Token(_) => Some(Self { node }),
21909            GreenNodeDetails::Node { .. } => None,
21910        }
21911    }
21912    fn as_syntax_node(&self) -> SyntaxNode {
21913        self.node.clone()
21914    }
21915    fn stable_ptr(&self) -> Self::StablePtr {
21916        TokenLiteralNumberPtr(self.node.0.stable_ptr)
21917    }
21918}
21919impl From<&TokenLiteralNumber> for SyntaxStablePtrId {
21920    fn from(node: &TokenLiteralNumber) -> Self {
21921        node.stable_ptr().untyped()
21922    }
21923}
21924#[derive(Clone, Debug, Eq, Hash, PartialEq)]
21925pub struct TerminalLiteralNumber {
21926    node: SyntaxNode,
21927    children: Arc<[SyntaxNode]>,
21928}
21929impl Terminal for TerminalLiteralNumber {
21930    const KIND: SyntaxKind = SyntaxKind::TerminalLiteralNumber;
21931    type TokenType = TokenLiteralNumber;
21932    fn new_green(
21933        db: &dyn SyntaxGroup,
21934        leading_trivia: TriviaGreen,
21935        token: <<TerminalLiteralNumber as Terminal>::TokenType as TypedSyntaxNode>::Green,
21936        trailing_trivia: TriviaGreen,
21937    ) -> Self::Green {
21938        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
21939        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
21940        TerminalLiteralNumberGreen(
21941            Arc::new(GreenNode {
21942                kind: SyntaxKind::TerminalLiteralNumber,
21943                details: GreenNodeDetails::Node { children, width },
21944            })
21945            .intern(db),
21946        )
21947    }
21948    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
21949        self.token(db).text(db)
21950    }
21951}
21952impl TerminalLiteralNumber {
21953    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
21954        Trivia::from_syntax_node(db, self.children[0].clone())
21955    }
21956    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenLiteralNumber {
21957        TokenLiteralNumber::from_syntax_node(db, self.children[1].clone())
21958    }
21959    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
21960        Trivia::from_syntax_node(db, self.children[2].clone())
21961    }
21962}
21963#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
21964pub struct TerminalLiteralNumberPtr(pub SyntaxStablePtrId);
21965impl TerminalLiteralNumberPtr {}
21966impl TypedStablePtr for TerminalLiteralNumberPtr {
21967    type SyntaxNode = TerminalLiteralNumber;
21968    fn untyped(&self) -> SyntaxStablePtrId {
21969        self.0
21970    }
21971    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalLiteralNumber {
21972        TerminalLiteralNumber::from_syntax_node(db, self.0.lookup(db))
21973    }
21974}
21975impl From<TerminalLiteralNumberPtr> for SyntaxStablePtrId {
21976    fn from(ptr: TerminalLiteralNumberPtr) -> Self {
21977        ptr.untyped()
21978    }
21979}
21980#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
21981pub struct TerminalLiteralNumberGreen(pub GreenId);
21982impl TypedSyntaxNode for TerminalLiteralNumber {
21983    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalLiteralNumber);
21984    type StablePtr = TerminalLiteralNumberPtr;
21985    type Green = TerminalLiteralNumberGreen;
21986    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
21987        TerminalLiteralNumberGreen(
21988            Arc::new(GreenNode {
21989                kind: SyntaxKind::TerminalLiteralNumber,
21990                details: GreenNodeDetails::Node {
21991                    children: vec![
21992                        Trivia::missing(db).0,
21993                        TokenLiteralNumber::missing(db).0,
21994                        Trivia::missing(db).0,
21995                    ],
21996                    width: TextWidth::default(),
21997                },
21998            })
21999            .intern(db),
22000        )
22001    }
22002    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
22003        let kind = node.kind(db);
22004        assert_eq!(
22005            kind,
22006            SyntaxKind::TerminalLiteralNumber,
22007            "Unexpected SyntaxKind {:?}. Expected {:?}.",
22008            kind,
22009            SyntaxKind::TerminalLiteralNumber
22010        );
22011        let children = db.get_children(node.clone());
22012        Self { node, children }
22013    }
22014    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
22015        let kind = node.kind(db);
22016        if kind == SyntaxKind::TerminalLiteralNumber {
22017            Some(Self::from_syntax_node(db, node))
22018        } else {
22019            None
22020        }
22021    }
22022    fn as_syntax_node(&self) -> SyntaxNode {
22023        self.node.clone()
22024    }
22025    fn stable_ptr(&self) -> Self::StablePtr {
22026        TerminalLiteralNumberPtr(self.node.0.stable_ptr)
22027    }
22028}
22029impl From<&TerminalLiteralNumber> for SyntaxStablePtrId {
22030    fn from(node: &TerminalLiteralNumber) -> Self {
22031        node.stable_ptr().untyped()
22032    }
22033}
22034#[derive(Clone, Debug, Eq, Hash, PartialEq)]
22035pub struct TokenShortString {
22036    node: SyntaxNode,
22037}
22038impl Token for TokenShortString {
22039    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
22040        TokenShortStringGreen(
22041            Arc::new(GreenNode {
22042                kind: SyntaxKind::TokenShortString,
22043                details: GreenNodeDetails::Token(text),
22044            })
22045            .intern(db),
22046        )
22047    }
22048    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
22049        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
22050            .clone()
22051    }
22052}
22053#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
22054pub struct TokenShortStringPtr(pub SyntaxStablePtrId);
22055impl TypedStablePtr for TokenShortStringPtr {
22056    type SyntaxNode = TokenShortString;
22057    fn untyped(&self) -> SyntaxStablePtrId {
22058        self.0
22059    }
22060    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenShortString {
22061        TokenShortString::from_syntax_node(db, self.0.lookup(db))
22062    }
22063}
22064impl From<TokenShortStringPtr> for SyntaxStablePtrId {
22065    fn from(ptr: TokenShortStringPtr) -> Self {
22066        ptr.untyped()
22067    }
22068}
22069#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
22070pub struct TokenShortStringGreen(pub GreenId);
22071impl TokenShortStringGreen {
22072    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
22073        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
22074    }
22075}
22076impl TypedSyntaxNode for TokenShortString {
22077    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenShortString);
22078    type StablePtr = TokenShortStringPtr;
22079    type Green = TokenShortStringGreen;
22080    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
22081        TokenShortStringGreen(
22082            Arc::new(GreenNode {
22083                kind: SyntaxKind::TokenMissing,
22084                details: GreenNodeDetails::Token("".into()),
22085            })
22086            .intern(db),
22087        )
22088    }
22089    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
22090        match node.0.green.lookup_intern(db).details {
22091            GreenNodeDetails::Token(_) => Self { node },
22092            GreenNodeDetails::Node { .. } => {
22093                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenShortString)
22094            }
22095        }
22096    }
22097    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
22098        match node.0.green.lookup_intern(db).details {
22099            GreenNodeDetails::Token(_) => Some(Self { node }),
22100            GreenNodeDetails::Node { .. } => None,
22101        }
22102    }
22103    fn as_syntax_node(&self) -> SyntaxNode {
22104        self.node.clone()
22105    }
22106    fn stable_ptr(&self) -> Self::StablePtr {
22107        TokenShortStringPtr(self.node.0.stable_ptr)
22108    }
22109}
22110impl From<&TokenShortString> for SyntaxStablePtrId {
22111    fn from(node: &TokenShortString) -> Self {
22112        node.stable_ptr().untyped()
22113    }
22114}
22115#[derive(Clone, Debug, Eq, Hash, PartialEq)]
22116pub struct TerminalShortString {
22117    node: SyntaxNode,
22118    children: Arc<[SyntaxNode]>,
22119}
22120impl Terminal for TerminalShortString {
22121    const KIND: SyntaxKind = SyntaxKind::TerminalShortString;
22122    type TokenType = TokenShortString;
22123    fn new_green(
22124        db: &dyn SyntaxGroup,
22125        leading_trivia: TriviaGreen,
22126        token: <<TerminalShortString as Terminal>::TokenType as TypedSyntaxNode>::Green,
22127        trailing_trivia: TriviaGreen,
22128    ) -> Self::Green {
22129        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
22130        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
22131        TerminalShortStringGreen(
22132            Arc::new(GreenNode {
22133                kind: SyntaxKind::TerminalShortString,
22134                details: GreenNodeDetails::Node { children, width },
22135            })
22136            .intern(db),
22137        )
22138    }
22139    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
22140        self.token(db).text(db)
22141    }
22142}
22143impl TerminalShortString {
22144    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
22145        Trivia::from_syntax_node(db, self.children[0].clone())
22146    }
22147    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenShortString {
22148        TokenShortString::from_syntax_node(db, self.children[1].clone())
22149    }
22150    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
22151        Trivia::from_syntax_node(db, self.children[2].clone())
22152    }
22153}
22154#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
22155pub struct TerminalShortStringPtr(pub SyntaxStablePtrId);
22156impl TerminalShortStringPtr {}
22157impl TypedStablePtr for TerminalShortStringPtr {
22158    type SyntaxNode = TerminalShortString;
22159    fn untyped(&self) -> SyntaxStablePtrId {
22160        self.0
22161    }
22162    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalShortString {
22163        TerminalShortString::from_syntax_node(db, self.0.lookup(db))
22164    }
22165}
22166impl From<TerminalShortStringPtr> for SyntaxStablePtrId {
22167    fn from(ptr: TerminalShortStringPtr) -> Self {
22168        ptr.untyped()
22169    }
22170}
22171#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
22172pub struct TerminalShortStringGreen(pub GreenId);
22173impl TypedSyntaxNode for TerminalShortString {
22174    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalShortString);
22175    type StablePtr = TerminalShortStringPtr;
22176    type Green = TerminalShortStringGreen;
22177    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
22178        TerminalShortStringGreen(
22179            Arc::new(GreenNode {
22180                kind: SyntaxKind::TerminalShortString,
22181                details: GreenNodeDetails::Node {
22182                    children: vec![
22183                        Trivia::missing(db).0,
22184                        TokenShortString::missing(db).0,
22185                        Trivia::missing(db).0,
22186                    ],
22187                    width: TextWidth::default(),
22188                },
22189            })
22190            .intern(db),
22191        )
22192    }
22193    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
22194        let kind = node.kind(db);
22195        assert_eq!(
22196            kind,
22197            SyntaxKind::TerminalShortString,
22198            "Unexpected SyntaxKind {:?}. Expected {:?}.",
22199            kind,
22200            SyntaxKind::TerminalShortString
22201        );
22202        let children = db.get_children(node.clone());
22203        Self { node, children }
22204    }
22205    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
22206        let kind = node.kind(db);
22207        if kind == SyntaxKind::TerminalShortString {
22208            Some(Self::from_syntax_node(db, node))
22209        } else {
22210            None
22211        }
22212    }
22213    fn as_syntax_node(&self) -> SyntaxNode {
22214        self.node.clone()
22215    }
22216    fn stable_ptr(&self) -> Self::StablePtr {
22217        TerminalShortStringPtr(self.node.0.stable_ptr)
22218    }
22219}
22220impl From<&TerminalShortString> for SyntaxStablePtrId {
22221    fn from(node: &TerminalShortString) -> Self {
22222        node.stable_ptr().untyped()
22223    }
22224}
22225#[derive(Clone, Debug, Eq, Hash, PartialEq)]
22226pub struct TokenString {
22227    node: SyntaxNode,
22228}
22229impl Token for TokenString {
22230    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
22231        TokenStringGreen(
22232            Arc::new(GreenNode {
22233                kind: SyntaxKind::TokenString,
22234                details: GreenNodeDetails::Token(text),
22235            })
22236            .intern(db),
22237        )
22238    }
22239    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
22240        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
22241            .clone()
22242    }
22243}
22244#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
22245pub struct TokenStringPtr(pub SyntaxStablePtrId);
22246impl TypedStablePtr for TokenStringPtr {
22247    type SyntaxNode = TokenString;
22248    fn untyped(&self) -> SyntaxStablePtrId {
22249        self.0
22250    }
22251    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenString {
22252        TokenString::from_syntax_node(db, self.0.lookup(db))
22253    }
22254}
22255impl From<TokenStringPtr> for SyntaxStablePtrId {
22256    fn from(ptr: TokenStringPtr) -> Self {
22257        ptr.untyped()
22258    }
22259}
22260#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
22261pub struct TokenStringGreen(pub GreenId);
22262impl TokenStringGreen {
22263    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
22264        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
22265    }
22266}
22267impl TypedSyntaxNode for TokenString {
22268    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenString);
22269    type StablePtr = TokenStringPtr;
22270    type Green = TokenStringGreen;
22271    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
22272        TokenStringGreen(
22273            Arc::new(GreenNode {
22274                kind: SyntaxKind::TokenMissing,
22275                details: GreenNodeDetails::Token("".into()),
22276            })
22277            .intern(db),
22278        )
22279    }
22280    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
22281        match node.0.green.lookup_intern(db).details {
22282            GreenNodeDetails::Token(_) => Self { node },
22283            GreenNodeDetails::Node { .. } => {
22284                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenString)
22285            }
22286        }
22287    }
22288    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
22289        match node.0.green.lookup_intern(db).details {
22290            GreenNodeDetails::Token(_) => Some(Self { node }),
22291            GreenNodeDetails::Node { .. } => None,
22292        }
22293    }
22294    fn as_syntax_node(&self) -> SyntaxNode {
22295        self.node.clone()
22296    }
22297    fn stable_ptr(&self) -> Self::StablePtr {
22298        TokenStringPtr(self.node.0.stable_ptr)
22299    }
22300}
22301impl From<&TokenString> for SyntaxStablePtrId {
22302    fn from(node: &TokenString) -> Self {
22303        node.stable_ptr().untyped()
22304    }
22305}
22306#[derive(Clone, Debug, Eq, Hash, PartialEq)]
22307pub struct TerminalString {
22308    node: SyntaxNode,
22309    children: Arc<[SyntaxNode]>,
22310}
22311impl Terminal for TerminalString {
22312    const KIND: SyntaxKind = SyntaxKind::TerminalString;
22313    type TokenType = TokenString;
22314    fn new_green(
22315        db: &dyn SyntaxGroup,
22316        leading_trivia: TriviaGreen,
22317        token: <<TerminalString as Terminal>::TokenType as TypedSyntaxNode>::Green,
22318        trailing_trivia: TriviaGreen,
22319    ) -> Self::Green {
22320        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
22321        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
22322        TerminalStringGreen(
22323            Arc::new(GreenNode {
22324                kind: SyntaxKind::TerminalString,
22325                details: GreenNodeDetails::Node { children, width },
22326            })
22327            .intern(db),
22328        )
22329    }
22330    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
22331        self.token(db).text(db)
22332    }
22333}
22334impl TerminalString {
22335    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
22336        Trivia::from_syntax_node(db, self.children[0].clone())
22337    }
22338    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenString {
22339        TokenString::from_syntax_node(db, self.children[1].clone())
22340    }
22341    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
22342        Trivia::from_syntax_node(db, self.children[2].clone())
22343    }
22344}
22345#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
22346pub struct TerminalStringPtr(pub SyntaxStablePtrId);
22347impl TerminalStringPtr {}
22348impl TypedStablePtr for TerminalStringPtr {
22349    type SyntaxNode = TerminalString;
22350    fn untyped(&self) -> SyntaxStablePtrId {
22351        self.0
22352    }
22353    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalString {
22354        TerminalString::from_syntax_node(db, self.0.lookup(db))
22355    }
22356}
22357impl From<TerminalStringPtr> for SyntaxStablePtrId {
22358    fn from(ptr: TerminalStringPtr) -> Self {
22359        ptr.untyped()
22360    }
22361}
22362#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
22363pub struct TerminalStringGreen(pub GreenId);
22364impl TypedSyntaxNode for TerminalString {
22365    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalString);
22366    type StablePtr = TerminalStringPtr;
22367    type Green = TerminalStringGreen;
22368    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
22369        TerminalStringGreen(
22370            Arc::new(GreenNode {
22371                kind: SyntaxKind::TerminalString,
22372                details: GreenNodeDetails::Node {
22373                    children: vec![
22374                        Trivia::missing(db).0,
22375                        TokenString::missing(db).0,
22376                        Trivia::missing(db).0,
22377                    ],
22378                    width: TextWidth::default(),
22379                },
22380            })
22381            .intern(db),
22382        )
22383    }
22384    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
22385        let kind = node.kind(db);
22386        assert_eq!(
22387            kind,
22388            SyntaxKind::TerminalString,
22389            "Unexpected SyntaxKind {:?}. Expected {:?}.",
22390            kind,
22391            SyntaxKind::TerminalString
22392        );
22393        let children = db.get_children(node.clone());
22394        Self { node, children }
22395    }
22396    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
22397        let kind = node.kind(db);
22398        if kind == SyntaxKind::TerminalString {
22399            Some(Self::from_syntax_node(db, node))
22400        } else {
22401            None
22402        }
22403    }
22404    fn as_syntax_node(&self) -> SyntaxNode {
22405        self.node.clone()
22406    }
22407    fn stable_ptr(&self) -> Self::StablePtr {
22408        TerminalStringPtr(self.node.0.stable_ptr)
22409    }
22410}
22411impl From<&TerminalString> for SyntaxStablePtrId {
22412    fn from(node: &TerminalString) -> Self {
22413        node.stable_ptr().untyped()
22414    }
22415}
22416#[derive(Clone, Debug, Eq, Hash, PartialEq)]
22417pub struct TokenAs {
22418    node: SyntaxNode,
22419}
22420impl Token for TokenAs {
22421    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
22422        TokenAsGreen(
22423            Arc::new(GreenNode {
22424                kind: SyntaxKind::TokenAs,
22425                details: GreenNodeDetails::Token(text),
22426            })
22427            .intern(db),
22428        )
22429    }
22430    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
22431        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
22432            .clone()
22433    }
22434}
22435#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
22436pub struct TokenAsPtr(pub SyntaxStablePtrId);
22437impl TypedStablePtr for TokenAsPtr {
22438    type SyntaxNode = TokenAs;
22439    fn untyped(&self) -> SyntaxStablePtrId {
22440        self.0
22441    }
22442    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenAs {
22443        TokenAs::from_syntax_node(db, self.0.lookup(db))
22444    }
22445}
22446impl From<TokenAsPtr> for SyntaxStablePtrId {
22447    fn from(ptr: TokenAsPtr) -> Self {
22448        ptr.untyped()
22449    }
22450}
22451#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
22452pub struct TokenAsGreen(pub GreenId);
22453impl TokenAsGreen {
22454    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
22455        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
22456    }
22457}
22458impl TypedSyntaxNode for TokenAs {
22459    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenAs);
22460    type StablePtr = TokenAsPtr;
22461    type Green = TokenAsGreen;
22462    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
22463        TokenAsGreen(
22464            Arc::new(GreenNode {
22465                kind: SyntaxKind::TokenMissing,
22466                details: GreenNodeDetails::Token("".into()),
22467            })
22468            .intern(db),
22469        )
22470    }
22471    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
22472        match node.0.green.lookup_intern(db).details {
22473            GreenNodeDetails::Token(_) => Self { node },
22474            GreenNodeDetails::Node { .. } => {
22475                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenAs)
22476            }
22477        }
22478    }
22479    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
22480        match node.0.green.lookup_intern(db).details {
22481            GreenNodeDetails::Token(_) => Some(Self { node }),
22482            GreenNodeDetails::Node { .. } => None,
22483        }
22484    }
22485    fn as_syntax_node(&self) -> SyntaxNode {
22486        self.node.clone()
22487    }
22488    fn stable_ptr(&self) -> Self::StablePtr {
22489        TokenAsPtr(self.node.0.stable_ptr)
22490    }
22491}
22492impl From<&TokenAs> for SyntaxStablePtrId {
22493    fn from(node: &TokenAs) -> Self {
22494        node.stable_ptr().untyped()
22495    }
22496}
22497#[derive(Clone, Debug, Eq, Hash, PartialEq)]
22498pub struct TerminalAs {
22499    node: SyntaxNode,
22500    children: Arc<[SyntaxNode]>,
22501}
22502impl Terminal for TerminalAs {
22503    const KIND: SyntaxKind = SyntaxKind::TerminalAs;
22504    type TokenType = TokenAs;
22505    fn new_green(
22506        db: &dyn SyntaxGroup,
22507        leading_trivia: TriviaGreen,
22508        token: <<TerminalAs as Terminal>::TokenType as TypedSyntaxNode>::Green,
22509        trailing_trivia: TriviaGreen,
22510    ) -> Self::Green {
22511        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
22512        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
22513        TerminalAsGreen(
22514            Arc::new(GreenNode {
22515                kind: SyntaxKind::TerminalAs,
22516                details: GreenNodeDetails::Node { children, width },
22517            })
22518            .intern(db),
22519        )
22520    }
22521    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
22522        self.token(db).text(db)
22523    }
22524}
22525impl TerminalAs {
22526    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
22527        Trivia::from_syntax_node(db, self.children[0].clone())
22528    }
22529    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenAs {
22530        TokenAs::from_syntax_node(db, self.children[1].clone())
22531    }
22532    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
22533        Trivia::from_syntax_node(db, self.children[2].clone())
22534    }
22535}
22536#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
22537pub struct TerminalAsPtr(pub SyntaxStablePtrId);
22538impl TerminalAsPtr {}
22539impl TypedStablePtr for TerminalAsPtr {
22540    type SyntaxNode = TerminalAs;
22541    fn untyped(&self) -> SyntaxStablePtrId {
22542        self.0
22543    }
22544    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalAs {
22545        TerminalAs::from_syntax_node(db, self.0.lookup(db))
22546    }
22547}
22548impl From<TerminalAsPtr> for SyntaxStablePtrId {
22549    fn from(ptr: TerminalAsPtr) -> Self {
22550        ptr.untyped()
22551    }
22552}
22553#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
22554pub struct TerminalAsGreen(pub GreenId);
22555impl TypedSyntaxNode for TerminalAs {
22556    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalAs);
22557    type StablePtr = TerminalAsPtr;
22558    type Green = TerminalAsGreen;
22559    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
22560        TerminalAsGreen(
22561            Arc::new(GreenNode {
22562                kind: SyntaxKind::TerminalAs,
22563                details: GreenNodeDetails::Node {
22564                    children: vec![
22565                        Trivia::missing(db).0,
22566                        TokenAs::missing(db).0,
22567                        Trivia::missing(db).0,
22568                    ],
22569                    width: TextWidth::default(),
22570                },
22571            })
22572            .intern(db),
22573        )
22574    }
22575    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
22576        let kind = node.kind(db);
22577        assert_eq!(
22578            kind,
22579            SyntaxKind::TerminalAs,
22580            "Unexpected SyntaxKind {:?}. Expected {:?}.",
22581            kind,
22582            SyntaxKind::TerminalAs
22583        );
22584        let children = db.get_children(node.clone());
22585        Self { node, children }
22586    }
22587    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
22588        let kind = node.kind(db);
22589        if kind == SyntaxKind::TerminalAs { Some(Self::from_syntax_node(db, node)) } else { None }
22590    }
22591    fn as_syntax_node(&self) -> SyntaxNode {
22592        self.node.clone()
22593    }
22594    fn stable_ptr(&self) -> Self::StablePtr {
22595        TerminalAsPtr(self.node.0.stable_ptr)
22596    }
22597}
22598impl From<&TerminalAs> for SyntaxStablePtrId {
22599    fn from(node: &TerminalAs) -> Self {
22600        node.stable_ptr().untyped()
22601    }
22602}
22603#[derive(Clone, Debug, Eq, Hash, PartialEq)]
22604pub struct TokenConst {
22605    node: SyntaxNode,
22606}
22607impl Token for TokenConst {
22608    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
22609        TokenConstGreen(
22610            Arc::new(GreenNode {
22611                kind: SyntaxKind::TokenConst,
22612                details: GreenNodeDetails::Token(text),
22613            })
22614            .intern(db),
22615        )
22616    }
22617    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
22618        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
22619            .clone()
22620    }
22621}
22622#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
22623pub struct TokenConstPtr(pub SyntaxStablePtrId);
22624impl TypedStablePtr for TokenConstPtr {
22625    type SyntaxNode = TokenConst;
22626    fn untyped(&self) -> SyntaxStablePtrId {
22627        self.0
22628    }
22629    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenConst {
22630        TokenConst::from_syntax_node(db, self.0.lookup(db))
22631    }
22632}
22633impl From<TokenConstPtr> for SyntaxStablePtrId {
22634    fn from(ptr: TokenConstPtr) -> Self {
22635        ptr.untyped()
22636    }
22637}
22638#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
22639pub struct TokenConstGreen(pub GreenId);
22640impl TokenConstGreen {
22641    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
22642        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
22643    }
22644}
22645impl TypedSyntaxNode for TokenConst {
22646    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenConst);
22647    type StablePtr = TokenConstPtr;
22648    type Green = TokenConstGreen;
22649    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
22650        TokenConstGreen(
22651            Arc::new(GreenNode {
22652                kind: SyntaxKind::TokenMissing,
22653                details: GreenNodeDetails::Token("".into()),
22654            })
22655            .intern(db),
22656        )
22657    }
22658    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
22659        match node.0.green.lookup_intern(db).details {
22660            GreenNodeDetails::Token(_) => Self { node },
22661            GreenNodeDetails::Node { .. } => {
22662                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenConst)
22663            }
22664        }
22665    }
22666    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
22667        match node.0.green.lookup_intern(db).details {
22668            GreenNodeDetails::Token(_) => Some(Self { node }),
22669            GreenNodeDetails::Node { .. } => None,
22670        }
22671    }
22672    fn as_syntax_node(&self) -> SyntaxNode {
22673        self.node.clone()
22674    }
22675    fn stable_ptr(&self) -> Self::StablePtr {
22676        TokenConstPtr(self.node.0.stable_ptr)
22677    }
22678}
22679impl From<&TokenConst> for SyntaxStablePtrId {
22680    fn from(node: &TokenConst) -> Self {
22681        node.stable_ptr().untyped()
22682    }
22683}
22684#[derive(Clone, Debug, Eq, Hash, PartialEq)]
22685pub struct TerminalConst {
22686    node: SyntaxNode,
22687    children: Arc<[SyntaxNode]>,
22688}
22689impl Terminal for TerminalConst {
22690    const KIND: SyntaxKind = SyntaxKind::TerminalConst;
22691    type TokenType = TokenConst;
22692    fn new_green(
22693        db: &dyn SyntaxGroup,
22694        leading_trivia: TriviaGreen,
22695        token: <<TerminalConst as Terminal>::TokenType as TypedSyntaxNode>::Green,
22696        trailing_trivia: TriviaGreen,
22697    ) -> Self::Green {
22698        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
22699        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
22700        TerminalConstGreen(
22701            Arc::new(GreenNode {
22702                kind: SyntaxKind::TerminalConst,
22703                details: GreenNodeDetails::Node { children, width },
22704            })
22705            .intern(db),
22706        )
22707    }
22708    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
22709        self.token(db).text(db)
22710    }
22711}
22712impl TerminalConst {
22713    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
22714        Trivia::from_syntax_node(db, self.children[0].clone())
22715    }
22716    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenConst {
22717        TokenConst::from_syntax_node(db, self.children[1].clone())
22718    }
22719    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
22720        Trivia::from_syntax_node(db, self.children[2].clone())
22721    }
22722}
22723#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
22724pub struct TerminalConstPtr(pub SyntaxStablePtrId);
22725impl TerminalConstPtr {}
22726impl TypedStablePtr for TerminalConstPtr {
22727    type SyntaxNode = TerminalConst;
22728    fn untyped(&self) -> SyntaxStablePtrId {
22729        self.0
22730    }
22731    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalConst {
22732        TerminalConst::from_syntax_node(db, self.0.lookup(db))
22733    }
22734}
22735impl From<TerminalConstPtr> for SyntaxStablePtrId {
22736    fn from(ptr: TerminalConstPtr) -> Self {
22737        ptr.untyped()
22738    }
22739}
22740#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
22741pub struct TerminalConstGreen(pub GreenId);
22742impl TypedSyntaxNode for TerminalConst {
22743    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalConst);
22744    type StablePtr = TerminalConstPtr;
22745    type Green = TerminalConstGreen;
22746    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
22747        TerminalConstGreen(
22748            Arc::new(GreenNode {
22749                kind: SyntaxKind::TerminalConst,
22750                details: GreenNodeDetails::Node {
22751                    children: vec![
22752                        Trivia::missing(db).0,
22753                        TokenConst::missing(db).0,
22754                        Trivia::missing(db).0,
22755                    ],
22756                    width: TextWidth::default(),
22757                },
22758            })
22759            .intern(db),
22760        )
22761    }
22762    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
22763        let kind = node.kind(db);
22764        assert_eq!(
22765            kind,
22766            SyntaxKind::TerminalConst,
22767            "Unexpected SyntaxKind {:?}. Expected {:?}.",
22768            kind,
22769            SyntaxKind::TerminalConst
22770        );
22771        let children = db.get_children(node.clone());
22772        Self { node, children }
22773    }
22774    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
22775        let kind = node.kind(db);
22776        if kind == SyntaxKind::TerminalConst {
22777            Some(Self::from_syntax_node(db, node))
22778        } else {
22779            None
22780        }
22781    }
22782    fn as_syntax_node(&self) -> SyntaxNode {
22783        self.node.clone()
22784    }
22785    fn stable_ptr(&self) -> Self::StablePtr {
22786        TerminalConstPtr(self.node.0.stable_ptr)
22787    }
22788}
22789impl From<&TerminalConst> for SyntaxStablePtrId {
22790    fn from(node: &TerminalConst) -> Self {
22791        node.stable_ptr().untyped()
22792    }
22793}
22794#[derive(Clone, Debug, Eq, Hash, PartialEq)]
22795pub struct TokenElse {
22796    node: SyntaxNode,
22797}
22798impl Token for TokenElse {
22799    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
22800        TokenElseGreen(
22801            Arc::new(GreenNode {
22802                kind: SyntaxKind::TokenElse,
22803                details: GreenNodeDetails::Token(text),
22804            })
22805            .intern(db),
22806        )
22807    }
22808    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
22809        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
22810            .clone()
22811    }
22812}
22813#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
22814pub struct TokenElsePtr(pub SyntaxStablePtrId);
22815impl TypedStablePtr for TokenElsePtr {
22816    type SyntaxNode = TokenElse;
22817    fn untyped(&self) -> SyntaxStablePtrId {
22818        self.0
22819    }
22820    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenElse {
22821        TokenElse::from_syntax_node(db, self.0.lookup(db))
22822    }
22823}
22824impl From<TokenElsePtr> for SyntaxStablePtrId {
22825    fn from(ptr: TokenElsePtr) -> Self {
22826        ptr.untyped()
22827    }
22828}
22829#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
22830pub struct TokenElseGreen(pub GreenId);
22831impl TokenElseGreen {
22832    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
22833        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
22834    }
22835}
22836impl TypedSyntaxNode for TokenElse {
22837    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenElse);
22838    type StablePtr = TokenElsePtr;
22839    type Green = TokenElseGreen;
22840    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
22841        TokenElseGreen(
22842            Arc::new(GreenNode {
22843                kind: SyntaxKind::TokenMissing,
22844                details: GreenNodeDetails::Token("".into()),
22845            })
22846            .intern(db),
22847        )
22848    }
22849    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
22850        match node.0.green.lookup_intern(db).details {
22851            GreenNodeDetails::Token(_) => Self { node },
22852            GreenNodeDetails::Node { .. } => {
22853                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenElse)
22854            }
22855        }
22856    }
22857    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
22858        match node.0.green.lookup_intern(db).details {
22859            GreenNodeDetails::Token(_) => Some(Self { node }),
22860            GreenNodeDetails::Node { .. } => None,
22861        }
22862    }
22863    fn as_syntax_node(&self) -> SyntaxNode {
22864        self.node.clone()
22865    }
22866    fn stable_ptr(&self) -> Self::StablePtr {
22867        TokenElsePtr(self.node.0.stable_ptr)
22868    }
22869}
22870impl From<&TokenElse> for SyntaxStablePtrId {
22871    fn from(node: &TokenElse) -> Self {
22872        node.stable_ptr().untyped()
22873    }
22874}
22875#[derive(Clone, Debug, Eq, Hash, PartialEq)]
22876pub struct TerminalElse {
22877    node: SyntaxNode,
22878    children: Arc<[SyntaxNode]>,
22879}
22880impl Terminal for TerminalElse {
22881    const KIND: SyntaxKind = SyntaxKind::TerminalElse;
22882    type TokenType = TokenElse;
22883    fn new_green(
22884        db: &dyn SyntaxGroup,
22885        leading_trivia: TriviaGreen,
22886        token: <<TerminalElse as Terminal>::TokenType as TypedSyntaxNode>::Green,
22887        trailing_trivia: TriviaGreen,
22888    ) -> Self::Green {
22889        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
22890        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
22891        TerminalElseGreen(
22892            Arc::new(GreenNode {
22893                kind: SyntaxKind::TerminalElse,
22894                details: GreenNodeDetails::Node { children, width },
22895            })
22896            .intern(db),
22897        )
22898    }
22899    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
22900        self.token(db).text(db)
22901    }
22902}
22903impl TerminalElse {
22904    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
22905        Trivia::from_syntax_node(db, self.children[0].clone())
22906    }
22907    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenElse {
22908        TokenElse::from_syntax_node(db, self.children[1].clone())
22909    }
22910    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
22911        Trivia::from_syntax_node(db, self.children[2].clone())
22912    }
22913}
22914#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
22915pub struct TerminalElsePtr(pub SyntaxStablePtrId);
22916impl TerminalElsePtr {}
22917impl TypedStablePtr for TerminalElsePtr {
22918    type SyntaxNode = TerminalElse;
22919    fn untyped(&self) -> SyntaxStablePtrId {
22920        self.0
22921    }
22922    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalElse {
22923        TerminalElse::from_syntax_node(db, self.0.lookup(db))
22924    }
22925}
22926impl From<TerminalElsePtr> for SyntaxStablePtrId {
22927    fn from(ptr: TerminalElsePtr) -> Self {
22928        ptr.untyped()
22929    }
22930}
22931#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
22932pub struct TerminalElseGreen(pub GreenId);
22933impl TypedSyntaxNode for TerminalElse {
22934    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalElse);
22935    type StablePtr = TerminalElsePtr;
22936    type Green = TerminalElseGreen;
22937    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
22938        TerminalElseGreen(
22939            Arc::new(GreenNode {
22940                kind: SyntaxKind::TerminalElse,
22941                details: GreenNodeDetails::Node {
22942                    children: vec![
22943                        Trivia::missing(db).0,
22944                        TokenElse::missing(db).0,
22945                        Trivia::missing(db).0,
22946                    ],
22947                    width: TextWidth::default(),
22948                },
22949            })
22950            .intern(db),
22951        )
22952    }
22953    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
22954        let kind = node.kind(db);
22955        assert_eq!(
22956            kind,
22957            SyntaxKind::TerminalElse,
22958            "Unexpected SyntaxKind {:?}. Expected {:?}.",
22959            kind,
22960            SyntaxKind::TerminalElse
22961        );
22962        let children = db.get_children(node.clone());
22963        Self { node, children }
22964    }
22965    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
22966        let kind = node.kind(db);
22967        if kind == SyntaxKind::TerminalElse { Some(Self::from_syntax_node(db, node)) } else { None }
22968    }
22969    fn as_syntax_node(&self) -> SyntaxNode {
22970        self.node.clone()
22971    }
22972    fn stable_ptr(&self) -> Self::StablePtr {
22973        TerminalElsePtr(self.node.0.stable_ptr)
22974    }
22975}
22976impl From<&TerminalElse> for SyntaxStablePtrId {
22977    fn from(node: &TerminalElse) -> Self {
22978        node.stable_ptr().untyped()
22979    }
22980}
22981#[derive(Clone, Debug, Eq, Hash, PartialEq)]
22982pub struct TokenEnum {
22983    node: SyntaxNode,
22984}
22985impl Token for TokenEnum {
22986    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
22987        TokenEnumGreen(
22988            Arc::new(GreenNode {
22989                kind: SyntaxKind::TokenEnum,
22990                details: GreenNodeDetails::Token(text),
22991            })
22992            .intern(db),
22993        )
22994    }
22995    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
22996        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
22997            .clone()
22998    }
22999}
23000#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
23001pub struct TokenEnumPtr(pub SyntaxStablePtrId);
23002impl TypedStablePtr for TokenEnumPtr {
23003    type SyntaxNode = TokenEnum;
23004    fn untyped(&self) -> SyntaxStablePtrId {
23005        self.0
23006    }
23007    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenEnum {
23008        TokenEnum::from_syntax_node(db, self.0.lookup(db))
23009    }
23010}
23011impl From<TokenEnumPtr> for SyntaxStablePtrId {
23012    fn from(ptr: TokenEnumPtr) -> Self {
23013        ptr.untyped()
23014    }
23015}
23016#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
23017pub struct TokenEnumGreen(pub GreenId);
23018impl TokenEnumGreen {
23019    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
23020        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
23021    }
23022}
23023impl TypedSyntaxNode for TokenEnum {
23024    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenEnum);
23025    type StablePtr = TokenEnumPtr;
23026    type Green = TokenEnumGreen;
23027    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
23028        TokenEnumGreen(
23029            Arc::new(GreenNode {
23030                kind: SyntaxKind::TokenMissing,
23031                details: GreenNodeDetails::Token("".into()),
23032            })
23033            .intern(db),
23034        )
23035    }
23036    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
23037        match node.0.green.lookup_intern(db).details {
23038            GreenNodeDetails::Token(_) => Self { node },
23039            GreenNodeDetails::Node { .. } => {
23040                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenEnum)
23041            }
23042        }
23043    }
23044    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
23045        match node.0.green.lookup_intern(db).details {
23046            GreenNodeDetails::Token(_) => Some(Self { node }),
23047            GreenNodeDetails::Node { .. } => None,
23048        }
23049    }
23050    fn as_syntax_node(&self) -> SyntaxNode {
23051        self.node.clone()
23052    }
23053    fn stable_ptr(&self) -> Self::StablePtr {
23054        TokenEnumPtr(self.node.0.stable_ptr)
23055    }
23056}
23057impl From<&TokenEnum> for SyntaxStablePtrId {
23058    fn from(node: &TokenEnum) -> Self {
23059        node.stable_ptr().untyped()
23060    }
23061}
23062#[derive(Clone, Debug, Eq, Hash, PartialEq)]
23063pub struct TerminalEnum {
23064    node: SyntaxNode,
23065    children: Arc<[SyntaxNode]>,
23066}
23067impl Terminal for TerminalEnum {
23068    const KIND: SyntaxKind = SyntaxKind::TerminalEnum;
23069    type TokenType = TokenEnum;
23070    fn new_green(
23071        db: &dyn SyntaxGroup,
23072        leading_trivia: TriviaGreen,
23073        token: <<TerminalEnum as Terminal>::TokenType as TypedSyntaxNode>::Green,
23074        trailing_trivia: TriviaGreen,
23075    ) -> Self::Green {
23076        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
23077        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
23078        TerminalEnumGreen(
23079            Arc::new(GreenNode {
23080                kind: SyntaxKind::TerminalEnum,
23081                details: GreenNodeDetails::Node { children, width },
23082            })
23083            .intern(db),
23084        )
23085    }
23086    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
23087        self.token(db).text(db)
23088    }
23089}
23090impl TerminalEnum {
23091    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
23092        Trivia::from_syntax_node(db, self.children[0].clone())
23093    }
23094    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenEnum {
23095        TokenEnum::from_syntax_node(db, self.children[1].clone())
23096    }
23097    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
23098        Trivia::from_syntax_node(db, self.children[2].clone())
23099    }
23100}
23101#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
23102pub struct TerminalEnumPtr(pub SyntaxStablePtrId);
23103impl TerminalEnumPtr {}
23104impl TypedStablePtr for TerminalEnumPtr {
23105    type SyntaxNode = TerminalEnum;
23106    fn untyped(&self) -> SyntaxStablePtrId {
23107        self.0
23108    }
23109    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalEnum {
23110        TerminalEnum::from_syntax_node(db, self.0.lookup(db))
23111    }
23112}
23113impl From<TerminalEnumPtr> for SyntaxStablePtrId {
23114    fn from(ptr: TerminalEnumPtr) -> Self {
23115        ptr.untyped()
23116    }
23117}
23118#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
23119pub struct TerminalEnumGreen(pub GreenId);
23120impl TypedSyntaxNode for TerminalEnum {
23121    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalEnum);
23122    type StablePtr = TerminalEnumPtr;
23123    type Green = TerminalEnumGreen;
23124    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
23125        TerminalEnumGreen(
23126            Arc::new(GreenNode {
23127                kind: SyntaxKind::TerminalEnum,
23128                details: GreenNodeDetails::Node {
23129                    children: vec![
23130                        Trivia::missing(db).0,
23131                        TokenEnum::missing(db).0,
23132                        Trivia::missing(db).0,
23133                    ],
23134                    width: TextWidth::default(),
23135                },
23136            })
23137            .intern(db),
23138        )
23139    }
23140    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
23141        let kind = node.kind(db);
23142        assert_eq!(
23143            kind,
23144            SyntaxKind::TerminalEnum,
23145            "Unexpected SyntaxKind {:?}. Expected {:?}.",
23146            kind,
23147            SyntaxKind::TerminalEnum
23148        );
23149        let children = db.get_children(node.clone());
23150        Self { node, children }
23151    }
23152    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
23153        let kind = node.kind(db);
23154        if kind == SyntaxKind::TerminalEnum { Some(Self::from_syntax_node(db, node)) } else { None }
23155    }
23156    fn as_syntax_node(&self) -> SyntaxNode {
23157        self.node.clone()
23158    }
23159    fn stable_ptr(&self) -> Self::StablePtr {
23160        TerminalEnumPtr(self.node.0.stable_ptr)
23161    }
23162}
23163impl From<&TerminalEnum> for SyntaxStablePtrId {
23164    fn from(node: &TerminalEnum) -> Self {
23165        node.stable_ptr().untyped()
23166    }
23167}
23168#[derive(Clone, Debug, Eq, Hash, PartialEq)]
23169pub struct TokenExtern {
23170    node: SyntaxNode,
23171}
23172impl Token for TokenExtern {
23173    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
23174        TokenExternGreen(
23175            Arc::new(GreenNode {
23176                kind: SyntaxKind::TokenExtern,
23177                details: GreenNodeDetails::Token(text),
23178            })
23179            .intern(db),
23180        )
23181    }
23182    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
23183        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
23184            .clone()
23185    }
23186}
23187#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
23188pub struct TokenExternPtr(pub SyntaxStablePtrId);
23189impl TypedStablePtr for TokenExternPtr {
23190    type SyntaxNode = TokenExtern;
23191    fn untyped(&self) -> SyntaxStablePtrId {
23192        self.0
23193    }
23194    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenExtern {
23195        TokenExtern::from_syntax_node(db, self.0.lookup(db))
23196    }
23197}
23198impl From<TokenExternPtr> for SyntaxStablePtrId {
23199    fn from(ptr: TokenExternPtr) -> Self {
23200        ptr.untyped()
23201    }
23202}
23203#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
23204pub struct TokenExternGreen(pub GreenId);
23205impl TokenExternGreen {
23206    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
23207        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
23208    }
23209}
23210impl TypedSyntaxNode for TokenExtern {
23211    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenExtern);
23212    type StablePtr = TokenExternPtr;
23213    type Green = TokenExternGreen;
23214    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
23215        TokenExternGreen(
23216            Arc::new(GreenNode {
23217                kind: SyntaxKind::TokenMissing,
23218                details: GreenNodeDetails::Token("".into()),
23219            })
23220            .intern(db),
23221        )
23222    }
23223    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
23224        match node.0.green.lookup_intern(db).details {
23225            GreenNodeDetails::Token(_) => Self { node },
23226            GreenNodeDetails::Node { .. } => {
23227                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenExtern)
23228            }
23229        }
23230    }
23231    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
23232        match node.0.green.lookup_intern(db).details {
23233            GreenNodeDetails::Token(_) => Some(Self { node }),
23234            GreenNodeDetails::Node { .. } => None,
23235        }
23236    }
23237    fn as_syntax_node(&self) -> SyntaxNode {
23238        self.node.clone()
23239    }
23240    fn stable_ptr(&self) -> Self::StablePtr {
23241        TokenExternPtr(self.node.0.stable_ptr)
23242    }
23243}
23244impl From<&TokenExtern> for SyntaxStablePtrId {
23245    fn from(node: &TokenExtern) -> Self {
23246        node.stable_ptr().untyped()
23247    }
23248}
23249#[derive(Clone, Debug, Eq, Hash, PartialEq)]
23250pub struct TerminalExtern {
23251    node: SyntaxNode,
23252    children: Arc<[SyntaxNode]>,
23253}
23254impl Terminal for TerminalExtern {
23255    const KIND: SyntaxKind = SyntaxKind::TerminalExtern;
23256    type TokenType = TokenExtern;
23257    fn new_green(
23258        db: &dyn SyntaxGroup,
23259        leading_trivia: TriviaGreen,
23260        token: <<TerminalExtern as Terminal>::TokenType as TypedSyntaxNode>::Green,
23261        trailing_trivia: TriviaGreen,
23262    ) -> Self::Green {
23263        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
23264        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
23265        TerminalExternGreen(
23266            Arc::new(GreenNode {
23267                kind: SyntaxKind::TerminalExtern,
23268                details: GreenNodeDetails::Node { children, width },
23269            })
23270            .intern(db),
23271        )
23272    }
23273    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
23274        self.token(db).text(db)
23275    }
23276}
23277impl TerminalExtern {
23278    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
23279        Trivia::from_syntax_node(db, self.children[0].clone())
23280    }
23281    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenExtern {
23282        TokenExtern::from_syntax_node(db, self.children[1].clone())
23283    }
23284    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
23285        Trivia::from_syntax_node(db, self.children[2].clone())
23286    }
23287}
23288#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
23289pub struct TerminalExternPtr(pub SyntaxStablePtrId);
23290impl TerminalExternPtr {}
23291impl TypedStablePtr for TerminalExternPtr {
23292    type SyntaxNode = TerminalExtern;
23293    fn untyped(&self) -> SyntaxStablePtrId {
23294        self.0
23295    }
23296    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalExtern {
23297        TerminalExtern::from_syntax_node(db, self.0.lookup(db))
23298    }
23299}
23300impl From<TerminalExternPtr> for SyntaxStablePtrId {
23301    fn from(ptr: TerminalExternPtr) -> Self {
23302        ptr.untyped()
23303    }
23304}
23305#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
23306pub struct TerminalExternGreen(pub GreenId);
23307impl TypedSyntaxNode for TerminalExtern {
23308    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalExtern);
23309    type StablePtr = TerminalExternPtr;
23310    type Green = TerminalExternGreen;
23311    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
23312        TerminalExternGreen(
23313            Arc::new(GreenNode {
23314                kind: SyntaxKind::TerminalExtern,
23315                details: GreenNodeDetails::Node {
23316                    children: vec![
23317                        Trivia::missing(db).0,
23318                        TokenExtern::missing(db).0,
23319                        Trivia::missing(db).0,
23320                    ],
23321                    width: TextWidth::default(),
23322                },
23323            })
23324            .intern(db),
23325        )
23326    }
23327    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
23328        let kind = node.kind(db);
23329        assert_eq!(
23330            kind,
23331            SyntaxKind::TerminalExtern,
23332            "Unexpected SyntaxKind {:?}. Expected {:?}.",
23333            kind,
23334            SyntaxKind::TerminalExtern
23335        );
23336        let children = db.get_children(node.clone());
23337        Self { node, children }
23338    }
23339    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
23340        let kind = node.kind(db);
23341        if kind == SyntaxKind::TerminalExtern {
23342            Some(Self::from_syntax_node(db, node))
23343        } else {
23344            None
23345        }
23346    }
23347    fn as_syntax_node(&self) -> SyntaxNode {
23348        self.node.clone()
23349    }
23350    fn stable_ptr(&self) -> Self::StablePtr {
23351        TerminalExternPtr(self.node.0.stable_ptr)
23352    }
23353}
23354impl From<&TerminalExtern> for SyntaxStablePtrId {
23355    fn from(node: &TerminalExtern) -> Self {
23356        node.stable_ptr().untyped()
23357    }
23358}
23359#[derive(Clone, Debug, Eq, Hash, PartialEq)]
23360pub struct TokenFalse {
23361    node: SyntaxNode,
23362}
23363impl Token for TokenFalse {
23364    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
23365        TokenFalseGreen(
23366            Arc::new(GreenNode {
23367                kind: SyntaxKind::TokenFalse,
23368                details: GreenNodeDetails::Token(text),
23369            })
23370            .intern(db),
23371        )
23372    }
23373    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
23374        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
23375            .clone()
23376    }
23377}
23378#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
23379pub struct TokenFalsePtr(pub SyntaxStablePtrId);
23380impl TypedStablePtr for TokenFalsePtr {
23381    type SyntaxNode = TokenFalse;
23382    fn untyped(&self) -> SyntaxStablePtrId {
23383        self.0
23384    }
23385    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenFalse {
23386        TokenFalse::from_syntax_node(db, self.0.lookup(db))
23387    }
23388}
23389impl From<TokenFalsePtr> for SyntaxStablePtrId {
23390    fn from(ptr: TokenFalsePtr) -> Self {
23391        ptr.untyped()
23392    }
23393}
23394#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
23395pub struct TokenFalseGreen(pub GreenId);
23396impl TokenFalseGreen {
23397    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
23398        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
23399    }
23400}
23401impl TypedSyntaxNode for TokenFalse {
23402    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenFalse);
23403    type StablePtr = TokenFalsePtr;
23404    type Green = TokenFalseGreen;
23405    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
23406        TokenFalseGreen(
23407            Arc::new(GreenNode {
23408                kind: SyntaxKind::TokenMissing,
23409                details: GreenNodeDetails::Token("".into()),
23410            })
23411            .intern(db),
23412        )
23413    }
23414    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
23415        match node.0.green.lookup_intern(db).details {
23416            GreenNodeDetails::Token(_) => Self { node },
23417            GreenNodeDetails::Node { .. } => {
23418                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenFalse)
23419            }
23420        }
23421    }
23422    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
23423        match node.0.green.lookup_intern(db).details {
23424            GreenNodeDetails::Token(_) => Some(Self { node }),
23425            GreenNodeDetails::Node { .. } => None,
23426        }
23427    }
23428    fn as_syntax_node(&self) -> SyntaxNode {
23429        self.node.clone()
23430    }
23431    fn stable_ptr(&self) -> Self::StablePtr {
23432        TokenFalsePtr(self.node.0.stable_ptr)
23433    }
23434}
23435impl From<&TokenFalse> for SyntaxStablePtrId {
23436    fn from(node: &TokenFalse) -> Self {
23437        node.stable_ptr().untyped()
23438    }
23439}
23440#[derive(Clone, Debug, Eq, Hash, PartialEq)]
23441pub struct TerminalFalse {
23442    node: SyntaxNode,
23443    children: Arc<[SyntaxNode]>,
23444}
23445impl Terminal for TerminalFalse {
23446    const KIND: SyntaxKind = SyntaxKind::TerminalFalse;
23447    type TokenType = TokenFalse;
23448    fn new_green(
23449        db: &dyn SyntaxGroup,
23450        leading_trivia: TriviaGreen,
23451        token: <<TerminalFalse as Terminal>::TokenType as TypedSyntaxNode>::Green,
23452        trailing_trivia: TriviaGreen,
23453    ) -> Self::Green {
23454        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
23455        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
23456        TerminalFalseGreen(
23457            Arc::new(GreenNode {
23458                kind: SyntaxKind::TerminalFalse,
23459                details: GreenNodeDetails::Node { children, width },
23460            })
23461            .intern(db),
23462        )
23463    }
23464    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
23465        self.token(db).text(db)
23466    }
23467}
23468impl TerminalFalse {
23469    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
23470        Trivia::from_syntax_node(db, self.children[0].clone())
23471    }
23472    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenFalse {
23473        TokenFalse::from_syntax_node(db, self.children[1].clone())
23474    }
23475    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
23476        Trivia::from_syntax_node(db, self.children[2].clone())
23477    }
23478}
23479#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
23480pub struct TerminalFalsePtr(pub SyntaxStablePtrId);
23481impl TerminalFalsePtr {}
23482impl TypedStablePtr for TerminalFalsePtr {
23483    type SyntaxNode = TerminalFalse;
23484    fn untyped(&self) -> SyntaxStablePtrId {
23485        self.0
23486    }
23487    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalFalse {
23488        TerminalFalse::from_syntax_node(db, self.0.lookup(db))
23489    }
23490}
23491impl From<TerminalFalsePtr> for SyntaxStablePtrId {
23492    fn from(ptr: TerminalFalsePtr) -> Self {
23493        ptr.untyped()
23494    }
23495}
23496#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
23497pub struct TerminalFalseGreen(pub GreenId);
23498impl TypedSyntaxNode for TerminalFalse {
23499    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalFalse);
23500    type StablePtr = TerminalFalsePtr;
23501    type Green = TerminalFalseGreen;
23502    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
23503        TerminalFalseGreen(
23504            Arc::new(GreenNode {
23505                kind: SyntaxKind::TerminalFalse,
23506                details: GreenNodeDetails::Node {
23507                    children: vec![
23508                        Trivia::missing(db).0,
23509                        TokenFalse::missing(db).0,
23510                        Trivia::missing(db).0,
23511                    ],
23512                    width: TextWidth::default(),
23513                },
23514            })
23515            .intern(db),
23516        )
23517    }
23518    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
23519        let kind = node.kind(db);
23520        assert_eq!(
23521            kind,
23522            SyntaxKind::TerminalFalse,
23523            "Unexpected SyntaxKind {:?}. Expected {:?}.",
23524            kind,
23525            SyntaxKind::TerminalFalse
23526        );
23527        let children = db.get_children(node.clone());
23528        Self { node, children }
23529    }
23530    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
23531        let kind = node.kind(db);
23532        if kind == SyntaxKind::TerminalFalse {
23533            Some(Self::from_syntax_node(db, node))
23534        } else {
23535            None
23536        }
23537    }
23538    fn as_syntax_node(&self) -> SyntaxNode {
23539        self.node.clone()
23540    }
23541    fn stable_ptr(&self) -> Self::StablePtr {
23542        TerminalFalsePtr(self.node.0.stable_ptr)
23543    }
23544}
23545impl From<&TerminalFalse> for SyntaxStablePtrId {
23546    fn from(node: &TerminalFalse) -> Self {
23547        node.stable_ptr().untyped()
23548    }
23549}
23550#[derive(Clone, Debug, Eq, Hash, PartialEq)]
23551pub struct TokenFunction {
23552    node: SyntaxNode,
23553}
23554impl Token for TokenFunction {
23555    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
23556        TokenFunctionGreen(
23557            Arc::new(GreenNode {
23558                kind: SyntaxKind::TokenFunction,
23559                details: GreenNodeDetails::Token(text),
23560            })
23561            .intern(db),
23562        )
23563    }
23564    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
23565        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
23566            .clone()
23567    }
23568}
23569#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
23570pub struct TokenFunctionPtr(pub SyntaxStablePtrId);
23571impl TypedStablePtr for TokenFunctionPtr {
23572    type SyntaxNode = TokenFunction;
23573    fn untyped(&self) -> SyntaxStablePtrId {
23574        self.0
23575    }
23576    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenFunction {
23577        TokenFunction::from_syntax_node(db, self.0.lookup(db))
23578    }
23579}
23580impl From<TokenFunctionPtr> for SyntaxStablePtrId {
23581    fn from(ptr: TokenFunctionPtr) -> Self {
23582        ptr.untyped()
23583    }
23584}
23585#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
23586pub struct TokenFunctionGreen(pub GreenId);
23587impl TokenFunctionGreen {
23588    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
23589        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
23590    }
23591}
23592impl TypedSyntaxNode for TokenFunction {
23593    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenFunction);
23594    type StablePtr = TokenFunctionPtr;
23595    type Green = TokenFunctionGreen;
23596    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
23597        TokenFunctionGreen(
23598            Arc::new(GreenNode {
23599                kind: SyntaxKind::TokenMissing,
23600                details: GreenNodeDetails::Token("".into()),
23601            })
23602            .intern(db),
23603        )
23604    }
23605    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
23606        match node.0.green.lookup_intern(db).details {
23607            GreenNodeDetails::Token(_) => Self { node },
23608            GreenNodeDetails::Node { .. } => {
23609                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenFunction)
23610            }
23611        }
23612    }
23613    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
23614        match node.0.green.lookup_intern(db).details {
23615            GreenNodeDetails::Token(_) => Some(Self { node }),
23616            GreenNodeDetails::Node { .. } => None,
23617        }
23618    }
23619    fn as_syntax_node(&self) -> SyntaxNode {
23620        self.node.clone()
23621    }
23622    fn stable_ptr(&self) -> Self::StablePtr {
23623        TokenFunctionPtr(self.node.0.stable_ptr)
23624    }
23625}
23626impl From<&TokenFunction> for SyntaxStablePtrId {
23627    fn from(node: &TokenFunction) -> Self {
23628        node.stable_ptr().untyped()
23629    }
23630}
23631#[derive(Clone, Debug, Eq, Hash, PartialEq)]
23632pub struct TerminalFunction {
23633    node: SyntaxNode,
23634    children: Arc<[SyntaxNode]>,
23635}
23636impl Terminal for TerminalFunction {
23637    const KIND: SyntaxKind = SyntaxKind::TerminalFunction;
23638    type TokenType = TokenFunction;
23639    fn new_green(
23640        db: &dyn SyntaxGroup,
23641        leading_trivia: TriviaGreen,
23642        token: <<TerminalFunction as Terminal>::TokenType as TypedSyntaxNode>::Green,
23643        trailing_trivia: TriviaGreen,
23644    ) -> Self::Green {
23645        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
23646        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
23647        TerminalFunctionGreen(
23648            Arc::new(GreenNode {
23649                kind: SyntaxKind::TerminalFunction,
23650                details: GreenNodeDetails::Node { children, width },
23651            })
23652            .intern(db),
23653        )
23654    }
23655    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
23656        self.token(db).text(db)
23657    }
23658}
23659impl TerminalFunction {
23660    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
23661        Trivia::from_syntax_node(db, self.children[0].clone())
23662    }
23663    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenFunction {
23664        TokenFunction::from_syntax_node(db, self.children[1].clone())
23665    }
23666    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
23667        Trivia::from_syntax_node(db, self.children[2].clone())
23668    }
23669}
23670#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
23671pub struct TerminalFunctionPtr(pub SyntaxStablePtrId);
23672impl TerminalFunctionPtr {}
23673impl TypedStablePtr for TerminalFunctionPtr {
23674    type SyntaxNode = TerminalFunction;
23675    fn untyped(&self) -> SyntaxStablePtrId {
23676        self.0
23677    }
23678    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalFunction {
23679        TerminalFunction::from_syntax_node(db, self.0.lookup(db))
23680    }
23681}
23682impl From<TerminalFunctionPtr> for SyntaxStablePtrId {
23683    fn from(ptr: TerminalFunctionPtr) -> Self {
23684        ptr.untyped()
23685    }
23686}
23687#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
23688pub struct TerminalFunctionGreen(pub GreenId);
23689impl TypedSyntaxNode for TerminalFunction {
23690    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalFunction);
23691    type StablePtr = TerminalFunctionPtr;
23692    type Green = TerminalFunctionGreen;
23693    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
23694        TerminalFunctionGreen(
23695            Arc::new(GreenNode {
23696                kind: SyntaxKind::TerminalFunction,
23697                details: GreenNodeDetails::Node {
23698                    children: vec![
23699                        Trivia::missing(db).0,
23700                        TokenFunction::missing(db).0,
23701                        Trivia::missing(db).0,
23702                    ],
23703                    width: TextWidth::default(),
23704                },
23705            })
23706            .intern(db),
23707        )
23708    }
23709    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
23710        let kind = node.kind(db);
23711        assert_eq!(
23712            kind,
23713            SyntaxKind::TerminalFunction,
23714            "Unexpected SyntaxKind {:?}. Expected {:?}.",
23715            kind,
23716            SyntaxKind::TerminalFunction
23717        );
23718        let children = db.get_children(node.clone());
23719        Self { node, children }
23720    }
23721    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
23722        let kind = node.kind(db);
23723        if kind == SyntaxKind::TerminalFunction {
23724            Some(Self::from_syntax_node(db, node))
23725        } else {
23726            None
23727        }
23728    }
23729    fn as_syntax_node(&self) -> SyntaxNode {
23730        self.node.clone()
23731    }
23732    fn stable_ptr(&self) -> Self::StablePtr {
23733        TerminalFunctionPtr(self.node.0.stable_ptr)
23734    }
23735}
23736impl From<&TerminalFunction> for SyntaxStablePtrId {
23737    fn from(node: &TerminalFunction) -> Self {
23738        node.stable_ptr().untyped()
23739    }
23740}
23741#[derive(Clone, Debug, Eq, Hash, PartialEq)]
23742pub struct TokenIf {
23743    node: SyntaxNode,
23744}
23745impl Token for TokenIf {
23746    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
23747        TokenIfGreen(
23748            Arc::new(GreenNode {
23749                kind: SyntaxKind::TokenIf,
23750                details: GreenNodeDetails::Token(text),
23751            })
23752            .intern(db),
23753        )
23754    }
23755    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
23756        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
23757            .clone()
23758    }
23759}
23760#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
23761pub struct TokenIfPtr(pub SyntaxStablePtrId);
23762impl TypedStablePtr for TokenIfPtr {
23763    type SyntaxNode = TokenIf;
23764    fn untyped(&self) -> SyntaxStablePtrId {
23765        self.0
23766    }
23767    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenIf {
23768        TokenIf::from_syntax_node(db, self.0.lookup(db))
23769    }
23770}
23771impl From<TokenIfPtr> for SyntaxStablePtrId {
23772    fn from(ptr: TokenIfPtr) -> Self {
23773        ptr.untyped()
23774    }
23775}
23776#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
23777pub struct TokenIfGreen(pub GreenId);
23778impl TokenIfGreen {
23779    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
23780        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
23781    }
23782}
23783impl TypedSyntaxNode for TokenIf {
23784    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenIf);
23785    type StablePtr = TokenIfPtr;
23786    type Green = TokenIfGreen;
23787    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
23788        TokenIfGreen(
23789            Arc::new(GreenNode {
23790                kind: SyntaxKind::TokenMissing,
23791                details: GreenNodeDetails::Token("".into()),
23792            })
23793            .intern(db),
23794        )
23795    }
23796    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
23797        match node.0.green.lookup_intern(db).details {
23798            GreenNodeDetails::Token(_) => Self { node },
23799            GreenNodeDetails::Node { .. } => {
23800                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenIf)
23801            }
23802        }
23803    }
23804    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
23805        match node.0.green.lookup_intern(db).details {
23806            GreenNodeDetails::Token(_) => Some(Self { node }),
23807            GreenNodeDetails::Node { .. } => None,
23808        }
23809    }
23810    fn as_syntax_node(&self) -> SyntaxNode {
23811        self.node.clone()
23812    }
23813    fn stable_ptr(&self) -> Self::StablePtr {
23814        TokenIfPtr(self.node.0.stable_ptr)
23815    }
23816}
23817impl From<&TokenIf> for SyntaxStablePtrId {
23818    fn from(node: &TokenIf) -> Self {
23819        node.stable_ptr().untyped()
23820    }
23821}
23822#[derive(Clone, Debug, Eq, Hash, PartialEq)]
23823pub struct TerminalIf {
23824    node: SyntaxNode,
23825    children: Arc<[SyntaxNode]>,
23826}
23827impl Terminal for TerminalIf {
23828    const KIND: SyntaxKind = SyntaxKind::TerminalIf;
23829    type TokenType = TokenIf;
23830    fn new_green(
23831        db: &dyn SyntaxGroup,
23832        leading_trivia: TriviaGreen,
23833        token: <<TerminalIf as Terminal>::TokenType as TypedSyntaxNode>::Green,
23834        trailing_trivia: TriviaGreen,
23835    ) -> Self::Green {
23836        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
23837        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
23838        TerminalIfGreen(
23839            Arc::new(GreenNode {
23840                kind: SyntaxKind::TerminalIf,
23841                details: GreenNodeDetails::Node { children, width },
23842            })
23843            .intern(db),
23844        )
23845    }
23846    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
23847        self.token(db).text(db)
23848    }
23849}
23850impl TerminalIf {
23851    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
23852        Trivia::from_syntax_node(db, self.children[0].clone())
23853    }
23854    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenIf {
23855        TokenIf::from_syntax_node(db, self.children[1].clone())
23856    }
23857    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
23858        Trivia::from_syntax_node(db, self.children[2].clone())
23859    }
23860}
23861#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
23862pub struct TerminalIfPtr(pub SyntaxStablePtrId);
23863impl TerminalIfPtr {}
23864impl TypedStablePtr for TerminalIfPtr {
23865    type SyntaxNode = TerminalIf;
23866    fn untyped(&self) -> SyntaxStablePtrId {
23867        self.0
23868    }
23869    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalIf {
23870        TerminalIf::from_syntax_node(db, self.0.lookup(db))
23871    }
23872}
23873impl From<TerminalIfPtr> for SyntaxStablePtrId {
23874    fn from(ptr: TerminalIfPtr) -> Self {
23875        ptr.untyped()
23876    }
23877}
23878#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
23879pub struct TerminalIfGreen(pub GreenId);
23880impl TypedSyntaxNode for TerminalIf {
23881    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalIf);
23882    type StablePtr = TerminalIfPtr;
23883    type Green = TerminalIfGreen;
23884    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
23885        TerminalIfGreen(
23886            Arc::new(GreenNode {
23887                kind: SyntaxKind::TerminalIf,
23888                details: GreenNodeDetails::Node {
23889                    children: vec![
23890                        Trivia::missing(db).0,
23891                        TokenIf::missing(db).0,
23892                        Trivia::missing(db).0,
23893                    ],
23894                    width: TextWidth::default(),
23895                },
23896            })
23897            .intern(db),
23898        )
23899    }
23900    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
23901        let kind = node.kind(db);
23902        assert_eq!(
23903            kind,
23904            SyntaxKind::TerminalIf,
23905            "Unexpected SyntaxKind {:?}. Expected {:?}.",
23906            kind,
23907            SyntaxKind::TerminalIf
23908        );
23909        let children = db.get_children(node.clone());
23910        Self { node, children }
23911    }
23912    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
23913        let kind = node.kind(db);
23914        if kind == SyntaxKind::TerminalIf { Some(Self::from_syntax_node(db, node)) } else { None }
23915    }
23916    fn as_syntax_node(&self) -> SyntaxNode {
23917        self.node.clone()
23918    }
23919    fn stable_ptr(&self) -> Self::StablePtr {
23920        TerminalIfPtr(self.node.0.stable_ptr)
23921    }
23922}
23923impl From<&TerminalIf> for SyntaxStablePtrId {
23924    fn from(node: &TerminalIf) -> Self {
23925        node.stable_ptr().untyped()
23926    }
23927}
23928#[derive(Clone, Debug, Eq, Hash, PartialEq)]
23929pub struct TokenWhile {
23930    node: SyntaxNode,
23931}
23932impl Token for TokenWhile {
23933    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
23934        TokenWhileGreen(
23935            Arc::new(GreenNode {
23936                kind: SyntaxKind::TokenWhile,
23937                details: GreenNodeDetails::Token(text),
23938            })
23939            .intern(db),
23940        )
23941    }
23942    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
23943        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
23944            .clone()
23945    }
23946}
23947#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
23948pub struct TokenWhilePtr(pub SyntaxStablePtrId);
23949impl TypedStablePtr for TokenWhilePtr {
23950    type SyntaxNode = TokenWhile;
23951    fn untyped(&self) -> SyntaxStablePtrId {
23952        self.0
23953    }
23954    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenWhile {
23955        TokenWhile::from_syntax_node(db, self.0.lookup(db))
23956    }
23957}
23958impl From<TokenWhilePtr> for SyntaxStablePtrId {
23959    fn from(ptr: TokenWhilePtr) -> Self {
23960        ptr.untyped()
23961    }
23962}
23963#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
23964pub struct TokenWhileGreen(pub GreenId);
23965impl TokenWhileGreen {
23966    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
23967        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
23968    }
23969}
23970impl TypedSyntaxNode for TokenWhile {
23971    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenWhile);
23972    type StablePtr = TokenWhilePtr;
23973    type Green = TokenWhileGreen;
23974    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
23975        TokenWhileGreen(
23976            Arc::new(GreenNode {
23977                kind: SyntaxKind::TokenMissing,
23978                details: GreenNodeDetails::Token("".into()),
23979            })
23980            .intern(db),
23981        )
23982    }
23983    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
23984        match node.0.green.lookup_intern(db).details {
23985            GreenNodeDetails::Token(_) => Self { node },
23986            GreenNodeDetails::Node { .. } => {
23987                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenWhile)
23988            }
23989        }
23990    }
23991    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
23992        match node.0.green.lookup_intern(db).details {
23993            GreenNodeDetails::Token(_) => Some(Self { node }),
23994            GreenNodeDetails::Node { .. } => None,
23995        }
23996    }
23997    fn as_syntax_node(&self) -> SyntaxNode {
23998        self.node.clone()
23999    }
24000    fn stable_ptr(&self) -> Self::StablePtr {
24001        TokenWhilePtr(self.node.0.stable_ptr)
24002    }
24003}
24004impl From<&TokenWhile> for SyntaxStablePtrId {
24005    fn from(node: &TokenWhile) -> Self {
24006        node.stable_ptr().untyped()
24007    }
24008}
24009#[derive(Clone, Debug, Eq, Hash, PartialEq)]
24010pub struct TerminalWhile {
24011    node: SyntaxNode,
24012    children: Arc<[SyntaxNode]>,
24013}
24014impl Terminal for TerminalWhile {
24015    const KIND: SyntaxKind = SyntaxKind::TerminalWhile;
24016    type TokenType = TokenWhile;
24017    fn new_green(
24018        db: &dyn SyntaxGroup,
24019        leading_trivia: TriviaGreen,
24020        token: <<TerminalWhile as Terminal>::TokenType as TypedSyntaxNode>::Green,
24021        trailing_trivia: TriviaGreen,
24022    ) -> Self::Green {
24023        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
24024        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
24025        TerminalWhileGreen(
24026            Arc::new(GreenNode {
24027                kind: SyntaxKind::TerminalWhile,
24028                details: GreenNodeDetails::Node { children, width },
24029            })
24030            .intern(db),
24031        )
24032    }
24033    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
24034        self.token(db).text(db)
24035    }
24036}
24037impl TerminalWhile {
24038    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
24039        Trivia::from_syntax_node(db, self.children[0].clone())
24040    }
24041    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenWhile {
24042        TokenWhile::from_syntax_node(db, self.children[1].clone())
24043    }
24044    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
24045        Trivia::from_syntax_node(db, self.children[2].clone())
24046    }
24047}
24048#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
24049pub struct TerminalWhilePtr(pub SyntaxStablePtrId);
24050impl TerminalWhilePtr {}
24051impl TypedStablePtr for TerminalWhilePtr {
24052    type SyntaxNode = TerminalWhile;
24053    fn untyped(&self) -> SyntaxStablePtrId {
24054        self.0
24055    }
24056    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalWhile {
24057        TerminalWhile::from_syntax_node(db, self.0.lookup(db))
24058    }
24059}
24060impl From<TerminalWhilePtr> for SyntaxStablePtrId {
24061    fn from(ptr: TerminalWhilePtr) -> Self {
24062        ptr.untyped()
24063    }
24064}
24065#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
24066pub struct TerminalWhileGreen(pub GreenId);
24067impl TypedSyntaxNode for TerminalWhile {
24068    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalWhile);
24069    type StablePtr = TerminalWhilePtr;
24070    type Green = TerminalWhileGreen;
24071    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
24072        TerminalWhileGreen(
24073            Arc::new(GreenNode {
24074                kind: SyntaxKind::TerminalWhile,
24075                details: GreenNodeDetails::Node {
24076                    children: vec![
24077                        Trivia::missing(db).0,
24078                        TokenWhile::missing(db).0,
24079                        Trivia::missing(db).0,
24080                    ],
24081                    width: TextWidth::default(),
24082                },
24083            })
24084            .intern(db),
24085        )
24086    }
24087    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
24088        let kind = node.kind(db);
24089        assert_eq!(
24090            kind,
24091            SyntaxKind::TerminalWhile,
24092            "Unexpected SyntaxKind {:?}. Expected {:?}.",
24093            kind,
24094            SyntaxKind::TerminalWhile
24095        );
24096        let children = db.get_children(node.clone());
24097        Self { node, children }
24098    }
24099    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
24100        let kind = node.kind(db);
24101        if kind == SyntaxKind::TerminalWhile {
24102            Some(Self::from_syntax_node(db, node))
24103        } else {
24104            None
24105        }
24106    }
24107    fn as_syntax_node(&self) -> SyntaxNode {
24108        self.node.clone()
24109    }
24110    fn stable_ptr(&self) -> Self::StablePtr {
24111        TerminalWhilePtr(self.node.0.stable_ptr)
24112    }
24113}
24114impl From<&TerminalWhile> for SyntaxStablePtrId {
24115    fn from(node: &TerminalWhile) -> Self {
24116        node.stable_ptr().untyped()
24117    }
24118}
24119#[derive(Clone, Debug, Eq, Hash, PartialEq)]
24120pub struct TokenFor {
24121    node: SyntaxNode,
24122}
24123impl Token for TokenFor {
24124    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
24125        TokenForGreen(
24126            Arc::new(GreenNode {
24127                kind: SyntaxKind::TokenFor,
24128                details: GreenNodeDetails::Token(text),
24129            })
24130            .intern(db),
24131        )
24132    }
24133    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
24134        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
24135            .clone()
24136    }
24137}
24138#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
24139pub struct TokenForPtr(pub SyntaxStablePtrId);
24140impl TypedStablePtr for TokenForPtr {
24141    type SyntaxNode = TokenFor;
24142    fn untyped(&self) -> SyntaxStablePtrId {
24143        self.0
24144    }
24145    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenFor {
24146        TokenFor::from_syntax_node(db, self.0.lookup(db))
24147    }
24148}
24149impl From<TokenForPtr> for SyntaxStablePtrId {
24150    fn from(ptr: TokenForPtr) -> Self {
24151        ptr.untyped()
24152    }
24153}
24154#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
24155pub struct TokenForGreen(pub GreenId);
24156impl TokenForGreen {
24157    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
24158        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
24159    }
24160}
24161impl TypedSyntaxNode for TokenFor {
24162    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenFor);
24163    type StablePtr = TokenForPtr;
24164    type Green = TokenForGreen;
24165    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
24166        TokenForGreen(
24167            Arc::new(GreenNode {
24168                kind: SyntaxKind::TokenMissing,
24169                details: GreenNodeDetails::Token("".into()),
24170            })
24171            .intern(db),
24172        )
24173    }
24174    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
24175        match node.0.green.lookup_intern(db).details {
24176            GreenNodeDetails::Token(_) => Self { node },
24177            GreenNodeDetails::Node { .. } => {
24178                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenFor)
24179            }
24180        }
24181    }
24182    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
24183        match node.0.green.lookup_intern(db).details {
24184            GreenNodeDetails::Token(_) => Some(Self { node }),
24185            GreenNodeDetails::Node { .. } => None,
24186        }
24187    }
24188    fn as_syntax_node(&self) -> SyntaxNode {
24189        self.node.clone()
24190    }
24191    fn stable_ptr(&self) -> Self::StablePtr {
24192        TokenForPtr(self.node.0.stable_ptr)
24193    }
24194}
24195impl From<&TokenFor> for SyntaxStablePtrId {
24196    fn from(node: &TokenFor) -> Self {
24197        node.stable_ptr().untyped()
24198    }
24199}
24200#[derive(Clone, Debug, Eq, Hash, PartialEq)]
24201pub struct TerminalFor {
24202    node: SyntaxNode,
24203    children: Arc<[SyntaxNode]>,
24204}
24205impl Terminal for TerminalFor {
24206    const KIND: SyntaxKind = SyntaxKind::TerminalFor;
24207    type TokenType = TokenFor;
24208    fn new_green(
24209        db: &dyn SyntaxGroup,
24210        leading_trivia: TriviaGreen,
24211        token: <<TerminalFor as Terminal>::TokenType as TypedSyntaxNode>::Green,
24212        trailing_trivia: TriviaGreen,
24213    ) -> Self::Green {
24214        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
24215        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
24216        TerminalForGreen(
24217            Arc::new(GreenNode {
24218                kind: SyntaxKind::TerminalFor,
24219                details: GreenNodeDetails::Node { children, width },
24220            })
24221            .intern(db),
24222        )
24223    }
24224    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
24225        self.token(db).text(db)
24226    }
24227}
24228impl TerminalFor {
24229    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
24230        Trivia::from_syntax_node(db, self.children[0].clone())
24231    }
24232    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenFor {
24233        TokenFor::from_syntax_node(db, self.children[1].clone())
24234    }
24235    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
24236        Trivia::from_syntax_node(db, self.children[2].clone())
24237    }
24238}
24239#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
24240pub struct TerminalForPtr(pub SyntaxStablePtrId);
24241impl TerminalForPtr {}
24242impl TypedStablePtr for TerminalForPtr {
24243    type SyntaxNode = TerminalFor;
24244    fn untyped(&self) -> SyntaxStablePtrId {
24245        self.0
24246    }
24247    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalFor {
24248        TerminalFor::from_syntax_node(db, self.0.lookup(db))
24249    }
24250}
24251impl From<TerminalForPtr> for SyntaxStablePtrId {
24252    fn from(ptr: TerminalForPtr) -> Self {
24253        ptr.untyped()
24254    }
24255}
24256#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
24257pub struct TerminalForGreen(pub GreenId);
24258impl TypedSyntaxNode for TerminalFor {
24259    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalFor);
24260    type StablePtr = TerminalForPtr;
24261    type Green = TerminalForGreen;
24262    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
24263        TerminalForGreen(
24264            Arc::new(GreenNode {
24265                kind: SyntaxKind::TerminalFor,
24266                details: GreenNodeDetails::Node {
24267                    children: vec![
24268                        Trivia::missing(db).0,
24269                        TokenFor::missing(db).0,
24270                        Trivia::missing(db).0,
24271                    ],
24272                    width: TextWidth::default(),
24273                },
24274            })
24275            .intern(db),
24276        )
24277    }
24278    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
24279        let kind = node.kind(db);
24280        assert_eq!(
24281            kind,
24282            SyntaxKind::TerminalFor,
24283            "Unexpected SyntaxKind {:?}. Expected {:?}.",
24284            kind,
24285            SyntaxKind::TerminalFor
24286        );
24287        let children = db.get_children(node.clone());
24288        Self { node, children }
24289    }
24290    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
24291        let kind = node.kind(db);
24292        if kind == SyntaxKind::TerminalFor { Some(Self::from_syntax_node(db, node)) } else { None }
24293    }
24294    fn as_syntax_node(&self) -> SyntaxNode {
24295        self.node.clone()
24296    }
24297    fn stable_ptr(&self) -> Self::StablePtr {
24298        TerminalForPtr(self.node.0.stable_ptr)
24299    }
24300}
24301impl From<&TerminalFor> for SyntaxStablePtrId {
24302    fn from(node: &TerminalFor) -> Self {
24303        node.stable_ptr().untyped()
24304    }
24305}
24306#[derive(Clone, Debug, Eq, Hash, PartialEq)]
24307pub struct TokenLoop {
24308    node: SyntaxNode,
24309}
24310impl Token for TokenLoop {
24311    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
24312        TokenLoopGreen(
24313            Arc::new(GreenNode {
24314                kind: SyntaxKind::TokenLoop,
24315                details: GreenNodeDetails::Token(text),
24316            })
24317            .intern(db),
24318        )
24319    }
24320    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
24321        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
24322            .clone()
24323    }
24324}
24325#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
24326pub struct TokenLoopPtr(pub SyntaxStablePtrId);
24327impl TypedStablePtr for TokenLoopPtr {
24328    type SyntaxNode = TokenLoop;
24329    fn untyped(&self) -> SyntaxStablePtrId {
24330        self.0
24331    }
24332    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenLoop {
24333        TokenLoop::from_syntax_node(db, self.0.lookup(db))
24334    }
24335}
24336impl From<TokenLoopPtr> for SyntaxStablePtrId {
24337    fn from(ptr: TokenLoopPtr) -> Self {
24338        ptr.untyped()
24339    }
24340}
24341#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
24342pub struct TokenLoopGreen(pub GreenId);
24343impl TokenLoopGreen {
24344    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
24345        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
24346    }
24347}
24348impl TypedSyntaxNode for TokenLoop {
24349    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenLoop);
24350    type StablePtr = TokenLoopPtr;
24351    type Green = TokenLoopGreen;
24352    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
24353        TokenLoopGreen(
24354            Arc::new(GreenNode {
24355                kind: SyntaxKind::TokenMissing,
24356                details: GreenNodeDetails::Token("".into()),
24357            })
24358            .intern(db),
24359        )
24360    }
24361    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
24362        match node.0.green.lookup_intern(db).details {
24363            GreenNodeDetails::Token(_) => Self { node },
24364            GreenNodeDetails::Node { .. } => {
24365                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenLoop)
24366            }
24367        }
24368    }
24369    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
24370        match node.0.green.lookup_intern(db).details {
24371            GreenNodeDetails::Token(_) => Some(Self { node }),
24372            GreenNodeDetails::Node { .. } => None,
24373        }
24374    }
24375    fn as_syntax_node(&self) -> SyntaxNode {
24376        self.node.clone()
24377    }
24378    fn stable_ptr(&self) -> Self::StablePtr {
24379        TokenLoopPtr(self.node.0.stable_ptr)
24380    }
24381}
24382impl From<&TokenLoop> for SyntaxStablePtrId {
24383    fn from(node: &TokenLoop) -> Self {
24384        node.stable_ptr().untyped()
24385    }
24386}
24387#[derive(Clone, Debug, Eq, Hash, PartialEq)]
24388pub struct TerminalLoop {
24389    node: SyntaxNode,
24390    children: Arc<[SyntaxNode]>,
24391}
24392impl Terminal for TerminalLoop {
24393    const KIND: SyntaxKind = SyntaxKind::TerminalLoop;
24394    type TokenType = TokenLoop;
24395    fn new_green(
24396        db: &dyn SyntaxGroup,
24397        leading_trivia: TriviaGreen,
24398        token: <<TerminalLoop as Terminal>::TokenType as TypedSyntaxNode>::Green,
24399        trailing_trivia: TriviaGreen,
24400    ) -> Self::Green {
24401        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
24402        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
24403        TerminalLoopGreen(
24404            Arc::new(GreenNode {
24405                kind: SyntaxKind::TerminalLoop,
24406                details: GreenNodeDetails::Node { children, width },
24407            })
24408            .intern(db),
24409        )
24410    }
24411    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
24412        self.token(db).text(db)
24413    }
24414}
24415impl TerminalLoop {
24416    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
24417        Trivia::from_syntax_node(db, self.children[0].clone())
24418    }
24419    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenLoop {
24420        TokenLoop::from_syntax_node(db, self.children[1].clone())
24421    }
24422    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
24423        Trivia::from_syntax_node(db, self.children[2].clone())
24424    }
24425}
24426#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
24427pub struct TerminalLoopPtr(pub SyntaxStablePtrId);
24428impl TerminalLoopPtr {}
24429impl TypedStablePtr for TerminalLoopPtr {
24430    type SyntaxNode = TerminalLoop;
24431    fn untyped(&self) -> SyntaxStablePtrId {
24432        self.0
24433    }
24434    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalLoop {
24435        TerminalLoop::from_syntax_node(db, self.0.lookup(db))
24436    }
24437}
24438impl From<TerminalLoopPtr> for SyntaxStablePtrId {
24439    fn from(ptr: TerminalLoopPtr) -> Self {
24440        ptr.untyped()
24441    }
24442}
24443#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
24444pub struct TerminalLoopGreen(pub GreenId);
24445impl TypedSyntaxNode for TerminalLoop {
24446    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalLoop);
24447    type StablePtr = TerminalLoopPtr;
24448    type Green = TerminalLoopGreen;
24449    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
24450        TerminalLoopGreen(
24451            Arc::new(GreenNode {
24452                kind: SyntaxKind::TerminalLoop,
24453                details: GreenNodeDetails::Node {
24454                    children: vec![
24455                        Trivia::missing(db).0,
24456                        TokenLoop::missing(db).0,
24457                        Trivia::missing(db).0,
24458                    ],
24459                    width: TextWidth::default(),
24460                },
24461            })
24462            .intern(db),
24463        )
24464    }
24465    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
24466        let kind = node.kind(db);
24467        assert_eq!(
24468            kind,
24469            SyntaxKind::TerminalLoop,
24470            "Unexpected SyntaxKind {:?}. Expected {:?}.",
24471            kind,
24472            SyntaxKind::TerminalLoop
24473        );
24474        let children = db.get_children(node.clone());
24475        Self { node, children }
24476    }
24477    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
24478        let kind = node.kind(db);
24479        if kind == SyntaxKind::TerminalLoop { Some(Self::from_syntax_node(db, node)) } else { None }
24480    }
24481    fn as_syntax_node(&self) -> SyntaxNode {
24482        self.node.clone()
24483    }
24484    fn stable_ptr(&self) -> Self::StablePtr {
24485        TerminalLoopPtr(self.node.0.stable_ptr)
24486    }
24487}
24488impl From<&TerminalLoop> for SyntaxStablePtrId {
24489    fn from(node: &TerminalLoop) -> Self {
24490        node.stable_ptr().untyped()
24491    }
24492}
24493#[derive(Clone, Debug, Eq, Hash, PartialEq)]
24494pub struct TokenImpl {
24495    node: SyntaxNode,
24496}
24497impl Token for TokenImpl {
24498    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
24499        TokenImplGreen(
24500            Arc::new(GreenNode {
24501                kind: SyntaxKind::TokenImpl,
24502                details: GreenNodeDetails::Token(text),
24503            })
24504            .intern(db),
24505        )
24506    }
24507    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
24508        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
24509            .clone()
24510    }
24511}
24512#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
24513pub struct TokenImplPtr(pub SyntaxStablePtrId);
24514impl TypedStablePtr for TokenImplPtr {
24515    type SyntaxNode = TokenImpl;
24516    fn untyped(&self) -> SyntaxStablePtrId {
24517        self.0
24518    }
24519    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenImpl {
24520        TokenImpl::from_syntax_node(db, self.0.lookup(db))
24521    }
24522}
24523impl From<TokenImplPtr> for SyntaxStablePtrId {
24524    fn from(ptr: TokenImplPtr) -> Self {
24525        ptr.untyped()
24526    }
24527}
24528#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
24529pub struct TokenImplGreen(pub GreenId);
24530impl TokenImplGreen {
24531    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
24532        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
24533    }
24534}
24535impl TypedSyntaxNode for TokenImpl {
24536    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenImpl);
24537    type StablePtr = TokenImplPtr;
24538    type Green = TokenImplGreen;
24539    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
24540        TokenImplGreen(
24541            Arc::new(GreenNode {
24542                kind: SyntaxKind::TokenMissing,
24543                details: GreenNodeDetails::Token("".into()),
24544            })
24545            .intern(db),
24546        )
24547    }
24548    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
24549        match node.0.green.lookup_intern(db).details {
24550            GreenNodeDetails::Token(_) => Self { node },
24551            GreenNodeDetails::Node { .. } => {
24552                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenImpl)
24553            }
24554        }
24555    }
24556    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
24557        match node.0.green.lookup_intern(db).details {
24558            GreenNodeDetails::Token(_) => Some(Self { node }),
24559            GreenNodeDetails::Node { .. } => None,
24560        }
24561    }
24562    fn as_syntax_node(&self) -> SyntaxNode {
24563        self.node.clone()
24564    }
24565    fn stable_ptr(&self) -> Self::StablePtr {
24566        TokenImplPtr(self.node.0.stable_ptr)
24567    }
24568}
24569impl From<&TokenImpl> for SyntaxStablePtrId {
24570    fn from(node: &TokenImpl) -> Self {
24571        node.stable_ptr().untyped()
24572    }
24573}
24574#[derive(Clone, Debug, Eq, Hash, PartialEq)]
24575pub struct TerminalImpl {
24576    node: SyntaxNode,
24577    children: Arc<[SyntaxNode]>,
24578}
24579impl Terminal for TerminalImpl {
24580    const KIND: SyntaxKind = SyntaxKind::TerminalImpl;
24581    type TokenType = TokenImpl;
24582    fn new_green(
24583        db: &dyn SyntaxGroup,
24584        leading_trivia: TriviaGreen,
24585        token: <<TerminalImpl as Terminal>::TokenType as TypedSyntaxNode>::Green,
24586        trailing_trivia: TriviaGreen,
24587    ) -> Self::Green {
24588        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
24589        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
24590        TerminalImplGreen(
24591            Arc::new(GreenNode {
24592                kind: SyntaxKind::TerminalImpl,
24593                details: GreenNodeDetails::Node { children, width },
24594            })
24595            .intern(db),
24596        )
24597    }
24598    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
24599        self.token(db).text(db)
24600    }
24601}
24602impl TerminalImpl {
24603    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
24604        Trivia::from_syntax_node(db, self.children[0].clone())
24605    }
24606    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenImpl {
24607        TokenImpl::from_syntax_node(db, self.children[1].clone())
24608    }
24609    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
24610        Trivia::from_syntax_node(db, self.children[2].clone())
24611    }
24612}
24613#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
24614pub struct TerminalImplPtr(pub SyntaxStablePtrId);
24615impl TerminalImplPtr {}
24616impl TypedStablePtr for TerminalImplPtr {
24617    type SyntaxNode = TerminalImpl;
24618    fn untyped(&self) -> SyntaxStablePtrId {
24619        self.0
24620    }
24621    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalImpl {
24622        TerminalImpl::from_syntax_node(db, self.0.lookup(db))
24623    }
24624}
24625impl From<TerminalImplPtr> for SyntaxStablePtrId {
24626    fn from(ptr: TerminalImplPtr) -> Self {
24627        ptr.untyped()
24628    }
24629}
24630#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
24631pub struct TerminalImplGreen(pub GreenId);
24632impl TypedSyntaxNode for TerminalImpl {
24633    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalImpl);
24634    type StablePtr = TerminalImplPtr;
24635    type Green = TerminalImplGreen;
24636    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
24637        TerminalImplGreen(
24638            Arc::new(GreenNode {
24639                kind: SyntaxKind::TerminalImpl,
24640                details: GreenNodeDetails::Node {
24641                    children: vec![
24642                        Trivia::missing(db).0,
24643                        TokenImpl::missing(db).0,
24644                        Trivia::missing(db).0,
24645                    ],
24646                    width: TextWidth::default(),
24647                },
24648            })
24649            .intern(db),
24650        )
24651    }
24652    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
24653        let kind = node.kind(db);
24654        assert_eq!(
24655            kind,
24656            SyntaxKind::TerminalImpl,
24657            "Unexpected SyntaxKind {:?}. Expected {:?}.",
24658            kind,
24659            SyntaxKind::TerminalImpl
24660        );
24661        let children = db.get_children(node.clone());
24662        Self { node, children }
24663    }
24664    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
24665        let kind = node.kind(db);
24666        if kind == SyntaxKind::TerminalImpl { Some(Self::from_syntax_node(db, node)) } else { None }
24667    }
24668    fn as_syntax_node(&self) -> SyntaxNode {
24669        self.node.clone()
24670    }
24671    fn stable_ptr(&self) -> Self::StablePtr {
24672        TerminalImplPtr(self.node.0.stable_ptr)
24673    }
24674}
24675impl From<&TerminalImpl> for SyntaxStablePtrId {
24676    fn from(node: &TerminalImpl) -> Self {
24677        node.stable_ptr().untyped()
24678    }
24679}
24680#[derive(Clone, Debug, Eq, Hash, PartialEq)]
24681pub struct TokenImplicits {
24682    node: SyntaxNode,
24683}
24684impl Token for TokenImplicits {
24685    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
24686        TokenImplicitsGreen(
24687            Arc::new(GreenNode {
24688                kind: SyntaxKind::TokenImplicits,
24689                details: GreenNodeDetails::Token(text),
24690            })
24691            .intern(db),
24692        )
24693    }
24694    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
24695        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
24696            .clone()
24697    }
24698}
24699#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
24700pub struct TokenImplicitsPtr(pub SyntaxStablePtrId);
24701impl TypedStablePtr for TokenImplicitsPtr {
24702    type SyntaxNode = TokenImplicits;
24703    fn untyped(&self) -> SyntaxStablePtrId {
24704        self.0
24705    }
24706    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenImplicits {
24707        TokenImplicits::from_syntax_node(db, self.0.lookup(db))
24708    }
24709}
24710impl From<TokenImplicitsPtr> for SyntaxStablePtrId {
24711    fn from(ptr: TokenImplicitsPtr) -> Self {
24712        ptr.untyped()
24713    }
24714}
24715#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
24716pub struct TokenImplicitsGreen(pub GreenId);
24717impl TokenImplicitsGreen {
24718    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
24719        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
24720    }
24721}
24722impl TypedSyntaxNode for TokenImplicits {
24723    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenImplicits);
24724    type StablePtr = TokenImplicitsPtr;
24725    type Green = TokenImplicitsGreen;
24726    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
24727        TokenImplicitsGreen(
24728            Arc::new(GreenNode {
24729                kind: SyntaxKind::TokenMissing,
24730                details: GreenNodeDetails::Token("".into()),
24731            })
24732            .intern(db),
24733        )
24734    }
24735    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
24736        match node.0.green.lookup_intern(db).details {
24737            GreenNodeDetails::Token(_) => Self { node },
24738            GreenNodeDetails::Node { .. } => {
24739                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenImplicits)
24740            }
24741        }
24742    }
24743    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
24744        match node.0.green.lookup_intern(db).details {
24745            GreenNodeDetails::Token(_) => Some(Self { node }),
24746            GreenNodeDetails::Node { .. } => None,
24747        }
24748    }
24749    fn as_syntax_node(&self) -> SyntaxNode {
24750        self.node.clone()
24751    }
24752    fn stable_ptr(&self) -> Self::StablePtr {
24753        TokenImplicitsPtr(self.node.0.stable_ptr)
24754    }
24755}
24756impl From<&TokenImplicits> for SyntaxStablePtrId {
24757    fn from(node: &TokenImplicits) -> Self {
24758        node.stable_ptr().untyped()
24759    }
24760}
24761#[derive(Clone, Debug, Eq, Hash, PartialEq)]
24762pub struct TerminalImplicits {
24763    node: SyntaxNode,
24764    children: Arc<[SyntaxNode]>,
24765}
24766impl Terminal for TerminalImplicits {
24767    const KIND: SyntaxKind = SyntaxKind::TerminalImplicits;
24768    type TokenType = TokenImplicits;
24769    fn new_green(
24770        db: &dyn SyntaxGroup,
24771        leading_trivia: TriviaGreen,
24772        token: <<TerminalImplicits as Terminal>::TokenType as TypedSyntaxNode>::Green,
24773        trailing_trivia: TriviaGreen,
24774    ) -> Self::Green {
24775        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
24776        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
24777        TerminalImplicitsGreen(
24778            Arc::new(GreenNode {
24779                kind: SyntaxKind::TerminalImplicits,
24780                details: GreenNodeDetails::Node { children, width },
24781            })
24782            .intern(db),
24783        )
24784    }
24785    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
24786        self.token(db).text(db)
24787    }
24788}
24789impl TerminalImplicits {
24790    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
24791        Trivia::from_syntax_node(db, self.children[0].clone())
24792    }
24793    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenImplicits {
24794        TokenImplicits::from_syntax_node(db, self.children[1].clone())
24795    }
24796    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
24797        Trivia::from_syntax_node(db, self.children[2].clone())
24798    }
24799}
24800#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
24801pub struct TerminalImplicitsPtr(pub SyntaxStablePtrId);
24802impl TerminalImplicitsPtr {}
24803impl TypedStablePtr for TerminalImplicitsPtr {
24804    type SyntaxNode = TerminalImplicits;
24805    fn untyped(&self) -> SyntaxStablePtrId {
24806        self.0
24807    }
24808    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalImplicits {
24809        TerminalImplicits::from_syntax_node(db, self.0.lookup(db))
24810    }
24811}
24812impl From<TerminalImplicitsPtr> for SyntaxStablePtrId {
24813    fn from(ptr: TerminalImplicitsPtr) -> Self {
24814        ptr.untyped()
24815    }
24816}
24817#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
24818pub struct TerminalImplicitsGreen(pub GreenId);
24819impl TypedSyntaxNode for TerminalImplicits {
24820    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalImplicits);
24821    type StablePtr = TerminalImplicitsPtr;
24822    type Green = TerminalImplicitsGreen;
24823    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
24824        TerminalImplicitsGreen(
24825            Arc::new(GreenNode {
24826                kind: SyntaxKind::TerminalImplicits,
24827                details: GreenNodeDetails::Node {
24828                    children: vec![
24829                        Trivia::missing(db).0,
24830                        TokenImplicits::missing(db).0,
24831                        Trivia::missing(db).0,
24832                    ],
24833                    width: TextWidth::default(),
24834                },
24835            })
24836            .intern(db),
24837        )
24838    }
24839    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
24840        let kind = node.kind(db);
24841        assert_eq!(
24842            kind,
24843            SyntaxKind::TerminalImplicits,
24844            "Unexpected SyntaxKind {:?}. Expected {:?}.",
24845            kind,
24846            SyntaxKind::TerminalImplicits
24847        );
24848        let children = db.get_children(node.clone());
24849        Self { node, children }
24850    }
24851    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
24852        let kind = node.kind(db);
24853        if kind == SyntaxKind::TerminalImplicits {
24854            Some(Self::from_syntax_node(db, node))
24855        } else {
24856            None
24857        }
24858    }
24859    fn as_syntax_node(&self) -> SyntaxNode {
24860        self.node.clone()
24861    }
24862    fn stable_ptr(&self) -> Self::StablePtr {
24863        TerminalImplicitsPtr(self.node.0.stable_ptr)
24864    }
24865}
24866impl From<&TerminalImplicits> for SyntaxStablePtrId {
24867    fn from(node: &TerminalImplicits) -> Self {
24868        node.stable_ptr().untyped()
24869    }
24870}
24871#[derive(Clone, Debug, Eq, Hash, PartialEq)]
24872pub struct TokenLet {
24873    node: SyntaxNode,
24874}
24875impl Token for TokenLet {
24876    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
24877        TokenLetGreen(
24878            Arc::new(GreenNode {
24879                kind: SyntaxKind::TokenLet,
24880                details: GreenNodeDetails::Token(text),
24881            })
24882            .intern(db),
24883        )
24884    }
24885    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
24886        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
24887            .clone()
24888    }
24889}
24890#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
24891pub struct TokenLetPtr(pub SyntaxStablePtrId);
24892impl TypedStablePtr for TokenLetPtr {
24893    type SyntaxNode = TokenLet;
24894    fn untyped(&self) -> SyntaxStablePtrId {
24895        self.0
24896    }
24897    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenLet {
24898        TokenLet::from_syntax_node(db, self.0.lookup(db))
24899    }
24900}
24901impl From<TokenLetPtr> for SyntaxStablePtrId {
24902    fn from(ptr: TokenLetPtr) -> Self {
24903        ptr.untyped()
24904    }
24905}
24906#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
24907pub struct TokenLetGreen(pub GreenId);
24908impl TokenLetGreen {
24909    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
24910        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
24911    }
24912}
24913impl TypedSyntaxNode for TokenLet {
24914    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenLet);
24915    type StablePtr = TokenLetPtr;
24916    type Green = TokenLetGreen;
24917    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
24918        TokenLetGreen(
24919            Arc::new(GreenNode {
24920                kind: SyntaxKind::TokenMissing,
24921                details: GreenNodeDetails::Token("".into()),
24922            })
24923            .intern(db),
24924        )
24925    }
24926    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
24927        match node.0.green.lookup_intern(db).details {
24928            GreenNodeDetails::Token(_) => Self { node },
24929            GreenNodeDetails::Node { .. } => {
24930                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenLet)
24931            }
24932        }
24933    }
24934    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
24935        match node.0.green.lookup_intern(db).details {
24936            GreenNodeDetails::Token(_) => Some(Self { node }),
24937            GreenNodeDetails::Node { .. } => None,
24938        }
24939    }
24940    fn as_syntax_node(&self) -> SyntaxNode {
24941        self.node.clone()
24942    }
24943    fn stable_ptr(&self) -> Self::StablePtr {
24944        TokenLetPtr(self.node.0.stable_ptr)
24945    }
24946}
24947impl From<&TokenLet> for SyntaxStablePtrId {
24948    fn from(node: &TokenLet) -> Self {
24949        node.stable_ptr().untyped()
24950    }
24951}
24952#[derive(Clone, Debug, Eq, Hash, PartialEq)]
24953pub struct TerminalLet {
24954    node: SyntaxNode,
24955    children: Arc<[SyntaxNode]>,
24956}
24957impl Terminal for TerminalLet {
24958    const KIND: SyntaxKind = SyntaxKind::TerminalLet;
24959    type TokenType = TokenLet;
24960    fn new_green(
24961        db: &dyn SyntaxGroup,
24962        leading_trivia: TriviaGreen,
24963        token: <<TerminalLet as Terminal>::TokenType as TypedSyntaxNode>::Green,
24964        trailing_trivia: TriviaGreen,
24965    ) -> Self::Green {
24966        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
24967        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
24968        TerminalLetGreen(
24969            Arc::new(GreenNode {
24970                kind: SyntaxKind::TerminalLet,
24971                details: GreenNodeDetails::Node { children, width },
24972            })
24973            .intern(db),
24974        )
24975    }
24976    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
24977        self.token(db).text(db)
24978    }
24979}
24980impl TerminalLet {
24981    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
24982        Trivia::from_syntax_node(db, self.children[0].clone())
24983    }
24984    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenLet {
24985        TokenLet::from_syntax_node(db, self.children[1].clone())
24986    }
24987    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
24988        Trivia::from_syntax_node(db, self.children[2].clone())
24989    }
24990}
24991#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
24992pub struct TerminalLetPtr(pub SyntaxStablePtrId);
24993impl TerminalLetPtr {}
24994impl TypedStablePtr for TerminalLetPtr {
24995    type SyntaxNode = TerminalLet;
24996    fn untyped(&self) -> SyntaxStablePtrId {
24997        self.0
24998    }
24999    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalLet {
25000        TerminalLet::from_syntax_node(db, self.0.lookup(db))
25001    }
25002}
25003impl From<TerminalLetPtr> for SyntaxStablePtrId {
25004    fn from(ptr: TerminalLetPtr) -> Self {
25005        ptr.untyped()
25006    }
25007}
25008#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
25009pub struct TerminalLetGreen(pub GreenId);
25010impl TypedSyntaxNode for TerminalLet {
25011    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalLet);
25012    type StablePtr = TerminalLetPtr;
25013    type Green = TerminalLetGreen;
25014    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
25015        TerminalLetGreen(
25016            Arc::new(GreenNode {
25017                kind: SyntaxKind::TerminalLet,
25018                details: GreenNodeDetails::Node {
25019                    children: vec![
25020                        Trivia::missing(db).0,
25021                        TokenLet::missing(db).0,
25022                        Trivia::missing(db).0,
25023                    ],
25024                    width: TextWidth::default(),
25025                },
25026            })
25027            .intern(db),
25028        )
25029    }
25030    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
25031        let kind = node.kind(db);
25032        assert_eq!(
25033            kind,
25034            SyntaxKind::TerminalLet,
25035            "Unexpected SyntaxKind {:?}. Expected {:?}.",
25036            kind,
25037            SyntaxKind::TerminalLet
25038        );
25039        let children = db.get_children(node.clone());
25040        Self { node, children }
25041    }
25042    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
25043        let kind = node.kind(db);
25044        if kind == SyntaxKind::TerminalLet { Some(Self::from_syntax_node(db, node)) } else { None }
25045    }
25046    fn as_syntax_node(&self) -> SyntaxNode {
25047        self.node.clone()
25048    }
25049    fn stable_ptr(&self) -> Self::StablePtr {
25050        TerminalLetPtr(self.node.0.stable_ptr)
25051    }
25052}
25053impl From<&TerminalLet> for SyntaxStablePtrId {
25054    fn from(node: &TerminalLet) -> Self {
25055        node.stable_ptr().untyped()
25056    }
25057}
25058#[derive(Clone, Debug, Eq, Hash, PartialEq)]
25059pub struct TokenMatch {
25060    node: SyntaxNode,
25061}
25062impl Token for TokenMatch {
25063    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
25064        TokenMatchGreen(
25065            Arc::new(GreenNode {
25066                kind: SyntaxKind::TokenMatch,
25067                details: GreenNodeDetails::Token(text),
25068            })
25069            .intern(db),
25070        )
25071    }
25072    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
25073        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
25074            .clone()
25075    }
25076}
25077#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
25078pub struct TokenMatchPtr(pub SyntaxStablePtrId);
25079impl TypedStablePtr for TokenMatchPtr {
25080    type SyntaxNode = TokenMatch;
25081    fn untyped(&self) -> SyntaxStablePtrId {
25082        self.0
25083    }
25084    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenMatch {
25085        TokenMatch::from_syntax_node(db, self.0.lookup(db))
25086    }
25087}
25088impl From<TokenMatchPtr> for SyntaxStablePtrId {
25089    fn from(ptr: TokenMatchPtr) -> Self {
25090        ptr.untyped()
25091    }
25092}
25093#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
25094pub struct TokenMatchGreen(pub GreenId);
25095impl TokenMatchGreen {
25096    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
25097        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
25098    }
25099}
25100impl TypedSyntaxNode for TokenMatch {
25101    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenMatch);
25102    type StablePtr = TokenMatchPtr;
25103    type Green = TokenMatchGreen;
25104    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
25105        TokenMatchGreen(
25106            Arc::new(GreenNode {
25107                kind: SyntaxKind::TokenMissing,
25108                details: GreenNodeDetails::Token("".into()),
25109            })
25110            .intern(db),
25111        )
25112    }
25113    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
25114        match node.0.green.lookup_intern(db).details {
25115            GreenNodeDetails::Token(_) => Self { node },
25116            GreenNodeDetails::Node { .. } => {
25117                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenMatch)
25118            }
25119        }
25120    }
25121    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
25122        match node.0.green.lookup_intern(db).details {
25123            GreenNodeDetails::Token(_) => Some(Self { node }),
25124            GreenNodeDetails::Node { .. } => None,
25125        }
25126    }
25127    fn as_syntax_node(&self) -> SyntaxNode {
25128        self.node.clone()
25129    }
25130    fn stable_ptr(&self) -> Self::StablePtr {
25131        TokenMatchPtr(self.node.0.stable_ptr)
25132    }
25133}
25134impl From<&TokenMatch> for SyntaxStablePtrId {
25135    fn from(node: &TokenMatch) -> Self {
25136        node.stable_ptr().untyped()
25137    }
25138}
25139#[derive(Clone, Debug, Eq, Hash, PartialEq)]
25140pub struct TerminalMatch {
25141    node: SyntaxNode,
25142    children: Arc<[SyntaxNode]>,
25143}
25144impl Terminal for TerminalMatch {
25145    const KIND: SyntaxKind = SyntaxKind::TerminalMatch;
25146    type TokenType = TokenMatch;
25147    fn new_green(
25148        db: &dyn SyntaxGroup,
25149        leading_trivia: TriviaGreen,
25150        token: <<TerminalMatch as Terminal>::TokenType as TypedSyntaxNode>::Green,
25151        trailing_trivia: TriviaGreen,
25152    ) -> Self::Green {
25153        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
25154        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
25155        TerminalMatchGreen(
25156            Arc::new(GreenNode {
25157                kind: SyntaxKind::TerminalMatch,
25158                details: GreenNodeDetails::Node { children, width },
25159            })
25160            .intern(db),
25161        )
25162    }
25163    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
25164        self.token(db).text(db)
25165    }
25166}
25167impl TerminalMatch {
25168    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
25169        Trivia::from_syntax_node(db, self.children[0].clone())
25170    }
25171    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenMatch {
25172        TokenMatch::from_syntax_node(db, self.children[1].clone())
25173    }
25174    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
25175        Trivia::from_syntax_node(db, self.children[2].clone())
25176    }
25177}
25178#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
25179pub struct TerminalMatchPtr(pub SyntaxStablePtrId);
25180impl TerminalMatchPtr {}
25181impl TypedStablePtr for TerminalMatchPtr {
25182    type SyntaxNode = TerminalMatch;
25183    fn untyped(&self) -> SyntaxStablePtrId {
25184        self.0
25185    }
25186    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalMatch {
25187        TerminalMatch::from_syntax_node(db, self.0.lookup(db))
25188    }
25189}
25190impl From<TerminalMatchPtr> for SyntaxStablePtrId {
25191    fn from(ptr: TerminalMatchPtr) -> Self {
25192        ptr.untyped()
25193    }
25194}
25195#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
25196pub struct TerminalMatchGreen(pub GreenId);
25197impl TypedSyntaxNode for TerminalMatch {
25198    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalMatch);
25199    type StablePtr = TerminalMatchPtr;
25200    type Green = TerminalMatchGreen;
25201    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
25202        TerminalMatchGreen(
25203            Arc::new(GreenNode {
25204                kind: SyntaxKind::TerminalMatch,
25205                details: GreenNodeDetails::Node {
25206                    children: vec![
25207                        Trivia::missing(db).0,
25208                        TokenMatch::missing(db).0,
25209                        Trivia::missing(db).0,
25210                    ],
25211                    width: TextWidth::default(),
25212                },
25213            })
25214            .intern(db),
25215        )
25216    }
25217    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
25218        let kind = node.kind(db);
25219        assert_eq!(
25220            kind,
25221            SyntaxKind::TerminalMatch,
25222            "Unexpected SyntaxKind {:?}. Expected {:?}.",
25223            kind,
25224            SyntaxKind::TerminalMatch
25225        );
25226        let children = db.get_children(node.clone());
25227        Self { node, children }
25228    }
25229    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
25230        let kind = node.kind(db);
25231        if kind == SyntaxKind::TerminalMatch {
25232            Some(Self::from_syntax_node(db, node))
25233        } else {
25234            None
25235        }
25236    }
25237    fn as_syntax_node(&self) -> SyntaxNode {
25238        self.node.clone()
25239    }
25240    fn stable_ptr(&self) -> Self::StablePtr {
25241        TerminalMatchPtr(self.node.0.stable_ptr)
25242    }
25243}
25244impl From<&TerminalMatch> for SyntaxStablePtrId {
25245    fn from(node: &TerminalMatch) -> Self {
25246        node.stable_ptr().untyped()
25247    }
25248}
25249#[derive(Clone, Debug, Eq, Hash, PartialEq)]
25250pub struct TokenModule {
25251    node: SyntaxNode,
25252}
25253impl Token for TokenModule {
25254    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
25255        TokenModuleGreen(
25256            Arc::new(GreenNode {
25257                kind: SyntaxKind::TokenModule,
25258                details: GreenNodeDetails::Token(text),
25259            })
25260            .intern(db),
25261        )
25262    }
25263    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
25264        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
25265            .clone()
25266    }
25267}
25268#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
25269pub struct TokenModulePtr(pub SyntaxStablePtrId);
25270impl TypedStablePtr for TokenModulePtr {
25271    type SyntaxNode = TokenModule;
25272    fn untyped(&self) -> SyntaxStablePtrId {
25273        self.0
25274    }
25275    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenModule {
25276        TokenModule::from_syntax_node(db, self.0.lookup(db))
25277    }
25278}
25279impl From<TokenModulePtr> for SyntaxStablePtrId {
25280    fn from(ptr: TokenModulePtr) -> Self {
25281        ptr.untyped()
25282    }
25283}
25284#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
25285pub struct TokenModuleGreen(pub GreenId);
25286impl TokenModuleGreen {
25287    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
25288        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
25289    }
25290}
25291impl TypedSyntaxNode for TokenModule {
25292    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenModule);
25293    type StablePtr = TokenModulePtr;
25294    type Green = TokenModuleGreen;
25295    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
25296        TokenModuleGreen(
25297            Arc::new(GreenNode {
25298                kind: SyntaxKind::TokenMissing,
25299                details: GreenNodeDetails::Token("".into()),
25300            })
25301            .intern(db),
25302        )
25303    }
25304    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
25305        match node.0.green.lookup_intern(db).details {
25306            GreenNodeDetails::Token(_) => Self { node },
25307            GreenNodeDetails::Node { .. } => {
25308                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenModule)
25309            }
25310        }
25311    }
25312    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
25313        match node.0.green.lookup_intern(db).details {
25314            GreenNodeDetails::Token(_) => Some(Self { node }),
25315            GreenNodeDetails::Node { .. } => None,
25316        }
25317    }
25318    fn as_syntax_node(&self) -> SyntaxNode {
25319        self.node.clone()
25320    }
25321    fn stable_ptr(&self) -> Self::StablePtr {
25322        TokenModulePtr(self.node.0.stable_ptr)
25323    }
25324}
25325impl From<&TokenModule> for SyntaxStablePtrId {
25326    fn from(node: &TokenModule) -> Self {
25327        node.stable_ptr().untyped()
25328    }
25329}
25330#[derive(Clone, Debug, Eq, Hash, PartialEq)]
25331pub struct TerminalModule {
25332    node: SyntaxNode,
25333    children: Arc<[SyntaxNode]>,
25334}
25335impl Terminal for TerminalModule {
25336    const KIND: SyntaxKind = SyntaxKind::TerminalModule;
25337    type TokenType = TokenModule;
25338    fn new_green(
25339        db: &dyn SyntaxGroup,
25340        leading_trivia: TriviaGreen,
25341        token: <<TerminalModule as Terminal>::TokenType as TypedSyntaxNode>::Green,
25342        trailing_trivia: TriviaGreen,
25343    ) -> Self::Green {
25344        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
25345        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
25346        TerminalModuleGreen(
25347            Arc::new(GreenNode {
25348                kind: SyntaxKind::TerminalModule,
25349                details: GreenNodeDetails::Node { children, width },
25350            })
25351            .intern(db),
25352        )
25353    }
25354    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
25355        self.token(db).text(db)
25356    }
25357}
25358impl TerminalModule {
25359    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
25360        Trivia::from_syntax_node(db, self.children[0].clone())
25361    }
25362    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenModule {
25363        TokenModule::from_syntax_node(db, self.children[1].clone())
25364    }
25365    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
25366        Trivia::from_syntax_node(db, self.children[2].clone())
25367    }
25368}
25369#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
25370pub struct TerminalModulePtr(pub SyntaxStablePtrId);
25371impl TerminalModulePtr {}
25372impl TypedStablePtr for TerminalModulePtr {
25373    type SyntaxNode = TerminalModule;
25374    fn untyped(&self) -> SyntaxStablePtrId {
25375        self.0
25376    }
25377    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalModule {
25378        TerminalModule::from_syntax_node(db, self.0.lookup(db))
25379    }
25380}
25381impl From<TerminalModulePtr> for SyntaxStablePtrId {
25382    fn from(ptr: TerminalModulePtr) -> Self {
25383        ptr.untyped()
25384    }
25385}
25386#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
25387pub struct TerminalModuleGreen(pub GreenId);
25388impl TypedSyntaxNode for TerminalModule {
25389    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalModule);
25390    type StablePtr = TerminalModulePtr;
25391    type Green = TerminalModuleGreen;
25392    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
25393        TerminalModuleGreen(
25394            Arc::new(GreenNode {
25395                kind: SyntaxKind::TerminalModule,
25396                details: GreenNodeDetails::Node {
25397                    children: vec![
25398                        Trivia::missing(db).0,
25399                        TokenModule::missing(db).0,
25400                        Trivia::missing(db).0,
25401                    ],
25402                    width: TextWidth::default(),
25403                },
25404            })
25405            .intern(db),
25406        )
25407    }
25408    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
25409        let kind = node.kind(db);
25410        assert_eq!(
25411            kind,
25412            SyntaxKind::TerminalModule,
25413            "Unexpected SyntaxKind {:?}. Expected {:?}.",
25414            kind,
25415            SyntaxKind::TerminalModule
25416        );
25417        let children = db.get_children(node.clone());
25418        Self { node, children }
25419    }
25420    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
25421        let kind = node.kind(db);
25422        if kind == SyntaxKind::TerminalModule {
25423            Some(Self::from_syntax_node(db, node))
25424        } else {
25425            None
25426        }
25427    }
25428    fn as_syntax_node(&self) -> SyntaxNode {
25429        self.node.clone()
25430    }
25431    fn stable_ptr(&self) -> Self::StablePtr {
25432        TerminalModulePtr(self.node.0.stable_ptr)
25433    }
25434}
25435impl From<&TerminalModule> for SyntaxStablePtrId {
25436    fn from(node: &TerminalModule) -> Self {
25437        node.stable_ptr().untyped()
25438    }
25439}
25440#[derive(Clone, Debug, Eq, Hash, PartialEq)]
25441pub struct TokenMut {
25442    node: SyntaxNode,
25443}
25444impl Token for TokenMut {
25445    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
25446        TokenMutGreen(
25447            Arc::new(GreenNode {
25448                kind: SyntaxKind::TokenMut,
25449                details: GreenNodeDetails::Token(text),
25450            })
25451            .intern(db),
25452        )
25453    }
25454    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
25455        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
25456            .clone()
25457    }
25458}
25459#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
25460pub struct TokenMutPtr(pub SyntaxStablePtrId);
25461impl TypedStablePtr for TokenMutPtr {
25462    type SyntaxNode = TokenMut;
25463    fn untyped(&self) -> SyntaxStablePtrId {
25464        self.0
25465    }
25466    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenMut {
25467        TokenMut::from_syntax_node(db, self.0.lookup(db))
25468    }
25469}
25470impl From<TokenMutPtr> for SyntaxStablePtrId {
25471    fn from(ptr: TokenMutPtr) -> Self {
25472        ptr.untyped()
25473    }
25474}
25475#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
25476pub struct TokenMutGreen(pub GreenId);
25477impl TokenMutGreen {
25478    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
25479        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
25480    }
25481}
25482impl TypedSyntaxNode for TokenMut {
25483    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenMut);
25484    type StablePtr = TokenMutPtr;
25485    type Green = TokenMutGreen;
25486    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
25487        TokenMutGreen(
25488            Arc::new(GreenNode {
25489                kind: SyntaxKind::TokenMissing,
25490                details: GreenNodeDetails::Token("".into()),
25491            })
25492            .intern(db),
25493        )
25494    }
25495    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
25496        match node.0.green.lookup_intern(db).details {
25497            GreenNodeDetails::Token(_) => Self { node },
25498            GreenNodeDetails::Node { .. } => {
25499                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenMut)
25500            }
25501        }
25502    }
25503    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
25504        match node.0.green.lookup_intern(db).details {
25505            GreenNodeDetails::Token(_) => Some(Self { node }),
25506            GreenNodeDetails::Node { .. } => None,
25507        }
25508    }
25509    fn as_syntax_node(&self) -> SyntaxNode {
25510        self.node.clone()
25511    }
25512    fn stable_ptr(&self) -> Self::StablePtr {
25513        TokenMutPtr(self.node.0.stable_ptr)
25514    }
25515}
25516impl From<&TokenMut> for SyntaxStablePtrId {
25517    fn from(node: &TokenMut) -> Self {
25518        node.stable_ptr().untyped()
25519    }
25520}
25521#[derive(Clone, Debug, Eq, Hash, PartialEq)]
25522pub struct TerminalMut {
25523    node: SyntaxNode,
25524    children: Arc<[SyntaxNode]>,
25525}
25526impl Terminal for TerminalMut {
25527    const KIND: SyntaxKind = SyntaxKind::TerminalMut;
25528    type TokenType = TokenMut;
25529    fn new_green(
25530        db: &dyn SyntaxGroup,
25531        leading_trivia: TriviaGreen,
25532        token: <<TerminalMut as Terminal>::TokenType as TypedSyntaxNode>::Green,
25533        trailing_trivia: TriviaGreen,
25534    ) -> Self::Green {
25535        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
25536        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
25537        TerminalMutGreen(
25538            Arc::new(GreenNode {
25539                kind: SyntaxKind::TerminalMut,
25540                details: GreenNodeDetails::Node { children, width },
25541            })
25542            .intern(db),
25543        )
25544    }
25545    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
25546        self.token(db).text(db)
25547    }
25548}
25549impl TerminalMut {
25550    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
25551        Trivia::from_syntax_node(db, self.children[0].clone())
25552    }
25553    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenMut {
25554        TokenMut::from_syntax_node(db, self.children[1].clone())
25555    }
25556    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
25557        Trivia::from_syntax_node(db, self.children[2].clone())
25558    }
25559}
25560#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
25561pub struct TerminalMutPtr(pub SyntaxStablePtrId);
25562impl TerminalMutPtr {}
25563impl TypedStablePtr for TerminalMutPtr {
25564    type SyntaxNode = TerminalMut;
25565    fn untyped(&self) -> SyntaxStablePtrId {
25566        self.0
25567    }
25568    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalMut {
25569        TerminalMut::from_syntax_node(db, self.0.lookup(db))
25570    }
25571}
25572impl From<TerminalMutPtr> for SyntaxStablePtrId {
25573    fn from(ptr: TerminalMutPtr) -> Self {
25574        ptr.untyped()
25575    }
25576}
25577#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
25578pub struct TerminalMutGreen(pub GreenId);
25579impl TypedSyntaxNode for TerminalMut {
25580    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalMut);
25581    type StablePtr = TerminalMutPtr;
25582    type Green = TerminalMutGreen;
25583    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
25584        TerminalMutGreen(
25585            Arc::new(GreenNode {
25586                kind: SyntaxKind::TerminalMut,
25587                details: GreenNodeDetails::Node {
25588                    children: vec![
25589                        Trivia::missing(db).0,
25590                        TokenMut::missing(db).0,
25591                        Trivia::missing(db).0,
25592                    ],
25593                    width: TextWidth::default(),
25594                },
25595            })
25596            .intern(db),
25597        )
25598    }
25599    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
25600        let kind = node.kind(db);
25601        assert_eq!(
25602            kind,
25603            SyntaxKind::TerminalMut,
25604            "Unexpected SyntaxKind {:?}. Expected {:?}.",
25605            kind,
25606            SyntaxKind::TerminalMut
25607        );
25608        let children = db.get_children(node.clone());
25609        Self { node, children }
25610    }
25611    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
25612        let kind = node.kind(db);
25613        if kind == SyntaxKind::TerminalMut { Some(Self::from_syntax_node(db, node)) } else { None }
25614    }
25615    fn as_syntax_node(&self) -> SyntaxNode {
25616        self.node.clone()
25617    }
25618    fn stable_ptr(&self) -> Self::StablePtr {
25619        TerminalMutPtr(self.node.0.stable_ptr)
25620    }
25621}
25622impl From<&TerminalMut> for SyntaxStablePtrId {
25623    fn from(node: &TerminalMut) -> Self {
25624        node.stable_ptr().untyped()
25625    }
25626}
25627#[derive(Clone, Debug, Eq, Hash, PartialEq)]
25628pub struct TokenNoPanic {
25629    node: SyntaxNode,
25630}
25631impl Token for TokenNoPanic {
25632    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
25633        TokenNoPanicGreen(
25634            Arc::new(GreenNode {
25635                kind: SyntaxKind::TokenNoPanic,
25636                details: GreenNodeDetails::Token(text),
25637            })
25638            .intern(db),
25639        )
25640    }
25641    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
25642        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
25643            .clone()
25644    }
25645}
25646#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
25647pub struct TokenNoPanicPtr(pub SyntaxStablePtrId);
25648impl TypedStablePtr for TokenNoPanicPtr {
25649    type SyntaxNode = TokenNoPanic;
25650    fn untyped(&self) -> SyntaxStablePtrId {
25651        self.0
25652    }
25653    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenNoPanic {
25654        TokenNoPanic::from_syntax_node(db, self.0.lookup(db))
25655    }
25656}
25657impl From<TokenNoPanicPtr> for SyntaxStablePtrId {
25658    fn from(ptr: TokenNoPanicPtr) -> Self {
25659        ptr.untyped()
25660    }
25661}
25662#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
25663pub struct TokenNoPanicGreen(pub GreenId);
25664impl TokenNoPanicGreen {
25665    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
25666        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
25667    }
25668}
25669impl TypedSyntaxNode for TokenNoPanic {
25670    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenNoPanic);
25671    type StablePtr = TokenNoPanicPtr;
25672    type Green = TokenNoPanicGreen;
25673    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
25674        TokenNoPanicGreen(
25675            Arc::new(GreenNode {
25676                kind: SyntaxKind::TokenMissing,
25677                details: GreenNodeDetails::Token("".into()),
25678            })
25679            .intern(db),
25680        )
25681    }
25682    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
25683        match node.0.green.lookup_intern(db).details {
25684            GreenNodeDetails::Token(_) => Self { node },
25685            GreenNodeDetails::Node { .. } => {
25686                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenNoPanic)
25687            }
25688        }
25689    }
25690    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
25691        match node.0.green.lookup_intern(db).details {
25692            GreenNodeDetails::Token(_) => Some(Self { node }),
25693            GreenNodeDetails::Node { .. } => None,
25694        }
25695    }
25696    fn as_syntax_node(&self) -> SyntaxNode {
25697        self.node.clone()
25698    }
25699    fn stable_ptr(&self) -> Self::StablePtr {
25700        TokenNoPanicPtr(self.node.0.stable_ptr)
25701    }
25702}
25703impl From<&TokenNoPanic> for SyntaxStablePtrId {
25704    fn from(node: &TokenNoPanic) -> Self {
25705        node.stable_ptr().untyped()
25706    }
25707}
25708#[derive(Clone, Debug, Eq, Hash, PartialEq)]
25709pub struct TerminalNoPanic {
25710    node: SyntaxNode,
25711    children: Arc<[SyntaxNode]>,
25712}
25713impl Terminal for TerminalNoPanic {
25714    const KIND: SyntaxKind = SyntaxKind::TerminalNoPanic;
25715    type TokenType = TokenNoPanic;
25716    fn new_green(
25717        db: &dyn SyntaxGroup,
25718        leading_trivia: TriviaGreen,
25719        token: <<TerminalNoPanic as Terminal>::TokenType as TypedSyntaxNode>::Green,
25720        trailing_trivia: TriviaGreen,
25721    ) -> Self::Green {
25722        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
25723        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
25724        TerminalNoPanicGreen(
25725            Arc::new(GreenNode {
25726                kind: SyntaxKind::TerminalNoPanic,
25727                details: GreenNodeDetails::Node { children, width },
25728            })
25729            .intern(db),
25730        )
25731    }
25732    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
25733        self.token(db).text(db)
25734    }
25735}
25736impl TerminalNoPanic {
25737    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
25738        Trivia::from_syntax_node(db, self.children[0].clone())
25739    }
25740    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenNoPanic {
25741        TokenNoPanic::from_syntax_node(db, self.children[1].clone())
25742    }
25743    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
25744        Trivia::from_syntax_node(db, self.children[2].clone())
25745    }
25746}
25747#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
25748pub struct TerminalNoPanicPtr(pub SyntaxStablePtrId);
25749impl TerminalNoPanicPtr {}
25750impl TypedStablePtr for TerminalNoPanicPtr {
25751    type SyntaxNode = TerminalNoPanic;
25752    fn untyped(&self) -> SyntaxStablePtrId {
25753        self.0
25754    }
25755    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalNoPanic {
25756        TerminalNoPanic::from_syntax_node(db, self.0.lookup(db))
25757    }
25758}
25759impl From<TerminalNoPanicPtr> for SyntaxStablePtrId {
25760    fn from(ptr: TerminalNoPanicPtr) -> Self {
25761        ptr.untyped()
25762    }
25763}
25764#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
25765pub struct TerminalNoPanicGreen(pub GreenId);
25766impl TypedSyntaxNode for TerminalNoPanic {
25767    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalNoPanic);
25768    type StablePtr = TerminalNoPanicPtr;
25769    type Green = TerminalNoPanicGreen;
25770    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
25771        TerminalNoPanicGreen(
25772            Arc::new(GreenNode {
25773                kind: SyntaxKind::TerminalNoPanic,
25774                details: GreenNodeDetails::Node {
25775                    children: vec![
25776                        Trivia::missing(db).0,
25777                        TokenNoPanic::missing(db).0,
25778                        Trivia::missing(db).0,
25779                    ],
25780                    width: TextWidth::default(),
25781                },
25782            })
25783            .intern(db),
25784        )
25785    }
25786    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
25787        let kind = node.kind(db);
25788        assert_eq!(
25789            kind,
25790            SyntaxKind::TerminalNoPanic,
25791            "Unexpected SyntaxKind {:?}. Expected {:?}.",
25792            kind,
25793            SyntaxKind::TerminalNoPanic
25794        );
25795        let children = db.get_children(node.clone());
25796        Self { node, children }
25797    }
25798    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
25799        let kind = node.kind(db);
25800        if kind == SyntaxKind::TerminalNoPanic {
25801            Some(Self::from_syntax_node(db, node))
25802        } else {
25803            None
25804        }
25805    }
25806    fn as_syntax_node(&self) -> SyntaxNode {
25807        self.node.clone()
25808    }
25809    fn stable_ptr(&self) -> Self::StablePtr {
25810        TerminalNoPanicPtr(self.node.0.stable_ptr)
25811    }
25812}
25813impl From<&TerminalNoPanic> for SyntaxStablePtrId {
25814    fn from(node: &TerminalNoPanic) -> Self {
25815        node.stable_ptr().untyped()
25816    }
25817}
25818#[derive(Clone, Debug, Eq, Hash, PartialEq)]
25819pub struct TokenOf {
25820    node: SyntaxNode,
25821}
25822impl Token for TokenOf {
25823    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
25824        TokenOfGreen(
25825            Arc::new(GreenNode {
25826                kind: SyntaxKind::TokenOf,
25827                details: GreenNodeDetails::Token(text),
25828            })
25829            .intern(db),
25830        )
25831    }
25832    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
25833        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
25834            .clone()
25835    }
25836}
25837#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
25838pub struct TokenOfPtr(pub SyntaxStablePtrId);
25839impl TypedStablePtr for TokenOfPtr {
25840    type SyntaxNode = TokenOf;
25841    fn untyped(&self) -> SyntaxStablePtrId {
25842        self.0
25843    }
25844    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenOf {
25845        TokenOf::from_syntax_node(db, self.0.lookup(db))
25846    }
25847}
25848impl From<TokenOfPtr> for SyntaxStablePtrId {
25849    fn from(ptr: TokenOfPtr) -> Self {
25850        ptr.untyped()
25851    }
25852}
25853#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
25854pub struct TokenOfGreen(pub GreenId);
25855impl TokenOfGreen {
25856    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
25857        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
25858    }
25859}
25860impl TypedSyntaxNode for TokenOf {
25861    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenOf);
25862    type StablePtr = TokenOfPtr;
25863    type Green = TokenOfGreen;
25864    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
25865        TokenOfGreen(
25866            Arc::new(GreenNode {
25867                kind: SyntaxKind::TokenMissing,
25868                details: GreenNodeDetails::Token("".into()),
25869            })
25870            .intern(db),
25871        )
25872    }
25873    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
25874        match node.0.green.lookup_intern(db).details {
25875            GreenNodeDetails::Token(_) => Self { node },
25876            GreenNodeDetails::Node { .. } => {
25877                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenOf)
25878            }
25879        }
25880    }
25881    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
25882        match node.0.green.lookup_intern(db).details {
25883            GreenNodeDetails::Token(_) => Some(Self { node }),
25884            GreenNodeDetails::Node { .. } => None,
25885        }
25886    }
25887    fn as_syntax_node(&self) -> SyntaxNode {
25888        self.node.clone()
25889    }
25890    fn stable_ptr(&self) -> Self::StablePtr {
25891        TokenOfPtr(self.node.0.stable_ptr)
25892    }
25893}
25894impl From<&TokenOf> for SyntaxStablePtrId {
25895    fn from(node: &TokenOf) -> Self {
25896        node.stable_ptr().untyped()
25897    }
25898}
25899#[derive(Clone, Debug, Eq, Hash, PartialEq)]
25900pub struct TerminalOf {
25901    node: SyntaxNode,
25902    children: Arc<[SyntaxNode]>,
25903}
25904impl Terminal for TerminalOf {
25905    const KIND: SyntaxKind = SyntaxKind::TerminalOf;
25906    type TokenType = TokenOf;
25907    fn new_green(
25908        db: &dyn SyntaxGroup,
25909        leading_trivia: TriviaGreen,
25910        token: <<TerminalOf as Terminal>::TokenType as TypedSyntaxNode>::Green,
25911        trailing_trivia: TriviaGreen,
25912    ) -> Self::Green {
25913        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
25914        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
25915        TerminalOfGreen(
25916            Arc::new(GreenNode {
25917                kind: SyntaxKind::TerminalOf,
25918                details: GreenNodeDetails::Node { children, width },
25919            })
25920            .intern(db),
25921        )
25922    }
25923    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
25924        self.token(db).text(db)
25925    }
25926}
25927impl TerminalOf {
25928    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
25929        Trivia::from_syntax_node(db, self.children[0].clone())
25930    }
25931    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenOf {
25932        TokenOf::from_syntax_node(db, self.children[1].clone())
25933    }
25934    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
25935        Trivia::from_syntax_node(db, self.children[2].clone())
25936    }
25937}
25938#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
25939pub struct TerminalOfPtr(pub SyntaxStablePtrId);
25940impl TerminalOfPtr {}
25941impl TypedStablePtr for TerminalOfPtr {
25942    type SyntaxNode = TerminalOf;
25943    fn untyped(&self) -> SyntaxStablePtrId {
25944        self.0
25945    }
25946    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalOf {
25947        TerminalOf::from_syntax_node(db, self.0.lookup(db))
25948    }
25949}
25950impl From<TerminalOfPtr> for SyntaxStablePtrId {
25951    fn from(ptr: TerminalOfPtr) -> Self {
25952        ptr.untyped()
25953    }
25954}
25955#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
25956pub struct TerminalOfGreen(pub GreenId);
25957impl TypedSyntaxNode for TerminalOf {
25958    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalOf);
25959    type StablePtr = TerminalOfPtr;
25960    type Green = TerminalOfGreen;
25961    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
25962        TerminalOfGreen(
25963            Arc::new(GreenNode {
25964                kind: SyntaxKind::TerminalOf,
25965                details: GreenNodeDetails::Node {
25966                    children: vec![
25967                        Trivia::missing(db).0,
25968                        TokenOf::missing(db).0,
25969                        Trivia::missing(db).0,
25970                    ],
25971                    width: TextWidth::default(),
25972                },
25973            })
25974            .intern(db),
25975        )
25976    }
25977    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
25978        let kind = node.kind(db);
25979        assert_eq!(
25980            kind,
25981            SyntaxKind::TerminalOf,
25982            "Unexpected SyntaxKind {:?}. Expected {:?}.",
25983            kind,
25984            SyntaxKind::TerminalOf
25985        );
25986        let children = db.get_children(node.clone());
25987        Self { node, children }
25988    }
25989    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
25990        let kind = node.kind(db);
25991        if kind == SyntaxKind::TerminalOf { Some(Self::from_syntax_node(db, node)) } else { None }
25992    }
25993    fn as_syntax_node(&self) -> SyntaxNode {
25994        self.node.clone()
25995    }
25996    fn stable_ptr(&self) -> Self::StablePtr {
25997        TerminalOfPtr(self.node.0.stable_ptr)
25998    }
25999}
26000impl From<&TerminalOf> for SyntaxStablePtrId {
26001    fn from(node: &TerminalOf) -> Self {
26002        node.stable_ptr().untyped()
26003    }
26004}
26005#[derive(Clone, Debug, Eq, Hash, PartialEq)]
26006pub struct TokenRef {
26007    node: SyntaxNode,
26008}
26009impl Token for TokenRef {
26010    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
26011        TokenRefGreen(
26012            Arc::new(GreenNode {
26013                kind: SyntaxKind::TokenRef,
26014                details: GreenNodeDetails::Token(text),
26015            })
26016            .intern(db),
26017        )
26018    }
26019    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
26020        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
26021            .clone()
26022    }
26023}
26024#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
26025pub struct TokenRefPtr(pub SyntaxStablePtrId);
26026impl TypedStablePtr for TokenRefPtr {
26027    type SyntaxNode = TokenRef;
26028    fn untyped(&self) -> SyntaxStablePtrId {
26029        self.0
26030    }
26031    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenRef {
26032        TokenRef::from_syntax_node(db, self.0.lookup(db))
26033    }
26034}
26035impl From<TokenRefPtr> for SyntaxStablePtrId {
26036    fn from(ptr: TokenRefPtr) -> Self {
26037        ptr.untyped()
26038    }
26039}
26040#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
26041pub struct TokenRefGreen(pub GreenId);
26042impl TokenRefGreen {
26043    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
26044        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
26045    }
26046}
26047impl TypedSyntaxNode for TokenRef {
26048    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenRef);
26049    type StablePtr = TokenRefPtr;
26050    type Green = TokenRefGreen;
26051    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
26052        TokenRefGreen(
26053            Arc::new(GreenNode {
26054                kind: SyntaxKind::TokenMissing,
26055                details: GreenNodeDetails::Token("".into()),
26056            })
26057            .intern(db),
26058        )
26059    }
26060    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
26061        match node.0.green.lookup_intern(db).details {
26062            GreenNodeDetails::Token(_) => Self { node },
26063            GreenNodeDetails::Node { .. } => {
26064                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenRef)
26065            }
26066        }
26067    }
26068    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
26069        match node.0.green.lookup_intern(db).details {
26070            GreenNodeDetails::Token(_) => Some(Self { node }),
26071            GreenNodeDetails::Node { .. } => None,
26072        }
26073    }
26074    fn as_syntax_node(&self) -> SyntaxNode {
26075        self.node.clone()
26076    }
26077    fn stable_ptr(&self) -> Self::StablePtr {
26078        TokenRefPtr(self.node.0.stable_ptr)
26079    }
26080}
26081impl From<&TokenRef> for SyntaxStablePtrId {
26082    fn from(node: &TokenRef) -> Self {
26083        node.stable_ptr().untyped()
26084    }
26085}
26086#[derive(Clone, Debug, Eq, Hash, PartialEq)]
26087pub struct TerminalRef {
26088    node: SyntaxNode,
26089    children: Arc<[SyntaxNode]>,
26090}
26091impl Terminal for TerminalRef {
26092    const KIND: SyntaxKind = SyntaxKind::TerminalRef;
26093    type TokenType = TokenRef;
26094    fn new_green(
26095        db: &dyn SyntaxGroup,
26096        leading_trivia: TriviaGreen,
26097        token: <<TerminalRef as Terminal>::TokenType as TypedSyntaxNode>::Green,
26098        trailing_trivia: TriviaGreen,
26099    ) -> Self::Green {
26100        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
26101        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
26102        TerminalRefGreen(
26103            Arc::new(GreenNode {
26104                kind: SyntaxKind::TerminalRef,
26105                details: GreenNodeDetails::Node { children, width },
26106            })
26107            .intern(db),
26108        )
26109    }
26110    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
26111        self.token(db).text(db)
26112    }
26113}
26114impl TerminalRef {
26115    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
26116        Trivia::from_syntax_node(db, self.children[0].clone())
26117    }
26118    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenRef {
26119        TokenRef::from_syntax_node(db, self.children[1].clone())
26120    }
26121    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
26122        Trivia::from_syntax_node(db, self.children[2].clone())
26123    }
26124}
26125#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
26126pub struct TerminalRefPtr(pub SyntaxStablePtrId);
26127impl TerminalRefPtr {}
26128impl TypedStablePtr for TerminalRefPtr {
26129    type SyntaxNode = TerminalRef;
26130    fn untyped(&self) -> SyntaxStablePtrId {
26131        self.0
26132    }
26133    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalRef {
26134        TerminalRef::from_syntax_node(db, self.0.lookup(db))
26135    }
26136}
26137impl From<TerminalRefPtr> for SyntaxStablePtrId {
26138    fn from(ptr: TerminalRefPtr) -> Self {
26139        ptr.untyped()
26140    }
26141}
26142#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
26143pub struct TerminalRefGreen(pub GreenId);
26144impl TypedSyntaxNode for TerminalRef {
26145    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalRef);
26146    type StablePtr = TerminalRefPtr;
26147    type Green = TerminalRefGreen;
26148    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
26149        TerminalRefGreen(
26150            Arc::new(GreenNode {
26151                kind: SyntaxKind::TerminalRef,
26152                details: GreenNodeDetails::Node {
26153                    children: vec![
26154                        Trivia::missing(db).0,
26155                        TokenRef::missing(db).0,
26156                        Trivia::missing(db).0,
26157                    ],
26158                    width: TextWidth::default(),
26159                },
26160            })
26161            .intern(db),
26162        )
26163    }
26164    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
26165        let kind = node.kind(db);
26166        assert_eq!(
26167            kind,
26168            SyntaxKind::TerminalRef,
26169            "Unexpected SyntaxKind {:?}. Expected {:?}.",
26170            kind,
26171            SyntaxKind::TerminalRef
26172        );
26173        let children = db.get_children(node.clone());
26174        Self { node, children }
26175    }
26176    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
26177        let kind = node.kind(db);
26178        if kind == SyntaxKind::TerminalRef { Some(Self::from_syntax_node(db, node)) } else { None }
26179    }
26180    fn as_syntax_node(&self) -> SyntaxNode {
26181        self.node.clone()
26182    }
26183    fn stable_ptr(&self) -> Self::StablePtr {
26184        TerminalRefPtr(self.node.0.stable_ptr)
26185    }
26186}
26187impl From<&TerminalRef> for SyntaxStablePtrId {
26188    fn from(node: &TerminalRef) -> Self {
26189        node.stable_ptr().untyped()
26190    }
26191}
26192#[derive(Clone, Debug, Eq, Hash, PartialEq)]
26193pub struct TokenContinue {
26194    node: SyntaxNode,
26195}
26196impl Token for TokenContinue {
26197    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
26198        TokenContinueGreen(
26199            Arc::new(GreenNode {
26200                kind: SyntaxKind::TokenContinue,
26201                details: GreenNodeDetails::Token(text),
26202            })
26203            .intern(db),
26204        )
26205    }
26206    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
26207        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
26208            .clone()
26209    }
26210}
26211#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
26212pub struct TokenContinuePtr(pub SyntaxStablePtrId);
26213impl TypedStablePtr for TokenContinuePtr {
26214    type SyntaxNode = TokenContinue;
26215    fn untyped(&self) -> SyntaxStablePtrId {
26216        self.0
26217    }
26218    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenContinue {
26219        TokenContinue::from_syntax_node(db, self.0.lookup(db))
26220    }
26221}
26222impl From<TokenContinuePtr> for SyntaxStablePtrId {
26223    fn from(ptr: TokenContinuePtr) -> Self {
26224        ptr.untyped()
26225    }
26226}
26227#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
26228pub struct TokenContinueGreen(pub GreenId);
26229impl TokenContinueGreen {
26230    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
26231        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
26232    }
26233}
26234impl TypedSyntaxNode for TokenContinue {
26235    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenContinue);
26236    type StablePtr = TokenContinuePtr;
26237    type Green = TokenContinueGreen;
26238    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
26239        TokenContinueGreen(
26240            Arc::new(GreenNode {
26241                kind: SyntaxKind::TokenMissing,
26242                details: GreenNodeDetails::Token("".into()),
26243            })
26244            .intern(db),
26245        )
26246    }
26247    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
26248        match node.0.green.lookup_intern(db).details {
26249            GreenNodeDetails::Token(_) => Self { node },
26250            GreenNodeDetails::Node { .. } => {
26251                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenContinue)
26252            }
26253        }
26254    }
26255    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
26256        match node.0.green.lookup_intern(db).details {
26257            GreenNodeDetails::Token(_) => Some(Self { node }),
26258            GreenNodeDetails::Node { .. } => None,
26259        }
26260    }
26261    fn as_syntax_node(&self) -> SyntaxNode {
26262        self.node.clone()
26263    }
26264    fn stable_ptr(&self) -> Self::StablePtr {
26265        TokenContinuePtr(self.node.0.stable_ptr)
26266    }
26267}
26268impl From<&TokenContinue> for SyntaxStablePtrId {
26269    fn from(node: &TokenContinue) -> Self {
26270        node.stable_ptr().untyped()
26271    }
26272}
26273#[derive(Clone, Debug, Eq, Hash, PartialEq)]
26274pub struct TerminalContinue {
26275    node: SyntaxNode,
26276    children: Arc<[SyntaxNode]>,
26277}
26278impl Terminal for TerminalContinue {
26279    const KIND: SyntaxKind = SyntaxKind::TerminalContinue;
26280    type TokenType = TokenContinue;
26281    fn new_green(
26282        db: &dyn SyntaxGroup,
26283        leading_trivia: TriviaGreen,
26284        token: <<TerminalContinue as Terminal>::TokenType as TypedSyntaxNode>::Green,
26285        trailing_trivia: TriviaGreen,
26286    ) -> Self::Green {
26287        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
26288        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
26289        TerminalContinueGreen(
26290            Arc::new(GreenNode {
26291                kind: SyntaxKind::TerminalContinue,
26292                details: GreenNodeDetails::Node { children, width },
26293            })
26294            .intern(db),
26295        )
26296    }
26297    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
26298        self.token(db).text(db)
26299    }
26300}
26301impl TerminalContinue {
26302    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
26303        Trivia::from_syntax_node(db, self.children[0].clone())
26304    }
26305    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenContinue {
26306        TokenContinue::from_syntax_node(db, self.children[1].clone())
26307    }
26308    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
26309        Trivia::from_syntax_node(db, self.children[2].clone())
26310    }
26311}
26312#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
26313pub struct TerminalContinuePtr(pub SyntaxStablePtrId);
26314impl TerminalContinuePtr {}
26315impl TypedStablePtr for TerminalContinuePtr {
26316    type SyntaxNode = TerminalContinue;
26317    fn untyped(&self) -> SyntaxStablePtrId {
26318        self.0
26319    }
26320    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalContinue {
26321        TerminalContinue::from_syntax_node(db, self.0.lookup(db))
26322    }
26323}
26324impl From<TerminalContinuePtr> for SyntaxStablePtrId {
26325    fn from(ptr: TerminalContinuePtr) -> Self {
26326        ptr.untyped()
26327    }
26328}
26329#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
26330pub struct TerminalContinueGreen(pub GreenId);
26331impl TypedSyntaxNode for TerminalContinue {
26332    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalContinue);
26333    type StablePtr = TerminalContinuePtr;
26334    type Green = TerminalContinueGreen;
26335    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
26336        TerminalContinueGreen(
26337            Arc::new(GreenNode {
26338                kind: SyntaxKind::TerminalContinue,
26339                details: GreenNodeDetails::Node {
26340                    children: vec![
26341                        Trivia::missing(db).0,
26342                        TokenContinue::missing(db).0,
26343                        Trivia::missing(db).0,
26344                    ],
26345                    width: TextWidth::default(),
26346                },
26347            })
26348            .intern(db),
26349        )
26350    }
26351    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
26352        let kind = node.kind(db);
26353        assert_eq!(
26354            kind,
26355            SyntaxKind::TerminalContinue,
26356            "Unexpected SyntaxKind {:?}. Expected {:?}.",
26357            kind,
26358            SyntaxKind::TerminalContinue
26359        );
26360        let children = db.get_children(node.clone());
26361        Self { node, children }
26362    }
26363    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
26364        let kind = node.kind(db);
26365        if kind == SyntaxKind::TerminalContinue {
26366            Some(Self::from_syntax_node(db, node))
26367        } else {
26368            None
26369        }
26370    }
26371    fn as_syntax_node(&self) -> SyntaxNode {
26372        self.node.clone()
26373    }
26374    fn stable_ptr(&self) -> Self::StablePtr {
26375        TerminalContinuePtr(self.node.0.stable_ptr)
26376    }
26377}
26378impl From<&TerminalContinue> for SyntaxStablePtrId {
26379    fn from(node: &TerminalContinue) -> Self {
26380        node.stable_ptr().untyped()
26381    }
26382}
26383#[derive(Clone, Debug, Eq, Hash, PartialEq)]
26384pub struct TokenReturn {
26385    node: SyntaxNode,
26386}
26387impl Token for TokenReturn {
26388    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
26389        TokenReturnGreen(
26390            Arc::new(GreenNode {
26391                kind: SyntaxKind::TokenReturn,
26392                details: GreenNodeDetails::Token(text),
26393            })
26394            .intern(db),
26395        )
26396    }
26397    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
26398        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
26399            .clone()
26400    }
26401}
26402#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
26403pub struct TokenReturnPtr(pub SyntaxStablePtrId);
26404impl TypedStablePtr for TokenReturnPtr {
26405    type SyntaxNode = TokenReturn;
26406    fn untyped(&self) -> SyntaxStablePtrId {
26407        self.0
26408    }
26409    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenReturn {
26410        TokenReturn::from_syntax_node(db, self.0.lookup(db))
26411    }
26412}
26413impl From<TokenReturnPtr> for SyntaxStablePtrId {
26414    fn from(ptr: TokenReturnPtr) -> Self {
26415        ptr.untyped()
26416    }
26417}
26418#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
26419pub struct TokenReturnGreen(pub GreenId);
26420impl TokenReturnGreen {
26421    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
26422        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
26423    }
26424}
26425impl TypedSyntaxNode for TokenReturn {
26426    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenReturn);
26427    type StablePtr = TokenReturnPtr;
26428    type Green = TokenReturnGreen;
26429    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
26430        TokenReturnGreen(
26431            Arc::new(GreenNode {
26432                kind: SyntaxKind::TokenMissing,
26433                details: GreenNodeDetails::Token("".into()),
26434            })
26435            .intern(db),
26436        )
26437    }
26438    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
26439        match node.0.green.lookup_intern(db).details {
26440            GreenNodeDetails::Token(_) => Self { node },
26441            GreenNodeDetails::Node { .. } => {
26442                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenReturn)
26443            }
26444        }
26445    }
26446    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
26447        match node.0.green.lookup_intern(db).details {
26448            GreenNodeDetails::Token(_) => Some(Self { node }),
26449            GreenNodeDetails::Node { .. } => None,
26450        }
26451    }
26452    fn as_syntax_node(&self) -> SyntaxNode {
26453        self.node.clone()
26454    }
26455    fn stable_ptr(&self) -> Self::StablePtr {
26456        TokenReturnPtr(self.node.0.stable_ptr)
26457    }
26458}
26459impl From<&TokenReturn> for SyntaxStablePtrId {
26460    fn from(node: &TokenReturn) -> Self {
26461        node.stable_ptr().untyped()
26462    }
26463}
26464#[derive(Clone, Debug, Eq, Hash, PartialEq)]
26465pub struct TerminalReturn {
26466    node: SyntaxNode,
26467    children: Arc<[SyntaxNode]>,
26468}
26469impl Terminal for TerminalReturn {
26470    const KIND: SyntaxKind = SyntaxKind::TerminalReturn;
26471    type TokenType = TokenReturn;
26472    fn new_green(
26473        db: &dyn SyntaxGroup,
26474        leading_trivia: TriviaGreen,
26475        token: <<TerminalReturn as Terminal>::TokenType as TypedSyntaxNode>::Green,
26476        trailing_trivia: TriviaGreen,
26477    ) -> Self::Green {
26478        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
26479        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
26480        TerminalReturnGreen(
26481            Arc::new(GreenNode {
26482                kind: SyntaxKind::TerminalReturn,
26483                details: GreenNodeDetails::Node { children, width },
26484            })
26485            .intern(db),
26486        )
26487    }
26488    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
26489        self.token(db).text(db)
26490    }
26491}
26492impl TerminalReturn {
26493    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
26494        Trivia::from_syntax_node(db, self.children[0].clone())
26495    }
26496    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenReturn {
26497        TokenReturn::from_syntax_node(db, self.children[1].clone())
26498    }
26499    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
26500        Trivia::from_syntax_node(db, self.children[2].clone())
26501    }
26502}
26503#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
26504pub struct TerminalReturnPtr(pub SyntaxStablePtrId);
26505impl TerminalReturnPtr {}
26506impl TypedStablePtr for TerminalReturnPtr {
26507    type SyntaxNode = TerminalReturn;
26508    fn untyped(&self) -> SyntaxStablePtrId {
26509        self.0
26510    }
26511    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalReturn {
26512        TerminalReturn::from_syntax_node(db, self.0.lookup(db))
26513    }
26514}
26515impl From<TerminalReturnPtr> for SyntaxStablePtrId {
26516    fn from(ptr: TerminalReturnPtr) -> Self {
26517        ptr.untyped()
26518    }
26519}
26520#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
26521pub struct TerminalReturnGreen(pub GreenId);
26522impl TypedSyntaxNode for TerminalReturn {
26523    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalReturn);
26524    type StablePtr = TerminalReturnPtr;
26525    type Green = TerminalReturnGreen;
26526    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
26527        TerminalReturnGreen(
26528            Arc::new(GreenNode {
26529                kind: SyntaxKind::TerminalReturn,
26530                details: GreenNodeDetails::Node {
26531                    children: vec![
26532                        Trivia::missing(db).0,
26533                        TokenReturn::missing(db).0,
26534                        Trivia::missing(db).0,
26535                    ],
26536                    width: TextWidth::default(),
26537                },
26538            })
26539            .intern(db),
26540        )
26541    }
26542    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
26543        let kind = node.kind(db);
26544        assert_eq!(
26545            kind,
26546            SyntaxKind::TerminalReturn,
26547            "Unexpected SyntaxKind {:?}. Expected {:?}.",
26548            kind,
26549            SyntaxKind::TerminalReturn
26550        );
26551        let children = db.get_children(node.clone());
26552        Self { node, children }
26553    }
26554    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
26555        let kind = node.kind(db);
26556        if kind == SyntaxKind::TerminalReturn {
26557            Some(Self::from_syntax_node(db, node))
26558        } else {
26559            None
26560        }
26561    }
26562    fn as_syntax_node(&self) -> SyntaxNode {
26563        self.node.clone()
26564    }
26565    fn stable_ptr(&self) -> Self::StablePtr {
26566        TerminalReturnPtr(self.node.0.stable_ptr)
26567    }
26568}
26569impl From<&TerminalReturn> for SyntaxStablePtrId {
26570    fn from(node: &TerminalReturn) -> Self {
26571        node.stable_ptr().untyped()
26572    }
26573}
26574#[derive(Clone, Debug, Eq, Hash, PartialEq)]
26575pub struct TokenBreak {
26576    node: SyntaxNode,
26577}
26578impl Token for TokenBreak {
26579    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
26580        TokenBreakGreen(
26581            Arc::new(GreenNode {
26582                kind: SyntaxKind::TokenBreak,
26583                details: GreenNodeDetails::Token(text),
26584            })
26585            .intern(db),
26586        )
26587    }
26588    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
26589        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
26590            .clone()
26591    }
26592}
26593#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
26594pub struct TokenBreakPtr(pub SyntaxStablePtrId);
26595impl TypedStablePtr for TokenBreakPtr {
26596    type SyntaxNode = TokenBreak;
26597    fn untyped(&self) -> SyntaxStablePtrId {
26598        self.0
26599    }
26600    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenBreak {
26601        TokenBreak::from_syntax_node(db, self.0.lookup(db))
26602    }
26603}
26604impl From<TokenBreakPtr> for SyntaxStablePtrId {
26605    fn from(ptr: TokenBreakPtr) -> Self {
26606        ptr.untyped()
26607    }
26608}
26609#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
26610pub struct TokenBreakGreen(pub GreenId);
26611impl TokenBreakGreen {
26612    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
26613        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
26614    }
26615}
26616impl TypedSyntaxNode for TokenBreak {
26617    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenBreak);
26618    type StablePtr = TokenBreakPtr;
26619    type Green = TokenBreakGreen;
26620    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
26621        TokenBreakGreen(
26622            Arc::new(GreenNode {
26623                kind: SyntaxKind::TokenMissing,
26624                details: GreenNodeDetails::Token("".into()),
26625            })
26626            .intern(db),
26627        )
26628    }
26629    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
26630        match node.0.green.lookup_intern(db).details {
26631            GreenNodeDetails::Token(_) => Self { node },
26632            GreenNodeDetails::Node { .. } => {
26633                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenBreak)
26634            }
26635        }
26636    }
26637    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
26638        match node.0.green.lookup_intern(db).details {
26639            GreenNodeDetails::Token(_) => Some(Self { node }),
26640            GreenNodeDetails::Node { .. } => None,
26641        }
26642    }
26643    fn as_syntax_node(&self) -> SyntaxNode {
26644        self.node.clone()
26645    }
26646    fn stable_ptr(&self) -> Self::StablePtr {
26647        TokenBreakPtr(self.node.0.stable_ptr)
26648    }
26649}
26650impl From<&TokenBreak> for SyntaxStablePtrId {
26651    fn from(node: &TokenBreak) -> Self {
26652        node.stable_ptr().untyped()
26653    }
26654}
26655#[derive(Clone, Debug, Eq, Hash, PartialEq)]
26656pub struct TerminalBreak {
26657    node: SyntaxNode,
26658    children: Arc<[SyntaxNode]>,
26659}
26660impl Terminal for TerminalBreak {
26661    const KIND: SyntaxKind = SyntaxKind::TerminalBreak;
26662    type TokenType = TokenBreak;
26663    fn new_green(
26664        db: &dyn SyntaxGroup,
26665        leading_trivia: TriviaGreen,
26666        token: <<TerminalBreak as Terminal>::TokenType as TypedSyntaxNode>::Green,
26667        trailing_trivia: TriviaGreen,
26668    ) -> Self::Green {
26669        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
26670        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
26671        TerminalBreakGreen(
26672            Arc::new(GreenNode {
26673                kind: SyntaxKind::TerminalBreak,
26674                details: GreenNodeDetails::Node { children, width },
26675            })
26676            .intern(db),
26677        )
26678    }
26679    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
26680        self.token(db).text(db)
26681    }
26682}
26683impl TerminalBreak {
26684    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
26685        Trivia::from_syntax_node(db, self.children[0].clone())
26686    }
26687    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenBreak {
26688        TokenBreak::from_syntax_node(db, self.children[1].clone())
26689    }
26690    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
26691        Trivia::from_syntax_node(db, self.children[2].clone())
26692    }
26693}
26694#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
26695pub struct TerminalBreakPtr(pub SyntaxStablePtrId);
26696impl TerminalBreakPtr {}
26697impl TypedStablePtr for TerminalBreakPtr {
26698    type SyntaxNode = TerminalBreak;
26699    fn untyped(&self) -> SyntaxStablePtrId {
26700        self.0
26701    }
26702    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalBreak {
26703        TerminalBreak::from_syntax_node(db, self.0.lookup(db))
26704    }
26705}
26706impl From<TerminalBreakPtr> for SyntaxStablePtrId {
26707    fn from(ptr: TerminalBreakPtr) -> Self {
26708        ptr.untyped()
26709    }
26710}
26711#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
26712pub struct TerminalBreakGreen(pub GreenId);
26713impl TypedSyntaxNode for TerminalBreak {
26714    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalBreak);
26715    type StablePtr = TerminalBreakPtr;
26716    type Green = TerminalBreakGreen;
26717    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
26718        TerminalBreakGreen(
26719            Arc::new(GreenNode {
26720                kind: SyntaxKind::TerminalBreak,
26721                details: GreenNodeDetails::Node {
26722                    children: vec![
26723                        Trivia::missing(db).0,
26724                        TokenBreak::missing(db).0,
26725                        Trivia::missing(db).0,
26726                    ],
26727                    width: TextWidth::default(),
26728                },
26729            })
26730            .intern(db),
26731        )
26732    }
26733    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
26734        let kind = node.kind(db);
26735        assert_eq!(
26736            kind,
26737            SyntaxKind::TerminalBreak,
26738            "Unexpected SyntaxKind {:?}. Expected {:?}.",
26739            kind,
26740            SyntaxKind::TerminalBreak
26741        );
26742        let children = db.get_children(node.clone());
26743        Self { node, children }
26744    }
26745    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
26746        let kind = node.kind(db);
26747        if kind == SyntaxKind::TerminalBreak {
26748            Some(Self::from_syntax_node(db, node))
26749        } else {
26750            None
26751        }
26752    }
26753    fn as_syntax_node(&self) -> SyntaxNode {
26754        self.node.clone()
26755    }
26756    fn stable_ptr(&self) -> Self::StablePtr {
26757        TerminalBreakPtr(self.node.0.stable_ptr)
26758    }
26759}
26760impl From<&TerminalBreak> for SyntaxStablePtrId {
26761    fn from(node: &TerminalBreak) -> Self {
26762        node.stable_ptr().untyped()
26763    }
26764}
26765#[derive(Clone, Debug, Eq, Hash, PartialEq)]
26766pub struct TokenStruct {
26767    node: SyntaxNode,
26768}
26769impl Token for TokenStruct {
26770    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
26771        TokenStructGreen(
26772            Arc::new(GreenNode {
26773                kind: SyntaxKind::TokenStruct,
26774                details: GreenNodeDetails::Token(text),
26775            })
26776            .intern(db),
26777        )
26778    }
26779    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
26780        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
26781            .clone()
26782    }
26783}
26784#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
26785pub struct TokenStructPtr(pub SyntaxStablePtrId);
26786impl TypedStablePtr for TokenStructPtr {
26787    type SyntaxNode = TokenStruct;
26788    fn untyped(&self) -> SyntaxStablePtrId {
26789        self.0
26790    }
26791    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenStruct {
26792        TokenStruct::from_syntax_node(db, self.0.lookup(db))
26793    }
26794}
26795impl From<TokenStructPtr> for SyntaxStablePtrId {
26796    fn from(ptr: TokenStructPtr) -> Self {
26797        ptr.untyped()
26798    }
26799}
26800#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
26801pub struct TokenStructGreen(pub GreenId);
26802impl TokenStructGreen {
26803    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
26804        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
26805    }
26806}
26807impl TypedSyntaxNode for TokenStruct {
26808    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenStruct);
26809    type StablePtr = TokenStructPtr;
26810    type Green = TokenStructGreen;
26811    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
26812        TokenStructGreen(
26813            Arc::new(GreenNode {
26814                kind: SyntaxKind::TokenMissing,
26815                details: GreenNodeDetails::Token("".into()),
26816            })
26817            .intern(db),
26818        )
26819    }
26820    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
26821        match node.0.green.lookup_intern(db).details {
26822            GreenNodeDetails::Token(_) => Self { node },
26823            GreenNodeDetails::Node { .. } => {
26824                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenStruct)
26825            }
26826        }
26827    }
26828    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
26829        match node.0.green.lookup_intern(db).details {
26830            GreenNodeDetails::Token(_) => Some(Self { node }),
26831            GreenNodeDetails::Node { .. } => None,
26832        }
26833    }
26834    fn as_syntax_node(&self) -> SyntaxNode {
26835        self.node.clone()
26836    }
26837    fn stable_ptr(&self) -> Self::StablePtr {
26838        TokenStructPtr(self.node.0.stable_ptr)
26839    }
26840}
26841impl From<&TokenStruct> for SyntaxStablePtrId {
26842    fn from(node: &TokenStruct) -> Self {
26843        node.stable_ptr().untyped()
26844    }
26845}
26846#[derive(Clone, Debug, Eq, Hash, PartialEq)]
26847pub struct TerminalStruct {
26848    node: SyntaxNode,
26849    children: Arc<[SyntaxNode]>,
26850}
26851impl Terminal for TerminalStruct {
26852    const KIND: SyntaxKind = SyntaxKind::TerminalStruct;
26853    type TokenType = TokenStruct;
26854    fn new_green(
26855        db: &dyn SyntaxGroup,
26856        leading_trivia: TriviaGreen,
26857        token: <<TerminalStruct as Terminal>::TokenType as TypedSyntaxNode>::Green,
26858        trailing_trivia: TriviaGreen,
26859    ) -> Self::Green {
26860        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
26861        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
26862        TerminalStructGreen(
26863            Arc::new(GreenNode {
26864                kind: SyntaxKind::TerminalStruct,
26865                details: GreenNodeDetails::Node { children, width },
26866            })
26867            .intern(db),
26868        )
26869    }
26870    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
26871        self.token(db).text(db)
26872    }
26873}
26874impl TerminalStruct {
26875    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
26876        Trivia::from_syntax_node(db, self.children[0].clone())
26877    }
26878    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenStruct {
26879        TokenStruct::from_syntax_node(db, self.children[1].clone())
26880    }
26881    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
26882        Trivia::from_syntax_node(db, self.children[2].clone())
26883    }
26884}
26885#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
26886pub struct TerminalStructPtr(pub SyntaxStablePtrId);
26887impl TerminalStructPtr {}
26888impl TypedStablePtr for TerminalStructPtr {
26889    type SyntaxNode = TerminalStruct;
26890    fn untyped(&self) -> SyntaxStablePtrId {
26891        self.0
26892    }
26893    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalStruct {
26894        TerminalStruct::from_syntax_node(db, self.0.lookup(db))
26895    }
26896}
26897impl From<TerminalStructPtr> for SyntaxStablePtrId {
26898    fn from(ptr: TerminalStructPtr) -> Self {
26899        ptr.untyped()
26900    }
26901}
26902#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
26903pub struct TerminalStructGreen(pub GreenId);
26904impl TypedSyntaxNode for TerminalStruct {
26905    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalStruct);
26906    type StablePtr = TerminalStructPtr;
26907    type Green = TerminalStructGreen;
26908    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
26909        TerminalStructGreen(
26910            Arc::new(GreenNode {
26911                kind: SyntaxKind::TerminalStruct,
26912                details: GreenNodeDetails::Node {
26913                    children: vec![
26914                        Trivia::missing(db).0,
26915                        TokenStruct::missing(db).0,
26916                        Trivia::missing(db).0,
26917                    ],
26918                    width: TextWidth::default(),
26919                },
26920            })
26921            .intern(db),
26922        )
26923    }
26924    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
26925        let kind = node.kind(db);
26926        assert_eq!(
26927            kind,
26928            SyntaxKind::TerminalStruct,
26929            "Unexpected SyntaxKind {:?}. Expected {:?}.",
26930            kind,
26931            SyntaxKind::TerminalStruct
26932        );
26933        let children = db.get_children(node.clone());
26934        Self { node, children }
26935    }
26936    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
26937        let kind = node.kind(db);
26938        if kind == SyntaxKind::TerminalStruct {
26939            Some(Self::from_syntax_node(db, node))
26940        } else {
26941            None
26942        }
26943    }
26944    fn as_syntax_node(&self) -> SyntaxNode {
26945        self.node.clone()
26946    }
26947    fn stable_ptr(&self) -> Self::StablePtr {
26948        TerminalStructPtr(self.node.0.stable_ptr)
26949    }
26950}
26951impl From<&TerminalStruct> for SyntaxStablePtrId {
26952    fn from(node: &TerminalStruct) -> Self {
26953        node.stable_ptr().untyped()
26954    }
26955}
26956#[derive(Clone, Debug, Eq, Hash, PartialEq)]
26957pub struct TokenTrait {
26958    node: SyntaxNode,
26959}
26960impl Token for TokenTrait {
26961    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
26962        TokenTraitGreen(
26963            Arc::new(GreenNode {
26964                kind: SyntaxKind::TokenTrait,
26965                details: GreenNodeDetails::Token(text),
26966            })
26967            .intern(db),
26968        )
26969    }
26970    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
26971        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
26972            .clone()
26973    }
26974}
26975#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
26976pub struct TokenTraitPtr(pub SyntaxStablePtrId);
26977impl TypedStablePtr for TokenTraitPtr {
26978    type SyntaxNode = TokenTrait;
26979    fn untyped(&self) -> SyntaxStablePtrId {
26980        self.0
26981    }
26982    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenTrait {
26983        TokenTrait::from_syntax_node(db, self.0.lookup(db))
26984    }
26985}
26986impl From<TokenTraitPtr> for SyntaxStablePtrId {
26987    fn from(ptr: TokenTraitPtr) -> Self {
26988        ptr.untyped()
26989    }
26990}
26991#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
26992pub struct TokenTraitGreen(pub GreenId);
26993impl TokenTraitGreen {
26994    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
26995        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
26996    }
26997}
26998impl TypedSyntaxNode for TokenTrait {
26999    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenTrait);
27000    type StablePtr = TokenTraitPtr;
27001    type Green = TokenTraitGreen;
27002    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
27003        TokenTraitGreen(
27004            Arc::new(GreenNode {
27005                kind: SyntaxKind::TokenMissing,
27006                details: GreenNodeDetails::Token("".into()),
27007            })
27008            .intern(db),
27009        )
27010    }
27011    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
27012        match node.0.green.lookup_intern(db).details {
27013            GreenNodeDetails::Token(_) => Self { node },
27014            GreenNodeDetails::Node { .. } => {
27015                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenTrait)
27016            }
27017        }
27018    }
27019    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
27020        match node.0.green.lookup_intern(db).details {
27021            GreenNodeDetails::Token(_) => Some(Self { node }),
27022            GreenNodeDetails::Node { .. } => None,
27023        }
27024    }
27025    fn as_syntax_node(&self) -> SyntaxNode {
27026        self.node.clone()
27027    }
27028    fn stable_ptr(&self) -> Self::StablePtr {
27029        TokenTraitPtr(self.node.0.stable_ptr)
27030    }
27031}
27032impl From<&TokenTrait> for SyntaxStablePtrId {
27033    fn from(node: &TokenTrait) -> Self {
27034        node.stable_ptr().untyped()
27035    }
27036}
27037#[derive(Clone, Debug, Eq, Hash, PartialEq)]
27038pub struct TerminalTrait {
27039    node: SyntaxNode,
27040    children: Arc<[SyntaxNode]>,
27041}
27042impl Terminal for TerminalTrait {
27043    const KIND: SyntaxKind = SyntaxKind::TerminalTrait;
27044    type TokenType = TokenTrait;
27045    fn new_green(
27046        db: &dyn SyntaxGroup,
27047        leading_trivia: TriviaGreen,
27048        token: <<TerminalTrait as Terminal>::TokenType as TypedSyntaxNode>::Green,
27049        trailing_trivia: TriviaGreen,
27050    ) -> Self::Green {
27051        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
27052        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
27053        TerminalTraitGreen(
27054            Arc::new(GreenNode {
27055                kind: SyntaxKind::TerminalTrait,
27056                details: GreenNodeDetails::Node { children, width },
27057            })
27058            .intern(db),
27059        )
27060    }
27061    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
27062        self.token(db).text(db)
27063    }
27064}
27065impl TerminalTrait {
27066    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
27067        Trivia::from_syntax_node(db, self.children[0].clone())
27068    }
27069    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenTrait {
27070        TokenTrait::from_syntax_node(db, self.children[1].clone())
27071    }
27072    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
27073        Trivia::from_syntax_node(db, self.children[2].clone())
27074    }
27075}
27076#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
27077pub struct TerminalTraitPtr(pub SyntaxStablePtrId);
27078impl TerminalTraitPtr {}
27079impl TypedStablePtr for TerminalTraitPtr {
27080    type SyntaxNode = TerminalTrait;
27081    fn untyped(&self) -> SyntaxStablePtrId {
27082        self.0
27083    }
27084    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalTrait {
27085        TerminalTrait::from_syntax_node(db, self.0.lookup(db))
27086    }
27087}
27088impl From<TerminalTraitPtr> for SyntaxStablePtrId {
27089    fn from(ptr: TerminalTraitPtr) -> Self {
27090        ptr.untyped()
27091    }
27092}
27093#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
27094pub struct TerminalTraitGreen(pub GreenId);
27095impl TypedSyntaxNode for TerminalTrait {
27096    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalTrait);
27097    type StablePtr = TerminalTraitPtr;
27098    type Green = TerminalTraitGreen;
27099    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
27100        TerminalTraitGreen(
27101            Arc::new(GreenNode {
27102                kind: SyntaxKind::TerminalTrait,
27103                details: GreenNodeDetails::Node {
27104                    children: vec![
27105                        Trivia::missing(db).0,
27106                        TokenTrait::missing(db).0,
27107                        Trivia::missing(db).0,
27108                    ],
27109                    width: TextWidth::default(),
27110                },
27111            })
27112            .intern(db),
27113        )
27114    }
27115    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
27116        let kind = node.kind(db);
27117        assert_eq!(
27118            kind,
27119            SyntaxKind::TerminalTrait,
27120            "Unexpected SyntaxKind {:?}. Expected {:?}.",
27121            kind,
27122            SyntaxKind::TerminalTrait
27123        );
27124        let children = db.get_children(node.clone());
27125        Self { node, children }
27126    }
27127    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
27128        let kind = node.kind(db);
27129        if kind == SyntaxKind::TerminalTrait {
27130            Some(Self::from_syntax_node(db, node))
27131        } else {
27132            None
27133        }
27134    }
27135    fn as_syntax_node(&self) -> SyntaxNode {
27136        self.node.clone()
27137    }
27138    fn stable_ptr(&self) -> Self::StablePtr {
27139        TerminalTraitPtr(self.node.0.stable_ptr)
27140    }
27141}
27142impl From<&TerminalTrait> for SyntaxStablePtrId {
27143    fn from(node: &TerminalTrait) -> Self {
27144        node.stable_ptr().untyped()
27145    }
27146}
27147#[derive(Clone, Debug, Eq, Hash, PartialEq)]
27148pub struct TokenTrue {
27149    node: SyntaxNode,
27150}
27151impl Token for TokenTrue {
27152    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
27153        TokenTrueGreen(
27154            Arc::new(GreenNode {
27155                kind: SyntaxKind::TokenTrue,
27156                details: GreenNodeDetails::Token(text),
27157            })
27158            .intern(db),
27159        )
27160    }
27161    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
27162        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
27163            .clone()
27164    }
27165}
27166#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
27167pub struct TokenTruePtr(pub SyntaxStablePtrId);
27168impl TypedStablePtr for TokenTruePtr {
27169    type SyntaxNode = TokenTrue;
27170    fn untyped(&self) -> SyntaxStablePtrId {
27171        self.0
27172    }
27173    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenTrue {
27174        TokenTrue::from_syntax_node(db, self.0.lookup(db))
27175    }
27176}
27177impl From<TokenTruePtr> for SyntaxStablePtrId {
27178    fn from(ptr: TokenTruePtr) -> Self {
27179        ptr.untyped()
27180    }
27181}
27182#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
27183pub struct TokenTrueGreen(pub GreenId);
27184impl TokenTrueGreen {
27185    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
27186        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
27187    }
27188}
27189impl TypedSyntaxNode for TokenTrue {
27190    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenTrue);
27191    type StablePtr = TokenTruePtr;
27192    type Green = TokenTrueGreen;
27193    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
27194        TokenTrueGreen(
27195            Arc::new(GreenNode {
27196                kind: SyntaxKind::TokenMissing,
27197                details: GreenNodeDetails::Token("".into()),
27198            })
27199            .intern(db),
27200        )
27201    }
27202    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
27203        match node.0.green.lookup_intern(db).details {
27204            GreenNodeDetails::Token(_) => Self { node },
27205            GreenNodeDetails::Node { .. } => {
27206                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenTrue)
27207            }
27208        }
27209    }
27210    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
27211        match node.0.green.lookup_intern(db).details {
27212            GreenNodeDetails::Token(_) => Some(Self { node }),
27213            GreenNodeDetails::Node { .. } => None,
27214        }
27215    }
27216    fn as_syntax_node(&self) -> SyntaxNode {
27217        self.node.clone()
27218    }
27219    fn stable_ptr(&self) -> Self::StablePtr {
27220        TokenTruePtr(self.node.0.stable_ptr)
27221    }
27222}
27223impl From<&TokenTrue> for SyntaxStablePtrId {
27224    fn from(node: &TokenTrue) -> Self {
27225        node.stable_ptr().untyped()
27226    }
27227}
27228#[derive(Clone, Debug, Eq, Hash, PartialEq)]
27229pub struct TerminalTrue {
27230    node: SyntaxNode,
27231    children: Arc<[SyntaxNode]>,
27232}
27233impl Terminal for TerminalTrue {
27234    const KIND: SyntaxKind = SyntaxKind::TerminalTrue;
27235    type TokenType = TokenTrue;
27236    fn new_green(
27237        db: &dyn SyntaxGroup,
27238        leading_trivia: TriviaGreen,
27239        token: <<TerminalTrue as Terminal>::TokenType as TypedSyntaxNode>::Green,
27240        trailing_trivia: TriviaGreen,
27241    ) -> Self::Green {
27242        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
27243        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
27244        TerminalTrueGreen(
27245            Arc::new(GreenNode {
27246                kind: SyntaxKind::TerminalTrue,
27247                details: GreenNodeDetails::Node { children, width },
27248            })
27249            .intern(db),
27250        )
27251    }
27252    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
27253        self.token(db).text(db)
27254    }
27255}
27256impl TerminalTrue {
27257    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
27258        Trivia::from_syntax_node(db, self.children[0].clone())
27259    }
27260    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenTrue {
27261        TokenTrue::from_syntax_node(db, self.children[1].clone())
27262    }
27263    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
27264        Trivia::from_syntax_node(db, self.children[2].clone())
27265    }
27266}
27267#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
27268pub struct TerminalTruePtr(pub SyntaxStablePtrId);
27269impl TerminalTruePtr {}
27270impl TypedStablePtr for TerminalTruePtr {
27271    type SyntaxNode = TerminalTrue;
27272    fn untyped(&self) -> SyntaxStablePtrId {
27273        self.0
27274    }
27275    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalTrue {
27276        TerminalTrue::from_syntax_node(db, self.0.lookup(db))
27277    }
27278}
27279impl From<TerminalTruePtr> for SyntaxStablePtrId {
27280    fn from(ptr: TerminalTruePtr) -> Self {
27281        ptr.untyped()
27282    }
27283}
27284#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
27285pub struct TerminalTrueGreen(pub GreenId);
27286impl TypedSyntaxNode for TerminalTrue {
27287    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalTrue);
27288    type StablePtr = TerminalTruePtr;
27289    type Green = TerminalTrueGreen;
27290    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
27291        TerminalTrueGreen(
27292            Arc::new(GreenNode {
27293                kind: SyntaxKind::TerminalTrue,
27294                details: GreenNodeDetails::Node {
27295                    children: vec![
27296                        Trivia::missing(db).0,
27297                        TokenTrue::missing(db).0,
27298                        Trivia::missing(db).0,
27299                    ],
27300                    width: TextWidth::default(),
27301                },
27302            })
27303            .intern(db),
27304        )
27305    }
27306    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
27307        let kind = node.kind(db);
27308        assert_eq!(
27309            kind,
27310            SyntaxKind::TerminalTrue,
27311            "Unexpected SyntaxKind {:?}. Expected {:?}.",
27312            kind,
27313            SyntaxKind::TerminalTrue
27314        );
27315        let children = db.get_children(node.clone());
27316        Self { node, children }
27317    }
27318    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
27319        let kind = node.kind(db);
27320        if kind == SyntaxKind::TerminalTrue { Some(Self::from_syntax_node(db, node)) } else { None }
27321    }
27322    fn as_syntax_node(&self) -> SyntaxNode {
27323        self.node.clone()
27324    }
27325    fn stable_ptr(&self) -> Self::StablePtr {
27326        TerminalTruePtr(self.node.0.stable_ptr)
27327    }
27328}
27329impl From<&TerminalTrue> for SyntaxStablePtrId {
27330    fn from(node: &TerminalTrue) -> Self {
27331        node.stable_ptr().untyped()
27332    }
27333}
27334#[derive(Clone, Debug, Eq, Hash, PartialEq)]
27335pub struct TokenType {
27336    node: SyntaxNode,
27337}
27338impl Token for TokenType {
27339    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
27340        TokenTypeGreen(
27341            Arc::new(GreenNode {
27342                kind: SyntaxKind::TokenType,
27343                details: GreenNodeDetails::Token(text),
27344            })
27345            .intern(db),
27346        )
27347    }
27348    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
27349        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
27350            .clone()
27351    }
27352}
27353#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
27354pub struct TokenTypePtr(pub SyntaxStablePtrId);
27355impl TypedStablePtr for TokenTypePtr {
27356    type SyntaxNode = TokenType;
27357    fn untyped(&self) -> SyntaxStablePtrId {
27358        self.0
27359    }
27360    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenType {
27361        TokenType::from_syntax_node(db, self.0.lookup(db))
27362    }
27363}
27364impl From<TokenTypePtr> for SyntaxStablePtrId {
27365    fn from(ptr: TokenTypePtr) -> Self {
27366        ptr.untyped()
27367    }
27368}
27369#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
27370pub struct TokenTypeGreen(pub GreenId);
27371impl TokenTypeGreen {
27372    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
27373        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
27374    }
27375}
27376impl TypedSyntaxNode for TokenType {
27377    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenType);
27378    type StablePtr = TokenTypePtr;
27379    type Green = TokenTypeGreen;
27380    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
27381        TokenTypeGreen(
27382            Arc::new(GreenNode {
27383                kind: SyntaxKind::TokenMissing,
27384                details: GreenNodeDetails::Token("".into()),
27385            })
27386            .intern(db),
27387        )
27388    }
27389    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
27390        match node.0.green.lookup_intern(db).details {
27391            GreenNodeDetails::Token(_) => Self { node },
27392            GreenNodeDetails::Node { .. } => {
27393                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenType)
27394            }
27395        }
27396    }
27397    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
27398        match node.0.green.lookup_intern(db).details {
27399            GreenNodeDetails::Token(_) => Some(Self { node }),
27400            GreenNodeDetails::Node { .. } => None,
27401        }
27402    }
27403    fn as_syntax_node(&self) -> SyntaxNode {
27404        self.node.clone()
27405    }
27406    fn stable_ptr(&self) -> Self::StablePtr {
27407        TokenTypePtr(self.node.0.stable_ptr)
27408    }
27409}
27410impl From<&TokenType> for SyntaxStablePtrId {
27411    fn from(node: &TokenType) -> Self {
27412        node.stable_ptr().untyped()
27413    }
27414}
27415#[derive(Clone, Debug, Eq, Hash, PartialEq)]
27416pub struct TerminalType {
27417    node: SyntaxNode,
27418    children: Arc<[SyntaxNode]>,
27419}
27420impl Terminal for TerminalType {
27421    const KIND: SyntaxKind = SyntaxKind::TerminalType;
27422    type TokenType = TokenType;
27423    fn new_green(
27424        db: &dyn SyntaxGroup,
27425        leading_trivia: TriviaGreen,
27426        token: <<TerminalType as Terminal>::TokenType as TypedSyntaxNode>::Green,
27427        trailing_trivia: TriviaGreen,
27428    ) -> Self::Green {
27429        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
27430        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
27431        TerminalTypeGreen(
27432            Arc::new(GreenNode {
27433                kind: SyntaxKind::TerminalType,
27434                details: GreenNodeDetails::Node { children, width },
27435            })
27436            .intern(db),
27437        )
27438    }
27439    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
27440        self.token(db).text(db)
27441    }
27442}
27443impl TerminalType {
27444    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
27445        Trivia::from_syntax_node(db, self.children[0].clone())
27446    }
27447    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenType {
27448        TokenType::from_syntax_node(db, self.children[1].clone())
27449    }
27450    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
27451        Trivia::from_syntax_node(db, self.children[2].clone())
27452    }
27453}
27454#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
27455pub struct TerminalTypePtr(pub SyntaxStablePtrId);
27456impl TerminalTypePtr {}
27457impl TypedStablePtr for TerminalTypePtr {
27458    type SyntaxNode = TerminalType;
27459    fn untyped(&self) -> SyntaxStablePtrId {
27460        self.0
27461    }
27462    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalType {
27463        TerminalType::from_syntax_node(db, self.0.lookup(db))
27464    }
27465}
27466impl From<TerminalTypePtr> for SyntaxStablePtrId {
27467    fn from(ptr: TerminalTypePtr) -> Self {
27468        ptr.untyped()
27469    }
27470}
27471#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
27472pub struct TerminalTypeGreen(pub GreenId);
27473impl TypedSyntaxNode for TerminalType {
27474    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalType);
27475    type StablePtr = TerminalTypePtr;
27476    type Green = TerminalTypeGreen;
27477    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
27478        TerminalTypeGreen(
27479            Arc::new(GreenNode {
27480                kind: SyntaxKind::TerminalType,
27481                details: GreenNodeDetails::Node {
27482                    children: vec![
27483                        Trivia::missing(db).0,
27484                        TokenType::missing(db).0,
27485                        Trivia::missing(db).0,
27486                    ],
27487                    width: TextWidth::default(),
27488                },
27489            })
27490            .intern(db),
27491        )
27492    }
27493    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
27494        let kind = node.kind(db);
27495        assert_eq!(
27496            kind,
27497            SyntaxKind::TerminalType,
27498            "Unexpected SyntaxKind {:?}. Expected {:?}.",
27499            kind,
27500            SyntaxKind::TerminalType
27501        );
27502        let children = db.get_children(node.clone());
27503        Self { node, children }
27504    }
27505    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
27506        let kind = node.kind(db);
27507        if kind == SyntaxKind::TerminalType { Some(Self::from_syntax_node(db, node)) } else { None }
27508    }
27509    fn as_syntax_node(&self) -> SyntaxNode {
27510        self.node.clone()
27511    }
27512    fn stable_ptr(&self) -> Self::StablePtr {
27513        TerminalTypePtr(self.node.0.stable_ptr)
27514    }
27515}
27516impl From<&TerminalType> for SyntaxStablePtrId {
27517    fn from(node: &TerminalType) -> Self {
27518        node.stable_ptr().untyped()
27519    }
27520}
27521#[derive(Clone, Debug, Eq, Hash, PartialEq)]
27522pub struct TokenUse {
27523    node: SyntaxNode,
27524}
27525impl Token for TokenUse {
27526    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
27527        TokenUseGreen(
27528            Arc::new(GreenNode {
27529                kind: SyntaxKind::TokenUse,
27530                details: GreenNodeDetails::Token(text),
27531            })
27532            .intern(db),
27533        )
27534    }
27535    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
27536        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
27537            .clone()
27538    }
27539}
27540#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
27541pub struct TokenUsePtr(pub SyntaxStablePtrId);
27542impl TypedStablePtr for TokenUsePtr {
27543    type SyntaxNode = TokenUse;
27544    fn untyped(&self) -> SyntaxStablePtrId {
27545        self.0
27546    }
27547    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenUse {
27548        TokenUse::from_syntax_node(db, self.0.lookup(db))
27549    }
27550}
27551impl From<TokenUsePtr> for SyntaxStablePtrId {
27552    fn from(ptr: TokenUsePtr) -> Self {
27553        ptr.untyped()
27554    }
27555}
27556#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
27557pub struct TokenUseGreen(pub GreenId);
27558impl TokenUseGreen {
27559    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
27560        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
27561    }
27562}
27563impl TypedSyntaxNode for TokenUse {
27564    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenUse);
27565    type StablePtr = TokenUsePtr;
27566    type Green = TokenUseGreen;
27567    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
27568        TokenUseGreen(
27569            Arc::new(GreenNode {
27570                kind: SyntaxKind::TokenMissing,
27571                details: GreenNodeDetails::Token("".into()),
27572            })
27573            .intern(db),
27574        )
27575    }
27576    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
27577        match node.0.green.lookup_intern(db).details {
27578            GreenNodeDetails::Token(_) => Self { node },
27579            GreenNodeDetails::Node { .. } => {
27580                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenUse)
27581            }
27582        }
27583    }
27584    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
27585        match node.0.green.lookup_intern(db).details {
27586            GreenNodeDetails::Token(_) => Some(Self { node }),
27587            GreenNodeDetails::Node { .. } => None,
27588        }
27589    }
27590    fn as_syntax_node(&self) -> SyntaxNode {
27591        self.node.clone()
27592    }
27593    fn stable_ptr(&self) -> Self::StablePtr {
27594        TokenUsePtr(self.node.0.stable_ptr)
27595    }
27596}
27597impl From<&TokenUse> for SyntaxStablePtrId {
27598    fn from(node: &TokenUse) -> Self {
27599        node.stable_ptr().untyped()
27600    }
27601}
27602#[derive(Clone, Debug, Eq, Hash, PartialEq)]
27603pub struct TerminalUse {
27604    node: SyntaxNode,
27605    children: Arc<[SyntaxNode]>,
27606}
27607impl Terminal for TerminalUse {
27608    const KIND: SyntaxKind = SyntaxKind::TerminalUse;
27609    type TokenType = TokenUse;
27610    fn new_green(
27611        db: &dyn SyntaxGroup,
27612        leading_trivia: TriviaGreen,
27613        token: <<TerminalUse as Terminal>::TokenType as TypedSyntaxNode>::Green,
27614        trailing_trivia: TriviaGreen,
27615    ) -> Self::Green {
27616        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
27617        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
27618        TerminalUseGreen(
27619            Arc::new(GreenNode {
27620                kind: SyntaxKind::TerminalUse,
27621                details: GreenNodeDetails::Node { children, width },
27622            })
27623            .intern(db),
27624        )
27625    }
27626    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
27627        self.token(db).text(db)
27628    }
27629}
27630impl TerminalUse {
27631    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
27632        Trivia::from_syntax_node(db, self.children[0].clone())
27633    }
27634    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenUse {
27635        TokenUse::from_syntax_node(db, self.children[1].clone())
27636    }
27637    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
27638        Trivia::from_syntax_node(db, self.children[2].clone())
27639    }
27640}
27641#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
27642pub struct TerminalUsePtr(pub SyntaxStablePtrId);
27643impl TerminalUsePtr {}
27644impl TypedStablePtr for TerminalUsePtr {
27645    type SyntaxNode = TerminalUse;
27646    fn untyped(&self) -> SyntaxStablePtrId {
27647        self.0
27648    }
27649    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalUse {
27650        TerminalUse::from_syntax_node(db, self.0.lookup(db))
27651    }
27652}
27653impl From<TerminalUsePtr> for SyntaxStablePtrId {
27654    fn from(ptr: TerminalUsePtr) -> Self {
27655        ptr.untyped()
27656    }
27657}
27658#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
27659pub struct TerminalUseGreen(pub GreenId);
27660impl TypedSyntaxNode for TerminalUse {
27661    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalUse);
27662    type StablePtr = TerminalUsePtr;
27663    type Green = TerminalUseGreen;
27664    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
27665        TerminalUseGreen(
27666            Arc::new(GreenNode {
27667                kind: SyntaxKind::TerminalUse,
27668                details: GreenNodeDetails::Node {
27669                    children: vec![
27670                        Trivia::missing(db).0,
27671                        TokenUse::missing(db).0,
27672                        Trivia::missing(db).0,
27673                    ],
27674                    width: TextWidth::default(),
27675                },
27676            })
27677            .intern(db),
27678        )
27679    }
27680    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
27681        let kind = node.kind(db);
27682        assert_eq!(
27683            kind,
27684            SyntaxKind::TerminalUse,
27685            "Unexpected SyntaxKind {:?}. Expected {:?}.",
27686            kind,
27687            SyntaxKind::TerminalUse
27688        );
27689        let children = db.get_children(node.clone());
27690        Self { node, children }
27691    }
27692    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
27693        let kind = node.kind(db);
27694        if kind == SyntaxKind::TerminalUse { Some(Self::from_syntax_node(db, node)) } else { None }
27695    }
27696    fn as_syntax_node(&self) -> SyntaxNode {
27697        self.node.clone()
27698    }
27699    fn stable_ptr(&self) -> Self::StablePtr {
27700        TerminalUsePtr(self.node.0.stable_ptr)
27701    }
27702}
27703impl From<&TerminalUse> for SyntaxStablePtrId {
27704    fn from(node: &TerminalUse) -> Self {
27705        node.stable_ptr().untyped()
27706    }
27707}
27708#[derive(Clone, Debug, Eq, Hash, PartialEq)]
27709pub struct TokenPub {
27710    node: SyntaxNode,
27711}
27712impl Token for TokenPub {
27713    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
27714        TokenPubGreen(
27715            Arc::new(GreenNode {
27716                kind: SyntaxKind::TokenPub,
27717                details: GreenNodeDetails::Token(text),
27718            })
27719            .intern(db),
27720        )
27721    }
27722    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
27723        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
27724            .clone()
27725    }
27726}
27727#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
27728pub struct TokenPubPtr(pub SyntaxStablePtrId);
27729impl TypedStablePtr for TokenPubPtr {
27730    type SyntaxNode = TokenPub;
27731    fn untyped(&self) -> SyntaxStablePtrId {
27732        self.0
27733    }
27734    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenPub {
27735        TokenPub::from_syntax_node(db, self.0.lookup(db))
27736    }
27737}
27738impl From<TokenPubPtr> for SyntaxStablePtrId {
27739    fn from(ptr: TokenPubPtr) -> Self {
27740        ptr.untyped()
27741    }
27742}
27743#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
27744pub struct TokenPubGreen(pub GreenId);
27745impl TokenPubGreen {
27746    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
27747        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
27748    }
27749}
27750impl TypedSyntaxNode for TokenPub {
27751    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenPub);
27752    type StablePtr = TokenPubPtr;
27753    type Green = TokenPubGreen;
27754    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
27755        TokenPubGreen(
27756            Arc::new(GreenNode {
27757                kind: SyntaxKind::TokenMissing,
27758                details: GreenNodeDetails::Token("".into()),
27759            })
27760            .intern(db),
27761        )
27762    }
27763    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
27764        match node.0.green.lookup_intern(db).details {
27765            GreenNodeDetails::Token(_) => Self { node },
27766            GreenNodeDetails::Node { .. } => {
27767                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenPub)
27768            }
27769        }
27770    }
27771    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
27772        match node.0.green.lookup_intern(db).details {
27773            GreenNodeDetails::Token(_) => Some(Self { node }),
27774            GreenNodeDetails::Node { .. } => None,
27775        }
27776    }
27777    fn as_syntax_node(&self) -> SyntaxNode {
27778        self.node.clone()
27779    }
27780    fn stable_ptr(&self) -> Self::StablePtr {
27781        TokenPubPtr(self.node.0.stable_ptr)
27782    }
27783}
27784impl From<&TokenPub> for SyntaxStablePtrId {
27785    fn from(node: &TokenPub) -> Self {
27786        node.stable_ptr().untyped()
27787    }
27788}
27789#[derive(Clone, Debug, Eq, Hash, PartialEq)]
27790pub struct TerminalPub {
27791    node: SyntaxNode,
27792    children: Arc<[SyntaxNode]>,
27793}
27794impl Terminal for TerminalPub {
27795    const KIND: SyntaxKind = SyntaxKind::TerminalPub;
27796    type TokenType = TokenPub;
27797    fn new_green(
27798        db: &dyn SyntaxGroup,
27799        leading_trivia: TriviaGreen,
27800        token: <<TerminalPub as Terminal>::TokenType as TypedSyntaxNode>::Green,
27801        trailing_trivia: TriviaGreen,
27802    ) -> Self::Green {
27803        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
27804        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
27805        TerminalPubGreen(
27806            Arc::new(GreenNode {
27807                kind: SyntaxKind::TerminalPub,
27808                details: GreenNodeDetails::Node { children, width },
27809            })
27810            .intern(db),
27811        )
27812    }
27813    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
27814        self.token(db).text(db)
27815    }
27816}
27817impl TerminalPub {
27818    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
27819        Trivia::from_syntax_node(db, self.children[0].clone())
27820    }
27821    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenPub {
27822        TokenPub::from_syntax_node(db, self.children[1].clone())
27823    }
27824    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
27825        Trivia::from_syntax_node(db, self.children[2].clone())
27826    }
27827}
27828#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
27829pub struct TerminalPubPtr(pub SyntaxStablePtrId);
27830impl TerminalPubPtr {}
27831impl TypedStablePtr for TerminalPubPtr {
27832    type SyntaxNode = TerminalPub;
27833    fn untyped(&self) -> SyntaxStablePtrId {
27834        self.0
27835    }
27836    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalPub {
27837        TerminalPub::from_syntax_node(db, self.0.lookup(db))
27838    }
27839}
27840impl From<TerminalPubPtr> for SyntaxStablePtrId {
27841    fn from(ptr: TerminalPubPtr) -> Self {
27842        ptr.untyped()
27843    }
27844}
27845#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
27846pub struct TerminalPubGreen(pub GreenId);
27847impl TypedSyntaxNode for TerminalPub {
27848    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalPub);
27849    type StablePtr = TerminalPubPtr;
27850    type Green = TerminalPubGreen;
27851    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
27852        TerminalPubGreen(
27853            Arc::new(GreenNode {
27854                kind: SyntaxKind::TerminalPub,
27855                details: GreenNodeDetails::Node {
27856                    children: vec![
27857                        Trivia::missing(db).0,
27858                        TokenPub::missing(db).0,
27859                        Trivia::missing(db).0,
27860                    ],
27861                    width: TextWidth::default(),
27862                },
27863            })
27864            .intern(db),
27865        )
27866    }
27867    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
27868        let kind = node.kind(db);
27869        assert_eq!(
27870            kind,
27871            SyntaxKind::TerminalPub,
27872            "Unexpected SyntaxKind {:?}. Expected {:?}.",
27873            kind,
27874            SyntaxKind::TerminalPub
27875        );
27876        let children = db.get_children(node.clone());
27877        Self { node, children }
27878    }
27879    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
27880        let kind = node.kind(db);
27881        if kind == SyntaxKind::TerminalPub { Some(Self::from_syntax_node(db, node)) } else { None }
27882    }
27883    fn as_syntax_node(&self) -> SyntaxNode {
27884        self.node.clone()
27885    }
27886    fn stable_ptr(&self) -> Self::StablePtr {
27887        TerminalPubPtr(self.node.0.stable_ptr)
27888    }
27889}
27890impl From<&TerminalPub> for SyntaxStablePtrId {
27891    fn from(node: &TerminalPub) -> Self {
27892        node.stable_ptr().untyped()
27893    }
27894}
27895#[derive(Clone, Debug, Eq, Hash, PartialEq)]
27896pub struct TokenAnd {
27897    node: SyntaxNode,
27898}
27899impl Token for TokenAnd {
27900    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
27901        TokenAndGreen(
27902            Arc::new(GreenNode {
27903                kind: SyntaxKind::TokenAnd,
27904                details: GreenNodeDetails::Token(text),
27905            })
27906            .intern(db),
27907        )
27908    }
27909    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
27910        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
27911            .clone()
27912    }
27913}
27914#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
27915pub struct TokenAndPtr(pub SyntaxStablePtrId);
27916impl TypedStablePtr for TokenAndPtr {
27917    type SyntaxNode = TokenAnd;
27918    fn untyped(&self) -> SyntaxStablePtrId {
27919        self.0
27920    }
27921    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenAnd {
27922        TokenAnd::from_syntax_node(db, self.0.lookup(db))
27923    }
27924}
27925impl From<TokenAndPtr> for SyntaxStablePtrId {
27926    fn from(ptr: TokenAndPtr) -> Self {
27927        ptr.untyped()
27928    }
27929}
27930#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
27931pub struct TokenAndGreen(pub GreenId);
27932impl TokenAndGreen {
27933    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
27934        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
27935    }
27936}
27937impl TypedSyntaxNode for TokenAnd {
27938    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenAnd);
27939    type StablePtr = TokenAndPtr;
27940    type Green = TokenAndGreen;
27941    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
27942        TokenAndGreen(
27943            Arc::new(GreenNode {
27944                kind: SyntaxKind::TokenMissing,
27945                details: GreenNodeDetails::Token("".into()),
27946            })
27947            .intern(db),
27948        )
27949    }
27950    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
27951        match node.0.green.lookup_intern(db).details {
27952            GreenNodeDetails::Token(_) => Self { node },
27953            GreenNodeDetails::Node { .. } => {
27954                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenAnd)
27955            }
27956        }
27957    }
27958    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
27959        match node.0.green.lookup_intern(db).details {
27960            GreenNodeDetails::Token(_) => Some(Self { node }),
27961            GreenNodeDetails::Node { .. } => None,
27962        }
27963    }
27964    fn as_syntax_node(&self) -> SyntaxNode {
27965        self.node.clone()
27966    }
27967    fn stable_ptr(&self) -> Self::StablePtr {
27968        TokenAndPtr(self.node.0.stable_ptr)
27969    }
27970}
27971impl From<&TokenAnd> for SyntaxStablePtrId {
27972    fn from(node: &TokenAnd) -> Self {
27973        node.stable_ptr().untyped()
27974    }
27975}
27976#[derive(Clone, Debug, Eq, Hash, PartialEq)]
27977pub struct TerminalAnd {
27978    node: SyntaxNode,
27979    children: Arc<[SyntaxNode]>,
27980}
27981impl Terminal for TerminalAnd {
27982    const KIND: SyntaxKind = SyntaxKind::TerminalAnd;
27983    type TokenType = TokenAnd;
27984    fn new_green(
27985        db: &dyn SyntaxGroup,
27986        leading_trivia: TriviaGreen,
27987        token: <<TerminalAnd as Terminal>::TokenType as TypedSyntaxNode>::Green,
27988        trailing_trivia: TriviaGreen,
27989    ) -> Self::Green {
27990        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
27991        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
27992        TerminalAndGreen(
27993            Arc::new(GreenNode {
27994                kind: SyntaxKind::TerminalAnd,
27995                details: GreenNodeDetails::Node { children, width },
27996            })
27997            .intern(db),
27998        )
27999    }
28000    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
28001        self.token(db).text(db)
28002    }
28003}
28004impl TerminalAnd {
28005    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
28006        Trivia::from_syntax_node(db, self.children[0].clone())
28007    }
28008    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenAnd {
28009        TokenAnd::from_syntax_node(db, self.children[1].clone())
28010    }
28011    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
28012        Trivia::from_syntax_node(db, self.children[2].clone())
28013    }
28014}
28015#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
28016pub struct TerminalAndPtr(pub SyntaxStablePtrId);
28017impl TerminalAndPtr {}
28018impl TypedStablePtr for TerminalAndPtr {
28019    type SyntaxNode = TerminalAnd;
28020    fn untyped(&self) -> SyntaxStablePtrId {
28021        self.0
28022    }
28023    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalAnd {
28024        TerminalAnd::from_syntax_node(db, self.0.lookup(db))
28025    }
28026}
28027impl From<TerminalAndPtr> for SyntaxStablePtrId {
28028    fn from(ptr: TerminalAndPtr) -> Self {
28029        ptr.untyped()
28030    }
28031}
28032#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
28033pub struct TerminalAndGreen(pub GreenId);
28034impl TypedSyntaxNode for TerminalAnd {
28035    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalAnd);
28036    type StablePtr = TerminalAndPtr;
28037    type Green = TerminalAndGreen;
28038    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
28039        TerminalAndGreen(
28040            Arc::new(GreenNode {
28041                kind: SyntaxKind::TerminalAnd,
28042                details: GreenNodeDetails::Node {
28043                    children: vec![
28044                        Trivia::missing(db).0,
28045                        TokenAnd::missing(db).0,
28046                        Trivia::missing(db).0,
28047                    ],
28048                    width: TextWidth::default(),
28049                },
28050            })
28051            .intern(db),
28052        )
28053    }
28054    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
28055        let kind = node.kind(db);
28056        assert_eq!(
28057            kind,
28058            SyntaxKind::TerminalAnd,
28059            "Unexpected SyntaxKind {:?}. Expected {:?}.",
28060            kind,
28061            SyntaxKind::TerminalAnd
28062        );
28063        let children = db.get_children(node.clone());
28064        Self { node, children }
28065    }
28066    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
28067        let kind = node.kind(db);
28068        if kind == SyntaxKind::TerminalAnd { Some(Self::from_syntax_node(db, node)) } else { None }
28069    }
28070    fn as_syntax_node(&self) -> SyntaxNode {
28071        self.node.clone()
28072    }
28073    fn stable_ptr(&self) -> Self::StablePtr {
28074        TerminalAndPtr(self.node.0.stable_ptr)
28075    }
28076}
28077impl From<&TerminalAnd> for SyntaxStablePtrId {
28078    fn from(node: &TerminalAnd) -> Self {
28079        node.stable_ptr().untyped()
28080    }
28081}
28082#[derive(Clone, Debug, Eq, Hash, PartialEq)]
28083pub struct TokenAndAnd {
28084    node: SyntaxNode,
28085}
28086impl Token for TokenAndAnd {
28087    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
28088        TokenAndAndGreen(
28089            Arc::new(GreenNode {
28090                kind: SyntaxKind::TokenAndAnd,
28091                details: GreenNodeDetails::Token(text),
28092            })
28093            .intern(db),
28094        )
28095    }
28096    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
28097        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
28098            .clone()
28099    }
28100}
28101#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
28102pub struct TokenAndAndPtr(pub SyntaxStablePtrId);
28103impl TypedStablePtr for TokenAndAndPtr {
28104    type SyntaxNode = TokenAndAnd;
28105    fn untyped(&self) -> SyntaxStablePtrId {
28106        self.0
28107    }
28108    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenAndAnd {
28109        TokenAndAnd::from_syntax_node(db, self.0.lookup(db))
28110    }
28111}
28112impl From<TokenAndAndPtr> for SyntaxStablePtrId {
28113    fn from(ptr: TokenAndAndPtr) -> Self {
28114        ptr.untyped()
28115    }
28116}
28117#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
28118pub struct TokenAndAndGreen(pub GreenId);
28119impl TokenAndAndGreen {
28120    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
28121        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
28122    }
28123}
28124impl TypedSyntaxNode for TokenAndAnd {
28125    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenAndAnd);
28126    type StablePtr = TokenAndAndPtr;
28127    type Green = TokenAndAndGreen;
28128    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
28129        TokenAndAndGreen(
28130            Arc::new(GreenNode {
28131                kind: SyntaxKind::TokenMissing,
28132                details: GreenNodeDetails::Token("".into()),
28133            })
28134            .intern(db),
28135        )
28136    }
28137    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
28138        match node.0.green.lookup_intern(db).details {
28139            GreenNodeDetails::Token(_) => Self { node },
28140            GreenNodeDetails::Node { .. } => {
28141                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenAndAnd)
28142            }
28143        }
28144    }
28145    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
28146        match node.0.green.lookup_intern(db).details {
28147            GreenNodeDetails::Token(_) => Some(Self { node }),
28148            GreenNodeDetails::Node { .. } => None,
28149        }
28150    }
28151    fn as_syntax_node(&self) -> SyntaxNode {
28152        self.node.clone()
28153    }
28154    fn stable_ptr(&self) -> Self::StablePtr {
28155        TokenAndAndPtr(self.node.0.stable_ptr)
28156    }
28157}
28158impl From<&TokenAndAnd> for SyntaxStablePtrId {
28159    fn from(node: &TokenAndAnd) -> Self {
28160        node.stable_ptr().untyped()
28161    }
28162}
28163#[derive(Clone, Debug, Eq, Hash, PartialEq)]
28164pub struct TerminalAndAnd {
28165    node: SyntaxNode,
28166    children: Arc<[SyntaxNode]>,
28167}
28168impl Terminal for TerminalAndAnd {
28169    const KIND: SyntaxKind = SyntaxKind::TerminalAndAnd;
28170    type TokenType = TokenAndAnd;
28171    fn new_green(
28172        db: &dyn SyntaxGroup,
28173        leading_trivia: TriviaGreen,
28174        token: <<TerminalAndAnd as Terminal>::TokenType as TypedSyntaxNode>::Green,
28175        trailing_trivia: TriviaGreen,
28176    ) -> Self::Green {
28177        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
28178        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
28179        TerminalAndAndGreen(
28180            Arc::new(GreenNode {
28181                kind: SyntaxKind::TerminalAndAnd,
28182                details: GreenNodeDetails::Node { children, width },
28183            })
28184            .intern(db),
28185        )
28186    }
28187    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
28188        self.token(db).text(db)
28189    }
28190}
28191impl TerminalAndAnd {
28192    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
28193        Trivia::from_syntax_node(db, self.children[0].clone())
28194    }
28195    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenAndAnd {
28196        TokenAndAnd::from_syntax_node(db, self.children[1].clone())
28197    }
28198    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
28199        Trivia::from_syntax_node(db, self.children[2].clone())
28200    }
28201}
28202#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
28203pub struct TerminalAndAndPtr(pub SyntaxStablePtrId);
28204impl TerminalAndAndPtr {}
28205impl TypedStablePtr for TerminalAndAndPtr {
28206    type SyntaxNode = TerminalAndAnd;
28207    fn untyped(&self) -> SyntaxStablePtrId {
28208        self.0
28209    }
28210    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalAndAnd {
28211        TerminalAndAnd::from_syntax_node(db, self.0.lookup(db))
28212    }
28213}
28214impl From<TerminalAndAndPtr> for SyntaxStablePtrId {
28215    fn from(ptr: TerminalAndAndPtr) -> Self {
28216        ptr.untyped()
28217    }
28218}
28219#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
28220pub struct TerminalAndAndGreen(pub GreenId);
28221impl TypedSyntaxNode for TerminalAndAnd {
28222    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalAndAnd);
28223    type StablePtr = TerminalAndAndPtr;
28224    type Green = TerminalAndAndGreen;
28225    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
28226        TerminalAndAndGreen(
28227            Arc::new(GreenNode {
28228                kind: SyntaxKind::TerminalAndAnd,
28229                details: GreenNodeDetails::Node {
28230                    children: vec![
28231                        Trivia::missing(db).0,
28232                        TokenAndAnd::missing(db).0,
28233                        Trivia::missing(db).0,
28234                    ],
28235                    width: TextWidth::default(),
28236                },
28237            })
28238            .intern(db),
28239        )
28240    }
28241    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
28242        let kind = node.kind(db);
28243        assert_eq!(
28244            kind,
28245            SyntaxKind::TerminalAndAnd,
28246            "Unexpected SyntaxKind {:?}. Expected {:?}.",
28247            kind,
28248            SyntaxKind::TerminalAndAnd
28249        );
28250        let children = db.get_children(node.clone());
28251        Self { node, children }
28252    }
28253    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
28254        let kind = node.kind(db);
28255        if kind == SyntaxKind::TerminalAndAnd {
28256            Some(Self::from_syntax_node(db, node))
28257        } else {
28258            None
28259        }
28260    }
28261    fn as_syntax_node(&self) -> SyntaxNode {
28262        self.node.clone()
28263    }
28264    fn stable_ptr(&self) -> Self::StablePtr {
28265        TerminalAndAndPtr(self.node.0.stable_ptr)
28266    }
28267}
28268impl From<&TerminalAndAnd> for SyntaxStablePtrId {
28269    fn from(node: &TerminalAndAnd) -> Self {
28270        node.stable_ptr().untyped()
28271    }
28272}
28273#[derive(Clone, Debug, Eq, Hash, PartialEq)]
28274pub struct TokenArrow {
28275    node: SyntaxNode,
28276}
28277impl Token for TokenArrow {
28278    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
28279        TokenArrowGreen(
28280            Arc::new(GreenNode {
28281                kind: SyntaxKind::TokenArrow,
28282                details: GreenNodeDetails::Token(text),
28283            })
28284            .intern(db),
28285        )
28286    }
28287    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
28288        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
28289            .clone()
28290    }
28291}
28292#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
28293pub struct TokenArrowPtr(pub SyntaxStablePtrId);
28294impl TypedStablePtr for TokenArrowPtr {
28295    type SyntaxNode = TokenArrow;
28296    fn untyped(&self) -> SyntaxStablePtrId {
28297        self.0
28298    }
28299    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenArrow {
28300        TokenArrow::from_syntax_node(db, self.0.lookup(db))
28301    }
28302}
28303impl From<TokenArrowPtr> for SyntaxStablePtrId {
28304    fn from(ptr: TokenArrowPtr) -> Self {
28305        ptr.untyped()
28306    }
28307}
28308#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
28309pub struct TokenArrowGreen(pub GreenId);
28310impl TokenArrowGreen {
28311    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
28312        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
28313    }
28314}
28315impl TypedSyntaxNode for TokenArrow {
28316    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenArrow);
28317    type StablePtr = TokenArrowPtr;
28318    type Green = TokenArrowGreen;
28319    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
28320        TokenArrowGreen(
28321            Arc::new(GreenNode {
28322                kind: SyntaxKind::TokenMissing,
28323                details: GreenNodeDetails::Token("".into()),
28324            })
28325            .intern(db),
28326        )
28327    }
28328    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
28329        match node.0.green.lookup_intern(db).details {
28330            GreenNodeDetails::Token(_) => Self { node },
28331            GreenNodeDetails::Node { .. } => {
28332                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenArrow)
28333            }
28334        }
28335    }
28336    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
28337        match node.0.green.lookup_intern(db).details {
28338            GreenNodeDetails::Token(_) => Some(Self { node }),
28339            GreenNodeDetails::Node { .. } => None,
28340        }
28341    }
28342    fn as_syntax_node(&self) -> SyntaxNode {
28343        self.node.clone()
28344    }
28345    fn stable_ptr(&self) -> Self::StablePtr {
28346        TokenArrowPtr(self.node.0.stable_ptr)
28347    }
28348}
28349impl From<&TokenArrow> for SyntaxStablePtrId {
28350    fn from(node: &TokenArrow) -> Self {
28351        node.stable_ptr().untyped()
28352    }
28353}
28354#[derive(Clone, Debug, Eq, Hash, PartialEq)]
28355pub struct TerminalArrow {
28356    node: SyntaxNode,
28357    children: Arc<[SyntaxNode]>,
28358}
28359impl Terminal for TerminalArrow {
28360    const KIND: SyntaxKind = SyntaxKind::TerminalArrow;
28361    type TokenType = TokenArrow;
28362    fn new_green(
28363        db: &dyn SyntaxGroup,
28364        leading_trivia: TriviaGreen,
28365        token: <<TerminalArrow as Terminal>::TokenType as TypedSyntaxNode>::Green,
28366        trailing_trivia: TriviaGreen,
28367    ) -> Self::Green {
28368        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
28369        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
28370        TerminalArrowGreen(
28371            Arc::new(GreenNode {
28372                kind: SyntaxKind::TerminalArrow,
28373                details: GreenNodeDetails::Node { children, width },
28374            })
28375            .intern(db),
28376        )
28377    }
28378    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
28379        self.token(db).text(db)
28380    }
28381}
28382impl TerminalArrow {
28383    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
28384        Trivia::from_syntax_node(db, self.children[0].clone())
28385    }
28386    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenArrow {
28387        TokenArrow::from_syntax_node(db, self.children[1].clone())
28388    }
28389    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
28390        Trivia::from_syntax_node(db, self.children[2].clone())
28391    }
28392}
28393#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
28394pub struct TerminalArrowPtr(pub SyntaxStablePtrId);
28395impl TerminalArrowPtr {}
28396impl TypedStablePtr for TerminalArrowPtr {
28397    type SyntaxNode = TerminalArrow;
28398    fn untyped(&self) -> SyntaxStablePtrId {
28399        self.0
28400    }
28401    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalArrow {
28402        TerminalArrow::from_syntax_node(db, self.0.lookup(db))
28403    }
28404}
28405impl From<TerminalArrowPtr> for SyntaxStablePtrId {
28406    fn from(ptr: TerminalArrowPtr) -> Self {
28407        ptr.untyped()
28408    }
28409}
28410#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
28411pub struct TerminalArrowGreen(pub GreenId);
28412impl TypedSyntaxNode for TerminalArrow {
28413    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalArrow);
28414    type StablePtr = TerminalArrowPtr;
28415    type Green = TerminalArrowGreen;
28416    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
28417        TerminalArrowGreen(
28418            Arc::new(GreenNode {
28419                kind: SyntaxKind::TerminalArrow,
28420                details: GreenNodeDetails::Node {
28421                    children: vec![
28422                        Trivia::missing(db).0,
28423                        TokenArrow::missing(db).0,
28424                        Trivia::missing(db).0,
28425                    ],
28426                    width: TextWidth::default(),
28427                },
28428            })
28429            .intern(db),
28430        )
28431    }
28432    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
28433        let kind = node.kind(db);
28434        assert_eq!(
28435            kind,
28436            SyntaxKind::TerminalArrow,
28437            "Unexpected SyntaxKind {:?}. Expected {:?}.",
28438            kind,
28439            SyntaxKind::TerminalArrow
28440        );
28441        let children = db.get_children(node.clone());
28442        Self { node, children }
28443    }
28444    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
28445        let kind = node.kind(db);
28446        if kind == SyntaxKind::TerminalArrow {
28447            Some(Self::from_syntax_node(db, node))
28448        } else {
28449            None
28450        }
28451    }
28452    fn as_syntax_node(&self) -> SyntaxNode {
28453        self.node.clone()
28454    }
28455    fn stable_ptr(&self) -> Self::StablePtr {
28456        TerminalArrowPtr(self.node.0.stable_ptr)
28457    }
28458}
28459impl From<&TerminalArrow> for SyntaxStablePtrId {
28460    fn from(node: &TerminalArrow) -> Self {
28461        node.stable_ptr().untyped()
28462    }
28463}
28464#[derive(Clone, Debug, Eq, Hash, PartialEq)]
28465pub struct TokenAt {
28466    node: SyntaxNode,
28467}
28468impl Token for TokenAt {
28469    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
28470        TokenAtGreen(
28471            Arc::new(GreenNode {
28472                kind: SyntaxKind::TokenAt,
28473                details: GreenNodeDetails::Token(text),
28474            })
28475            .intern(db),
28476        )
28477    }
28478    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
28479        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
28480            .clone()
28481    }
28482}
28483#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
28484pub struct TokenAtPtr(pub SyntaxStablePtrId);
28485impl TypedStablePtr for TokenAtPtr {
28486    type SyntaxNode = TokenAt;
28487    fn untyped(&self) -> SyntaxStablePtrId {
28488        self.0
28489    }
28490    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenAt {
28491        TokenAt::from_syntax_node(db, self.0.lookup(db))
28492    }
28493}
28494impl From<TokenAtPtr> for SyntaxStablePtrId {
28495    fn from(ptr: TokenAtPtr) -> Self {
28496        ptr.untyped()
28497    }
28498}
28499#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
28500pub struct TokenAtGreen(pub GreenId);
28501impl TokenAtGreen {
28502    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
28503        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
28504    }
28505}
28506impl TypedSyntaxNode for TokenAt {
28507    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenAt);
28508    type StablePtr = TokenAtPtr;
28509    type Green = TokenAtGreen;
28510    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
28511        TokenAtGreen(
28512            Arc::new(GreenNode {
28513                kind: SyntaxKind::TokenMissing,
28514                details: GreenNodeDetails::Token("".into()),
28515            })
28516            .intern(db),
28517        )
28518    }
28519    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
28520        match node.0.green.lookup_intern(db).details {
28521            GreenNodeDetails::Token(_) => Self { node },
28522            GreenNodeDetails::Node { .. } => {
28523                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenAt)
28524            }
28525        }
28526    }
28527    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
28528        match node.0.green.lookup_intern(db).details {
28529            GreenNodeDetails::Token(_) => Some(Self { node }),
28530            GreenNodeDetails::Node { .. } => None,
28531        }
28532    }
28533    fn as_syntax_node(&self) -> SyntaxNode {
28534        self.node.clone()
28535    }
28536    fn stable_ptr(&self) -> Self::StablePtr {
28537        TokenAtPtr(self.node.0.stable_ptr)
28538    }
28539}
28540impl From<&TokenAt> for SyntaxStablePtrId {
28541    fn from(node: &TokenAt) -> Self {
28542        node.stable_ptr().untyped()
28543    }
28544}
28545#[derive(Clone, Debug, Eq, Hash, PartialEq)]
28546pub struct TerminalAt {
28547    node: SyntaxNode,
28548    children: Arc<[SyntaxNode]>,
28549}
28550impl Terminal for TerminalAt {
28551    const KIND: SyntaxKind = SyntaxKind::TerminalAt;
28552    type TokenType = TokenAt;
28553    fn new_green(
28554        db: &dyn SyntaxGroup,
28555        leading_trivia: TriviaGreen,
28556        token: <<TerminalAt as Terminal>::TokenType as TypedSyntaxNode>::Green,
28557        trailing_trivia: TriviaGreen,
28558    ) -> Self::Green {
28559        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
28560        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
28561        TerminalAtGreen(
28562            Arc::new(GreenNode {
28563                kind: SyntaxKind::TerminalAt,
28564                details: GreenNodeDetails::Node { children, width },
28565            })
28566            .intern(db),
28567        )
28568    }
28569    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
28570        self.token(db).text(db)
28571    }
28572}
28573impl TerminalAt {
28574    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
28575        Trivia::from_syntax_node(db, self.children[0].clone())
28576    }
28577    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenAt {
28578        TokenAt::from_syntax_node(db, self.children[1].clone())
28579    }
28580    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
28581        Trivia::from_syntax_node(db, self.children[2].clone())
28582    }
28583}
28584#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
28585pub struct TerminalAtPtr(pub SyntaxStablePtrId);
28586impl TerminalAtPtr {}
28587impl TypedStablePtr for TerminalAtPtr {
28588    type SyntaxNode = TerminalAt;
28589    fn untyped(&self) -> SyntaxStablePtrId {
28590        self.0
28591    }
28592    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalAt {
28593        TerminalAt::from_syntax_node(db, self.0.lookup(db))
28594    }
28595}
28596impl From<TerminalAtPtr> for SyntaxStablePtrId {
28597    fn from(ptr: TerminalAtPtr) -> Self {
28598        ptr.untyped()
28599    }
28600}
28601#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
28602pub struct TerminalAtGreen(pub GreenId);
28603impl TypedSyntaxNode for TerminalAt {
28604    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalAt);
28605    type StablePtr = TerminalAtPtr;
28606    type Green = TerminalAtGreen;
28607    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
28608        TerminalAtGreen(
28609            Arc::new(GreenNode {
28610                kind: SyntaxKind::TerminalAt,
28611                details: GreenNodeDetails::Node {
28612                    children: vec![
28613                        Trivia::missing(db).0,
28614                        TokenAt::missing(db).0,
28615                        Trivia::missing(db).0,
28616                    ],
28617                    width: TextWidth::default(),
28618                },
28619            })
28620            .intern(db),
28621        )
28622    }
28623    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
28624        let kind = node.kind(db);
28625        assert_eq!(
28626            kind,
28627            SyntaxKind::TerminalAt,
28628            "Unexpected SyntaxKind {:?}. Expected {:?}.",
28629            kind,
28630            SyntaxKind::TerminalAt
28631        );
28632        let children = db.get_children(node.clone());
28633        Self { node, children }
28634    }
28635    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
28636        let kind = node.kind(db);
28637        if kind == SyntaxKind::TerminalAt { Some(Self::from_syntax_node(db, node)) } else { None }
28638    }
28639    fn as_syntax_node(&self) -> SyntaxNode {
28640        self.node.clone()
28641    }
28642    fn stable_ptr(&self) -> Self::StablePtr {
28643        TerminalAtPtr(self.node.0.stable_ptr)
28644    }
28645}
28646impl From<&TerminalAt> for SyntaxStablePtrId {
28647    fn from(node: &TerminalAt) -> Self {
28648        node.stable_ptr().untyped()
28649    }
28650}
28651#[derive(Clone, Debug, Eq, Hash, PartialEq)]
28652pub struct TokenBadCharacters {
28653    node: SyntaxNode,
28654}
28655impl Token for TokenBadCharacters {
28656    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
28657        TokenBadCharactersGreen(
28658            Arc::new(GreenNode {
28659                kind: SyntaxKind::TokenBadCharacters,
28660                details: GreenNodeDetails::Token(text),
28661            })
28662            .intern(db),
28663        )
28664    }
28665    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
28666        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
28667            .clone()
28668    }
28669}
28670#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
28671pub struct TokenBadCharactersPtr(pub SyntaxStablePtrId);
28672impl TypedStablePtr for TokenBadCharactersPtr {
28673    type SyntaxNode = TokenBadCharacters;
28674    fn untyped(&self) -> SyntaxStablePtrId {
28675        self.0
28676    }
28677    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenBadCharacters {
28678        TokenBadCharacters::from_syntax_node(db, self.0.lookup(db))
28679    }
28680}
28681impl From<TokenBadCharactersPtr> for SyntaxStablePtrId {
28682    fn from(ptr: TokenBadCharactersPtr) -> Self {
28683        ptr.untyped()
28684    }
28685}
28686#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
28687pub struct TokenBadCharactersGreen(pub GreenId);
28688impl TokenBadCharactersGreen {
28689    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
28690        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
28691    }
28692}
28693impl TypedSyntaxNode for TokenBadCharacters {
28694    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenBadCharacters);
28695    type StablePtr = TokenBadCharactersPtr;
28696    type Green = TokenBadCharactersGreen;
28697    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
28698        TokenBadCharactersGreen(
28699            Arc::new(GreenNode {
28700                kind: SyntaxKind::TokenMissing,
28701                details: GreenNodeDetails::Token("".into()),
28702            })
28703            .intern(db),
28704        )
28705    }
28706    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
28707        match node.0.green.lookup_intern(db).details {
28708            GreenNodeDetails::Token(_) => Self { node },
28709            GreenNodeDetails::Node { .. } => panic!(
28710                "Expected a token {:?}, not an internal node",
28711                SyntaxKind::TokenBadCharacters
28712            ),
28713        }
28714    }
28715    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
28716        match node.0.green.lookup_intern(db).details {
28717            GreenNodeDetails::Token(_) => Some(Self { node }),
28718            GreenNodeDetails::Node { .. } => None,
28719        }
28720    }
28721    fn as_syntax_node(&self) -> SyntaxNode {
28722        self.node.clone()
28723    }
28724    fn stable_ptr(&self) -> Self::StablePtr {
28725        TokenBadCharactersPtr(self.node.0.stable_ptr)
28726    }
28727}
28728impl From<&TokenBadCharacters> for SyntaxStablePtrId {
28729    fn from(node: &TokenBadCharacters) -> Self {
28730        node.stable_ptr().untyped()
28731    }
28732}
28733#[derive(Clone, Debug, Eq, Hash, PartialEq)]
28734pub struct TerminalBadCharacters {
28735    node: SyntaxNode,
28736    children: Arc<[SyntaxNode]>,
28737}
28738impl Terminal for TerminalBadCharacters {
28739    const KIND: SyntaxKind = SyntaxKind::TerminalBadCharacters;
28740    type TokenType = TokenBadCharacters;
28741    fn new_green(
28742        db: &dyn SyntaxGroup,
28743        leading_trivia: TriviaGreen,
28744        token: <<TerminalBadCharacters as Terminal>::TokenType as TypedSyntaxNode>::Green,
28745        trailing_trivia: TriviaGreen,
28746    ) -> Self::Green {
28747        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
28748        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
28749        TerminalBadCharactersGreen(
28750            Arc::new(GreenNode {
28751                kind: SyntaxKind::TerminalBadCharacters,
28752                details: GreenNodeDetails::Node { children, width },
28753            })
28754            .intern(db),
28755        )
28756    }
28757    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
28758        self.token(db).text(db)
28759    }
28760}
28761impl TerminalBadCharacters {
28762    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
28763        Trivia::from_syntax_node(db, self.children[0].clone())
28764    }
28765    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenBadCharacters {
28766        TokenBadCharacters::from_syntax_node(db, self.children[1].clone())
28767    }
28768    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
28769        Trivia::from_syntax_node(db, self.children[2].clone())
28770    }
28771}
28772#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
28773pub struct TerminalBadCharactersPtr(pub SyntaxStablePtrId);
28774impl TerminalBadCharactersPtr {}
28775impl TypedStablePtr for TerminalBadCharactersPtr {
28776    type SyntaxNode = TerminalBadCharacters;
28777    fn untyped(&self) -> SyntaxStablePtrId {
28778        self.0
28779    }
28780    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalBadCharacters {
28781        TerminalBadCharacters::from_syntax_node(db, self.0.lookup(db))
28782    }
28783}
28784impl From<TerminalBadCharactersPtr> for SyntaxStablePtrId {
28785    fn from(ptr: TerminalBadCharactersPtr) -> Self {
28786        ptr.untyped()
28787    }
28788}
28789#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
28790pub struct TerminalBadCharactersGreen(pub GreenId);
28791impl TypedSyntaxNode for TerminalBadCharacters {
28792    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalBadCharacters);
28793    type StablePtr = TerminalBadCharactersPtr;
28794    type Green = TerminalBadCharactersGreen;
28795    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
28796        TerminalBadCharactersGreen(
28797            Arc::new(GreenNode {
28798                kind: SyntaxKind::TerminalBadCharacters,
28799                details: GreenNodeDetails::Node {
28800                    children: vec![
28801                        Trivia::missing(db).0,
28802                        TokenBadCharacters::missing(db).0,
28803                        Trivia::missing(db).0,
28804                    ],
28805                    width: TextWidth::default(),
28806                },
28807            })
28808            .intern(db),
28809        )
28810    }
28811    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
28812        let kind = node.kind(db);
28813        assert_eq!(
28814            kind,
28815            SyntaxKind::TerminalBadCharacters,
28816            "Unexpected SyntaxKind {:?}. Expected {:?}.",
28817            kind,
28818            SyntaxKind::TerminalBadCharacters
28819        );
28820        let children = db.get_children(node.clone());
28821        Self { node, children }
28822    }
28823    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
28824        let kind = node.kind(db);
28825        if kind == SyntaxKind::TerminalBadCharacters {
28826            Some(Self::from_syntax_node(db, node))
28827        } else {
28828            None
28829        }
28830    }
28831    fn as_syntax_node(&self) -> SyntaxNode {
28832        self.node.clone()
28833    }
28834    fn stable_ptr(&self) -> Self::StablePtr {
28835        TerminalBadCharactersPtr(self.node.0.stable_ptr)
28836    }
28837}
28838impl From<&TerminalBadCharacters> for SyntaxStablePtrId {
28839    fn from(node: &TerminalBadCharacters) -> Self {
28840        node.stable_ptr().untyped()
28841    }
28842}
28843#[derive(Clone, Debug, Eq, Hash, PartialEq)]
28844pub struct TokenColon {
28845    node: SyntaxNode,
28846}
28847impl Token for TokenColon {
28848    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
28849        TokenColonGreen(
28850            Arc::new(GreenNode {
28851                kind: SyntaxKind::TokenColon,
28852                details: GreenNodeDetails::Token(text),
28853            })
28854            .intern(db),
28855        )
28856    }
28857    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
28858        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
28859            .clone()
28860    }
28861}
28862#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
28863pub struct TokenColonPtr(pub SyntaxStablePtrId);
28864impl TypedStablePtr for TokenColonPtr {
28865    type SyntaxNode = TokenColon;
28866    fn untyped(&self) -> SyntaxStablePtrId {
28867        self.0
28868    }
28869    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenColon {
28870        TokenColon::from_syntax_node(db, self.0.lookup(db))
28871    }
28872}
28873impl From<TokenColonPtr> for SyntaxStablePtrId {
28874    fn from(ptr: TokenColonPtr) -> Self {
28875        ptr.untyped()
28876    }
28877}
28878#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
28879pub struct TokenColonGreen(pub GreenId);
28880impl TokenColonGreen {
28881    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
28882        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
28883    }
28884}
28885impl TypedSyntaxNode for TokenColon {
28886    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenColon);
28887    type StablePtr = TokenColonPtr;
28888    type Green = TokenColonGreen;
28889    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
28890        TokenColonGreen(
28891            Arc::new(GreenNode {
28892                kind: SyntaxKind::TokenMissing,
28893                details: GreenNodeDetails::Token("".into()),
28894            })
28895            .intern(db),
28896        )
28897    }
28898    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
28899        match node.0.green.lookup_intern(db).details {
28900            GreenNodeDetails::Token(_) => Self { node },
28901            GreenNodeDetails::Node { .. } => {
28902                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenColon)
28903            }
28904        }
28905    }
28906    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
28907        match node.0.green.lookup_intern(db).details {
28908            GreenNodeDetails::Token(_) => Some(Self { node }),
28909            GreenNodeDetails::Node { .. } => None,
28910        }
28911    }
28912    fn as_syntax_node(&self) -> SyntaxNode {
28913        self.node.clone()
28914    }
28915    fn stable_ptr(&self) -> Self::StablePtr {
28916        TokenColonPtr(self.node.0.stable_ptr)
28917    }
28918}
28919impl From<&TokenColon> for SyntaxStablePtrId {
28920    fn from(node: &TokenColon) -> Self {
28921        node.stable_ptr().untyped()
28922    }
28923}
28924#[derive(Clone, Debug, Eq, Hash, PartialEq)]
28925pub struct TerminalColon {
28926    node: SyntaxNode,
28927    children: Arc<[SyntaxNode]>,
28928}
28929impl Terminal for TerminalColon {
28930    const KIND: SyntaxKind = SyntaxKind::TerminalColon;
28931    type TokenType = TokenColon;
28932    fn new_green(
28933        db: &dyn SyntaxGroup,
28934        leading_trivia: TriviaGreen,
28935        token: <<TerminalColon as Terminal>::TokenType as TypedSyntaxNode>::Green,
28936        trailing_trivia: TriviaGreen,
28937    ) -> Self::Green {
28938        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
28939        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
28940        TerminalColonGreen(
28941            Arc::new(GreenNode {
28942                kind: SyntaxKind::TerminalColon,
28943                details: GreenNodeDetails::Node { children, width },
28944            })
28945            .intern(db),
28946        )
28947    }
28948    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
28949        self.token(db).text(db)
28950    }
28951}
28952impl TerminalColon {
28953    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
28954        Trivia::from_syntax_node(db, self.children[0].clone())
28955    }
28956    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenColon {
28957        TokenColon::from_syntax_node(db, self.children[1].clone())
28958    }
28959    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
28960        Trivia::from_syntax_node(db, self.children[2].clone())
28961    }
28962}
28963#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
28964pub struct TerminalColonPtr(pub SyntaxStablePtrId);
28965impl TerminalColonPtr {}
28966impl TypedStablePtr for TerminalColonPtr {
28967    type SyntaxNode = TerminalColon;
28968    fn untyped(&self) -> SyntaxStablePtrId {
28969        self.0
28970    }
28971    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalColon {
28972        TerminalColon::from_syntax_node(db, self.0.lookup(db))
28973    }
28974}
28975impl From<TerminalColonPtr> for SyntaxStablePtrId {
28976    fn from(ptr: TerminalColonPtr) -> Self {
28977        ptr.untyped()
28978    }
28979}
28980#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
28981pub struct TerminalColonGreen(pub GreenId);
28982impl TypedSyntaxNode for TerminalColon {
28983    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalColon);
28984    type StablePtr = TerminalColonPtr;
28985    type Green = TerminalColonGreen;
28986    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
28987        TerminalColonGreen(
28988            Arc::new(GreenNode {
28989                kind: SyntaxKind::TerminalColon,
28990                details: GreenNodeDetails::Node {
28991                    children: vec![
28992                        Trivia::missing(db).0,
28993                        TokenColon::missing(db).0,
28994                        Trivia::missing(db).0,
28995                    ],
28996                    width: TextWidth::default(),
28997                },
28998            })
28999            .intern(db),
29000        )
29001    }
29002    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
29003        let kind = node.kind(db);
29004        assert_eq!(
29005            kind,
29006            SyntaxKind::TerminalColon,
29007            "Unexpected SyntaxKind {:?}. Expected {:?}.",
29008            kind,
29009            SyntaxKind::TerminalColon
29010        );
29011        let children = db.get_children(node.clone());
29012        Self { node, children }
29013    }
29014    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
29015        let kind = node.kind(db);
29016        if kind == SyntaxKind::TerminalColon {
29017            Some(Self::from_syntax_node(db, node))
29018        } else {
29019            None
29020        }
29021    }
29022    fn as_syntax_node(&self) -> SyntaxNode {
29023        self.node.clone()
29024    }
29025    fn stable_ptr(&self) -> Self::StablePtr {
29026        TerminalColonPtr(self.node.0.stable_ptr)
29027    }
29028}
29029impl From<&TerminalColon> for SyntaxStablePtrId {
29030    fn from(node: &TerminalColon) -> Self {
29031        node.stable_ptr().untyped()
29032    }
29033}
29034#[derive(Clone, Debug, Eq, Hash, PartialEq)]
29035pub struct TokenColonColon {
29036    node: SyntaxNode,
29037}
29038impl Token for TokenColonColon {
29039    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
29040        TokenColonColonGreen(
29041            Arc::new(GreenNode {
29042                kind: SyntaxKind::TokenColonColon,
29043                details: GreenNodeDetails::Token(text),
29044            })
29045            .intern(db),
29046        )
29047    }
29048    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
29049        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
29050            .clone()
29051    }
29052}
29053#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
29054pub struct TokenColonColonPtr(pub SyntaxStablePtrId);
29055impl TypedStablePtr for TokenColonColonPtr {
29056    type SyntaxNode = TokenColonColon;
29057    fn untyped(&self) -> SyntaxStablePtrId {
29058        self.0
29059    }
29060    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenColonColon {
29061        TokenColonColon::from_syntax_node(db, self.0.lookup(db))
29062    }
29063}
29064impl From<TokenColonColonPtr> for SyntaxStablePtrId {
29065    fn from(ptr: TokenColonColonPtr) -> Self {
29066        ptr.untyped()
29067    }
29068}
29069#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
29070pub struct TokenColonColonGreen(pub GreenId);
29071impl TokenColonColonGreen {
29072    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
29073        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
29074    }
29075}
29076impl TypedSyntaxNode for TokenColonColon {
29077    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenColonColon);
29078    type StablePtr = TokenColonColonPtr;
29079    type Green = TokenColonColonGreen;
29080    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
29081        TokenColonColonGreen(
29082            Arc::new(GreenNode {
29083                kind: SyntaxKind::TokenMissing,
29084                details: GreenNodeDetails::Token("".into()),
29085            })
29086            .intern(db),
29087        )
29088    }
29089    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
29090        match node.0.green.lookup_intern(db).details {
29091            GreenNodeDetails::Token(_) => Self { node },
29092            GreenNodeDetails::Node { .. } => {
29093                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenColonColon)
29094            }
29095        }
29096    }
29097    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
29098        match node.0.green.lookup_intern(db).details {
29099            GreenNodeDetails::Token(_) => Some(Self { node }),
29100            GreenNodeDetails::Node { .. } => None,
29101        }
29102    }
29103    fn as_syntax_node(&self) -> SyntaxNode {
29104        self.node.clone()
29105    }
29106    fn stable_ptr(&self) -> Self::StablePtr {
29107        TokenColonColonPtr(self.node.0.stable_ptr)
29108    }
29109}
29110impl From<&TokenColonColon> for SyntaxStablePtrId {
29111    fn from(node: &TokenColonColon) -> Self {
29112        node.stable_ptr().untyped()
29113    }
29114}
29115#[derive(Clone, Debug, Eq, Hash, PartialEq)]
29116pub struct TerminalColonColon {
29117    node: SyntaxNode,
29118    children: Arc<[SyntaxNode]>,
29119}
29120impl Terminal for TerminalColonColon {
29121    const KIND: SyntaxKind = SyntaxKind::TerminalColonColon;
29122    type TokenType = TokenColonColon;
29123    fn new_green(
29124        db: &dyn SyntaxGroup,
29125        leading_trivia: TriviaGreen,
29126        token: <<TerminalColonColon as Terminal>::TokenType as TypedSyntaxNode>::Green,
29127        trailing_trivia: TriviaGreen,
29128    ) -> Self::Green {
29129        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
29130        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
29131        TerminalColonColonGreen(
29132            Arc::new(GreenNode {
29133                kind: SyntaxKind::TerminalColonColon,
29134                details: GreenNodeDetails::Node { children, width },
29135            })
29136            .intern(db),
29137        )
29138    }
29139    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
29140        self.token(db).text(db)
29141    }
29142}
29143impl TerminalColonColon {
29144    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
29145        Trivia::from_syntax_node(db, self.children[0].clone())
29146    }
29147    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenColonColon {
29148        TokenColonColon::from_syntax_node(db, self.children[1].clone())
29149    }
29150    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
29151        Trivia::from_syntax_node(db, self.children[2].clone())
29152    }
29153}
29154#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
29155pub struct TerminalColonColonPtr(pub SyntaxStablePtrId);
29156impl TerminalColonColonPtr {}
29157impl TypedStablePtr for TerminalColonColonPtr {
29158    type SyntaxNode = TerminalColonColon;
29159    fn untyped(&self) -> SyntaxStablePtrId {
29160        self.0
29161    }
29162    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalColonColon {
29163        TerminalColonColon::from_syntax_node(db, self.0.lookup(db))
29164    }
29165}
29166impl From<TerminalColonColonPtr> for SyntaxStablePtrId {
29167    fn from(ptr: TerminalColonColonPtr) -> Self {
29168        ptr.untyped()
29169    }
29170}
29171#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
29172pub struct TerminalColonColonGreen(pub GreenId);
29173impl TypedSyntaxNode for TerminalColonColon {
29174    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalColonColon);
29175    type StablePtr = TerminalColonColonPtr;
29176    type Green = TerminalColonColonGreen;
29177    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
29178        TerminalColonColonGreen(
29179            Arc::new(GreenNode {
29180                kind: SyntaxKind::TerminalColonColon,
29181                details: GreenNodeDetails::Node {
29182                    children: vec![
29183                        Trivia::missing(db).0,
29184                        TokenColonColon::missing(db).0,
29185                        Trivia::missing(db).0,
29186                    ],
29187                    width: TextWidth::default(),
29188                },
29189            })
29190            .intern(db),
29191        )
29192    }
29193    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
29194        let kind = node.kind(db);
29195        assert_eq!(
29196            kind,
29197            SyntaxKind::TerminalColonColon,
29198            "Unexpected SyntaxKind {:?}. Expected {:?}.",
29199            kind,
29200            SyntaxKind::TerminalColonColon
29201        );
29202        let children = db.get_children(node.clone());
29203        Self { node, children }
29204    }
29205    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
29206        let kind = node.kind(db);
29207        if kind == SyntaxKind::TerminalColonColon {
29208            Some(Self::from_syntax_node(db, node))
29209        } else {
29210            None
29211        }
29212    }
29213    fn as_syntax_node(&self) -> SyntaxNode {
29214        self.node.clone()
29215    }
29216    fn stable_ptr(&self) -> Self::StablePtr {
29217        TerminalColonColonPtr(self.node.0.stable_ptr)
29218    }
29219}
29220impl From<&TerminalColonColon> for SyntaxStablePtrId {
29221    fn from(node: &TerminalColonColon) -> Self {
29222        node.stable_ptr().untyped()
29223    }
29224}
29225#[derive(Clone, Debug, Eq, Hash, PartialEq)]
29226pub struct TokenComma {
29227    node: SyntaxNode,
29228}
29229impl Token for TokenComma {
29230    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
29231        TokenCommaGreen(
29232            Arc::new(GreenNode {
29233                kind: SyntaxKind::TokenComma,
29234                details: GreenNodeDetails::Token(text),
29235            })
29236            .intern(db),
29237        )
29238    }
29239    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
29240        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
29241            .clone()
29242    }
29243}
29244#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
29245pub struct TokenCommaPtr(pub SyntaxStablePtrId);
29246impl TypedStablePtr for TokenCommaPtr {
29247    type SyntaxNode = TokenComma;
29248    fn untyped(&self) -> SyntaxStablePtrId {
29249        self.0
29250    }
29251    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenComma {
29252        TokenComma::from_syntax_node(db, self.0.lookup(db))
29253    }
29254}
29255impl From<TokenCommaPtr> for SyntaxStablePtrId {
29256    fn from(ptr: TokenCommaPtr) -> Self {
29257        ptr.untyped()
29258    }
29259}
29260#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
29261pub struct TokenCommaGreen(pub GreenId);
29262impl TokenCommaGreen {
29263    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
29264        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
29265    }
29266}
29267impl TypedSyntaxNode for TokenComma {
29268    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenComma);
29269    type StablePtr = TokenCommaPtr;
29270    type Green = TokenCommaGreen;
29271    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
29272        TokenCommaGreen(
29273            Arc::new(GreenNode {
29274                kind: SyntaxKind::TokenMissing,
29275                details: GreenNodeDetails::Token("".into()),
29276            })
29277            .intern(db),
29278        )
29279    }
29280    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
29281        match node.0.green.lookup_intern(db).details {
29282            GreenNodeDetails::Token(_) => Self { node },
29283            GreenNodeDetails::Node { .. } => {
29284                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenComma)
29285            }
29286        }
29287    }
29288    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
29289        match node.0.green.lookup_intern(db).details {
29290            GreenNodeDetails::Token(_) => Some(Self { node }),
29291            GreenNodeDetails::Node { .. } => None,
29292        }
29293    }
29294    fn as_syntax_node(&self) -> SyntaxNode {
29295        self.node.clone()
29296    }
29297    fn stable_ptr(&self) -> Self::StablePtr {
29298        TokenCommaPtr(self.node.0.stable_ptr)
29299    }
29300}
29301impl From<&TokenComma> for SyntaxStablePtrId {
29302    fn from(node: &TokenComma) -> Self {
29303        node.stable_ptr().untyped()
29304    }
29305}
29306#[derive(Clone, Debug, Eq, Hash, PartialEq)]
29307pub struct TerminalComma {
29308    node: SyntaxNode,
29309    children: Arc<[SyntaxNode]>,
29310}
29311impl Terminal for TerminalComma {
29312    const KIND: SyntaxKind = SyntaxKind::TerminalComma;
29313    type TokenType = TokenComma;
29314    fn new_green(
29315        db: &dyn SyntaxGroup,
29316        leading_trivia: TriviaGreen,
29317        token: <<TerminalComma as Terminal>::TokenType as TypedSyntaxNode>::Green,
29318        trailing_trivia: TriviaGreen,
29319    ) -> Self::Green {
29320        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
29321        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
29322        TerminalCommaGreen(
29323            Arc::new(GreenNode {
29324                kind: SyntaxKind::TerminalComma,
29325                details: GreenNodeDetails::Node { children, width },
29326            })
29327            .intern(db),
29328        )
29329    }
29330    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
29331        self.token(db).text(db)
29332    }
29333}
29334impl TerminalComma {
29335    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
29336        Trivia::from_syntax_node(db, self.children[0].clone())
29337    }
29338    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenComma {
29339        TokenComma::from_syntax_node(db, self.children[1].clone())
29340    }
29341    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
29342        Trivia::from_syntax_node(db, self.children[2].clone())
29343    }
29344}
29345#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
29346pub struct TerminalCommaPtr(pub SyntaxStablePtrId);
29347impl TerminalCommaPtr {}
29348impl TypedStablePtr for TerminalCommaPtr {
29349    type SyntaxNode = TerminalComma;
29350    fn untyped(&self) -> SyntaxStablePtrId {
29351        self.0
29352    }
29353    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalComma {
29354        TerminalComma::from_syntax_node(db, self.0.lookup(db))
29355    }
29356}
29357impl From<TerminalCommaPtr> for SyntaxStablePtrId {
29358    fn from(ptr: TerminalCommaPtr) -> Self {
29359        ptr.untyped()
29360    }
29361}
29362#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
29363pub struct TerminalCommaGreen(pub GreenId);
29364impl TypedSyntaxNode for TerminalComma {
29365    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalComma);
29366    type StablePtr = TerminalCommaPtr;
29367    type Green = TerminalCommaGreen;
29368    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
29369        TerminalCommaGreen(
29370            Arc::new(GreenNode {
29371                kind: SyntaxKind::TerminalComma,
29372                details: GreenNodeDetails::Node {
29373                    children: vec![
29374                        Trivia::missing(db).0,
29375                        TokenComma::missing(db).0,
29376                        Trivia::missing(db).0,
29377                    ],
29378                    width: TextWidth::default(),
29379                },
29380            })
29381            .intern(db),
29382        )
29383    }
29384    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
29385        let kind = node.kind(db);
29386        assert_eq!(
29387            kind,
29388            SyntaxKind::TerminalComma,
29389            "Unexpected SyntaxKind {:?}. Expected {:?}.",
29390            kind,
29391            SyntaxKind::TerminalComma
29392        );
29393        let children = db.get_children(node.clone());
29394        Self { node, children }
29395    }
29396    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
29397        let kind = node.kind(db);
29398        if kind == SyntaxKind::TerminalComma {
29399            Some(Self::from_syntax_node(db, node))
29400        } else {
29401            None
29402        }
29403    }
29404    fn as_syntax_node(&self) -> SyntaxNode {
29405        self.node.clone()
29406    }
29407    fn stable_ptr(&self) -> Self::StablePtr {
29408        TerminalCommaPtr(self.node.0.stable_ptr)
29409    }
29410}
29411impl From<&TerminalComma> for SyntaxStablePtrId {
29412    fn from(node: &TerminalComma) -> Self {
29413        node.stable_ptr().untyped()
29414    }
29415}
29416#[derive(Clone, Debug, Eq, Hash, PartialEq)]
29417pub struct TokenDiv {
29418    node: SyntaxNode,
29419}
29420impl Token for TokenDiv {
29421    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
29422        TokenDivGreen(
29423            Arc::new(GreenNode {
29424                kind: SyntaxKind::TokenDiv,
29425                details: GreenNodeDetails::Token(text),
29426            })
29427            .intern(db),
29428        )
29429    }
29430    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
29431        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
29432            .clone()
29433    }
29434}
29435#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
29436pub struct TokenDivPtr(pub SyntaxStablePtrId);
29437impl TypedStablePtr for TokenDivPtr {
29438    type SyntaxNode = TokenDiv;
29439    fn untyped(&self) -> SyntaxStablePtrId {
29440        self.0
29441    }
29442    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenDiv {
29443        TokenDiv::from_syntax_node(db, self.0.lookup(db))
29444    }
29445}
29446impl From<TokenDivPtr> for SyntaxStablePtrId {
29447    fn from(ptr: TokenDivPtr) -> Self {
29448        ptr.untyped()
29449    }
29450}
29451#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
29452pub struct TokenDivGreen(pub GreenId);
29453impl TokenDivGreen {
29454    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
29455        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
29456    }
29457}
29458impl TypedSyntaxNode for TokenDiv {
29459    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenDiv);
29460    type StablePtr = TokenDivPtr;
29461    type Green = TokenDivGreen;
29462    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
29463        TokenDivGreen(
29464            Arc::new(GreenNode {
29465                kind: SyntaxKind::TokenMissing,
29466                details: GreenNodeDetails::Token("".into()),
29467            })
29468            .intern(db),
29469        )
29470    }
29471    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
29472        match node.0.green.lookup_intern(db).details {
29473            GreenNodeDetails::Token(_) => Self { node },
29474            GreenNodeDetails::Node { .. } => {
29475                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenDiv)
29476            }
29477        }
29478    }
29479    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
29480        match node.0.green.lookup_intern(db).details {
29481            GreenNodeDetails::Token(_) => Some(Self { node }),
29482            GreenNodeDetails::Node { .. } => None,
29483        }
29484    }
29485    fn as_syntax_node(&self) -> SyntaxNode {
29486        self.node.clone()
29487    }
29488    fn stable_ptr(&self) -> Self::StablePtr {
29489        TokenDivPtr(self.node.0.stable_ptr)
29490    }
29491}
29492impl From<&TokenDiv> for SyntaxStablePtrId {
29493    fn from(node: &TokenDiv) -> Self {
29494        node.stable_ptr().untyped()
29495    }
29496}
29497#[derive(Clone, Debug, Eq, Hash, PartialEq)]
29498pub struct TerminalDiv {
29499    node: SyntaxNode,
29500    children: Arc<[SyntaxNode]>,
29501}
29502impl Terminal for TerminalDiv {
29503    const KIND: SyntaxKind = SyntaxKind::TerminalDiv;
29504    type TokenType = TokenDiv;
29505    fn new_green(
29506        db: &dyn SyntaxGroup,
29507        leading_trivia: TriviaGreen,
29508        token: <<TerminalDiv as Terminal>::TokenType as TypedSyntaxNode>::Green,
29509        trailing_trivia: TriviaGreen,
29510    ) -> Self::Green {
29511        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
29512        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
29513        TerminalDivGreen(
29514            Arc::new(GreenNode {
29515                kind: SyntaxKind::TerminalDiv,
29516                details: GreenNodeDetails::Node { children, width },
29517            })
29518            .intern(db),
29519        )
29520    }
29521    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
29522        self.token(db).text(db)
29523    }
29524}
29525impl TerminalDiv {
29526    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
29527        Trivia::from_syntax_node(db, self.children[0].clone())
29528    }
29529    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenDiv {
29530        TokenDiv::from_syntax_node(db, self.children[1].clone())
29531    }
29532    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
29533        Trivia::from_syntax_node(db, self.children[2].clone())
29534    }
29535}
29536#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
29537pub struct TerminalDivPtr(pub SyntaxStablePtrId);
29538impl TerminalDivPtr {}
29539impl TypedStablePtr for TerminalDivPtr {
29540    type SyntaxNode = TerminalDiv;
29541    fn untyped(&self) -> SyntaxStablePtrId {
29542        self.0
29543    }
29544    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalDiv {
29545        TerminalDiv::from_syntax_node(db, self.0.lookup(db))
29546    }
29547}
29548impl From<TerminalDivPtr> for SyntaxStablePtrId {
29549    fn from(ptr: TerminalDivPtr) -> Self {
29550        ptr.untyped()
29551    }
29552}
29553#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
29554pub struct TerminalDivGreen(pub GreenId);
29555impl TypedSyntaxNode for TerminalDiv {
29556    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalDiv);
29557    type StablePtr = TerminalDivPtr;
29558    type Green = TerminalDivGreen;
29559    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
29560        TerminalDivGreen(
29561            Arc::new(GreenNode {
29562                kind: SyntaxKind::TerminalDiv,
29563                details: GreenNodeDetails::Node {
29564                    children: vec![
29565                        Trivia::missing(db).0,
29566                        TokenDiv::missing(db).0,
29567                        Trivia::missing(db).0,
29568                    ],
29569                    width: TextWidth::default(),
29570                },
29571            })
29572            .intern(db),
29573        )
29574    }
29575    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
29576        let kind = node.kind(db);
29577        assert_eq!(
29578            kind,
29579            SyntaxKind::TerminalDiv,
29580            "Unexpected SyntaxKind {:?}. Expected {:?}.",
29581            kind,
29582            SyntaxKind::TerminalDiv
29583        );
29584        let children = db.get_children(node.clone());
29585        Self { node, children }
29586    }
29587    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
29588        let kind = node.kind(db);
29589        if kind == SyntaxKind::TerminalDiv { Some(Self::from_syntax_node(db, node)) } else { None }
29590    }
29591    fn as_syntax_node(&self) -> SyntaxNode {
29592        self.node.clone()
29593    }
29594    fn stable_ptr(&self) -> Self::StablePtr {
29595        TerminalDivPtr(self.node.0.stable_ptr)
29596    }
29597}
29598impl From<&TerminalDiv> for SyntaxStablePtrId {
29599    fn from(node: &TerminalDiv) -> Self {
29600        node.stable_ptr().untyped()
29601    }
29602}
29603#[derive(Clone, Debug, Eq, Hash, PartialEq)]
29604pub struct TokenDivEq {
29605    node: SyntaxNode,
29606}
29607impl Token for TokenDivEq {
29608    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
29609        TokenDivEqGreen(
29610            Arc::new(GreenNode {
29611                kind: SyntaxKind::TokenDivEq,
29612                details: GreenNodeDetails::Token(text),
29613            })
29614            .intern(db),
29615        )
29616    }
29617    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
29618        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
29619            .clone()
29620    }
29621}
29622#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
29623pub struct TokenDivEqPtr(pub SyntaxStablePtrId);
29624impl TypedStablePtr for TokenDivEqPtr {
29625    type SyntaxNode = TokenDivEq;
29626    fn untyped(&self) -> SyntaxStablePtrId {
29627        self.0
29628    }
29629    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenDivEq {
29630        TokenDivEq::from_syntax_node(db, self.0.lookup(db))
29631    }
29632}
29633impl From<TokenDivEqPtr> for SyntaxStablePtrId {
29634    fn from(ptr: TokenDivEqPtr) -> Self {
29635        ptr.untyped()
29636    }
29637}
29638#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
29639pub struct TokenDivEqGreen(pub GreenId);
29640impl TokenDivEqGreen {
29641    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
29642        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
29643    }
29644}
29645impl TypedSyntaxNode for TokenDivEq {
29646    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenDivEq);
29647    type StablePtr = TokenDivEqPtr;
29648    type Green = TokenDivEqGreen;
29649    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
29650        TokenDivEqGreen(
29651            Arc::new(GreenNode {
29652                kind: SyntaxKind::TokenMissing,
29653                details: GreenNodeDetails::Token("".into()),
29654            })
29655            .intern(db),
29656        )
29657    }
29658    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
29659        match node.0.green.lookup_intern(db).details {
29660            GreenNodeDetails::Token(_) => Self { node },
29661            GreenNodeDetails::Node { .. } => {
29662                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenDivEq)
29663            }
29664        }
29665    }
29666    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
29667        match node.0.green.lookup_intern(db).details {
29668            GreenNodeDetails::Token(_) => Some(Self { node }),
29669            GreenNodeDetails::Node { .. } => None,
29670        }
29671    }
29672    fn as_syntax_node(&self) -> SyntaxNode {
29673        self.node.clone()
29674    }
29675    fn stable_ptr(&self) -> Self::StablePtr {
29676        TokenDivEqPtr(self.node.0.stable_ptr)
29677    }
29678}
29679impl From<&TokenDivEq> for SyntaxStablePtrId {
29680    fn from(node: &TokenDivEq) -> Self {
29681        node.stable_ptr().untyped()
29682    }
29683}
29684#[derive(Clone, Debug, Eq, Hash, PartialEq)]
29685pub struct TerminalDivEq {
29686    node: SyntaxNode,
29687    children: Arc<[SyntaxNode]>,
29688}
29689impl Terminal for TerminalDivEq {
29690    const KIND: SyntaxKind = SyntaxKind::TerminalDivEq;
29691    type TokenType = TokenDivEq;
29692    fn new_green(
29693        db: &dyn SyntaxGroup,
29694        leading_trivia: TriviaGreen,
29695        token: <<TerminalDivEq as Terminal>::TokenType as TypedSyntaxNode>::Green,
29696        trailing_trivia: TriviaGreen,
29697    ) -> Self::Green {
29698        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
29699        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
29700        TerminalDivEqGreen(
29701            Arc::new(GreenNode {
29702                kind: SyntaxKind::TerminalDivEq,
29703                details: GreenNodeDetails::Node { children, width },
29704            })
29705            .intern(db),
29706        )
29707    }
29708    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
29709        self.token(db).text(db)
29710    }
29711}
29712impl TerminalDivEq {
29713    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
29714        Trivia::from_syntax_node(db, self.children[0].clone())
29715    }
29716    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenDivEq {
29717        TokenDivEq::from_syntax_node(db, self.children[1].clone())
29718    }
29719    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
29720        Trivia::from_syntax_node(db, self.children[2].clone())
29721    }
29722}
29723#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
29724pub struct TerminalDivEqPtr(pub SyntaxStablePtrId);
29725impl TerminalDivEqPtr {}
29726impl TypedStablePtr for TerminalDivEqPtr {
29727    type SyntaxNode = TerminalDivEq;
29728    fn untyped(&self) -> SyntaxStablePtrId {
29729        self.0
29730    }
29731    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalDivEq {
29732        TerminalDivEq::from_syntax_node(db, self.0.lookup(db))
29733    }
29734}
29735impl From<TerminalDivEqPtr> for SyntaxStablePtrId {
29736    fn from(ptr: TerminalDivEqPtr) -> Self {
29737        ptr.untyped()
29738    }
29739}
29740#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
29741pub struct TerminalDivEqGreen(pub GreenId);
29742impl TypedSyntaxNode for TerminalDivEq {
29743    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalDivEq);
29744    type StablePtr = TerminalDivEqPtr;
29745    type Green = TerminalDivEqGreen;
29746    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
29747        TerminalDivEqGreen(
29748            Arc::new(GreenNode {
29749                kind: SyntaxKind::TerminalDivEq,
29750                details: GreenNodeDetails::Node {
29751                    children: vec![
29752                        Trivia::missing(db).0,
29753                        TokenDivEq::missing(db).0,
29754                        Trivia::missing(db).0,
29755                    ],
29756                    width: TextWidth::default(),
29757                },
29758            })
29759            .intern(db),
29760        )
29761    }
29762    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
29763        let kind = node.kind(db);
29764        assert_eq!(
29765            kind,
29766            SyntaxKind::TerminalDivEq,
29767            "Unexpected SyntaxKind {:?}. Expected {:?}.",
29768            kind,
29769            SyntaxKind::TerminalDivEq
29770        );
29771        let children = db.get_children(node.clone());
29772        Self { node, children }
29773    }
29774    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
29775        let kind = node.kind(db);
29776        if kind == SyntaxKind::TerminalDivEq {
29777            Some(Self::from_syntax_node(db, node))
29778        } else {
29779            None
29780        }
29781    }
29782    fn as_syntax_node(&self) -> SyntaxNode {
29783        self.node.clone()
29784    }
29785    fn stable_ptr(&self) -> Self::StablePtr {
29786        TerminalDivEqPtr(self.node.0.stable_ptr)
29787    }
29788}
29789impl From<&TerminalDivEq> for SyntaxStablePtrId {
29790    fn from(node: &TerminalDivEq) -> Self {
29791        node.stable_ptr().untyped()
29792    }
29793}
29794#[derive(Clone, Debug, Eq, Hash, PartialEq)]
29795pub struct TokenDot {
29796    node: SyntaxNode,
29797}
29798impl Token for TokenDot {
29799    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
29800        TokenDotGreen(
29801            Arc::new(GreenNode {
29802                kind: SyntaxKind::TokenDot,
29803                details: GreenNodeDetails::Token(text),
29804            })
29805            .intern(db),
29806        )
29807    }
29808    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
29809        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
29810            .clone()
29811    }
29812}
29813#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
29814pub struct TokenDotPtr(pub SyntaxStablePtrId);
29815impl TypedStablePtr for TokenDotPtr {
29816    type SyntaxNode = TokenDot;
29817    fn untyped(&self) -> SyntaxStablePtrId {
29818        self.0
29819    }
29820    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenDot {
29821        TokenDot::from_syntax_node(db, self.0.lookup(db))
29822    }
29823}
29824impl From<TokenDotPtr> for SyntaxStablePtrId {
29825    fn from(ptr: TokenDotPtr) -> Self {
29826        ptr.untyped()
29827    }
29828}
29829#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
29830pub struct TokenDotGreen(pub GreenId);
29831impl TokenDotGreen {
29832    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
29833        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
29834    }
29835}
29836impl TypedSyntaxNode for TokenDot {
29837    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenDot);
29838    type StablePtr = TokenDotPtr;
29839    type Green = TokenDotGreen;
29840    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
29841        TokenDotGreen(
29842            Arc::new(GreenNode {
29843                kind: SyntaxKind::TokenMissing,
29844                details: GreenNodeDetails::Token("".into()),
29845            })
29846            .intern(db),
29847        )
29848    }
29849    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
29850        match node.0.green.lookup_intern(db).details {
29851            GreenNodeDetails::Token(_) => Self { node },
29852            GreenNodeDetails::Node { .. } => {
29853                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenDot)
29854            }
29855        }
29856    }
29857    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
29858        match node.0.green.lookup_intern(db).details {
29859            GreenNodeDetails::Token(_) => Some(Self { node }),
29860            GreenNodeDetails::Node { .. } => None,
29861        }
29862    }
29863    fn as_syntax_node(&self) -> SyntaxNode {
29864        self.node.clone()
29865    }
29866    fn stable_ptr(&self) -> Self::StablePtr {
29867        TokenDotPtr(self.node.0.stable_ptr)
29868    }
29869}
29870impl From<&TokenDot> for SyntaxStablePtrId {
29871    fn from(node: &TokenDot) -> Self {
29872        node.stable_ptr().untyped()
29873    }
29874}
29875#[derive(Clone, Debug, Eq, Hash, PartialEq)]
29876pub struct TerminalDot {
29877    node: SyntaxNode,
29878    children: Arc<[SyntaxNode]>,
29879}
29880impl Terminal for TerminalDot {
29881    const KIND: SyntaxKind = SyntaxKind::TerminalDot;
29882    type TokenType = TokenDot;
29883    fn new_green(
29884        db: &dyn SyntaxGroup,
29885        leading_trivia: TriviaGreen,
29886        token: <<TerminalDot as Terminal>::TokenType as TypedSyntaxNode>::Green,
29887        trailing_trivia: TriviaGreen,
29888    ) -> Self::Green {
29889        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
29890        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
29891        TerminalDotGreen(
29892            Arc::new(GreenNode {
29893                kind: SyntaxKind::TerminalDot,
29894                details: GreenNodeDetails::Node { children, width },
29895            })
29896            .intern(db),
29897        )
29898    }
29899    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
29900        self.token(db).text(db)
29901    }
29902}
29903impl TerminalDot {
29904    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
29905        Trivia::from_syntax_node(db, self.children[0].clone())
29906    }
29907    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenDot {
29908        TokenDot::from_syntax_node(db, self.children[1].clone())
29909    }
29910    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
29911        Trivia::from_syntax_node(db, self.children[2].clone())
29912    }
29913}
29914#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
29915pub struct TerminalDotPtr(pub SyntaxStablePtrId);
29916impl TerminalDotPtr {}
29917impl TypedStablePtr for TerminalDotPtr {
29918    type SyntaxNode = TerminalDot;
29919    fn untyped(&self) -> SyntaxStablePtrId {
29920        self.0
29921    }
29922    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalDot {
29923        TerminalDot::from_syntax_node(db, self.0.lookup(db))
29924    }
29925}
29926impl From<TerminalDotPtr> for SyntaxStablePtrId {
29927    fn from(ptr: TerminalDotPtr) -> Self {
29928        ptr.untyped()
29929    }
29930}
29931#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
29932pub struct TerminalDotGreen(pub GreenId);
29933impl TypedSyntaxNode for TerminalDot {
29934    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalDot);
29935    type StablePtr = TerminalDotPtr;
29936    type Green = TerminalDotGreen;
29937    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
29938        TerminalDotGreen(
29939            Arc::new(GreenNode {
29940                kind: SyntaxKind::TerminalDot,
29941                details: GreenNodeDetails::Node {
29942                    children: vec![
29943                        Trivia::missing(db).0,
29944                        TokenDot::missing(db).0,
29945                        Trivia::missing(db).0,
29946                    ],
29947                    width: TextWidth::default(),
29948                },
29949            })
29950            .intern(db),
29951        )
29952    }
29953    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
29954        let kind = node.kind(db);
29955        assert_eq!(
29956            kind,
29957            SyntaxKind::TerminalDot,
29958            "Unexpected SyntaxKind {:?}. Expected {:?}.",
29959            kind,
29960            SyntaxKind::TerminalDot
29961        );
29962        let children = db.get_children(node.clone());
29963        Self { node, children }
29964    }
29965    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
29966        let kind = node.kind(db);
29967        if kind == SyntaxKind::TerminalDot { Some(Self::from_syntax_node(db, node)) } else { None }
29968    }
29969    fn as_syntax_node(&self) -> SyntaxNode {
29970        self.node.clone()
29971    }
29972    fn stable_ptr(&self) -> Self::StablePtr {
29973        TerminalDotPtr(self.node.0.stable_ptr)
29974    }
29975}
29976impl From<&TerminalDot> for SyntaxStablePtrId {
29977    fn from(node: &TerminalDot) -> Self {
29978        node.stable_ptr().untyped()
29979    }
29980}
29981#[derive(Clone, Debug, Eq, Hash, PartialEq)]
29982pub struct TokenDotDot {
29983    node: SyntaxNode,
29984}
29985impl Token for TokenDotDot {
29986    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
29987        TokenDotDotGreen(
29988            Arc::new(GreenNode {
29989                kind: SyntaxKind::TokenDotDot,
29990                details: GreenNodeDetails::Token(text),
29991            })
29992            .intern(db),
29993        )
29994    }
29995    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
29996        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
29997            .clone()
29998    }
29999}
30000#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
30001pub struct TokenDotDotPtr(pub SyntaxStablePtrId);
30002impl TypedStablePtr for TokenDotDotPtr {
30003    type SyntaxNode = TokenDotDot;
30004    fn untyped(&self) -> SyntaxStablePtrId {
30005        self.0
30006    }
30007    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenDotDot {
30008        TokenDotDot::from_syntax_node(db, self.0.lookup(db))
30009    }
30010}
30011impl From<TokenDotDotPtr> for SyntaxStablePtrId {
30012    fn from(ptr: TokenDotDotPtr) -> Self {
30013        ptr.untyped()
30014    }
30015}
30016#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
30017pub struct TokenDotDotGreen(pub GreenId);
30018impl TokenDotDotGreen {
30019    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
30020        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
30021    }
30022}
30023impl TypedSyntaxNode for TokenDotDot {
30024    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenDotDot);
30025    type StablePtr = TokenDotDotPtr;
30026    type Green = TokenDotDotGreen;
30027    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
30028        TokenDotDotGreen(
30029            Arc::new(GreenNode {
30030                kind: SyntaxKind::TokenMissing,
30031                details: GreenNodeDetails::Token("".into()),
30032            })
30033            .intern(db),
30034        )
30035    }
30036    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
30037        match node.0.green.lookup_intern(db).details {
30038            GreenNodeDetails::Token(_) => Self { node },
30039            GreenNodeDetails::Node { .. } => {
30040                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenDotDot)
30041            }
30042        }
30043    }
30044    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
30045        match node.0.green.lookup_intern(db).details {
30046            GreenNodeDetails::Token(_) => Some(Self { node }),
30047            GreenNodeDetails::Node { .. } => None,
30048        }
30049    }
30050    fn as_syntax_node(&self) -> SyntaxNode {
30051        self.node.clone()
30052    }
30053    fn stable_ptr(&self) -> Self::StablePtr {
30054        TokenDotDotPtr(self.node.0.stable_ptr)
30055    }
30056}
30057impl From<&TokenDotDot> for SyntaxStablePtrId {
30058    fn from(node: &TokenDotDot) -> Self {
30059        node.stable_ptr().untyped()
30060    }
30061}
30062#[derive(Clone, Debug, Eq, Hash, PartialEq)]
30063pub struct TerminalDotDot {
30064    node: SyntaxNode,
30065    children: Arc<[SyntaxNode]>,
30066}
30067impl Terminal for TerminalDotDot {
30068    const KIND: SyntaxKind = SyntaxKind::TerminalDotDot;
30069    type TokenType = TokenDotDot;
30070    fn new_green(
30071        db: &dyn SyntaxGroup,
30072        leading_trivia: TriviaGreen,
30073        token: <<TerminalDotDot as Terminal>::TokenType as TypedSyntaxNode>::Green,
30074        trailing_trivia: TriviaGreen,
30075    ) -> Self::Green {
30076        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
30077        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
30078        TerminalDotDotGreen(
30079            Arc::new(GreenNode {
30080                kind: SyntaxKind::TerminalDotDot,
30081                details: GreenNodeDetails::Node { children, width },
30082            })
30083            .intern(db),
30084        )
30085    }
30086    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
30087        self.token(db).text(db)
30088    }
30089}
30090impl TerminalDotDot {
30091    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
30092        Trivia::from_syntax_node(db, self.children[0].clone())
30093    }
30094    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenDotDot {
30095        TokenDotDot::from_syntax_node(db, self.children[1].clone())
30096    }
30097    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
30098        Trivia::from_syntax_node(db, self.children[2].clone())
30099    }
30100}
30101#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
30102pub struct TerminalDotDotPtr(pub SyntaxStablePtrId);
30103impl TerminalDotDotPtr {}
30104impl TypedStablePtr for TerminalDotDotPtr {
30105    type SyntaxNode = TerminalDotDot;
30106    fn untyped(&self) -> SyntaxStablePtrId {
30107        self.0
30108    }
30109    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalDotDot {
30110        TerminalDotDot::from_syntax_node(db, self.0.lookup(db))
30111    }
30112}
30113impl From<TerminalDotDotPtr> for SyntaxStablePtrId {
30114    fn from(ptr: TerminalDotDotPtr) -> Self {
30115        ptr.untyped()
30116    }
30117}
30118#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
30119pub struct TerminalDotDotGreen(pub GreenId);
30120impl TypedSyntaxNode for TerminalDotDot {
30121    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalDotDot);
30122    type StablePtr = TerminalDotDotPtr;
30123    type Green = TerminalDotDotGreen;
30124    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
30125        TerminalDotDotGreen(
30126            Arc::new(GreenNode {
30127                kind: SyntaxKind::TerminalDotDot,
30128                details: GreenNodeDetails::Node {
30129                    children: vec![
30130                        Trivia::missing(db).0,
30131                        TokenDotDot::missing(db).0,
30132                        Trivia::missing(db).0,
30133                    ],
30134                    width: TextWidth::default(),
30135                },
30136            })
30137            .intern(db),
30138        )
30139    }
30140    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
30141        let kind = node.kind(db);
30142        assert_eq!(
30143            kind,
30144            SyntaxKind::TerminalDotDot,
30145            "Unexpected SyntaxKind {:?}. Expected {:?}.",
30146            kind,
30147            SyntaxKind::TerminalDotDot
30148        );
30149        let children = db.get_children(node.clone());
30150        Self { node, children }
30151    }
30152    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
30153        let kind = node.kind(db);
30154        if kind == SyntaxKind::TerminalDotDot {
30155            Some(Self::from_syntax_node(db, node))
30156        } else {
30157            None
30158        }
30159    }
30160    fn as_syntax_node(&self) -> SyntaxNode {
30161        self.node.clone()
30162    }
30163    fn stable_ptr(&self) -> Self::StablePtr {
30164        TerminalDotDotPtr(self.node.0.stable_ptr)
30165    }
30166}
30167impl From<&TerminalDotDot> for SyntaxStablePtrId {
30168    fn from(node: &TerminalDotDot) -> Self {
30169        node.stable_ptr().untyped()
30170    }
30171}
30172#[derive(Clone, Debug, Eq, Hash, PartialEq)]
30173pub struct TokenDotDotEq {
30174    node: SyntaxNode,
30175}
30176impl Token for TokenDotDotEq {
30177    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
30178        TokenDotDotEqGreen(
30179            Arc::new(GreenNode {
30180                kind: SyntaxKind::TokenDotDotEq,
30181                details: GreenNodeDetails::Token(text),
30182            })
30183            .intern(db),
30184        )
30185    }
30186    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
30187        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
30188            .clone()
30189    }
30190}
30191#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
30192pub struct TokenDotDotEqPtr(pub SyntaxStablePtrId);
30193impl TypedStablePtr for TokenDotDotEqPtr {
30194    type SyntaxNode = TokenDotDotEq;
30195    fn untyped(&self) -> SyntaxStablePtrId {
30196        self.0
30197    }
30198    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenDotDotEq {
30199        TokenDotDotEq::from_syntax_node(db, self.0.lookup(db))
30200    }
30201}
30202impl From<TokenDotDotEqPtr> for SyntaxStablePtrId {
30203    fn from(ptr: TokenDotDotEqPtr) -> Self {
30204        ptr.untyped()
30205    }
30206}
30207#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
30208pub struct TokenDotDotEqGreen(pub GreenId);
30209impl TokenDotDotEqGreen {
30210    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
30211        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
30212    }
30213}
30214impl TypedSyntaxNode for TokenDotDotEq {
30215    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenDotDotEq);
30216    type StablePtr = TokenDotDotEqPtr;
30217    type Green = TokenDotDotEqGreen;
30218    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
30219        TokenDotDotEqGreen(
30220            Arc::new(GreenNode {
30221                kind: SyntaxKind::TokenMissing,
30222                details: GreenNodeDetails::Token("".into()),
30223            })
30224            .intern(db),
30225        )
30226    }
30227    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
30228        match node.0.green.lookup_intern(db).details {
30229            GreenNodeDetails::Token(_) => Self { node },
30230            GreenNodeDetails::Node { .. } => {
30231                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenDotDotEq)
30232            }
30233        }
30234    }
30235    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
30236        match node.0.green.lookup_intern(db).details {
30237            GreenNodeDetails::Token(_) => Some(Self { node }),
30238            GreenNodeDetails::Node { .. } => None,
30239        }
30240    }
30241    fn as_syntax_node(&self) -> SyntaxNode {
30242        self.node.clone()
30243    }
30244    fn stable_ptr(&self) -> Self::StablePtr {
30245        TokenDotDotEqPtr(self.node.0.stable_ptr)
30246    }
30247}
30248impl From<&TokenDotDotEq> for SyntaxStablePtrId {
30249    fn from(node: &TokenDotDotEq) -> Self {
30250        node.stable_ptr().untyped()
30251    }
30252}
30253#[derive(Clone, Debug, Eq, Hash, PartialEq)]
30254pub struct TerminalDotDotEq {
30255    node: SyntaxNode,
30256    children: Arc<[SyntaxNode]>,
30257}
30258impl Terminal for TerminalDotDotEq {
30259    const KIND: SyntaxKind = SyntaxKind::TerminalDotDotEq;
30260    type TokenType = TokenDotDotEq;
30261    fn new_green(
30262        db: &dyn SyntaxGroup,
30263        leading_trivia: TriviaGreen,
30264        token: <<TerminalDotDotEq as Terminal>::TokenType as TypedSyntaxNode>::Green,
30265        trailing_trivia: TriviaGreen,
30266    ) -> Self::Green {
30267        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
30268        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
30269        TerminalDotDotEqGreen(
30270            Arc::new(GreenNode {
30271                kind: SyntaxKind::TerminalDotDotEq,
30272                details: GreenNodeDetails::Node { children, width },
30273            })
30274            .intern(db),
30275        )
30276    }
30277    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
30278        self.token(db).text(db)
30279    }
30280}
30281impl TerminalDotDotEq {
30282    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
30283        Trivia::from_syntax_node(db, self.children[0].clone())
30284    }
30285    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenDotDotEq {
30286        TokenDotDotEq::from_syntax_node(db, self.children[1].clone())
30287    }
30288    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
30289        Trivia::from_syntax_node(db, self.children[2].clone())
30290    }
30291}
30292#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
30293pub struct TerminalDotDotEqPtr(pub SyntaxStablePtrId);
30294impl TerminalDotDotEqPtr {}
30295impl TypedStablePtr for TerminalDotDotEqPtr {
30296    type SyntaxNode = TerminalDotDotEq;
30297    fn untyped(&self) -> SyntaxStablePtrId {
30298        self.0
30299    }
30300    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalDotDotEq {
30301        TerminalDotDotEq::from_syntax_node(db, self.0.lookup(db))
30302    }
30303}
30304impl From<TerminalDotDotEqPtr> for SyntaxStablePtrId {
30305    fn from(ptr: TerminalDotDotEqPtr) -> Self {
30306        ptr.untyped()
30307    }
30308}
30309#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
30310pub struct TerminalDotDotEqGreen(pub GreenId);
30311impl TypedSyntaxNode for TerminalDotDotEq {
30312    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalDotDotEq);
30313    type StablePtr = TerminalDotDotEqPtr;
30314    type Green = TerminalDotDotEqGreen;
30315    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
30316        TerminalDotDotEqGreen(
30317            Arc::new(GreenNode {
30318                kind: SyntaxKind::TerminalDotDotEq,
30319                details: GreenNodeDetails::Node {
30320                    children: vec![
30321                        Trivia::missing(db).0,
30322                        TokenDotDotEq::missing(db).0,
30323                        Trivia::missing(db).0,
30324                    ],
30325                    width: TextWidth::default(),
30326                },
30327            })
30328            .intern(db),
30329        )
30330    }
30331    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
30332        let kind = node.kind(db);
30333        assert_eq!(
30334            kind,
30335            SyntaxKind::TerminalDotDotEq,
30336            "Unexpected SyntaxKind {:?}. Expected {:?}.",
30337            kind,
30338            SyntaxKind::TerminalDotDotEq
30339        );
30340        let children = db.get_children(node.clone());
30341        Self { node, children }
30342    }
30343    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
30344        let kind = node.kind(db);
30345        if kind == SyntaxKind::TerminalDotDotEq {
30346            Some(Self::from_syntax_node(db, node))
30347        } else {
30348            None
30349        }
30350    }
30351    fn as_syntax_node(&self) -> SyntaxNode {
30352        self.node.clone()
30353    }
30354    fn stable_ptr(&self) -> Self::StablePtr {
30355        TerminalDotDotEqPtr(self.node.0.stable_ptr)
30356    }
30357}
30358impl From<&TerminalDotDotEq> for SyntaxStablePtrId {
30359    fn from(node: &TerminalDotDotEq) -> Self {
30360        node.stable_ptr().untyped()
30361    }
30362}
30363#[derive(Clone, Debug, Eq, Hash, PartialEq)]
30364pub struct TokenEndOfFile {
30365    node: SyntaxNode,
30366}
30367impl Token for TokenEndOfFile {
30368    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
30369        TokenEndOfFileGreen(
30370            Arc::new(GreenNode {
30371                kind: SyntaxKind::TokenEndOfFile,
30372                details: GreenNodeDetails::Token(text),
30373            })
30374            .intern(db),
30375        )
30376    }
30377    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
30378        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
30379            .clone()
30380    }
30381}
30382#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
30383pub struct TokenEndOfFilePtr(pub SyntaxStablePtrId);
30384impl TypedStablePtr for TokenEndOfFilePtr {
30385    type SyntaxNode = TokenEndOfFile;
30386    fn untyped(&self) -> SyntaxStablePtrId {
30387        self.0
30388    }
30389    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenEndOfFile {
30390        TokenEndOfFile::from_syntax_node(db, self.0.lookup(db))
30391    }
30392}
30393impl From<TokenEndOfFilePtr> for SyntaxStablePtrId {
30394    fn from(ptr: TokenEndOfFilePtr) -> Self {
30395        ptr.untyped()
30396    }
30397}
30398#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
30399pub struct TokenEndOfFileGreen(pub GreenId);
30400impl TokenEndOfFileGreen {
30401    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
30402        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
30403    }
30404}
30405impl TypedSyntaxNode for TokenEndOfFile {
30406    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenEndOfFile);
30407    type StablePtr = TokenEndOfFilePtr;
30408    type Green = TokenEndOfFileGreen;
30409    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
30410        TokenEndOfFileGreen(
30411            Arc::new(GreenNode {
30412                kind: SyntaxKind::TokenMissing,
30413                details: GreenNodeDetails::Token("".into()),
30414            })
30415            .intern(db),
30416        )
30417    }
30418    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
30419        match node.0.green.lookup_intern(db).details {
30420            GreenNodeDetails::Token(_) => Self { node },
30421            GreenNodeDetails::Node { .. } => {
30422                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenEndOfFile)
30423            }
30424        }
30425    }
30426    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
30427        match node.0.green.lookup_intern(db).details {
30428            GreenNodeDetails::Token(_) => Some(Self { node }),
30429            GreenNodeDetails::Node { .. } => None,
30430        }
30431    }
30432    fn as_syntax_node(&self) -> SyntaxNode {
30433        self.node.clone()
30434    }
30435    fn stable_ptr(&self) -> Self::StablePtr {
30436        TokenEndOfFilePtr(self.node.0.stable_ptr)
30437    }
30438}
30439impl From<&TokenEndOfFile> for SyntaxStablePtrId {
30440    fn from(node: &TokenEndOfFile) -> Self {
30441        node.stable_ptr().untyped()
30442    }
30443}
30444#[derive(Clone, Debug, Eq, Hash, PartialEq)]
30445pub struct TerminalEndOfFile {
30446    node: SyntaxNode,
30447    children: Arc<[SyntaxNode]>,
30448}
30449impl Terminal for TerminalEndOfFile {
30450    const KIND: SyntaxKind = SyntaxKind::TerminalEndOfFile;
30451    type TokenType = TokenEndOfFile;
30452    fn new_green(
30453        db: &dyn SyntaxGroup,
30454        leading_trivia: TriviaGreen,
30455        token: <<TerminalEndOfFile as Terminal>::TokenType as TypedSyntaxNode>::Green,
30456        trailing_trivia: TriviaGreen,
30457    ) -> Self::Green {
30458        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
30459        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
30460        TerminalEndOfFileGreen(
30461            Arc::new(GreenNode {
30462                kind: SyntaxKind::TerminalEndOfFile,
30463                details: GreenNodeDetails::Node { children, width },
30464            })
30465            .intern(db),
30466        )
30467    }
30468    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
30469        self.token(db).text(db)
30470    }
30471}
30472impl TerminalEndOfFile {
30473    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
30474        Trivia::from_syntax_node(db, self.children[0].clone())
30475    }
30476    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenEndOfFile {
30477        TokenEndOfFile::from_syntax_node(db, self.children[1].clone())
30478    }
30479    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
30480        Trivia::from_syntax_node(db, self.children[2].clone())
30481    }
30482}
30483#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
30484pub struct TerminalEndOfFilePtr(pub SyntaxStablePtrId);
30485impl TerminalEndOfFilePtr {}
30486impl TypedStablePtr for TerminalEndOfFilePtr {
30487    type SyntaxNode = TerminalEndOfFile;
30488    fn untyped(&self) -> SyntaxStablePtrId {
30489        self.0
30490    }
30491    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalEndOfFile {
30492        TerminalEndOfFile::from_syntax_node(db, self.0.lookup(db))
30493    }
30494}
30495impl From<TerminalEndOfFilePtr> for SyntaxStablePtrId {
30496    fn from(ptr: TerminalEndOfFilePtr) -> Self {
30497        ptr.untyped()
30498    }
30499}
30500#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
30501pub struct TerminalEndOfFileGreen(pub GreenId);
30502impl TypedSyntaxNode for TerminalEndOfFile {
30503    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalEndOfFile);
30504    type StablePtr = TerminalEndOfFilePtr;
30505    type Green = TerminalEndOfFileGreen;
30506    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
30507        TerminalEndOfFileGreen(
30508            Arc::new(GreenNode {
30509                kind: SyntaxKind::TerminalEndOfFile,
30510                details: GreenNodeDetails::Node {
30511                    children: vec![
30512                        Trivia::missing(db).0,
30513                        TokenEndOfFile::missing(db).0,
30514                        Trivia::missing(db).0,
30515                    ],
30516                    width: TextWidth::default(),
30517                },
30518            })
30519            .intern(db),
30520        )
30521    }
30522    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
30523        let kind = node.kind(db);
30524        assert_eq!(
30525            kind,
30526            SyntaxKind::TerminalEndOfFile,
30527            "Unexpected SyntaxKind {:?}. Expected {:?}.",
30528            kind,
30529            SyntaxKind::TerminalEndOfFile
30530        );
30531        let children = db.get_children(node.clone());
30532        Self { node, children }
30533    }
30534    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
30535        let kind = node.kind(db);
30536        if kind == SyntaxKind::TerminalEndOfFile {
30537            Some(Self::from_syntax_node(db, node))
30538        } else {
30539            None
30540        }
30541    }
30542    fn as_syntax_node(&self) -> SyntaxNode {
30543        self.node.clone()
30544    }
30545    fn stable_ptr(&self) -> Self::StablePtr {
30546        TerminalEndOfFilePtr(self.node.0.stable_ptr)
30547    }
30548}
30549impl From<&TerminalEndOfFile> for SyntaxStablePtrId {
30550    fn from(node: &TerminalEndOfFile) -> Self {
30551        node.stable_ptr().untyped()
30552    }
30553}
30554#[derive(Clone, Debug, Eq, Hash, PartialEq)]
30555pub struct TokenEq {
30556    node: SyntaxNode,
30557}
30558impl Token for TokenEq {
30559    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
30560        TokenEqGreen(
30561            Arc::new(GreenNode {
30562                kind: SyntaxKind::TokenEq,
30563                details: GreenNodeDetails::Token(text),
30564            })
30565            .intern(db),
30566        )
30567    }
30568    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
30569        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
30570            .clone()
30571    }
30572}
30573#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
30574pub struct TokenEqPtr(pub SyntaxStablePtrId);
30575impl TypedStablePtr for TokenEqPtr {
30576    type SyntaxNode = TokenEq;
30577    fn untyped(&self) -> SyntaxStablePtrId {
30578        self.0
30579    }
30580    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenEq {
30581        TokenEq::from_syntax_node(db, self.0.lookup(db))
30582    }
30583}
30584impl From<TokenEqPtr> for SyntaxStablePtrId {
30585    fn from(ptr: TokenEqPtr) -> Self {
30586        ptr.untyped()
30587    }
30588}
30589#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
30590pub struct TokenEqGreen(pub GreenId);
30591impl TokenEqGreen {
30592    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
30593        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
30594    }
30595}
30596impl TypedSyntaxNode for TokenEq {
30597    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenEq);
30598    type StablePtr = TokenEqPtr;
30599    type Green = TokenEqGreen;
30600    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
30601        TokenEqGreen(
30602            Arc::new(GreenNode {
30603                kind: SyntaxKind::TokenMissing,
30604                details: GreenNodeDetails::Token("".into()),
30605            })
30606            .intern(db),
30607        )
30608    }
30609    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
30610        match node.0.green.lookup_intern(db).details {
30611            GreenNodeDetails::Token(_) => Self { node },
30612            GreenNodeDetails::Node { .. } => {
30613                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenEq)
30614            }
30615        }
30616    }
30617    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
30618        match node.0.green.lookup_intern(db).details {
30619            GreenNodeDetails::Token(_) => Some(Self { node }),
30620            GreenNodeDetails::Node { .. } => None,
30621        }
30622    }
30623    fn as_syntax_node(&self) -> SyntaxNode {
30624        self.node.clone()
30625    }
30626    fn stable_ptr(&self) -> Self::StablePtr {
30627        TokenEqPtr(self.node.0.stable_ptr)
30628    }
30629}
30630impl From<&TokenEq> for SyntaxStablePtrId {
30631    fn from(node: &TokenEq) -> Self {
30632        node.stable_ptr().untyped()
30633    }
30634}
30635#[derive(Clone, Debug, Eq, Hash, PartialEq)]
30636pub struct TerminalEq {
30637    node: SyntaxNode,
30638    children: Arc<[SyntaxNode]>,
30639}
30640impl Terminal for TerminalEq {
30641    const KIND: SyntaxKind = SyntaxKind::TerminalEq;
30642    type TokenType = TokenEq;
30643    fn new_green(
30644        db: &dyn SyntaxGroup,
30645        leading_trivia: TriviaGreen,
30646        token: <<TerminalEq as Terminal>::TokenType as TypedSyntaxNode>::Green,
30647        trailing_trivia: TriviaGreen,
30648    ) -> Self::Green {
30649        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
30650        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
30651        TerminalEqGreen(
30652            Arc::new(GreenNode {
30653                kind: SyntaxKind::TerminalEq,
30654                details: GreenNodeDetails::Node { children, width },
30655            })
30656            .intern(db),
30657        )
30658    }
30659    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
30660        self.token(db).text(db)
30661    }
30662}
30663impl TerminalEq {
30664    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
30665        Trivia::from_syntax_node(db, self.children[0].clone())
30666    }
30667    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenEq {
30668        TokenEq::from_syntax_node(db, self.children[1].clone())
30669    }
30670    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
30671        Trivia::from_syntax_node(db, self.children[2].clone())
30672    }
30673}
30674#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
30675pub struct TerminalEqPtr(pub SyntaxStablePtrId);
30676impl TerminalEqPtr {}
30677impl TypedStablePtr for TerminalEqPtr {
30678    type SyntaxNode = TerminalEq;
30679    fn untyped(&self) -> SyntaxStablePtrId {
30680        self.0
30681    }
30682    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalEq {
30683        TerminalEq::from_syntax_node(db, self.0.lookup(db))
30684    }
30685}
30686impl From<TerminalEqPtr> for SyntaxStablePtrId {
30687    fn from(ptr: TerminalEqPtr) -> Self {
30688        ptr.untyped()
30689    }
30690}
30691#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
30692pub struct TerminalEqGreen(pub GreenId);
30693impl TypedSyntaxNode for TerminalEq {
30694    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalEq);
30695    type StablePtr = TerminalEqPtr;
30696    type Green = TerminalEqGreen;
30697    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
30698        TerminalEqGreen(
30699            Arc::new(GreenNode {
30700                kind: SyntaxKind::TerminalEq,
30701                details: GreenNodeDetails::Node {
30702                    children: vec![
30703                        Trivia::missing(db).0,
30704                        TokenEq::missing(db).0,
30705                        Trivia::missing(db).0,
30706                    ],
30707                    width: TextWidth::default(),
30708                },
30709            })
30710            .intern(db),
30711        )
30712    }
30713    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
30714        let kind = node.kind(db);
30715        assert_eq!(
30716            kind,
30717            SyntaxKind::TerminalEq,
30718            "Unexpected SyntaxKind {:?}. Expected {:?}.",
30719            kind,
30720            SyntaxKind::TerminalEq
30721        );
30722        let children = db.get_children(node.clone());
30723        Self { node, children }
30724    }
30725    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
30726        let kind = node.kind(db);
30727        if kind == SyntaxKind::TerminalEq { Some(Self::from_syntax_node(db, node)) } else { None }
30728    }
30729    fn as_syntax_node(&self) -> SyntaxNode {
30730        self.node.clone()
30731    }
30732    fn stable_ptr(&self) -> Self::StablePtr {
30733        TerminalEqPtr(self.node.0.stable_ptr)
30734    }
30735}
30736impl From<&TerminalEq> for SyntaxStablePtrId {
30737    fn from(node: &TerminalEq) -> Self {
30738        node.stable_ptr().untyped()
30739    }
30740}
30741#[derive(Clone, Debug, Eq, Hash, PartialEq)]
30742pub struct TokenEqEq {
30743    node: SyntaxNode,
30744}
30745impl Token for TokenEqEq {
30746    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
30747        TokenEqEqGreen(
30748            Arc::new(GreenNode {
30749                kind: SyntaxKind::TokenEqEq,
30750                details: GreenNodeDetails::Token(text),
30751            })
30752            .intern(db),
30753        )
30754    }
30755    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
30756        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
30757            .clone()
30758    }
30759}
30760#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
30761pub struct TokenEqEqPtr(pub SyntaxStablePtrId);
30762impl TypedStablePtr for TokenEqEqPtr {
30763    type SyntaxNode = TokenEqEq;
30764    fn untyped(&self) -> SyntaxStablePtrId {
30765        self.0
30766    }
30767    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenEqEq {
30768        TokenEqEq::from_syntax_node(db, self.0.lookup(db))
30769    }
30770}
30771impl From<TokenEqEqPtr> for SyntaxStablePtrId {
30772    fn from(ptr: TokenEqEqPtr) -> Self {
30773        ptr.untyped()
30774    }
30775}
30776#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
30777pub struct TokenEqEqGreen(pub GreenId);
30778impl TokenEqEqGreen {
30779    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
30780        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
30781    }
30782}
30783impl TypedSyntaxNode for TokenEqEq {
30784    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenEqEq);
30785    type StablePtr = TokenEqEqPtr;
30786    type Green = TokenEqEqGreen;
30787    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
30788        TokenEqEqGreen(
30789            Arc::new(GreenNode {
30790                kind: SyntaxKind::TokenMissing,
30791                details: GreenNodeDetails::Token("".into()),
30792            })
30793            .intern(db),
30794        )
30795    }
30796    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
30797        match node.0.green.lookup_intern(db).details {
30798            GreenNodeDetails::Token(_) => Self { node },
30799            GreenNodeDetails::Node { .. } => {
30800                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenEqEq)
30801            }
30802        }
30803    }
30804    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
30805        match node.0.green.lookup_intern(db).details {
30806            GreenNodeDetails::Token(_) => Some(Self { node }),
30807            GreenNodeDetails::Node { .. } => None,
30808        }
30809    }
30810    fn as_syntax_node(&self) -> SyntaxNode {
30811        self.node.clone()
30812    }
30813    fn stable_ptr(&self) -> Self::StablePtr {
30814        TokenEqEqPtr(self.node.0.stable_ptr)
30815    }
30816}
30817impl From<&TokenEqEq> for SyntaxStablePtrId {
30818    fn from(node: &TokenEqEq) -> Self {
30819        node.stable_ptr().untyped()
30820    }
30821}
30822#[derive(Clone, Debug, Eq, Hash, PartialEq)]
30823pub struct TerminalEqEq {
30824    node: SyntaxNode,
30825    children: Arc<[SyntaxNode]>,
30826}
30827impl Terminal for TerminalEqEq {
30828    const KIND: SyntaxKind = SyntaxKind::TerminalEqEq;
30829    type TokenType = TokenEqEq;
30830    fn new_green(
30831        db: &dyn SyntaxGroup,
30832        leading_trivia: TriviaGreen,
30833        token: <<TerminalEqEq as Terminal>::TokenType as TypedSyntaxNode>::Green,
30834        trailing_trivia: TriviaGreen,
30835    ) -> Self::Green {
30836        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
30837        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
30838        TerminalEqEqGreen(
30839            Arc::new(GreenNode {
30840                kind: SyntaxKind::TerminalEqEq,
30841                details: GreenNodeDetails::Node { children, width },
30842            })
30843            .intern(db),
30844        )
30845    }
30846    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
30847        self.token(db).text(db)
30848    }
30849}
30850impl TerminalEqEq {
30851    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
30852        Trivia::from_syntax_node(db, self.children[0].clone())
30853    }
30854    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenEqEq {
30855        TokenEqEq::from_syntax_node(db, self.children[1].clone())
30856    }
30857    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
30858        Trivia::from_syntax_node(db, self.children[2].clone())
30859    }
30860}
30861#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
30862pub struct TerminalEqEqPtr(pub SyntaxStablePtrId);
30863impl TerminalEqEqPtr {}
30864impl TypedStablePtr for TerminalEqEqPtr {
30865    type SyntaxNode = TerminalEqEq;
30866    fn untyped(&self) -> SyntaxStablePtrId {
30867        self.0
30868    }
30869    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalEqEq {
30870        TerminalEqEq::from_syntax_node(db, self.0.lookup(db))
30871    }
30872}
30873impl From<TerminalEqEqPtr> for SyntaxStablePtrId {
30874    fn from(ptr: TerminalEqEqPtr) -> Self {
30875        ptr.untyped()
30876    }
30877}
30878#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
30879pub struct TerminalEqEqGreen(pub GreenId);
30880impl TypedSyntaxNode for TerminalEqEq {
30881    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalEqEq);
30882    type StablePtr = TerminalEqEqPtr;
30883    type Green = TerminalEqEqGreen;
30884    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
30885        TerminalEqEqGreen(
30886            Arc::new(GreenNode {
30887                kind: SyntaxKind::TerminalEqEq,
30888                details: GreenNodeDetails::Node {
30889                    children: vec![
30890                        Trivia::missing(db).0,
30891                        TokenEqEq::missing(db).0,
30892                        Trivia::missing(db).0,
30893                    ],
30894                    width: TextWidth::default(),
30895                },
30896            })
30897            .intern(db),
30898        )
30899    }
30900    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
30901        let kind = node.kind(db);
30902        assert_eq!(
30903            kind,
30904            SyntaxKind::TerminalEqEq,
30905            "Unexpected SyntaxKind {:?}. Expected {:?}.",
30906            kind,
30907            SyntaxKind::TerminalEqEq
30908        );
30909        let children = db.get_children(node.clone());
30910        Self { node, children }
30911    }
30912    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
30913        let kind = node.kind(db);
30914        if kind == SyntaxKind::TerminalEqEq { Some(Self::from_syntax_node(db, node)) } else { None }
30915    }
30916    fn as_syntax_node(&self) -> SyntaxNode {
30917        self.node.clone()
30918    }
30919    fn stable_ptr(&self) -> Self::StablePtr {
30920        TerminalEqEqPtr(self.node.0.stable_ptr)
30921    }
30922}
30923impl From<&TerminalEqEq> for SyntaxStablePtrId {
30924    fn from(node: &TerminalEqEq) -> Self {
30925        node.stable_ptr().untyped()
30926    }
30927}
30928#[derive(Clone, Debug, Eq, Hash, PartialEq)]
30929pub struct TokenGE {
30930    node: SyntaxNode,
30931}
30932impl Token for TokenGE {
30933    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
30934        TokenGEGreen(
30935            Arc::new(GreenNode {
30936                kind: SyntaxKind::TokenGE,
30937                details: GreenNodeDetails::Token(text),
30938            })
30939            .intern(db),
30940        )
30941    }
30942    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
30943        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
30944            .clone()
30945    }
30946}
30947#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
30948pub struct TokenGEPtr(pub SyntaxStablePtrId);
30949impl TypedStablePtr for TokenGEPtr {
30950    type SyntaxNode = TokenGE;
30951    fn untyped(&self) -> SyntaxStablePtrId {
30952        self.0
30953    }
30954    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenGE {
30955        TokenGE::from_syntax_node(db, self.0.lookup(db))
30956    }
30957}
30958impl From<TokenGEPtr> for SyntaxStablePtrId {
30959    fn from(ptr: TokenGEPtr) -> Self {
30960        ptr.untyped()
30961    }
30962}
30963#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
30964pub struct TokenGEGreen(pub GreenId);
30965impl TokenGEGreen {
30966    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
30967        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
30968    }
30969}
30970impl TypedSyntaxNode for TokenGE {
30971    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenGE);
30972    type StablePtr = TokenGEPtr;
30973    type Green = TokenGEGreen;
30974    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
30975        TokenGEGreen(
30976            Arc::new(GreenNode {
30977                kind: SyntaxKind::TokenMissing,
30978                details: GreenNodeDetails::Token("".into()),
30979            })
30980            .intern(db),
30981        )
30982    }
30983    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
30984        match node.0.green.lookup_intern(db).details {
30985            GreenNodeDetails::Token(_) => Self { node },
30986            GreenNodeDetails::Node { .. } => {
30987                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenGE)
30988            }
30989        }
30990    }
30991    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
30992        match node.0.green.lookup_intern(db).details {
30993            GreenNodeDetails::Token(_) => Some(Self { node }),
30994            GreenNodeDetails::Node { .. } => None,
30995        }
30996    }
30997    fn as_syntax_node(&self) -> SyntaxNode {
30998        self.node.clone()
30999    }
31000    fn stable_ptr(&self) -> Self::StablePtr {
31001        TokenGEPtr(self.node.0.stable_ptr)
31002    }
31003}
31004impl From<&TokenGE> for SyntaxStablePtrId {
31005    fn from(node: &TokenGE) -> Self {
31006        node.stable_ptr().untyped()
31007    }
31008}
31009#[derive(Clone, Debug, Eq, Hash, PartialEq)]
31010pub struct TerminalGE {
31011    node: SyntaxNode,
31012    children: Arc<[SyntaxNode]>,
31013}
31014impl Terminal for TerminalGE {
31015    const KIND: SyntaxKind = SyntaxKind::TerminalGE;
31016    type TokenType = TokenGE;
31017    fn new_green(
31018        db: &dyn SyntaxGroup,
31019        leading_trivia: TriviaGreen,
31020        token: <<TerminalGE as Terminal>::TokenType as TypedSyntaxNode>::Green,
31021        trailing_trivia: TriviaGreen,
31022    ) -> Self::Green {
31023        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
31024        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
31025        TerminalGEGreen(
31026            Arc::new(GreenNode {
31027                kind: SyntaxKind::TerminalGE,
31028                details: GreenNodeDetails::Node { children, width },
31029            })
31030            .intern(db),
31031        )
31032    }
31033    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
31034        self.token(db).text(db)
31035    }
31036}
31037impl TerminalGE {
31038    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
31039        Trivia::from_syntax_node(db, self.children[0].clone())
31040    }
31041    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenGE {
31042        TokenGE::from_syntax_node(db, self.children[1].clone())
31043    }
31044    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
31045        Trivia::from_syntax_node(db, self.children[2].clone())
31046    }
31047}
31048#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
31049pub struct TerminalGEPtr(pub SyntaxStablePtrId);
31050impl TerminalGEPtr {}
31051impl TypedStablePtr for TerminalGEPtr {
31052    type SyntaxNode = TerminalGE;
31053    fn untyped(&self) -> SyntaxStablePtrId {
31054        self.0
31055    }
31056    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalGE {
31057        TerminalGE::from_syntax_node(db, self.0.lookup(db))
31058    }
31059}
31060impl From<TerminalGEPtr> for SyntaxStablePtrId {
31061    fn from(ptr: TerminalGEPtr) -> Self {
31062        ptr.untyped()
31063    }
31064}
31065#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
31066pub struct TerminalGEGreen(pub GreenId);
31067impl TypedSyntaxNode for TerminalGE {
31068    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalGE);
31069    type StablePtr = TerminalGEPtr;
31070    type Green = TerminalGEGreen;
31071    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
31072        TerminalGEGreen(
31073            Arc::new(GreenNode {
31074                kind: SyntaxKind::TerminalGE,
31075                details: GreenNodeDetails::Node {
31076                    children: vec![
31077                        Trivia::missing(db).0,
31078                        TokenGE::missing(db).0,
31079                        Trivia::missing(db).0,
31080                    ],
31081                    width: TextWidth::default(),
31082                },
31083            })
31084            .intern(db),
31085        )
31086    }
31087    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
31088        let kind = node.kind(db);
31089        assert_eq!(
31090            kind,
31091            SyntaxKind::TerminalGE,
31092            "Unexpected SyntaxKind {:?}. Expected {:?}.",
31093            kind,
31094            SyntaxKind::TerminalGE
31095        );
31096        let children = db.get_children(node.clone());
31097        Self { node, children }
31098    }
31099    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
31100        let kind = node.kind(db);
31101        if kind == SyntaxKind::TerminalGE { Some(Self::from_syntax_node(db, node)) } else { None }
31102    }
31103    fn as_syntax_node(&self) -> SyntaxNode {
31104        self.node.clone()
31105    }
31106    fn stable_ptr(&self) -> Self::StablePtr {
31107        TerminalGEPtr(self.node.0.stable_ptr)
31108    }
31109}
31110impl From<&TerminalGE> for SyntaxStablePtrId {
31111    fn from(node: &TerminalGE) -> Self {
31112        node.stable_ptr().untyped()
31113    }
31114}
31115#[derive(Clone, Debug, Eq, Hash, PartialEq)]
31116pub struct TokenGT {
31117    node: SyntaxNode,
31118}
31119impl Token for TokenGT {
31120    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
31121        TokenGTGreen(
31122            Arc::new(GreenNode {
31123                kind: SyntaxKind::TokenGT,
31124                details: GreenNodeDetails::Token(text),
31125            })
31126            .intern(db),
31127        )
31128    }
31129    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
31130        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
31131            .clone()
31132    }
31133}
31134#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
31135pub struct TokenGTPtr(pub SyntaxStablePtrId);
31136impl TypedStablePtr for TokenGTPtr {
31137    type SyntaxNode = TokenGT;
31138    fn untyped(&self) -> SyntaxStablePtrId {
31139        self.0
31140    }
31141    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenGT {
31142        TokenGT::from_syntax_node(db, self.0.lookup(db))
31143    }
31144}
31145impl From<TokenGTPtr> for SyntaxStablePtrId {
31146    fn from(ptr: TokenGTPtr) -> Self {
31147        ptr.untyped()
31148    }
31149}
31150#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
31151pub struct TokenGTGreen(pub GreenId);
31152impl TokenGTGreen {
31153    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
31154        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
31155    }
31156}
31157impl TypedSyntaxNode for TokenGT {
31158    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenGT);
31159    type StablePtr = TokenGTPtr;
31160    type Green = TokenGTGreen;
31161    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
31162        TokenGTGreen(
31163            Arc::new(GreenNode {
31164                kind: SyntaxKind::TokenMissing,
31165                details: GreenNodeDetails::Token("".into()),
31166            })
31167            .intern(db),
31168        )
31169    }
31170    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
31171        match node.0.green.lookup_intern(db).details {
31172            GreenNodeDetails::Token(_) => Self { node },
31173            GreenNodeDetails::Node { .. } => {
31174                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenGT)
31175            }
31176        }
31177    }
31178    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
31179        match node.0.green.lookup_intern(db).details {
31180            GreenNodeDetails::Token(_) => Some(Self { node }),
31181            GreenNodeDetails::Node { .. } => None,
31182        }
31183    }
31184    fn as_syntax_node(&self) -> SyntaxNode {
31185        self.node.clone()
31186    }
31187    fn stable_ptr(&self) -> Self::StablePtr {
31188        TokenGTPtr(self.node.0.stable_ptr)
31189    }
31190}
31191impl From<&TokenGT> for SyntaxStablePtrId {
31192    fn from(node: &TokenGT) -> Self {
31193        node.stable_ptr().untyped()
31194    }
31195}
31196#[derive(Clone, Debug, Eq, Hash, PartialEq)]
31197pub struct TerminalGT {
31198    node: SyntaxNode,
31199    children: Arc<[SyntaxNode]>,
31200}
31201impl Terminal for TerminalGT {
31202    const KIND: SyntaxKind = SyntaxKind::TerminalGT;
31203    type TokenType = TokenGT;
31204    fn new_green(
31205        db: &dyn SyntaxGroup,
31206        leading_trivia: TriviaGreen,
31207        token: <<TerminalGT as Terminal>::TokenType as TypedSyntaxNode>::Green,
31208        trailing_trivia: TriviaGreen,
31209    ) -> Self::Green {
31210        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
31211        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
31212        TerminalGTGreen(
31213            Arc::new(GreenNode {
31214                kind: SyntaxKind::TerminalGT,
31215                details: GreenNodeDetails::Node { children, width },
31216            })
31217            .intern(db),
31218        )
31219    }
31220    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
31221        self.token(db).text(db)
31222    }
31223}
31224impl TerminalGT {
31225    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
31226        Trivia::from_syntax_node(db, self.children[0].clone())
31227    }
31228    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenGT {
31229        TokenGT::from_syntax_node(db, self.children[1].clone())
31230    }
31231    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
31232        Trivia::from_syntax_node(db, self.children[2].clone())
31233    }
31234}
31235#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
31236pub struct TerminalGTPtr(pub SyntaxStablePtrId);
31237impl TerminalGTPtr {}
31238impl TypedStablePtr for TerminalGTPtr {
31239    type SyntaxNode = TerminalGT;
31240    fn untyped(&self) -> SyntaxStablePtrId {
31241        self.0
31242    }
31243    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalGT {
31244        TerminalGT::from_syntax_node(db, self.0.lookup(db))
31245    }
31246}
31247impl From<TerminalGTPtr> for SyntaxStablePtrId {
31248    fn from(ptr: TerminalGTPtr) -> Self {
31249        ptr.untyped()
31250    }
31251}
31252#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
31253pub struct TerminalGTGreen(pub GreenId);
31254impl TypedSyntaxNode for TerminalGT {
31255    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalGT);
31256    type StablePtr = TerminalGTPtr;
31257    type Green = TerminalGTGreen;
31258    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
31259        TerminalGTGreen(
31260            Arc::new(GreenNode {
31261                kind: SyntaxKind::TerminalGT,
31262                details: GreenNodeDetails::Node {
31263                    children: vec![
31264                        Trivia::missing(db).0,
31265                        TokenGT::missing(db).0,
31266                        Trivia::missing(db).0,
31267                    ],
31268                    width: TextWidth::default(),
31269                },
31270            })
31271            .intern(db),
31272        )
31273    }
31274    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
31275        let kind = node.kind(db);
31276        assert_eq!(
31277            kind,
31278            SyntaxKind::TerminalGT,
31279            "Unexpected SyntaxKind {:?}. Expected {:?}.",
31280            kind,
31281            SyntaxKind::TerminalGT
31282        );
31283        let children = db.get_children(node.clone());
31284        Self { node, children }
31285    }
31286    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
31287        let kind = node.kind(db);
31288        if kind == SyntaxKind::TerminalGT { Some(Self::from_syntax_node(db, node)) } else { None }
31289    }
31290    fn as_syntax_node(&self) -> SyntaxNode {
31291        self.node.clone()
31292    }
31293    fn stable_ptr(&self) -> Self::StablePtr {
31294        TerminalGTPtr(self.node.0.stable_ptr)
31295    }
31296}
31297impl From<&TerminalGT> for SyntaxStablePtrId {
31298    fn from(node: &TerminalGT) -> Self {
31299        node.stable_ptr().untyped()
31300    }
31301}
31302#[derive(Clone, Debug, Eq, Hash, PartialEq)]
31303pub struct TokenHash {
31304    node: SyntaxNode,
31305}
31306impl Token for TokenHash {
31307    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
31308        TokenHashGreen(
31309            Arc::new(GreenNode {
31310                kind: SyntaxKind::TokenHash,
31311                details: GreenNodeDetails::Token(text),
31312            })
31313            .intern(db),
31314        )
31315    }
31316    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
31317        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
31318            .clone()
31319    }
31320}
31321#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
31322pub struct TokenHashPtr(pub SyntaxStablePtrId);
31323impl TypedStablePtr for TokenHashPtr {
31324    type SyntaxNode = TokenHash;
31325    fn untyped(&self) -> SyntaxStablePtrId {
31326        self.0
31327    }
31328    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenHash {
31329        TokenHash::from_syntax_node(db, self.0.lookup(db))
31330    }
31331}
31332impl From<TokenHashPtr> for SyntaxStablePtrId {
31333    fn from(ptr: TokenHashPtr) -> Self {
31334        ptr.untyped()
31335    }
31336}
31337#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
31338pub struct TokenHashGreen(pub GreenId);
31339impl TokenHashGreen {
31340    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
31341        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
31342    }
31343}
31344impl TypedSyntaxNode for TokenHash {
31345    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenHash);
31346    type StablePtr = TokenHashPtr;
31347    type Green = TokenHashGreen;
31348    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
31349        TokenHashGreen(
31350            Arc::new(GreenNode {
31351                kind: SyntaxKind::TokenMissing,
31352                details: GreenNodeDetails::Token("".into()),
31353            })
31354            .intern(db),
31355        )
31356    }
31357    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
31358        match node.0.green.lookup_intern(db).details {
31359            GreenNodeDetails::Token(_) => Self { node },
31360            GreenNodeDetails::Node { .. } => {
31361                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenHash)
31362            }
31363        }
31364    }
31365    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
31366        match node.0.green.lookup_intern(db).details {
31367            GreenNodeDetails::Token(_) => Some(Self { node }),
31368            GreenNodeDetails::Node { .. } => None,
31369        }
31370    }
31371    fn as_syntax_node(&self) -> SyntaxNode {
31372        self.node.clone()
31373    }
31374    fn stable_ptr(&self) -> Self::StablePtr {
31375        TokenHashPtr(self.node.0.stable_ptr)
31376    }
31377}
31378impl From<&TokenHash> for SyntaxStablePtrId {
31379    fn from(node: &TokenHash) -> Self {
31380        node.stable_ptr().untyped()
31381    }
31382}
31383#[derive(Clone, Debug, Eq, Hash, PartialEq)]
31384pub struct TerminalHash {
31385    node: SyntaxNode,
31386    children: Arc<[SyntaxNode]>,
31387}
31388impl Terminal for TerminalHash {
31389    const KIND: SyntaxKind = SyntaxKind::TerminalHash;
31390    type TokenType = TokenHash;
31391    fn new_green(
31392        db: &dyn SyntaxGroup,
31393        leading_trivia: TriviaGreen,
31394        token: <<TerminalHash as Terminal>::TokenType as TypedSyntaxNode>::Green,
31395        trailing_trivia: TriviaGreen,
31396    ) -> Self::Green {
31397        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
31398        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
31399        TerminalHashGreen(
31400            Arc::new(GreenNode {
31401                kind: SyntaxKind::TerminalHash,
31402                details: GreenNodeDetails::Node { children, width },
31403            })
31404            .intern(db),
31405        )
31406    }
31407    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
31408        self.token(db).text(db)
31409    }
31410}
31411impl TerminalHash {
31412    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
31413        Trivia::from_syntax_node(db, self.children[0].clone())
31414    }
31415    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenHash {
31416        TokenHash::from_syntax_node(db, self.children[1].clone())
31417    }
31418    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
31419        Trivia::from_syntax_node(db, self.children[2].clone())
31420    }
31421}
31422#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
31423pub struct TerminalHashPtr(pub SyntaxStablePtrId);
31424impl TerminalHashPtr {}
31425impl TypedStablePtr for TerminalHashPtr {
31426    type SyntaxNode = TerminalHash;
31427    fn untyped(&self) -> SyntaxStablePtrId {
31428        self.0
31429    }
31430    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalHash {
31431        TerminalHash::from_syntax_node(db, self.0.lookup(db))
31432    }
31433}
31434impl From<TerminalHashPtr> for SyntaxStablePtrId {
31435    fn from(ptr: TerminalHashPtr) -> Self {
31436        ptr.untyped()
31437    }
31438}
31439#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
31440pub struct TerminalHashGreen(pub GreenId);
31441impl TypedSyntaxNode for TerminalHash {
31442    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalHash);
31443    type StablePtr = TerminalHashPtr;
31444    type Green = TerminalHashGreen;
31445    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
31446        TerminalHashGreen(
31447            Arc::new(GreenNode {
31448                kind: SyntaxKind::TerminalHash,
31449                details: GreenNodeDetails::Node {
31450                    children: vec![
31451                        Trivia::missing(db).0,
31452                        TokenHash::missing(db).0,
31453                        Trivia::missing(db).0,
31454                    ],
31455                    width: TextWidth::default(),
31456                },
31457            })
31458            .intern(db),
31459        )
31460    }
31461    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
31462        let kind = node.kind(db);
31463        assert_eq!(
31464            kind,
31465            SyntaxKind::TerminalHash,
31466            "Unexpected SyntaxKind {:?}. Expected {:?}.",
31467            kind,
31468            SyntaxKind::TerminalHash
31469        );
31470        let children = db.get_children(node.clone());
31471        Self { node, children }
31472    }
31473    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
31474        let kind = node.kind(db);
31475        if kind == SyntaxKind::TerminalHash { Some(Self::from_syntax_node(db, node)) } else { None }
31476    }
31477    fn as_syntax_node(&self) -> SyntaxNode {
31478        self.node.clone()
31479    }
31480    fn stable_ptr(&self) -> Self::StablePtr {
31481        TerminalHashPtr(self.node.0.stable_ptr)
31482    }
31483}
31484impl From<&TerminalHash> for SyntaxStablePtrId {
31485    fn from(node: &TerminalHash) -> Self {
31486        node.stable_ptr().untyped()
31487    }
31488}
31489#[derive(Clone, Debug, Eq, Hash, PartialEq)]
31490pub struct TokenLBrace {
31491    node: SyntaxNode,
31492}
31493impl Token for TokenLBrace {
31494    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
31495        TokenLBraceGreen(
31496            Arc::new(GreenNode {
31497                kind: SyntaxKind::TokenLBrace,
31498                details: GreenNodeDetails::Token(text),
31499            })
31500            .intern(db),
31501        )
31502    }
31503    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
31504        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
31505            .clone()
31506    }
31507}
31508#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
31509pub struct TokenLBracePtr(pub SyntaxStablePtrId);
31510impl TypedStablePtr for TokenLBracePtr {
31511    type SyntaxNode = TokenLBrace;
31512    fn untyped(&self) -> SyntaxStablePtrId {
31513        self.0
31514    }
31515    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenLBrace {
31516        TokenLBrace::from_syntax_node(db, self.0.lookup(db))
31517    }
31518}
31519impl From<TokenLBracePtr> for SyntaxStablePtrId {
31520    fn from(ptr: TokenLBracePtr) -> Self {
31521        ptr.untyped()
31522    }
31523}
31524#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
31525pub struct TokenLBraceGreen(pub GreenId);
31526impl TokenLBraceGreen {
31527    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
31528        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
31529    }
31530}
31531impl TypedSyntaxNode for TokenLBrace {
31532    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenLBrace);
31533    type StablePtr = TokenLBracePtr;
31534    type Green = TokenLBraceGreen;
31535    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
31536        TokenLBraceGreen(
31537            Arc::new(GreenNode {
31538                kind: SyntaxKind::TokenMissing,
31539                details: GreenNodeDetails::Token("".into()),
31540            })
31541            .intern(db),
31542        )
31543    }
31544    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
31545        match node.0.green.lookup_intern(db).details {
31546            GreenNodeDetails::Token(_) => Self { node },
31547            GreenNodeDetails::Node { .. } => {
31548                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenLBrace)
31549            }
31550        }
31551    }
31552    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
31553        match node.0.green.lookup_intern(db).details {
31554            GreenNodeDetails::Token(_) => Some(Self { node }),
31555            GreenNodeDetails::Node { .. } => None,
31556        }
31557    }
31558    fn as_syntax_node(&self) -> SyntaxNode {
31559        self.node.clone()
31560    }
31561    fn stable_ptr(&self) -> Self::StablePtr {
31562        TokenLBracePtr(self.node.0.stable_ptr)
31563    }
31564}
31565impl From<&TokenLBrace> for SyntaxStablePtrId {
31566    fn from(node: &TokenLBrace) -> Self {
31567        node.stable_ptr().untyped()
31568    }
31569}
31570#[derive(Clone, Debug, Eq, Hash, PartialEq)]
31571pub struct TerminalLBrace {
31572    node: SyntaxNode,
31573    children: Arc<[SyntaxNode]>,
31574}
31575impl Terminal for TerminalLBrace {
31576    const KIND: SyntaxKind = SyntaxKind::TerminalLBrace;
31577    type TokenType = TokenLBrace;
31578    fn new_green(
31579        db: &dyn SyntaxGroup,
31580        leading_trivia: TriviaGreen,
31581        token: <<TerminalLBrace as Terminal>::TokenType as TypedSyntaxNode>::Green,
31582        trailing_trivia: TriviaGreen,
31583    ) -> Self::Green {
31584        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
31585        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
31586        TerminalLBraceGreen(
31587            Arc::new(GreenNode {
31588                kind: SyntaxKind::TerminalLBrace,
31589                details: GreenNodeDetails::Node { children, width },
31590            })
31591            .intern(db),
31592        )
31593    }
31594    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
31595        self.token(db).text(db)
31596    }
31597}
31598impl TerminalLBrace {
31599    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
31600        Trivia::from_syntax_node(db, self.children[0].clone())
31601    }
31602    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenLBrace {
31603        TokenLBrace::from_syntax_node(db, self.children[1].clone())
31604    }
31605    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
31606        Trivia::from_syntax_node(db, self.children[2].clone())
31607    }
31608}
31609#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
31610pub struct TerminalLBracePtr(pub SyntaxStablePtrId);
31611impl TerminalLBracePtr {}
31612impl TypedStablePtr for TerminalLBracePtr {
31613    type SyntaxNode = TerminalLBrace;
31614    fn untyped(&self) -> SyntaxStablePtrId {
31615        self.0
31616    }
31617    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalLBrace {
31618        TerminalLBrace::from_syntax_node(db, self.0.lookup(db))
31619    }
31620}
31621impl From<TerminalLBracePtr> for SyntaxStablePtrId {
31622    fn from(ptr: TerminalLBracePtr) -> Self {
31623        ptr.untyped()
31624    }
31625}
31626#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
31627pub struct TerminalLBraceGreen(pub GreenId);
31628impl TypedSyntaxNode for TerminalLBrace {
31629    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalLBrace);
31630    type StablePtr = TerminalLBracePtr;
31631    type Green = TerminalLBraceGreen;
31632    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
31633        TerminalLBraceGreen(
31634            Arc::new(GreenNode {
31635                kind: SyntaxKind::TerminalLBrace,
31636                details: GreenNodeDetails::Node {
31637                    children: vec![
31638                        Trivia::missing(db).0,
31639                        TokenLBrace::missing(db).0,
31640                        Trivia::missing(db).0,
31641                    ],
31642                    width: TextWidth::default(),
31643                },
31644            })
31645            .intern(db),
31646        )
31647    }
31648    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
31649        let kind = node.kind(db);
31650        assert_eq!(
31651            kind,
31652            SyntaxKind::TerminalLBrace,
31653            "Unexpected SyntaxKind {:?}. Expected {:?}.",
31654            kind,
31655            SyntaxKind::TerminalLBrace
31656        );
31657        let children = db.get_children(node.clone());
31658        Self { node, children }
31659    }
31660    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
31661        let kind = node.kind(db);
31662        if kind == SyntaxKind::TerminalLBrace {
31663            Some(Self::from_syntax_node(db, node))
31664        } else {
31665            None
31666        }
31667    }
31668    fn as_syntax_node(&self) -> SyntaxNode {
31669        self.node.clone()
31670    }
31671    fn stable_ptr(&self) -> Self::StablePtr {
31672        TerminalLBracePtr(self.node.0.stable_ptr)
31673    }
31674}
31675impl From<&TerminalLBrace> for SyntaxStablePtrId {
31676    fn from(node: &TerminalLBrace) -> Self {
31677        node.stable_ptr().untyped()
31678    }
31679}
31680#[derive(Clone, Debug, Eq, Hash, PartialEq)]
31681pub struct TokenLBrack {
31682    node: SyntaxNode,
31683}
31684impl Token for TokenLBrack {
31685    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
31686        TokenLBrackGreen(
31687            Arc::new(GreenNode {
31688                kind: SyntaxKind::TokenLBrack,
31689                details: GreenNodeDetails::Token(text),
31690            })
31691            .intern(db),
31692        )
31693    }
31694    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
31695        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
31696            .clone()
31697    }
31698}
31699#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
31700pub struct TokenLBrackPtr(pub SyntaxStablePtrId);
31701impl TypedStablePtr for TokenLBrackPtr {
31702    type SyntaxNode = TokenLBrack;
31703    fn untyped(&self) -> SyntaxStablePtrId {
31704        self.0
31705    }
31706    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenLBrack {
31707        TokenLBrack::from_syntax_node(db, self.0.lookup(db))
31708    }
31709}
31710impl From<TokenLBrackPtr> for SyntaxStablePtrId {
31711    fn from(ptr: TokenLBrackPtr) -> Self {
31712        ptr.untyped()
31713    }
31714}
31715#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
31716pub struct TokenLBrackGreen(pub GreenId);
31717impl TokenLBrackGreen {
31718    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
31719        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
31720    }
31721}
31722impl TypedSyntaxNode for TokenLBrack {
31723    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenLBrack);
31724    type StablePtr = TokenLBrackPtr;
31725    type Green = TokenLBrackGreen;
31726    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
31727        TokenLBrackGreen(
31728            Arc::new(GreenNode {
31729                kind: SyntaxKind::TokenMissing,
31730                details: GreenNodeDetails::Token("".into()),
31731            })
31732            .intern(db),
31733        )
31734    }
31735    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
31736        match node.0.green.lookup_intern(db).details {
31737            GreenNodeDetails::Token(_) => Self { node },
31738            GreenNodeDetails::Node { .. } => {
31739                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenLBrack)
31740            }
31741        }
31742    }
31743    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
31744        match node.0.green.lookup_intern(db).details {
31745            GreenNodeDetails::Token(_) => Some(Self { node }),
31746            GreenNodeDetails::Node { .. } => None,
31747        }
31748    }
31749    fn as_syntax_node(&self) -> SyntaxNode {
31750        self.node.clone()
31751    }
31752    fn stable_ptr(&self) -> Self::StablePtr {
31753        TokenLBrackPtr(self.node.0.stable_ptr)
31754    }
31755}
31756impl From<&TokenLBrack> for SyntaxStablePtrId {
31757    fn from(node: &TokenLBrack) -> Self {
31758        node.stable_ptr().untyped()
31759    }
31760}
31761#[derive(Clone, Debug, Eq, Hash, PartialEq)]
31762pub struct TerminalLBrack {
31763    node: SyntaxNode,
31764    children: Arc<[SyntaxNode]>,
31765}
31766impl Terminal for TerminalLBrack {
31767    const KIND: SyntaxKind = SyntaxKind::TerminalLBrack;
31768    type TokenType = TokenLBrack;
31769    fn new_green(
31770        db: &dyn SyntaxGroup,
31771        leading_trivia: TriviaGreen,
31772        token: <<TerminalLBrack as Terminal>::TokenType as TypedSyntaxNode>::Green,
31773        trailing_trivia: TriviaGreen,
31774    ) -> Self::Green {
31775        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
31776        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
31777        TerminalLBrackGreen(
31778            Arc::new(GreenNode {
31779                kind: SyntaxKind::TerminalLBrack,
31780                details: GreenNodeDetails::Node { children, width },
31781            })
31782            .intern(db),
31783        )
31784    }
31785    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
31786        self.token(db).text(db)
31787    }
31788}
31789impl TerminalLBrack {
31790    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
31791        Trivia::from_syntax_node(db, self.children[0].clone())
31792    }
31793    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenLBrack {
31794        TokenLBrack::from_syntax_node(db, self.children[1].clone())
31795    }
31796    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
31797        Trivia::from_syntax_node(db, self.children[2].clone())
31798    }
31799}
31800#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
31801pub struct TerminalLBrackPtr(pub SyntaxStablePtrId);
31802impl TerminalLBrackPtr {}
31803impl TypedStablePtr for TerminalLBrackPtr {
31804    type SyntaxNode = TerminalLBrack;
31805    fn untyped(&self) -> SyntaxStablePtrId {
31806        self.0
31807    }
31808    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalLBrack {
31809        TerminalLBrack::from_syntax_node(db, self.0.lookup(db))
31810    }
31811}
31812impl From<TerminalLBrackPtr> for SyntaxStablePtrId {
31813    fn from(ptr: TerminalLBrackPtr) -> Self {
31814        ptr.untyped()
31815    }
31816}
31817#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
31818pub struct TerminalLBrackGreen(pub GreenId);
31819impl TypedSyntaxNode for TerminalLBrack {
31820    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalLBrack);
31821    type StablePtr = TerminalLBrackPtr;
31822    type Green = TerminalLBrackGreen;
31823    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
31824        TerminalLBrackGreen(
31825            Arc::new(GreenNode {
31826                kind: SyntaxKind::TerminalLBrack,
31827                details: GreenNodeDetails::Node {
31828                    children: vec![
31829                        Trivia::missing(db).0,
31830                        TokenLBrack::missing(db).0,
31831                        Trivia::missing(db).0,
31832                    ],
31833                    width: TextWidth::default(),
31834                },
31835            })
31836            .intern(db),
31837        )
31838    }
31839    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
31840        let kind = node.kind(db);
31841        assert_eq!(
31842            kind,
31843            SyntaxKind::TerminalLBrack,
31844            "Unexpected SyntaxKind {:?}. Expected {:?}.",
31845            kind,
31846            SyntaxKind::TerminalLBrack
31847        );
31848        let children = db.get_children(node.clone());
31849        Self { node, children }
31850    }
31851    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
31852        let kind = node.kind(db);
31853        if kind == SyntaxKind::TerminalLBrack {
31854            Some(Self::from_syntax_node(db, node))
31855        } else {
31856            None
31857        }
31858    }
31859    fn as_syntax_node(&self) -> SyntaxNode {
31860        self.node.clone()
31861    }
31862    fn stable_ptr(&self) -> Self::StablePtr {
31863        TerminalLBrackPtr(self.node.0.stable_ptr)
31864    }
31865}
31866impl From<&TerminalLBrack> for SyntaxStablePtrId {
31867    fn from(node: &TerminalLBrack) -> Self {
31868        node.stable_ptr().untyped()
31869    }
31870}
31871#[derive(Clone, Debug, Eq, Hash, PartialEq)]
31872pub struct TokenLE {
31873    node: SyntaxNode,
31874}
31875impl Token for TokenLE {
31876    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
31877        TokenLEGreen(
31878            Arc::new(GreenNode {
31879                kind: SyntaxKind::TokenLE,
31880                details: GreenNodeDetails::Token(text),
31881            })
31882            .intern(db),
31883        )
31884    }
31885    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
31886        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
31887            .clone()
31888    }
31889}
31890#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
31891pub struct TokenLEPtr(pub SyntaxStablePtrId);
31892impl TypedStablePtr for TokenLEPtr {
31893    type SyntaxNode = TokenLE;
31894    fn untyped(&self) -> SyntaxStablePtrId {
31895        self.0
31896    }
31897    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenLE {
31898        TokenLE::from_syntax_node(db, self.0.lookup(db))
31899    }
31900}
31901impl From<TokenLEPtr> for SyntaxStablePtrId {
31902    fn from(ptr: TokenLEPtr) -> Self {
31903        ptr.untyped()
31904    }
31905}
31906#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
31907pub struct TokenLEGreen(pub GreenId);
31908impl TokenLEGreen {
31909    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
31910        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
31911    }
31912}
31913impl TypedSyntaxNode for TokenLE {
31914    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenLE);
31915    type StablePtr = TokenLEPtr;
31916    type Green = TokenLEGreen;
31917    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
31918        TokenLEGreen(
31919            Arc::new(GreenNode {
31920                kind: SyntaxKind::TokenMissing,
31921                details: GreenNodeDetails::Token("".into()),
31922            })
31923            .intern(db),
31924        )
31925    }
31926    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
31927        match node.0.green.lookup_intern(db).details {
31928            GreenNodeDetails::Token(_) => Self { node },
31929            GreenNodeDetails::Node { .. } => {
31930                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenLE)
31931            }
31932        }
31933    }
31934    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
31935        match node.0.green.lookup_intern(db).details {
31936            GreenNodeDetails::Token(_) => Some(Self { node }),
31937            GreenNodeDetails::Node { .. } => None,
31938        }
31939    }
31940    fn as_syntax_node(&self) -> SyntaxNode {
31941        self.node.clone()
31942    }
31943    fn stable_ptr(&self) -> Self::StablePtr {
31944        TokenLEPtr(self.node.0.stable_ptr)
31945    }
31946}
31947impl From<&TokenLE> for SyntaxStablePtrId {
31948    fn from(node: &TokenLE) -> Self {
31949        node.stable_ptr().untyped()
31950    }
31951}
31952#[derive(Clone, Debug, Eq, Hash, PartialEq)]
31953pub struct TerminalLE {
31954    node: SyntaxNode,
31955    children: Arc<[SyntaxNode]>,
31956}
31957impl Terminal for TerminalLE {
31958    const KIND: SyntaxKind = SyntaxKind::TerminalLE;
31959    type TokenType = TokenLE;
31960    fn new_green(
31961        db: &dyn SyntaxGroup,
31962        leading_trivia: TriviaGreen,
31963        token: <<TerminalLE as Terminal>::TokenType as TypedSyntaxNode>::Green,
31964        trailing_trivia: TriviaGreen,
31965    ) -> Self::Green {
31966        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
31967        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
31968        TerminalLEGreen(
31969            Arc::new(GreenNode {
31970                kind: SyntaxKind::TerminalLE,
31971                details: GreenNodeDetails::Node { children, width },
31972            })
31973            .intern(db),
31974        )
31975    }
31976    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
31977        self.token(db).text(db)
31978    }
31979}
31980impl TerminalLE {
31981    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
31982        Trivia::from_syntax_node(db, self.children[0].clone())
31983    }
31984    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenLE {
31985        TokenLE::from_syntax_node(db, self.children[1].clone())
31986    }
31987    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
31988        Trivia::from_syntax_node(db, self.children[2].clone())
31989    }
31990}
31991#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
31992pub struct TerminalLEPtr(pub SyntaxStablePtrId);
31993impl TerminalLEPtr {}
31994impl TypedStablePtr for TerminalLEPtr {
31995    type SyntaxNode = TerminalLE;
31996    fn untyped(&self) -> SyntaxStablePtrId {
31997        self.0
31998    }
31999    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalLE {
32000        TerminalLE::from_syntax_node(db, self.0.lookup(db))
32001    }
32002}
32003impl From<TerminalLEPtr> for SyntaxStablePtrId {
32004    fn from(ptr: TerminalLEPtr) -> Self {
32005        ptr.untyped()
32006    }
32007}
32008#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
32009pub struct TerminalLEGreen(pub GreenId);
32010impl TypedSyntaxNode for TerminalLE {
32011    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalLE);
32012    type StablePtr = TerminalLEPtr;
32013    type Green = TerminalLEGreen;
32014    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
32015        TerminalLEGreen(
32016            Arc::new(GreenNode {
32017                kind: SyntaxKind::TerminalLE,
32018                details: GreenNodeDetails::Node {
32019                    children: vec![
32020                        Trivia::missing(db).0,
32021                        TokenLE::missing(db).0,
32022                        Trivia::missing(db).0,
32023                    ],
32024                    width: TextWidth::default(),
32025                },
32026            })
32027            .intern(db),
32028        )
32029    }
32030    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
32031        let kind = node.kind(db);
32032        assert_eq!(
32033            kind,
32034            SyntaxKind::TerminalLE,
32035            "Unexpected SyntaxKind {:?}. Expected {:?}.",
32036            kind,
32037            SyntaxKind::TerminalLE
32038        );
32039        let children = db.get_children(node.clone());
32040        Self { node, children }
32041    }
32042    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
32043        let kind = node.kind(db);
32044        if kind == SyntaxKind::TerminalLE { Some(Self::from_syntax_node(db, node)) } else { None }
32045    }
32046    fn as_syntax_node(&self) -> SyntaxNode {
32047        self.node.clone()
32048    }
32049    fn stable_ptr(&self) -> Self::StablePtr {
32050        TerminalLEPtr(self.node.0.stable_ptr)
32051    }
32052}
32053impl From<&TerminalLE> for SyntaxStablePtrId {
32054    fn from(node: &TerminalLE) -> Self {
32055        node.stable_ptr().untyped()
32056    }
32057}
32058#[derive(Clone, Debug, Eq, Hash, PartialEq)]
32059pub struct TokenLParen {
32060    node: SyntaxNode,
32061}
32062impl Token for TokenLParen {
32063    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
32064        TokenLParenGreen(
32065            Arc::new(GreenNode {
32066                kind: SyntaxKind::TokenLParen,
32067                details: GreenNodeDetails::Token(text),
32068            })
32069            .intern(db),
32070        )
32071    }
32072    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
32073        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
32074            .clone()
32075    }
32076}
32077#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
32078pub struct TokenLParenPtr(pub SyntaxStablePtrId);
32079impl TypedStablePtr for TokenLParenPtr {
32080    type SyntaxNode = TokenLParen;
32081    fn untyped(&self) -> SyntaxStablePtrId {
32082        self.0
32083    }
32084    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenLParen {
32085        TokenLParen::from_syntax_node(db, self.0.lookup(db))
32086    }
32087}
32088impl From<TokenLParenPtr> for SyntaxStablePtrId {
32089    fn from(ptr: TokenLParenPtr) -> Self {
32090        ptr.untyped()
32091    }
32092}
32093#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
32094pub struct TokenLParenGreen(pub GreenId);
32095impl TokenLParenGreen {
32096    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
32097        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
32098    }
32099}
32100impl TypedSyntaxNode for TokenLParen {
32101    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenLParen);
32102    type StablePtr = TokenLParenPtr;
32103    type Green = TokenLParenGreen;
32104    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
32105        TokenLParenGreen(
32106            Arc::new(GreenNode {
32107                kind: SyntaxKind::TokenMissing,
32108                details: GreenNodeDetails::Token("".into()),
32109            })
32110            .intern(db),
32111        )
32112    }
32113    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
32114        match node.0.green.lookup_intern(db).details {
32115            GreenNodeDetails::Token(_) => Self { node },
32116            GreenNodeDetails::Node { .. } => {
32117                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenLParen)
32118            }
32119        }
32120    }
32121    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
32122        match node.0.green.lookup_intern(db).details {
32123            GreenNodeDetails::Token(_) => Some(Self { node }),
32124            GreenNodeDetails::Node { .. } => None,
32125        }
32126    }
32127    fn as_syntax_node(&self) -> SyntaxNode {
32128        self.node.clone()
32129    }
32130    fn stable_ptr(&self) -> Self::StablePtr {
32131        TokenLParenPtr(self.node.0.stable_ptr)
32132    }
32133}
32134impl From<&TokenLParen> for SyntaxStablePtrId {
32135    fn from(node: &TokenLParen) -> Self {
32136        node.stable_ptr().untyped()
32137    }
32138}
32139#[derive(Clone, Debug, Eq, Hash, PartialEq)]
32140pub struct TerminalLParen {
32141    node: SyntaxNode,
32142    children: Arc<[SyntaxNode]>,
32143}
32144impl Terminal for TerminalLParen {
32145    const KIND: SyntaxKind = SyntaxKind::TerminalLParen;
32146    type TokenType = TokenLParen;
32147    fn new_green(
32148        db: &dyn SyntaxGroup,
32149        leading_trivia: TriviaGreen,
32150        token: <<TerminalLParen as Terminal>::TokenType as TypedSyntaxNode>::Green,
32151        trailing_trivia: TriviaGreen,
32152    ) -> Self::Green {
32153        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
32154        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
32155        TerminalLParenGreen(
32156            Arc::new(GreenNode {
32157                kind: SyntaxKind::TerminalLParen,
32158                details: GreenNodeDetails::Node { children, width },
32159            })
32160            .intern(db),
32161        )
32162    }
32163    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
32164        self.token(db).text(db)
32165    }
32166}
32167impl TerminalLParen {
32168    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
32169        Trivia::from_syntax_node(db, self.children[0].clone())
32170    }
32171    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenLParen {
32172        TokenLParen::from_syntax_node(db, self.children[1].clone())
32173    }
32174    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
32175        Trivia::from_syntax_node(db, self.children[2].clone())
32176    }
32177}
32178#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
32179pub struct TerminalLParenPtr(pub SyntaxStablePtrId);
32180impl TerminalLParenPtr {}
32181impl TypedStablePtr for TerminalLParenPtr {
32182    type SyntaxNode = TerminalLParen;
32183    fn untyped(&self) -> SyntaxStablePtrId {
32184        self.0
32185    }
32186    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalLParen {
32187        TerminalLParen::from_syntax_node(db, self.0.lookup(db))
32188    }
32189}
32190impl From<TerminalLParenPtr> for SyntaxStablePtrId {
32191    fn from(ptr: TerminalLParenPtr) -> Self {
32192        ptr.untyped()
32193    }
32194}
32195#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
32196pub struct TerminalLParenGreen(pub GreenId);
32197impl TypedSyntaxNode for TerminalLParen {
32198    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalLParen);
32199    type StablePtr = TerminalLParenPtr;
32200    type Green = TerminalLParenGreen;
32201    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
32202        TerminalLParenGreen(
32203            Arc::new(GreenNode {
32204                kind: SyntaxKind::TerminalLParen,
32205                details: GreenNodeDetails::Node {
32206                    children: vec![
32207                        Trivia::missing(db).0,
32208                        TokenLParen::missing(db).0,
32209                        Trivia::missing(db).0,
32210                    ],
32211                    width: TextWidth::default(),
32212                },
32213            })
32214            .intern(db),
32215        )
32216    }
32217    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
32218        let kind = node.kind(db);
32219        assert_eq!(
32220            kind,
32221            SyntaxKind::TerminalLParen,
32222            "Unexpected SyntaxKind {:?}. Expected {:?}.",
32223            kind,
32224            SyntaxKind::TerminalLParen
32225        );
32226        let children = db.get_children(node.clone());
32227        Self { node, children }
32228    }
32229    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
32230        let kind = node.kind(db);
32231        if kind == SyntaxKind::TerminalLParen {
32232            Some(Self::from_syntax_node(db, node))
32233        } else {
32234            None
32235        }
32236    }
32237    fn as_syntax_node(&self) -> SyntaxNode {
32238        self.node.clone()
32239    }
32240    fn stable_ptr(&self) -> Self::StablePtr {
32241        TerminalLParenPtr(self.node.0.stable_ptr)
32242    }
32243}
32244impl From<&TerminalLParen> for SyntaxStablePtrId {
32245    fn from(node: &TerminalLParen) -> Self {
32246        node.stable_ptr().untyped()
32247    }
32248}
32249#[derive(Clone, Debug, Eq, Hash, PartialEq)]
32250pub struct TokenLT {
32251    node: SyntaxNode,
32252}
32253impl Token for TokenLT {
32254    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
32255        TokenLTGreen(
32256            Arc::new(GreenNode {
32257                kind: SyntaxKind::TokenLT,
32258                details: GreenNodeDetails::Token(text),
32259            })
32260            .intern(db),
32261        )
32262    }
32263    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
32264        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
32265            .clone()
32266    }
32267}
32268#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
32269pub struct TokenLTPtr(pub SyntaxStablePtrId);
32270impl TypedStablePtr for TokenLTPtr {
32271    type SyntaxNode = TokenLT;
32272    fn untyped(&self) -> SyntaxStablePtrId {
32273        self.0
32274    }
32275    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenLT {
32276        TokenLT::from_syntax_node(db, self.0.lookup(db))
32277    }
32278}
32279impl From<TokenLTPtr> for SyntaxStablePtrId {
32280    fn from(ptr: TokenLTPtr) -> Self {
32281        ptr.untyped()
32282    }
32283}
32284#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
32285pub struct TokenLTGreen(pub GreenId);
32286impl TokenLTGreen {
32287    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
32288        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
32289    }
32290}
32291impl TypedSyntaxNode for TokenLT {
32292    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenLT);
32293    type StablePtr = TokenLTPtr;
32294    type Green = TokenLTGreen;
32295    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
32296        TokenLTGreen(
32297            Arc::new(GreenNode {
32298                kind: SyntaxKind::TokenMissing,
32299                details: GreenNodeDetails::Token("".into()),
32300            })
32301            .intern(db),
32302        )
32303    }
32304    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
32305        match node.0.green.lookup_intern(db).details {
32306            GreenNodeDetails::Token(_) => Self { node },
32307            GreenNodeDetails::Node { .. } => {
32308                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenLT)
32309            }
32310        }
32311    }
32312    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
32313        match node.0.green.lookup_intern(db).details {
32314            GreenNodeDetails::Token(_) => Some(Self { node }),
32315            GreenNodeDetails::Node { .. } => None,
32316        }
32317    }
32318    fn as_syntax_node(&self) -> SyntaxNode {
32319        self.node.clone()
32320    }
32321    fn stable_ptr(&self) -> Self::StablePtr {
32322        TokenLTPtr(self.node.0.stable_ptr)
32323    }
32324}
32325impl From<&TokenLT> for SyntaxStablePtrId {
32326    fn from(node: &TokenLT) -> Self {
32327        node.stable_ptr().untyped()
32328    }
32329}
32330#[derive(Clone, Debug, Eq, Hash, PartialEq)]
32331pub struct TerminalLT {
32332    node: SyntaxNode,
32333    children: Arc<[SyntaxNode]>,
32334}
32335impl Terminal for TerminalLT {
32336    const KIND: SyntaxKind = SyntaxKind::TerminalLT;
32337    type TokenType = TokenLT;
32338    fn new_green(
32339        db: &dyn SyntaxGroup,
32340        leading_trivia: TriviaGreen,
32341        token: <<TerminalLT as Terminal>::TokenType as TypedSyntaxNode>::Green,
32342        trailing_trivia: TriviaGreen,
32343    ) -> Self::Green {
32344        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
32345        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
32346        TerminalLTGreen(
32347            Arc::new(GreenNode {
32348                kind: SyntaxKind::TerminalLT,
32349                details: GreenNodeDetails::Node { children, width },
32350            })
32351            .intern(db),
32352        )
32353    }
32354    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
32355        self.token(db).text(db)
32356    }
32357}
32358impl TerminalLT {
32359    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
32360        Trivia::from_syntax_node(db, self.children[0].clone())
32361    }
32362    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenLT {
32363        TokenLT::from_syntax_node(db, self.children[1].clone())
32364    }
32365    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
32366        Trivia::from_syntax_node(db, self.children[2].clone())
32367    }
32368}
32369#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
32370pub struct TerminalLTPtr(pub SyntaxStablePtrId);
32371impl TerminalLTPtr {}
32372impl TypedStablePtr for TerminalLTPtr {
32373    type SyntaxNode = TerminalLT;
32374    fn untyped(&self) -> SyntaxStablePtrId {
32375        self.0
32376    }
32377    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalLT {
32378        TerminalLT::from_syntax_node(db, self.0.lookup(db))
32379    }
32380}
32381impl From<TerminalLTPtr> for SyntaxStablePtrId {
32382    fn from(ptr: TerminalLTPtr) -> Self {
32383        ptr.untyped()
32384    }
32385}
32386#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
32387pub struct TerminalLTGreen(pub GreenId);
32388impl TypedSyntaxNode for TerminalLT {
32389    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalLT);
32390    type StablePtr = TerminalLTPtr;
32391    type Green = TerminalLTGreen;
32392    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
32393        TerminalLTGreen(
32394            Arc::new(GreenNode {
32395                kind: SyntaxKind::TerminalLT,
32396                details: GreenNodeDetails::Node {
32397                    children: vec![
32398                        Trivia::missing(db).0,
32399                        TokenLT::missing(db).0,
32400                        Trivia::missing(db).0,
32401                    ],
32402                    width: TextWidth::default(),
32403                },
32404            })
32405            .intern(db),
32406        )
32407    }
32408    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
32409        let kind = node.kind(db);
32410        assert_eq!(
32411            kind,
32412            SyntaxKind::TerminalLT,
32413            "Unexpected SyntaxKind {:?}. Expected {:?}.",
32414            kind,
32415            SyntaxKind::TerminalLT
32416        );
32417        let children = db.get_children(node.clone());
32418        Self { node, children }
32419    }
32420    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
32421        let kind = node.kind(db);
32422        if kind == SyntaxKind::TerminalLT { Some(Self::from_syntax_node(db, node)) } else { None }
32423    }
32424    fn as_syntax_node(&self) -> SyntaxNode {
32425        self.node.clone()
32426    }
32427    fn stable_ptr(&self) -> Self::StablePtr {
32428        TerminalLTPtr(self.node.0.stable_ptr)
32429    }
32430}
32431impl From<&TerminalLT> for SyntaxStablePtrId {
32432    fn from(node: &TerminalLT) -> Self {
32433        node.stable_ptr().untyped()
32434    }
32435}
32436#[derive(Clone, Debug, Eq, Hash, PartialEq)]
32437pub struct TokenMatchArrow {
32438    node: SyntaxNode,
32439}
32440impl Token for TokenMatchArrow {
32441    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
32442        TokenMatchArrowGreen(
32443            Arc::new(GreenNode {
32444                kind: SyntaxKind::TokenMatchArrow,
32445                details: GreenNodeDetails::Token(text),
32446            })
32447            .intern(db),
32448        )
32449    }
32450    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
32451        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
32452            .clone()
32453    }
32454}
32455#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
32456pub struct TokenMatchArrowPtr(pub SyntaxStablePtrId);
32457impl TypedStablePtr for TokenMatchArrowPtr {
32458    type SyntaxNode = TokenMatchArrow;
32459    fn untyped(&self) -> SyntaxStablePtrId {
32460        self.0
32461    }
32462    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenMatchArrow {
32463        TokenMatchArrow::from_syntax_node(db, self.0.lookup(db))
32464    }
32465}
32466impl From<TokenMatchArrowPtr> for SyntaxStablePtrId {
32467    fn from(ptr: TokenMatchArrowPtr) -> Self {
32468        ptr.untyped()
32469    }
32470}
32471#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
32472pub struct TokenMatchArrowGreen(pub GreenId);
32473impl TokenMatchArrowGreen {
32474    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
32475        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
32476    }
32477}
32478impl TypedSyntaxNode for TokenMatchArrow {
32479    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenMatchArrow);
32480    type StablePtr = TokenMatchArrowPtr;
32481    type Green = TokenMatchArrowGreen;
32482    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
32483        TokenMatchArrowGreen(
32484            Arc::new(GreenNode {
32485                kind: SyntaxKind::TokenMissing,
32486                details: GreenNodeDetails::Token("".into()),
32487            })
32488            .intern(db),
32489        )
32490    }
32491    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
32492        match node.0.green.lookup_intern(db).details {
32493            GreenNodeDetails::Token(_) => Self { node },
32494            GreenNodeDetails::Node { .. } => {
32495                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenMatchArrow)
32496            }
32497        }
32498    }
32499    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
32500        match node.0.green.lookup_intern(db).details {
32501            GreenNodeDetails::Token(_) => Some(Self { node }),
32502            GreenNodeDetails::Node { .. } => None,
32503        }
32504    }
32505    fn as_syntax_node(&self) -> SyntaxNode {
32506        self.node.clone()
32507    }
32508    fn stable_ptr(&self) -> Self::StablePtr {
32509        TokenMatchArrowPtr(self.node.0.stable_ptr)
32510    }
32511}
32512impl From<&TokenMatchArrow> for SyntaxStablePtrId {
32513    fn from(node: &TokenMatchArrow) -> Self {
32514        node.stable_ptr().untyped()
32515    }
32516}
32517#[derive(Clone, Debug, Eq, Hash, PartialEq)]
32518pub struct TerminalMatchArrow {
32519    node: SyntaxNode,
32520    children: Arc<[SyntaxNode]>,
32521}
32522impl Terminal for TerminalMatchArrow {
32523    const KIND: SyntaxKind = SyntaxKind::TerminalMatchArrow;
32524    type TokenType = TokenMatchArrow;
32525    fn new_green(
32526        db: &dyn SyntaxGroup,
32527        leading_trivia: TriviaGreen,
32528        token: <<TerminalMatchArrow as Terminal>::TokenType as TypedSyntaxNode>::Green,
32529        trailing_trivia: TriviaGreen,
32530    ) -> Self::Green {
32531        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
32532        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
32533        TerminalMatchArrowGreen(
32534            Arc::new(GreenNode {
32535                kind: SyntaxKind::TerminalMatchArrow,
32536                details: GreenNodeDetails::Node { children, width },
32537            })
32538            .intern(db),
32539        )
32540    }
32541    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
32542        self.token(db).text(db)
32543    }
32544}
32545impl TerminalMatchArrow {
32546    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
32547        Trivia::from_syntax_node(db, self.children[0].clone())
32548    }
32549    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenMatchArrow {
32550        TokenMatchArrow::from_syntax_node(db, self.children[1].clone())
32551    }
32552    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
32553        Trivia::from_syntax_node(db, self.children[2].clone())
32554    }
32555}
32556#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
32557pub struct TerminalMatchArrowPtr(pub SyntaxStablePtrId);
32558impl TerminalMatchArrowPtr {}
32559impl TypedStablePtr for TerminalMatchArrowPtr {
32560    type SyntaxNode = TerminalMatchArrow;
32561    fn untyped(&self) -> SyntaxStablePtrId {
32562        self.0
32563    }
32564    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalMatchArrow {
32565        TerminalMatchArrow::from_syntax_node(db, self.0.lookup(db))
32566    }
32567}
32568impl From<TerminalMatchArrowPtr> for SyntaxStablePtrId {
32569    fn from(ptr: TerminalMatchArrowPtr) -> Self {
32570        ptr.untyped()
32571    }
32572}
32573#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
32574pub struct TerminalMatchArrowGreen(pub GreenId);
32575impl TypedSyntaxNode for TerminalMatchArrow {
32576    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalMatchArrow);
32577    type StablePtr = TerminalMatchArrowPtr;
32578    type Green = TerminalMatchArrowGreen;
32579    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
32580        TerminalMatchArrowGreen(
32581            Arc::new(GreenNode {
32582                kind: SyntaxKind::TerminalMatchArrow,
32583                details: GreenNodeDetails::Node {
32584                    children: vec![
32585                        Trivia::missing(db).0,
32586                        TokenMatchArrow::missing(db).0,
32587                        Trivia::missing(db).0,
32588                    ],
32589                    width: TextWidth::default(),
32590                },
32591            })
32592            .intern(db),
32593        )
32594    }
32595    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
32596        let kind = node.kind(db);
32597        assert_eq!(
32598            kind,
32599            SyntaxKind::TerminalMatchArrow,
32600            "Unexpected SyntaxKind {:?}. Expected {:?}.",
32601            kind,
32602            SyntaxKind::TerminalMatchArrow
32603        );
32604        let children = db.get_children(node.clone());
32605        Self { node, children }
32606    }
32607    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
32608        let kind = node.kind(db);
32609        if kind == SyntaxKind::TerminalMatchArrow {
32610            Some(Self::from_syntax_node(db, node))
32611        } else {
32612            None
32613        }
32614    }
32615    fn as_syntax_node(&self) -> SyntaxNode {
32616        self.node.clone()
32617    }
32618    fn stable_ptr(&self) -> Self::StablePtr {
32619        TerminalMatchArrowPtr(self.node.0.stable_ptr)
32620    }
32621}
32622impl From<&TerminalMatchArrow> for SyntaxStablePtrId {
32623    fn from(node: &TerminalMatchArrow) -> Self {
32624        node.stable_ptr().untyped()
32625    }
32626}
32627#[derive(Clone, Debug, Eq, Hash, PartialEq)]
32628pub struct TokenMinus {
32629    node: SyntaxNode,
32630}
32631impl Token for TokenMinus {
32632    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
32633        TokenMinusGreen(
32634            Arc::new(GreenNode {
32635                kind: SyntaxKind::TokenMinus,
32636                details: GreenNodeDetails::Token(text),
32637            })
32638            .intern(db),
32639        )
32640    }
32641    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
32642        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
32643            .clone()
32644    }
32645}
32646#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
32647pub struct TokenMinusPtr(pub SyntaxStablePtrId);
32648impl TypedStablePtr for TokenMinusPtr {
32649    type SyntaxNode = TokenMinus;
32650    fn untyped(&self) -> SyntaxStablePtrId {
32651        self.0
32652    }
32653    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenMinus {
32654        TokenMinus::from_syntax_node(db, self.0.lookup(db))
32655    }
32656}
32657impl From<TokenMinusPtr> for SyntaxStablePtrId {
32658    fn from(ptr: TokenMinusPtr) -> Self {
32659        ptr.untyped()
32660    }
32661}
32662#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
32663pub struct TokenMinusGreen(pub GreenId);
32664impl TokenMinusGreen {
32665    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
32666        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
32667    }
32668}
32669impl TypedSyntaxNode for TokenMinus {
32670    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenMinus);
32671    type StablePtr = TokenMinusPtr;
32672    type Green = TokenMinusGreen;
32673    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
32674        TokenMinusGreen(
32675            Arc::new(GreenNode {
32676                kind: SyntaxKind::TokenMissing,
32677                details: GreenNodeDetails::Token("".into()),
32678            })
32679            .intern(db),
32680        )
32681    }
32682    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
32683        match node.0.green.lookup_intern(db).details {
32684            GreenNodeDetails::Token(_) => Self { node },
32685            GreenNodeDetails::Node { .. } => {
32686                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenMinus)
32687            }
32688        }
32689    }
32690    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
32691        match node.0.green.lookup_intern(db).details {
32692            GreenNodeDetails::Token(_) => Some(Self { node }),
32693            GreenNodeDetails::Node { .. } => None,
32694        }
32695    }
32696    fn as_syntax_node(&self) -> SyntaxNode {
32697        self.node.clone()
32698    }
32699    fn stable_ptr(&self) -> Self::StablePtr {
32700        TokenMinusPtr(self.node.0.stable_ptr)
32701    }
32702}
32703impl From<&TokenMinus> for SyntaxStablePtrId {
32704    fn from(node: &TokenMinus) -> Self {
32705        node.stable_ptr().untyped()
32706    }
32707}
32708#[derive(Clone, Debug, Eq, Hash, PartialEq)]
32709pub struct TerminalMinus {
32710    node: SyntaxNode,
32711    children: Arc<[SyntaxNode]>,
32712}
32713impl Terminal for TerminalMinus {
32714    const KIND: SyntaxKind = SyntaxKind::TerminalMinus;
32715    type TokenType = TokenMinus;
32716    fn new_green(
32717        db: &dyn SyntaxGroup,
32718        leading_trivia: TriviaGreen,
32719        token: <<TerminalMinus as Terminal>::TokenType as TypedSyntaxNode>::Green,
32720        trailing_trivia: TriviaGreen,
32721    ) -> Self::Green {
32722        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
32723        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
32724        TerminalMinusGreen(
32725            Arc::new(GreenNode {
32726                kind: SyntaxKind::TerminalMinus,
32727                details: GreenNodeDetails::Node { children, width },
32728            })
32729            .intern(db),
32730        )
32731    }
32732    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
32733        self.token(db).text(db)
32734    }
32735}
32736impl TerminalMinus {
32737    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
32738        Trivia::from_syntax_node(db, self.children[0].clone())
32739    }
32740    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenMinus {
32741        TokenMinus::from_syntax_node(db, self.children[1].clone())
32742    }
32743    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
32744        Trivia::from_syntax_node(db, self.children[2].clone())
32745    }
32746}
32747#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
32748pub struct TerminalMinusPtr(pub SyntaxStablePtrId);
32749impl TerminalMinusPtr {}
32750impl TypedStablePtr for TerminalMinusPtr {
32751    type SyntaxNode = TerminalMinus;
32752    fn untyped(&self) -> SyntaxStablePtrId {
32753        self.0
32754    }
32755    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalMinus {
32756        TerminalMinus::from_syntax_node(db, self.0.lookup(db))
32757    }
32758}
32759impl From<TerminalMinusPtr> for SyntaxStablePtrId {
32760    fn from(ptr: TerminalMinusPtr) -> Self {
32761        ptr.untyped()
32762    }
32763}
32764#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
32765pub struct TerminalMinusGreen(pub GreenId);
32766impl TypedSyntaxNode for TerminalMinus {
32767    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalMinus);
32768    type StablePtr = TerminalMinusPtr;
32769    type Green = TerminalMinusGreen;
32770    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
32771        TerminalMinusGreen(
32772            Arc::new(GreenNode {
32773                kind: SyntaxKind::TerminalMinus,
32774                details: GreenNodeDetails::Node {
32775                    children: vec![
32776                        Trivia::missing(db).0,
32777                        TokenMinus::missing(db).0,
32778                        Trivia::missing(db).0,
32779                    ],
32780                    width: TextWidth::default(),
32781                },
32782            })
32783            .intern(db),
32784        )
32785    }
32786    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
32787        let kind = node.kind(db);
32788        assert_eq!(
32789            kind,
32790            SyntaxKind::TerminalMinus,
32791            "Unexpected SyntaxKind {:?}. Expected {:?}.",
32792            kind,
32793            SyntaxKind::TerminalMinus
32794        );
32795        let children = db.get_children(node.clone());
32796        Self { node, children }
32797    }
32798    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
32799        let kind = node.kind(db);
32800        if kind == SyntaxKind::TerminalMinus {
32801            Some(Self::from_syntax_node(db, node))
32802        } else {
32803            None
32804        }
32805    }
32806    fn as_syntax_node(&self) -> SyntaxNode {
32807        self.node.clone()
32808    }
32809    fn stable_ptr(&self) -> Self::StablePtr {
32810        TerminalMinusPtr(self.node.0.stable_ptr)
32811    }
32812}
32813impl From<&TerminalMinus> for SyntaxStablePtrId {
32814    fn from(node: &TerminalMinus) -> Self {
32815        node.stable_ptr().untyped()
32816    }
32817}
32818#[derive(Clone, Debug, Eq, Hash, PartialEq)]
32819pub struct TokenMinusEq {
32820    node: SyntaxNode,
32821}
32822impl Token for TokenMinusEq {
32823    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
32824        TokenMinusEqGreen(
32825            Arc::new(GreenNode {
32826                kind: SyntaxKind::TokenMinusEq,
32827                details: GreenNodeDetails::Token(text),
32828            })
32829            .intern(db),
32830        )
32831    }
32832    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
32833        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
32834            .clone()
32835    }
32836}
32837#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
32838pub struct TokenMinusEqPtr(pub SyntaxStablePtrId);
32839impl TypedStablePtr for TokenMinusEqPtr {
32840    type SyntaxNode = TokenMinusEq;
32841    fn untyped(&self) -> SyntaxStablePtrId {
32842        self.0
32843    }
32844    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenMinusEq {
32845        TokenMinusEq::from_syntax_node(db, self.0.lookup(db))
32846    }
32847}
32848impl From<TokenMinusEqPtr> for SyntaxStablePtrId {
32849    fn from(ptr: TokenMinusEqPtr) -> Self {
32850        ptr.untyped()
32851    }
32852}
32853#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
32854pub struct TokenMinusEqGreen(pub GreenId);
32855impl TokenMinusEqGreen {
32856    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
32857        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
32858    }
32859}
32860impl TypedSyntaxNode for TokenMinusEq {
32861    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenMinusEq);
32862    type StablePtr = TokenMinusEqPtr;
32863    type Green = TokenMinusEqGreen;
32864    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
32865        TokenMinusEqGreen(
32866            Arc::new(GreenNode {
32867                kind: SyntaxKind::TokenMissing,
32868                details: GreenNodeDetails::Token("".into()),
32869            })
32870            .intern(db),
32871        )
32872    }
32873    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
32874        match node.0.green.lookup_intern(db).details {
32875            GreenNodeDetails::Token(_) => Self { node },
32876            GreenNodeDetails::Node { .. } => {
32877                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenMinusEq)
32878            }
32879        }
32880    }
32881    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
32882        match node.0.green.lookup_intern(db).details {
32883            GreenNodeDetails::Token(_) => Some(Self { node }),
32884            GreenNodeDetails::Node { .. } => None,
32885        }
32886    }
32887    fn as_syntax_node(&self) -> SyntaxNode {
32888        self.node.clone()
32889    }
32890    fn stable_ptr(&self) -> Self::StablePtr {
32891        TokenMinusEqPtr(self.node.0.stable_ptr)
32892    }
32893}
32894impl From<&TokenMinusEq> for SyntaxStablePtrId {
32895    fn from(node: &TokenMinusEq) -> Self {
32896        node.stable_ptr().untyped()
32897    }
32898}
32899#[derive(Clone, Debug, Eq, Hash, PartialEq)]
32900pub struct TerminalMinusEq {
32901    node: SyntaxNode,
32902    children: Arc<[SyntaxNode]>,
32903}
32904impl Terminal for TerminalMinusEq {
32905    const KIND: SyntaxKind = SyntaxKind::TerminalMinusEq;
32906    type TokenType = TokenMinusEq;
32907    fn new_green(
32908        db: &dyn SyntaxGroup,
32909        leading_trivia: TriviaGreen,
32910        token: <<TerminalMinusEq as Terminal>::TokenType as TypedSyntaxNode>::Green,
32911        trailing_trivia: TriviaGreen,
32912    ) -> Self::Green {
32913        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
32914        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
32915        TerminalMinusEqGreen(
32916            Arc::new(GreenNode {
32917                kind: SyntaxKind::TerminalMinusEq,
32918                details: GreenNodeDetails::Node { children, width },
32919            })
32920            .intern(db),
32921        )
32922    }
32923    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
32924        self.token(db).text(db)
32925    }
32926}
32927impl TerminalMinusEq {
32928    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
32929        Trivia::from_syntax_node(db, self.children[0].clone())
32930    }
32931    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenMinusEq {
32932        TokenMinusEq::from_syntax_node(db, self.children[1].clone())
32933    }
32934    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
32935        Trivia::from_syntax_node(db, self.children[2].clone())
32936    }
32937}
32938#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
32939pub struct TerminalMinusEqPtr(pub SyntaxStablePtrId);
32940impl TerminalMinusEqPtr {}
32941impl TypedStablePtr for TerminalMinusEqPtr {
32942    type SyntaxNode = TerminalMinusEq;
32943    fn untyped(&self) -> SyntaxStablePtrId {
32944        self.0
32945    }
32946    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalMinusEq {
32947        TerminalMinusEq::from_syntax_node(db, self.0.lookup(db))
32948    }
32949}
32950impl From<TerminalMinusEqPtr> for SyntaxStablePtrId {
32951    fn from(ptr: TerminalMinusEqPtr) -> Self {
32952        ptr.untyped()
32953    }
32954}
32955#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
32956pub struct TerminalMinusEqGreen(pub GreenId);
32957impl TypedSyntaxNode for TerminalMinusEq {
32958    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalMinusEq);
32959    type StablePtr = TerminalMinusEqPtr;
32960    type Green = TerminalMinusEqGreen;
32961    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
32962        TerminalMinusEqGreen(
32963            Arc::new(GreenNode {
32964                kind: SyntaxKind::TerminalMinusEq,
32965                details: GreenNodeDetails::Node {
32966                    children: vec![
32967                        Trivia::missing(db).0,
32968                        TokenMinusEq::missing(db).0,
32969                        Trivia::missing(db).0,
32970                    ],
32971                    width: TextWidth::default(),
32972                },
32973            })
32974            .intern(db),
32975        )
32976    }
32977    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
32978        let kind = node.kind(db);
32979        assert_eq!(
32980            kind,
32981            SyntaxKind::TerminalMinusEq,
32982            "Unexpected SyntaxKind {:?}. Expected {:?}.",
32983            kind,
32984            SyntaxKind::TerminalMinusEq
32985        );
32986        let children = db.get_children(node.clone());
32987        Self { node, children }
32988    }
32989    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
32990        let kind = node.kind(db);
32991        if kind == SyntaxKind::TerminalMinusEq {
32992            Some(Self::from_syntax_node(db, node))
32993        } else {
32994            None
32995        }
32996    }
32997    fn as_syntax_node(&self) -> SyntaxNode {
32998        self.node.clone()
32999    }
33000    fn stable_ptr(&self) -> Self::StablePtr {
33001        TerminalMinusEqPtr(self.node.0.stable_ptr)
33002    }
33003}
33004impl From<&TerminalMinusEq> for SyntaxStablePtrId {
33005    fn from(node: &TerminalMinusEq) -> Self {
33006        node.stable_ptr().untyped()
33007    }
33008}
33009#[derive(Clone, Debug, Eq, Hash, PartialEq)]
33010pub struct TokenMod {
33011    node: SyntaxNode,
33012}
33013impl Token for TokenMod {
33014    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
33015        TokenModGreen(
33016            Arc::new(GreenNode {
33017                kind: SyntaxKind::TokenMod,
33018                details: GreenNodeDetails::Token(text),
33019            })
33020            .intern(db),
33021        )
33022    }
33023    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
33024        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
33025            .clone()
33026    }
33027}
33028#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
33029pub struct TokenModPtr(pub SyntaxStablePtrId);
33030impl TypedStablePtr for TokenModPtr {
33031    type SyntaxNode = TokenMod;
33032    fn untyped(&self) -> SyntaxStablePtrId {
33033        self.0
33034    }
33035    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenMod {
33036        TokenMod::from_syntax_node(db, self.0.lookup(db))
33037    }
33038}
33039impl From<TokenModPtr> for SyntaxStablePtrId {
33040    fn from(ptr: TokenModPtr) -> Self {
33041        ptr.untyped()
33042    }
33043}
33044#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
33045pub struct TokenModGreen(pub GreenId);
33046impl TokenModGreen {
33047    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
33048        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
33049    }
33050}
33051impl TypedSyntaxNode for TokenMod {
33052    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenMod);
33053    type StablePtr = TokenModPtr;
33054    type Green = TokenModGreen;
33055    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
33056        TokenModGreen(
33057            Arc::new(GreenNode {
33058                kind: SyntaxKind::TokenMissing,
33059                details: GreenNodeDetails::Token("".into()),
33060            })
33061            .intern(db),
33062        )
33063    }
33064    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
33065        match node.0.green.lookup_intern(db).details {
33066            GreenNodeDetails::Token(_) => Self { node },
33067            GreenNodeDetails::Node { .. } => {
33068                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenMod)
33069            }
33070        }
33071    }
33072    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
33073        match node.0.green.lookup_intern(db).details {
33074            GreenNodeDetails::Token(_) => Some(Self { node }),
33075            GreenNodeDetails::Node { .. } => None,
33076        }
33077    }
33078    fn as_syntax_node(&self) -> SyntaxNode {
33079        self.node.clone()
33080    }
33081    fn stable_ptr(&self) -> Self::StablePtr {
33082        TokenModPtr(self.node.0.stable_ptr)
33083    }
33084}
33085impl From<&TokenMod> for SyntaxStablePtrId {
33086    fn from(node: &TokenMod) -> Self {
33087        node.stable_ptr().untyped()
33088    }
33089}
33090#[derive(Clone, Debug, Eq, Hash, PartialEq)]
33091pub struct TerminalMod {
33092    node: SyntaxNode,
33093    children: Arc<[SyntaxNode]>,
33094}
33095impl Terminal for TerminalMod {
33096    const KIND: SyntaxKind = SyntaxKind::TerminalMod;
33097    type TokenType = TokenMod;
33098    fn new_green(
33099        db: &dyn SyntaxGroup,
33100        leading_trivia: TriviaGreen,
33101        token: <<TerminalMod as Terminal>::TokenType as TypedSyntaxNode>::Green,
33102        trailing_trivia: TriviaGreen,
33103    ) -> Self::Green {
33104        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
33105        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
33106        TerminalModGreen(
33107            Arc::new(GreenNode {
33108                kind: SyntaxKind::TerminalMod,
33109                details: GreenNodeDetails::Node { children, width },
33110            })
33111            .intern(db),
33112        )
33113    }
33114    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
33115        self.token(db).text(db)
33116    }
33117}
33118impl TerminalMod {
33119    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
33120        Trivia::from_syntax_node(db, self.children[0].clone())
33121    }
33122    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenMod {
33123        TokenMod::from_syntax_node(db, self.children[1].clone())
33124    }
33125    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
33126        Trivia::from_syntax_node(db, self.children[2].clone())
33127    }
33128}
33129#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
33130pub struct TerminalModPtr(pub SyntaxStablePtrId);
33131impl TerminalModPtr {}
33132impl TypedStablePtr for TerminalModPtr {
33133    type SyntaxNode = TerminalMod;
33134    fn untyped(&self) -> SyntaxStablePtrId {
33135        self.0
33136    }
33137    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalMod {
33138        TerminalMod::from_syntax_node(db, self.0.lookup(db))
33139    }
33140}
33141impl From<TerminalModPtr> for SyntaxStablePtrId {
33142    fn from(ptr: TerminalModPtr) -> Self {
33143        ptr.untyped()
33144    }
33145}
33146#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
33147pub struct TerminalModGreen(pub GreenId);
33148impl TypedSyntaxNode for TerminalMod {
33149    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalMod);
33150    type StablePtr = TerminalModPtr;
33151    type Green = TerminalModGreen;
33152    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
33153        TerminalModGreen(
33154            Arc::new(GreenNode {
33155                kind: SyntaxKind::TerminalMod,
33156                details: GreenNodeDetails::Node {
33157                    children: vec![
33158                        Trivia::missing(db).0,
33159                        TokenMod::missing(db).0,
33160                        Trivia::missing(db).0,
33161                    ],
33162                    width: TextWidth::default(),
33163                },
33164            })
33165            .intern(db),
33166        )
33167    }
33168    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
33169        let kind = node.kind(db);
33170        assert_eq!(
33171            kind,
33172            SyntaxKind::TerminalMod,
33173            "Unexpected SyntaxKind {:?}. Expected {:?}.",
33174            kind,
33175            SyntaxKind::TerminalMod
33176        );
33177        let children = db.get_children(node.clone());
33178        Self { node, children }
33179    }
33180    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
33181        let kind = node.kind(db);
33182        if kind == SyntaxKind::TerminalMod { Some(Self::from_syntax_node(db, node)) } else { None }
33183    }
33184    fn as_syntax_node(&self) -> SyntaxNode {
33185        self.node.clone()
33186    }
33187    fn stable_ptr(&self) -> Self::StablePtr {
33188        TerminalModPtr(self.node.0.stable_ptr)
33189    }
33190}
33191impl From<&TerminalMod> for SyntaxStablePtrId {
33192    fn from(node: &TerminalMod) -> Self {
33193        node.stable_ptr().untyped()
33194    }
33195}
33196#[derive(Clone, Debug, Eq, Hash, PartialEq)]
33197pub struct TokenModEq {
33198    node: SyntaxNode,
33199}
33200impl Token for TokenModEq {
33201    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
33202        TokenModEqGreen(
33203            Arc::new(GreenNode {
33204                kind: SyntaxKind::TokenModEq,
33205                details: GreenNodeDetails::Token(text),
33206            })
33207            .intern(db),
33208        )
33209    }
33210    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
33211        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
33212            .clone()
33213    }
33214}
33215#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
33216pub struct TokenModEqPtr(pub SyntaxStablePtrId);
33217impl TypedStablePtr for TokenModEqPtr {
33218    type SyntaxNode = TokenModEq;
33219    fn untyped(&self) -> SyntaxStablePtrId {
33220        self.0
33221    }
33222    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenModEq {
33223        TokenModEq::from_syntax_node(db, self.0.lookup(db))
33224    }
33225}
33226impl From<TokenModEqPtr> for SyntaxStablePtrId {
33227    fn from(ptr: TokenModEqPtr) -> Self {
33228        ptr.untyped()
33229    }
33230}
33231#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
33232pub struct TokenModEqGreen(pub GreenId);
33233impl TokenModEqGreen {
33234    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
33235        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
33236    }
33237}
33238impl TypedSyntaxNode for TokenModEq {
33239    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenModEq);
33240    type StablePtr = TokenModEqPtr;
33241    type Green = TokenModEqGreen;
33242    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
33243        TokenModEqGreen(
33244            Arc::new(GreenNode {
33245                kind: SyntaxKind::TokenMissing,
33246                details: GreenNodeDetails::Token("".into()),
33247            })
33248            .intern(db),
33249        )
33250    }
33251    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
33252        match node.0.green.lookup_intern(db).details {
33253            GreenNodeDetails::Token(_) => Self { node },
33254            GreenNodeDetails::Node { .. } => {
33255                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenModEq)
33256            }
33257        }
33258    }
33259    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
33260        match node.0.green.lookup_intern(db).details {
33261            GreenNodeDetails::Token(_) => Some(Self { node }),
33262            GreenNodeDetails::Node { .. } => None,
33263        }
33264    }
33265    fn as_syntax_node(&self) -> SyntaxNode {
33266        self.node.clone()
33267    }
33268    fn stable_ptr(&self) -> Self::StablePtr {
33269        TokenModEqPtr(self.node.0.stable_ptr)
33270    }
33271}
33272impl From<&TokenModEq> for SyntaxStablePtrId {
33273    fn from(node: &TokenModEq) -> Self {
33274        node.stable_ptr().untyped()
33275    }
33276}
33277#[derive(Clone, Debug, Eq, Hash, PartialEq)]
33278pub struct TerminalModEq {
33279    node: SyntaxNode,
33280    children: Arc<[SyntaxNode]>,
33281}
33282impl Terminal for TerminalModEq {
33283    const KIND: SyntaxKind = SyntaxKind::TerminalModEq;
33284    type TokenType = TokenModEq;
33285    fn new_green(
33286        db: &dyn SyntaxGroup,
33287        leading_trivia: TriviaGreen,
33288        token: <<TerminalModEq as Terminal>::TokenType as TypedSyntaxNode>::Green,
33289        trailing_trivia: TriviaGreen,
33290    ) -> Self::Green {
33291        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
33292        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
33293        TerminalModEqGreen(
33294            Arc::new(GreenNode {
33295                kind: SyntaxKind::TerminalModEq,
33296                details: GreenNodeDetails::Node { children, width },
33297            })
33298            .intern(db),
33299        )
33300    }
33301    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
33302        self.token(db).text(db)
33303    }
33304}
33305impl TerminalModEq {
33306    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
33307        Trivia::from_syntax_node(db, self.children[0].clone())
33308    }
33309    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenModEq {
33310        TokenModEq::from_syntax_node(db, self.children[1].clone())
33311    }
33312    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
33313        Trivia::from_syntax_node(db, self.children[2].clone())
33314    }
33315}
33316#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
33317pub struct TerminalModEqPtr(pub SyntaxStablePtrId);
33318impl TerminalModEqPtr {}
33319impl TypedStablePtr for TerminalModEqPtr {
33320    type SyntaxNode = TerminalModEq;
33321    fn untyped(&self) -> SyntaxStablePtrId {
33322        self.0
33323    }
33324    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalModEq {
33325        TerminalModEq::from_syntax_node(db, self.0.lookup(db))
33326    }
33327}
33328impl From<TerminalModEqPtr> for SyntaxStablePtrId {
33329    fn from(ptr: TerminalModEqPtr) -> Self {
33330        ptr.untyped()
33331    }
33332}
33333#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
33334pub struct TerminalModEqGreen(pub GreenId);
33335impl TypedSyntaxNode for TerminalModEq {
33336    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalModEq);
33337    type StablePtr = TerminalModEqPtr;
33338    type Green = TerminalModEqGreen;
33339    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
33340        TerminalModEqGreen(
33341            Arc::new(GreenNode {
33342                kind: SyntaxKind::TerminalModEq,
33343                details: GreenNodeDetails::Node {
33344                    children: vec![
33345                        Trivia::missing(db).0,
33346                        TokenModEq::missing(db).0,
33347                        Trivia::missing(db).0,
33348                    ],
33349                    width: TextWidth::default(),
33350                },
33351            })
33352            .intern(db),
33353        )
33354    }
33355    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
33356        let kind = node.kind(db);
33357        assert_eq!(
33358            kind,
33359            SyntaxKind::TerminalModEq,
33360            "Unexpected SyntaxKind {:?}. Expected {:?}.",
33361            kind,
33362            SyntaxKind::TerminalModEq
33363        );
33364        let children = db.get_children(node.clone());
33365        Self { node, children }
33366    }
33367    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
33368        let kind = node.kind(db);
33369        if kind == SyntaxKind::TerminalModEq {
33370            Some(Self::from_syntax_node(db, node))
33371        } else {
33372            None
33373        }
33374    }
33375    fn as_syntax_node(&self) -> SyntaxNode {
33376        self.node.clone()
33377    }
33378    fn stable_ptr(&self) -> Self::StablePtr {
33379        TerminalModEqPtr(self.node.0.stable_ptr)
33380    }
33381}
33382impl From<&TerminalModEq> for SyntaxStablePtrId {
33383    fn from(node: &TerminalModEq) -> Self {
33384        node.stable_ptr().untyped()
33385    }
33386}
33387#[derive(Clone, Debug, Eq, Hash, PartialEq)]
33388pub struct TokenMul {
33389    node: SyntaxNode,
33390}
33391impl Token for TokenMul {
33392    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
33393        TokenMulGreen(
33394            Arc::new(GreenNode {
33395                kind: SyntaxKind::TokenMul,
33396                details: GreenNodeDetails::Token(text),
33397            })
33398            .intern(db),
33399        )
33400    }
33401    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
33402        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
33403            .clone()
33404    }
33405}
33406#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
33407pub struct TokenMulPtr(pub SyntaxStablePtrId);
33408impl TypedStablePtr for TokenMulPtr {
33409    type SyntaxNode = TokenMul;
33410    fn untyped(&self) -> SyntaxStablePtrId {
33411        self.0
33412    }
33413    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenMul {
33414        TokenMul::from_syntax_node(db, self.0.lookup(db))
33415    }
33416}
33417impl From<TokenMulPtr> for SyntaxStablePtrId {
33418    fn from(ptr: TokenMulPtr) -> Self {
33419        ptr.untyped()
33420    }
33421}
33422#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
33423pub struct TokenMulGreen(pub GreenId);
33424impl TokenMulGreen {
33425    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
33426        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
33427    }
33428}
33429impl TypedSyntaxNode for TokenMul {
33430    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenMul);
33431    type StablePtr = TokenMulPtr;
33432    type Green = TokenMulGreen;
33433    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
33434        TokenMulGreen(
33435            Arc::new(GreenNode {
33436                kind: SyntaxKind::TokenMissing,
33437                details: GreenNodeDetails::Token("".into()),
33438            })
33439            .intern(db),
33440        )
33441    }
33442    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
33443        match node.0.green.lookup_intern(db).details {
33444            GreenNodeDetails::Token(_) => Self { node },
33445            GreenNodeDetails::Node { .. } => {
33446                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenMul)
33447            }
33448        }
33449    }
33450    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
33451        match node.0.green.lookup_intern(db).details {
33452            GreenNodeDetails::Token(_) => Some(Self { node }),
33453            GreenNodeDetails::Node { .. } => None,
33454        }
33455    }
33456    fn as_syntax_node(&self) -> SyntaxNode {
33457        self.node.clone()
33458    }
33459    fn stable_ptr(&self) -> Self::StablePtr {
33460        TokenMulPtr(self.node.0.stable_ptr)
33461    }
33462}
33463impl From<&TokenMul> for SyntaxStablePtrId {
33464    fn from(node: &TokenMul) -> Self {
33465        node.stable_ptr().untyped()
33466    }
33467}
33468#[derive(Clone, Debug, Eq, Hash, PartialEq)]
33469pub struct TerminalMul {
33470    node: SyntaxNode,
33471    children: Arc<[SyntaxNode]>,
33472}
33473impl Terminal for TerminalMul {
33474    const KIND: SyntaxKind = SyntaxKind::TerminalMul;
33475    type TokenType = TokenMul;
33476    fn new_green(
33477        db: &dyn SyntaxGroup,
33478        leading_trivia: TriviaGreen,
33479        token: <<TerminalMul as Terminal>::TokenType as TypedSyntaxNode>::Green,
33480        trailing_trivia: TriviaGreen,
33481    ) -> Self::Green {
33482        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
33483        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
33484        TerminalMulGreen(
33485            Arc::new(GreenNode {
33486                kind: SyntaxKind::TerminalMul,
33487                details: GreenNodeDetails::Node { children, width },
33488            })
33489            .intern(db),
33490        )
33491    }
33492    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
33493        self.token(db).text(db)
33494    }
33495}
33496impl TerminalMul {
33497    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
33498        Trivia::from_syntax_node(db, self.children[0].clone())
33499    }
33500    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenMul {
33501        TokenMul::from_syntax_node(db, self.children[1].clone())
33502    }
33503    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
33504        Trivia::from_syntax_node(db, self.children[2].clone())
33505    }
33506}
33507#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
33508pub struct TerminalMulPtr(pub SyntaxStablePtrId);
33509impl TerminalMulPtr {}
33510impl TypedStablePtr for TerminalMulPtr {
33511    type SyntaxNode = TerminalMul;
33512    fn untyped(&self) -> SyntaxStablePtrId {
33513        self.0
33514    }
33515    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalMul {
33516        TerminalMul::from_syntax_node(db, self.0.lookup(db))
33517    }
33518}
33519impl From<TerminalMulPtr> for SyntaxStablePtrId {
33520    fn from(ptr: TerminalMulPtr) -> Self {
33521        ptr.untyped()
33522    }
33523}
33524#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
33525pub struct TerminalMulGreen(pub GreenId);
33526impl TypedSyntaxNode for TerminalMul {
33527    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalMul);
33528    type StablePtr = TerminalMulPtr;
33529    type Green = TerminalMulGreen;
33530    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
33531        TerminalMulGreen(
33532            Arc::new(GreenNode {
33533                kind: SyntaxKind::TerminalMul,
33534                details: GreenNodeDetails::Node {
33535                    children: vec![
33536                        Trivia::missing(db).0,
33537                        TokenMul::missing(db).0,
33538                        Trivia::missing(db).0,
33539                    ],
33540                    width: TextWidth::default(),
33541                },
33542            })
33543            .intern(db),
33544        )
33545    }
33546    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
33547        let kind = node.kind(db);
33548        assert_eq!(
33549            kind,
33550            SyntaxKind::TerminalMul,
33551            "Unexpected SyntaxKind {:?}. Expected {:?}.",
33552            kind,
33553            SyntaxKind::TerminalMul
33554        );
33555        let children = db.get_children(node.clone());
33556        Self { node, children }
33557    }
33558    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
33559        let kind = node.kind(db);
33560        if kind == SyntaxKind::TerminalMul { Some(Self::from_syntax_node(db, node)) } else { None }
33561    }
33562    fn as_syntax_node(&self) -> SyntaxNode {
33563        self.node.clone()
33564    }
33565    fn stable_ptr(&self) -> Self::StablePtr {
33566        TerminalMulPtr(self.node.0.stable_ptr)
33567    }
33568}
33569impl From<&TerminalMul> for SyntaxStablePtrId {
33570    fn from(node: &TerminalMul) -> Self {
33571        node.stable_ptr().untyped()
33572    }
33573}
33574#[derive(Clone, Debug, Eq, Hash, PartialEq)]
33575pub struct TokenMulEq {
33576    node: SyntaxNode,
33577}
33578impl Token for TokenMulEq {
33579    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
33580        TokenMulEqGreen(
33581            Arc::new(GreenNode {
33582                kind: SyntaxKind::TokenMulEq,
33583                details: GreenNodeDetails::Token(text),
33584            })
33585            .intern(db),
33586        )
33587    }
33588    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
33589        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
33590            .clone()
33591    }
33592}
33593#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
33594pub struct TokenMulEqPtr(pub SyntaxStablePtrId);
33595impl TypedStablePtr for TokenMulEqPtr {
33596    type SyntaxNode = TokenMulEq;
33597    fn untyped(&self) -> SyntaxStablePtrId {
33598        self.0
33599    }
33600    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenMulEq {
33601        TokenMulEq::from_syntax_node(db, self.0.lookup(db))
33602    }
33603}
33604impl From<TokenMulEqPtr> for SyntaxStablePtrId {
33605    fn from(ptr: TokenMulEqPtr) -> Self {
33606        ptr.untyped()
33607    }
33608}
33609#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
33610pub struct TokenMulEqGreen(pub GreenId);
33611impl TokenMulEqGreen {
33612    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
33613        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
33614    }
33615}
33616impl TypedSyntaxNode for TokenMulEq {
33617    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenMulEq);
33618    type StablePtr = TokenMulEqPtr;
33619    type Green = TokenMulEqGreen;
33620    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
33621        TokenMulEqGreen(
33622            Arc::new(GreenNode {
33623                kind: SyntaxKind::TokenMissing,
33624                details: GreenNodeDetails::Token("".into()),
33625            })
33626            .intern(db),
33627        )
33628    }
33629    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
33630        match node.0.green.lookup_intern(db).details {
33631            GreenNodeDetails::Token(_) => Self { node },
33632            GreenNodeDetails::Node { .. } => {
33633                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenMulEq)
33634            }
33635        }
33636    }
33637    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
33638        match node.0.green.lookup_intern(db).details {
33639            GreenNodeDetails::Token(_) => Some(Self { node }),
33640            GreenNodeDetails::Node { .. } => None,
33641        }
33642    }
33643    fn as_syntax_node(&self) -> SyntaxNode {
33644        self.node.clone()
33645    }
33646    fn stable_ptr(&self) -> Self::StablePtr {
33647        TokenMulEqPtr(self.node.0.stable_ptr)
33648    }
33649}
33650impl From<&TokenMulEq> for SyntaxStablePtrId {
33651    fn from(node: &TokenMulEq) -> Self {
33652        node.stable_ptr().untyped()
33653    }
33654}
33655#[derive(Clone, Debug, Eq, Hash, PartialEq)]
33656pub struct TerminalMulEq {
33657    node: SyntaxNode,
33658    children: Arc<[SyntaxNode]>,
33659}
33660impl Terminal for TerminalMulEq {
33661    const KIND: SyntaxKind = SyntaxKind::TerminalMulEq;
33662    type TokenType = TokenMulEq;
33663    fn new_green(
33664        db: &dyn SyntaxGroup,
33665        leading_trivia: TriviaGreen,
33666        token: <<TerminalMulEq as Terminal>::TokenType as TypedSyntaxNode>::Green,
33667        trailing_trivia: TriviaGreen,
33668    ) -> Self::Green {
33669        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
33670        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
33671        TerminalMulEqGreen(
33672            Arc::new(GreenNode {
33673                kind: SyntaxKind::TerminalMulEq,
33674                details: GreenNodeDetails::Node { children, width },
33675            })
33676            .intern(db),
33677        )
33678    }
33679    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
33680        self.token(db).text(db)
33681    }
33682}
33683impl TerminalMulEq {
33684    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
33685        Trivia::from_syntax_node(db, self.children[0].clone())
33686    }
33687    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenMulEq {
33688        TokenMulEq::from_syntax_node(db, self.children[1].clone())
33689    }
33690    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
33691        Trivia::from_syntax_node(db, self.children[2].clone())
33692    }
33693}
33694#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
33695pub struct TerminalMulEqPtr(pub SyntaxStablePtrId);
33696impl TerminalMulEqPtr {}
33697impl TypedStablePtr for TerminalMulEqPtr {
33698    type SyntaxNode = TerminalMulEq;
33699    fn untyped(&self) -> SyntaxStablePtrId {
33700        self.0
33701    }
33702    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalMulEq {
33703        TerminalMulEq::from_syntax_node(db, self.0.lookup(db))
33704    }
33705}
33706impl From<TerminalMulEqPtr> for SyntaxStablePtrId {
33707    fn from(ptr: TerminalMulEqPtr) -> Self {
33708        ptr.untyped()
33709    }
33710}
33711#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
33712pub struct TerminalMulEqGreen(pub GreenId);
33713impl TypedSyntaxNode for TerminalMulEq {
33714    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalMulEq);
33715    type StablePtr = TerminalMulEqPtr;
33716    type Green = TerminalMulEqGreen;
33717    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
33718        TerminalMulEqGreen(
33719            Arc::new(GreenNode {
33720                kind: SyntaxKind::TerminalMulEq,
33721                details: GreenNodeDetails::Node {
33722                    children: vec![
33723                        Trivia::missing(db).0,
33724                        TokenMulEq::missing(db).0,
33725                        Trivia::missing(db).0,
33726                    ],
33727                    width: TextWidth::default(),
33728                },
33729            })
33730            .intern(db),
33731        )
33732    }
33733    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
33734        let kind = node.kind(db);
33735        assert_eq!(
33736            kind,
33737            SyntaxKind::TerminalMulEq,
33738            "Unexpected SyntaxKind {:?}. Expected {:?}.",
33739            kind,
33740            SyntaxKind::TerminalMulEq
33741        );
33742        let children = db.get_children(node.clone());
33743        Self { node, children }
33744    }
33745    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
33746        let kind = node.kind(db);
33747        if kind == SyntaxKind::TerminalMulEq {
33748            Some(Self::from_syntax_node(db, node))
33749        } else {
33750            None
33751        }
33752    }
33753    fn as_syntax_node(&self) -> SyntaxNode {
33754        self.node.clone()
33755    }
33756    fn stable_ptr(&self) -> Self::StablePtr {
33757        TerminalMulEqPtr(self.node.0.stable_ptr)
33758    }
33759}
33760impl From<&TerminalMulEq> for SyntaxStablePtrId {
33761    fn from(node: &TerminalMulEq) -> Self {
33762        node.stable_ptr().untyped()
33763    }
33764}
33765#[derive(Clone, Debug, Eq, Hash, PartialEq)]
33766pub struct TokenNeq {
33767    node: SyntaxNode,
33768}
33769impl Token for TokenNeq {
33770    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
33771        TokenNeqGreen(
33772            Arc::new(GreenNode {
33773                kind: SyntaxKind::TokenNeq,
33774                details: GreenNodeDetails::Token(text),
33775            })
33776            .intern(db),
33777        )
33778    }
33779    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
33780        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
33781            .clone()
33782    }
33783}
33784#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
33785pub struct TokenNeqPtr(pub SyntaxStablePtrId);
33786impl TypedStablePtr for TokenNeqPtr {
33787    type SyntaxNode = TokenNeq;
33788    fn untyped(&self) -> SyntaxStablePtrId {
33789        self.0
33790    }
33791    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenNeq {
33792        TokenNeq::from_syntax_node(db, self.0.lookup(db))
33793    }
33794}
33795impl From<TokenNeqPtr> for SyntaxStablePtrId {
33796    fn from(ptr: TokenNeqPtr) -> Self {
33797        ptr.untyped()
33798    }
33799}
33800#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
33801pub struct TokenNeqGreen(pub GreenId);
33802impl TokenNeqGreen {
33803    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
33804        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
33805    }
33806}
33807impl TypedSyntaxNode for TokenNeq {
33808    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenNeq);
33809    type StablePtr = TokenNeqPtr;
33810    type Green = TokenNeqGreen;
33811    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
33812        TokenNeqGreen(
33813            Arc::new(GreenNode {
33814                kind: SyntaxKind::TokenMissing,
33815                details: GreenNodeDetails::Token("".into()),
33816            })
33817            .intern(db),
33818        )
33819    }
33820    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
33821        match node.0.green.lookup_intern(db).details {
33822            GreenNodeDetails::Token(_) => Self { node },
33823            GreenNodeDetails::Node { .. } => {
33824                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenNeq)
33825            }
33826        }
33827    }
33828    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
33829        match node.0.green.lookup_intern(db).details {
33830            GreenNodeDetails::Token(_) => Some(Self { node }),
33831            GreenNodeDetails::Node { .. } => None,
33832        }
33833    }
33834    fn as_syntax_node(&self) -> SyntaxNode {
33835        self.node.clone()
33836    }
33837    fn stable_ptr(&self) -> Self::StablePtr {
33838        TokenNeqPtr(self.node.0.stable_ptr)
33839    }
33840}
33841impl From<&TokenNeq> for SyntaxStablePtrId {
33842    fn from(node: &TokenNeq) -> Self {
33843        node.stable_ptr().untyped()
33844    }
33845}
33846#[derive(Clone, Debug, Eq, Hash, PartialEq)]
33847pub struct TerminalNeq {
33848    node: SyntaxNode,
33849    children: Arc<[SyntaxNode]>,
33850}
33851impl Terminal for TerminalNeq {
33852    const KIND: SyntaxKind = SyntaxKind::TerminalNeq;
33853    type TokenType = TokenNeq;
33854    fn new_green(
33855        db: &dyn SyntaxGroup,
33856        leading_trivia: TriviaGreen,
33857        token: <<TerminalNeq as Terminal>::TokenType as TypedSyntaxNode>::Green,
33858        trailing_trivia: TriviaGreen,
33859    ) -> Self::Green {
33860        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
33861        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
33862        TerminalNeqGreen(
33863            Arc::new(GreenNode {
33864                kind: SyntaxKind::TerminalNeq,
33865                details: GreenNodeDetails::Node { children, width },
33866            })
33867            .intern(db),
33868        )
33869    }
33870    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
33871        self.token(db).text(db)
33872    }
33873}
33874impl TerminalNeq {
33875    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
33876        Trivia::from_syntax_node(db, self.children[0].clone())
33877    }
33878    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenNeq {
33879        TokenNeq::from_syntax_node(db, self.children[1].clone())
33880    }
33881    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
33882        Trivia::from_syntax_node(db, self.children[2].clone())
33883    }
33884}
33885#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
33886pub struct TerminalNeqPtr(pub SyntaxStablePtrId);
33887impl TerminalNeqPtr {}
33888impl TypedStablePtr for TerminalNeqPtr {
33889    type SyntaxNode = TerminalNeq;
33890    fn untyped(&self) -> SyntaxStablePtrId {
33891        self.0
33892    }
33893    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalNeq {
33894        TerminalNeq::from_syntax_node(db, self.0.lookup(db))
33895    }
33896}
33897impl From<TerminalNeqPtr> for SyntaxStablePtrId {
33898    fn from(ptr: TerminalNeqPtr) -> Self {
33899        ptr.untyped()
33900    }
33901}
33902#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
33903pub struct TerminalNeqGreen(pub GreenId);
33904impl TypedSyntaxNode for TerminalNeq {
33905    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalNeq);
33906    type StablePtr = TerminalNeqPtr;
33907    type Green = TerminalNeqGreen;
33908    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
33909        TerminalNeqGreen(
33910            Arc::new(GreenNode {
33911                kind: SyntaxKind::TerminalNeq,
33912                details: GreenNodeDetails::Node {
33913                    children: vec![
33914                        Trivia::missing(db).0,
33915                        TokenNeq::missing(db).0,
33916                        Trivia::missing(db).0,
33917                    ],
33918                    width: TextWidth::default(),
33919                },
33920            })
33921            .intern(db),
33922        )
33923    }
33924    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
33925        let kind = node.kind(db);
33926        assert_eq!(
33927            kind,
33928            SyntaxKind::TerminalNeq,
33929            "Unexpected SyntaxKind {:?}. Expected {:?}.",
33930            kind,
33931            SyntaxKind::TerminalNeq
33932        );
33933        let children = db.get_children(node.clone());
33934        Self { node, children }
33935    }
33936    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
33937        let kind = node.kind(db);
33938        if kind == SyntaxKind::TerminalNeq { Some(Self::from_syntax_node(db, node)) } else { None }
33939    }
33940    fn as_syntax_node(&self) -> SyntaxNode {
33941        self.node.clone()
33942    }
33943    fn stable_ptr(&self) -> Self::StablePtr {
33944        TerminalNeqPtr(self.node.0.stable_ptr)
33945    }
33946}
33947impl From<&TerminalNeq> for SyntaxStablePtrId {
33948    fn from(node: &TerminalNeq) -> Self {
33949        node.stable_ptr().untyped()
33950    }
33951}
33952#[derive(Clone, Debug, Eq, Hash, PartialEq)]
33953pub struct TokenNot {
33954    node: SyntaxNode,
33955}
33956impl Token for TokenNot {
33957    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
33958        TokenNotGreen(
33959            Arc::new(GreenNode {
33960                kind: SyntaxKind::TokenNot,
33961                details: GreenNodeDetails::Token(text),
33962            })
33963            .intern(db),
33964        )
33965    }
33966    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
33967        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
33968            .clone()
33969    }
33970}
33971#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
33972pub struct TokenNotPtr(pub SyntaxStablePtrId);
33973impl TypedStablePtr for TokenNotPtr {
33974    type SyntaxNode = TokenNot;
33975    fn untyped(&self) -> SyntaxStablePtrId {
33976        self.0
33977    }
33978    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenNot {
33979        TokenNot::from_syntax_node(db, self.0.lookup(db))
33980    }
33981}
33982impl From<TokenNotPtr> for SyntaxStablePtrId {
33983    fn from(ptr: TokenNotPtr) -> Self {
33984        ptr.untyped()
33985    }
33986}
33987#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
33988pub struct TokenNotGreen(pub GreenId);
33989impl TokenNotGreen {
33990    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
33991        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
33992    }
33993}
33994impl TypedSyntaxNode for TokenNot {
33995    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenNot);
33996    type StablePtr = TokenNotPtr;
33997    type Green = TokenNotGreen;
33998    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
33999        TokenNotGreen(
34000            Arc::new(GreenNode {
34001                kind: SyntaxKind::TokenMissing,
34002                details: GreenNodeDetails::Token("".into()),
34003            })
34004            .intern(db),
34005        )
34006    }
34007    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
34008        match node.0.green.lookup_intern(db).details {
34009            GreenNodeDetails::Token(_) => Self { node },
34010            GreenNodeDetails::Node { .. } => {
34011                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenNot)
34012            }
34013        }
34014    }
34015    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
34016        match node.0.green.lookup_intern(db).details {
34017            GreenNodeDetails::Token(_) => Some(Self { node }),
34018            GreenNodeDetails::Node { .. } => None,
34019        }
34020    }
34021    fn as_syntax_node(&self) -> SyntaxNode {
34022        self.node.clone()
34023    }
34024    fn stable_ptr(&self) -> Self::StablePtr {
34025        TokenNotPtr(self.node.0.stable_ptr)
34026    }
34027}
34028impl From<&TokenNot> for SyntaxStablePtrId {
34029    fn from(node: &TokenNot) -> Self {
34030        node.stable_ptr().untyped()
34031    }
34032}
34033#[derive(Clone, Debug, Eq, Hash, PartialEq)]
34034pub struct TerminalNot {
34035    node: SyntaxNode,
34036    children: Arc<[SyntaxNode]>,
34037}
34038impl Terminal for TerminalNot {
34039    const KIND: SyntaxKind = SyntaxKind::TerminalNot;
34040    type TokenType = TokenNot;
34041    fn new_green(
34042        db: &dyn SyntaxGroup,
34043        leading_trivia: TriviaGreen,
34044        token: <<TerminalNot as Terminal>::TokenType as TypedSyntaxNode>::Green,
34045        trailing_trivia: TriviaGreen,
34046    ) -> Self::Green {
34047        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
34048        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
34049        TerminalNotGreen(
34050            Arc::new(GreenNode {
34051                kind: SyntaxKind::TerminalNot,
34052                details: GreenNodeDetails::Node { children, width },
34053            })
34054            .intern(db),
34055        )
34056    }
34057    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
34058        self.token(db).text(db)
34059    }
34060}
34061impl TerminalNot {
34062    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
34063        Trivia::from_syntax_node(db, self.children[0].clone())
34064    }
34065    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenNot {
34066        TokenNot::from_syntax_node(db, self.children[1].clone())
34067    }
34068    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
34069        Trivia::from_syntax_node(db, self.children[2].clone())
34070    }
34071}
34072#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
34073pub struct TerminalNotPtr(pub SyntaxStablePtrId);
34074impl TerminalNotPtr {}
34075impl TypedStablePtr for TerminalNotPtr {
34076    type SyntaxNode = TerminalNot;
34077    fn untyped(&self) -> SyntaxStablePtrId {
34078        self.0
34079    }
34080    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalNot {
34081        TerminalNot::from_syntax_node(db, self.0.lookup(db))
34082    }
34083}
34084impl From<TerminalNotPtr> for SyntaxStablePtrId {
34085    fn from(ptr: TerminalNotPtr) -> Self {
34086        ptr.untyped()
34087    }
34088}
34089#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
34090pub struct TerminalNotGreen(pub GreenId);
34091impl TypedSyntaxNode for TerminalNot {
34092    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalNot);
34093    type StablePtr = TerminalNotPtr;
34094    type Green = TerminalNotGreen;
34095    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
34096        TerminalNotGreen(
34097            Arc::new(GreenNode {
34098                kind: SyntaxKind::TerminalNot,
34099                details: GreenNodeDetails::Node {
34100                    children: vec![
34101                        Trivia::missing(db).0,
34102                        TokenNot::missing(db).0,
34103                        Trivia::missing(db).0,
34104                    ],
34105                    width: TextWidth::default(),
34106                },
34107            })
34108            .intern(db),
34109        )
34110    }
34111    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
34112        let kind = node.kind(db);
34113        assert_eq!(
34114            kind,
34115            SyntaxKind::TerminalNot,
34116            "Unexpected SyntaxKind {:?}. Expected {:?}.",
34117            kind,
34118            SyntaxKind::TerminalNot
34119        );
34120        let children = db.get_children(node.clone());
34121        Self { node, children }
34122    }
34123    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
34124        let kind = node.kind(db);
34125        if kind == SyntaxKind::TerminalNot { Some(Self::from_syntax_node(db, node)) } else { None }
34126    }
34127    fn as_syntax_node(&self) -> SyntaxNode {
34128        self.node.clone()
34129    }
34130    fn stable_ptr(&self) -> Self::StablePtr {
34131        TerminalNotPtr(self.node.0.stable_ptr)
34132    }
34133}
34134impl From<&TerminalNot> for SyntaxStablePtrId {
34135    fn from(node: &TerminalNot) -> Self {
34136        node.stable_ptr().untyped()
34137    }
34138}
34139#[derive(Clone, Debug, Eq, Hash, PartialEq)]
34140pub struct TokenBitNot {
34141    node: SyntaxNode,
34142}
34143impl Token for TokenBitNot {
34144    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
34145        TokenBitNotGreen(
34146            Arc::new(GreenNode {
34147                kind: SyntaxKind::TokenBitNot,
34148                details: GreenNodeDetails::Token(text),
34149            })
34150            .intern(db),
34151        )
34152    }
34153    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
34154        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
34155            .clone()
34156    }
34157}
34158#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
34159pub struct TokenBitNotPtr(pub SyntaxStablePtrId);
34160impl TypedStablePtr for TokenBitNotPtr {
34161    type SyntaxNode = TokenBitNot;
34162    fn untyped(&self) -> SyntaxStablePtrId {
34163        self.0
34164    }
34165    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenBitNot {
34166        TokenBitNot::from_syntax_node(db, self.0.lookup(db))
34167    }
34168}
34169impl From<TokenBitNotPtr> for SyntaxStablePtrId {
34170    fn from(ptr: TokenBitNotPtr) -> Self {
34171        ptr.untyped()
34172    }
34173}
34174#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
34175pub struct TokenBitNotGreen(pub GreenId);
34176impl TokenBitNotGreen {
34177    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
34178        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
34179    }
34180}
34181impl TypedSyntaxNode for TokenBitNot {
34182    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenBitNot);
34183    type StablePtr = TokenBitNotPtr;
34184    type Green = TokenBitNotGreen;
34185    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
34186        TokenBitNotGreen(
34187            Arc::new(GreenNode {
34188                kind: SyntaxKind::TokenMissing,
34189                details: GreenNodeDetails::Token("".into()),
34190            })
34191            .intern(db),
34192        )
34193    }
34194    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
34195        match node.0.green.lookup_intern(db).details {
34196            GreenNodeDetails::Token(_) => Self { node },
34197            GreenNodeDetails::Node { .. } => {
34198                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenBitNot)
34199            }
34200        }
34201    }
34202    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
34203        match node.0.green.lookup_intern(db).details {
34204            GreenNodeDetails::Token(_) => Some(Self { node }),
34205            GreenNodeDetails::Node { .. } => None,
34206        }
34207    }
34208    fn as_syntax_node(&self) -> SyntaxNode {
34209        self.node.clone()
34210    }
34211    fn stable_ptr(&self) -> Self::StablePtr {
34212        TokenBitNotPtr(self.node.0.stable_ptr)
34213    }
34214}
34215impl From<&TokenBitNot> for SyntaxStablePtrId {
34216    fn from(node: &TokenBitNot) -> Self {
34217        node.stable_ptr().untyped()
34218    }
34219}
34220#[derive(Clone, Debug, Eq, Hash, PartialEq)]
34221pub struct TerminalBitNot {
34222    node: SyntaxNode,
34223    children: Arc<[SyntaxNode]>,
34224}
34225impl Terminal for TerminalBitNot {
34226    const KIND: SyntaxKind = SyntaxKind::TerminalBitNot;
34227    type TokenType = TokenBitNot;
34228    fn new_green(
34229        db: &dyn SyntaxGroup,
34230        leading_trivia: TriviaGreen,
34231        token: <<TerminalBitNot as Terminal>::TokenType as TypedSyntaxNode>::Green,
34232        trailing_trivia: TriviaGreen,
34233    ) -> Self::Green {
34234        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
34235        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
34236        TerminalBitNotGreen(
34237            Arc::new(GreenNode {
34238                kind: SyntaxKind::TerminalBitNot,
34239                details: GreenNodeDetails::Node { children, width },
34240            })
34241            .intern(db),
34242        )
34243    }
34244    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
34245        self.token(db).text(db)
34246    }
34247}
34248impl TerminalBitNot {
34249    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
34250        Trivia::from_syntax_node(db, self.children[0].clone())
34251    }
34252    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenBitNot {
34253        TokenBitNot::from_syntax_node(db, self.children[1].clone())
34254    }
34255    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
34256        Trivia::from_syntax_node(db, self.children[2].clone())
34257    }
34258}
34259#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
34260pub struct TerminalBitNotPtr(pub SyntaxStablePtrId);
34261impl TerminalBitNotPtr {}
34262impl TypedStablePtr for TerminalBitNotPtr {
34263    type SyntaxNode = TerminalBitNot;
34264    fn untyped(&self) -> SyntaxStablePtrId {
34265        self.0
34266    }
34267    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalBitNot {
34268        TerminalBitNot::from_syntax_node(db, self.0.lookup(db))
34269    }
34270}
34271impl From<TerminalBitNotPtr> for SyntaxStablePtrId {
34272    fn from(ptr: TerminalBitNotPtr) -> Self {
34273        ptr.untyped()
34274    }
34275}
34276#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
34277pub struct TerminalBitNotGreen(pub GreenId);
34278impl TypedSyntaxNode for TerminalBitNot {
34279    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalBitNot);
34280    type StablePtr = TerminalBitNotPtr;
34281    type Green = TerminalBitNotGreen;
34282    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
34283        TerminalBitNotGreen(
34284            Arc::new(GreenNode {
34285                kind: SyntaxKind::TerminalBitNot,
34286                details: GreenNodeDetails::Node {
34287                    children: vec![
34288                        Trivia::missing(db).0,
34289                        TokenBitNot::missing(db).0,
34290                        Trivia::missing(db).0,
34291                    ],
34292                    width: TextWidth::default(),
34293                },
34294            })
34295            .intern(db),
34296        )
34297    }
34298    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
34299        let kind = node.kind(db);
34300        assert_eq!(
34301            kind,
34302            SyntaxKind::TerminalBitNot,
34303            "Unexpected SyntaxKind {:?}. Expected {:?}.",
34304            kind,
34305            SyntaxKind::TerminalBitNot
34306        );
34307        let children = db.get_children(node.clone());
34308        Self { node, children }
34309    }
34310    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
34311        let kind = node.kind(db);
34312        if kind == SyntaxKind::TerminalBitNot {
34313            Some(Self::from_syntax_node(db, node))
34314        } else {
34315            None
34316        }
34317    }
34318    fn as_syntax_node(&self) -> SyntaxNode {
34319        self.node.clone()
34320    }
34321    fn stable_ptr(&self) -> Self::StablePtr {
34322        TerminalBitNotPtr(self.node.0.stable_ptr)
34323    }
34324}
34325impl From<&TerminalBitNot> for SyntaxStablePtrId {
34326    fn from(node: &TerminalBitNot) -> Self {
34327        node.stable_ptr().untyped()
34328    }
34329}
34330#[derive(Clone, Debug, Eq, Hash, PartialEq)]
34331pub struct TokenOr {
34332    node: SyntaxNode,
34333}
34334impl Token for TokenOr {
34335    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
34336        TokenOrGreen(
34337            Arc::new(GreenNode {
34338                kind: SyntaxKind::TokenOr,
34339                details: GreenNodeDetails::Token(text),
34340            })
34341            .intern(db),
34342        )
34343    }
34344    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
34345        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
34346            .clone()
34347    }
34348}
34349#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
34350pub struct TokenOrPtr(pub SyntaxStablePtrId);
34351impl TypedStablePtr for TokenOrPtr {
34352    type SyntaxNode = TokenOr;
34353    fn untyped(&self) -> SyntaxStablePtrId {
34354        self.0
34355    }
34356    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenOr {
34357        TokenOr::from_syntax_node(db, self.0.lookup(db))
34358    }
34359}
34360impl From<TokenOrPtr> for SyntaxStablePtrId {
34361    fn from(ptr: TokenOrPtr) -> Self {
34362        ptr.untyped()
34363    }
34364}
34365#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
34366pub struct TokenOrGreen(pub GreenId);
34367impl TokenOrGreen {
34368    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
34369        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
34370    }
34371}
34372impl TypedSyntaxNode for TokenOr {
34373    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenOr);
34374    type StablePtr = TokenOrPtr;
34375    type Green = TokenOrGreen;
34376    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
34377        TokenOrGreen(
34378            Arc::new(GreenNode {
34379                kind: SyntaxKind::TokenMissing,
34380                details: GreenNodeDetails::Token("".into()),
34381            })
34382            .intern(db),
34383        )
34384    }
34385    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
34386        match node.0.green.lookup_intern(db).details {
34387            GreenNodeDetails::Token(_) => Self { node },
34388            GreenNodeDetails::Node { .. } => {
34389                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenOr)
34390            }
34391        }
34392    }
34393    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
34394        match node.0.green.lookup_intern(db).details {
34395            GreenNodeDetails::Token(_) => Some(Self { node }),
34396            GreenNodeDetails::Node { .. } => None,
34397        }
34398    }
34399    fn as_syntax_node(&self) -> SyntaxNode {
34400        self.node.clone()
34401    }
34402    fn stable_ptr(&self) -> Self::StablePtr {
34403        TokenOrPtr(self.node.0.stable_ptr)
34404    }
34405}
34406impl From<&TokenOr> for SyntaxStablePtrId {
34407    fn from(node: &TokenOr) -> Self {
34408        node.stable_ptr().untyped()
34409    }
34410}
34411#[derive(Clone, Debug, Eq, Hash, PartialEq)]
34412pub struct TerminalOr {
34413    node: SyntaxNode,
34414    children: Arc<[SyntaxNode]>,
34415}
34416impl Terminal for TerminalOr {
34417    const KIND: SyntaxKind = SyntaxKind::TerminalOr;
34418    type TokenType = TokenOr;
34419    fn new_green(
34420        db: &dyn SyntaxGroup,
34421        leading_trivia: TriviaGreen,
34422        token: <<TerminalOr as Terminal>::TokenType as TypedSyntaxNode>::Green,
34423        trailing_trivia: TriviaGreen,
34424    ) -> Self::Green {
34425        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
34426        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
34427        TerminalOrGreen(
34428            Arc::new(GreenNode {
34429                kind: SyntaxKind::TerminalOr,
34430                details: GreenNodeDetails::Node { children, width },
34431            })
34432            .intern(db),
34433        )
34434    }
34435    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
34436        self.token(db).text(db)
34437    }
34438}
34439impl TerminalOr {
34440    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
34441        Trivia::from_syntax_node(db, self.children[0].clone())
34442    }
34443    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenOr {
34444        TokenOr::from_syntax_node(db, self.children[1].clone())
34445    }
34446    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
34447        Trivia::from_syntax_node(db, self.children[2].clone())
34448    }
34449}
34450#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
34451pub struct TerminalOrPtr(pub SyntaxStablePtrId);
34452impl TerminalOrPtr {}
34453impl TypedStablePtr for TerminalOrPtr {
34454    type SyntaxNode = TerminalOr;
34455    fn untyped(&self) -> SyntaxStablePtrId {
34456        self.0
34457    }
34458    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalOr {
34459        TerminalOr::from_syntax_node(db, self.0.lookup(db))
34460    }
34461}
34462impl From<TerminalOrPtr> for SyntaxStablePtrId {
34463    fn from(ptr: TerminalOrPtr) -> Self {
34464        ptr.untyped()
34465    }
34466}
34467#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
34468pub struct TerminalOrGreen(pub GreenId);
34469impl TypedSyntaxNode for TerminalOr {
34470    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalOr);
34471    type StablePtr = TerminalOrPtr;
34472    type Green = TerminalOrGreen;
34473    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
34474        TerminalOrGreen(
34475            Arc::new(GreenNode {
34476                kind: SyntaxKind::TerminalOr,
34477                details: GreenNodeDetails::Node {
34478                    children: vec![
34479                        Trivia::missing(db).0,
34480                        TokenOr::missing(db).0,
34481                        Trivia::missing(db).0,
34482                    ],
34483                    width: TextWidth::default(),
34484                },
34485            })
34486            .intern(db),
34487        )
34488    }
34489    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
34490        let kind = node.kind(db);
34491        assert_eq!(
34492            kind,
34493            SyntaxKind::TerminalOr,
34494            "Unexpected SyntaxKind {:?}. Expected {:?}.",
34495            kind,
34496            SyntaxKind::TerminalOr
34497        );
34498        let children = db.get_children(node.clone());
34499        Self { node, children }
34500    }
34501    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
34502        let kind = node.kind(db);
34503        if kind == SyntaxKind::TerminalOr { Some(Self::from_syntax_node(db, node)) } else { None }
34504    }
34505    fn as_syntax_node(&self) -> SyntaxNode {
34506        self.node.clone()
34507    }
34508    fn stable_ptr(&self) -> Self::StablePtr {
34509        TerminalOrPtr(self.node.0.stable_ptr)
34510    }
34511}
34512impl From<&TerminalOr> for SyntaxStablePtrId {
34513    fn from(node: &TerminalOr) -> Self {
34514        node.stable_ptr().untyped()
34515    }
34516}
34517#[derive(Clone, Debug, Eq, Hash, PartialEq)]
34518pub struct TokenOrOr {
34519    node: SyntaxNode,
34520}
34521impl Token for TokenOrOr {
34522    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
34523        TokenOrOrGreen(
34524            Arc::new(GreenNode {
34525                kind: SyntaxKind::TokenOrOr,
34526                details: GreenNodeDetails::Token(text),
34527            })
34528            .intern(db),
34529        )
34530    }
34531    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
34532        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
34533            .clone()
34534    }
34535}
34536#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
34537pub struct TokenOrOrPtr(pub SyntaxStablePtrId);
34538impl TypedStablePtr for TokenOrOrPtr {
34539    type SyntaxNode = TokenOrOr;
34540    fn untyped(&self) -> SyntaxStablePtrId {
34541        self.0
34542    }
34543    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenOrOr {
34544        TokenOrOr::from_syntax_node(db, self.0.lookup(db))
34545    }
34546}
34547impl From<TokenOrOrPtr> for SyntaxStablePtrId {
34548    fn from(ptr: TokenOrOrPtr) -> Self {
34549        ptr.untyped()
34550    }
34551}
34552#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
34553pub struct TokenOrOrGreen(pub GreenId);
34554impl TokenOrOrGreen {
34555    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
34556        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
34557    }
34558}
34559impl TypedSyntaxNode for TokenOrOr {
34560    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenOrOr);
34561    type StablePtr = TokenOrOrPtr;
34562    type Green = TokenOrOrGreen;
34563    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
34564        TokenOrOrGreen(
34565            Arc::new(GreenNode {
34566                kind: SyntaxKind::TokenMissing,
34567                details: GreenNodeDetails::Token("".into()),
34568            })
34569            .intern(db),
34570        )
34571    }
34572    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
34573        match node.0.green.lookup_intern(db).details {
34574            GreenNodeDetails::Token(_) => Self { node },
34575            GreenNodeDetails::Node { .. } => {
34576                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenOrOr)
34577            }
34578        }
34579    }
34580    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
34581        match node.0.green.lookup_intern(db).details {
34582            GreenNodeDetails::Token(_) => Some(Self { node }),
34583            GreenNodeDetails::Node { .. } => None,
34584        }
34585    }
34586    fn as_syntax_node(&self) -> SyntaxNode {
34587        self.node.clone()
34588    }
34589    fn stable_ptr(&self) -> Self::StablePtr {
34590        TokenOrOrPtr(self.node.0.stable_ptr)
34591    }
34592}
34593impl From<&TokenOrOr> for SyntaxStablePtrId {
34594    fn from(node: &TokenOrOr) -> Self {
34595        node.stable_ptr().untyped()
34596    }
34597}
34598#[derive(Clone, Debug, Eq, Hash, PartialEq)]
34599pub struct TerminalOrOr {
34600    node: SyntaxNode,
34601    children: Arc<[SyntaxNode]>,
34602}
34603impl Terminal for TerminalOrOr {
34604    const KIND: SyntaxKind = SyntaxKind::TerminalOrOr;
34605    type TokenType = TokenOrOr;
34606    fn new_green(
34607        db: &dyn SyntaxGroup,
34608        leading_trivia: TriviaGreen,
34609        token: <<TerminalOrOr as Terminal>::TokenType as TypedSyntaxNode>::Green,
34610        trailing_trivia: TriviaGreen,
34611    ) -> Self::Green {
34612        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
34613        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
34614        TerminalOrOrGreen(
34615            Arc::new(GreenNode {
34616                kind: SyntaxKind::TerminalOrOr,
34617                details: GreenNodeDetails::Node { children, width },
34618            })
34619            .intern(db),
34620        )
34621    }
34622    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
34623        self.token(db).text(db)
34624    }
34625}
34626impl TerminalOrOr {
34627    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
34628        Trivia::from_syntax_node(db, self.children[0].clone())
34629    }
34630    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenOrOr {
34631        TokenOrOr::from_syntax_node(db, self.children[1].clone())
34632    }
34633    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
34634        Trivia::from_syntax_node(db, self.children[2].clone())
34635    }
34636}
34637#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
34638pub struct TerminalOrOrPtr(pub SyntaxStablePtrId);
34639impl TerminalOrOrPtr {}
34640impl TypedStablePtr for TerminalOrOrPtr {
34641    type SyntaxNode = TerminalOrOr;
34642    fn untyped(&self) -> SyntaxStablePtrId {
34643        self.0
34644    }
34645    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalOrOr {
34646        TerminalOrOr::from_syntax_node(db, self.0.lookup(db))
34647    }
34648}
34649impl From<TerminalOrOrPtr> for SyntaxStablePtrId {
34650    fn from(ptr: TerminalOrOrPtr) -> Self {
34651        ptr.untyped()
34652    }
34653}
34654#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
34655pub struct TerminalOrOrGreen(pub GreenId);
34656impl TypedSyntaxNode for TerminalOrOr {
34657    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalOrOr);
34658    type StablePtr = TerminalOrOrPtr;
34659    type Green = TerminalOrOrGreen;
34660    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
34661        TerminalOrOrGreen(
34662            Arc::new(GreenNode {
34663                kind: SyntaxKind::TerminalOrOr,
34664                details: GreenNodeDetails::Node {
34665                    children: vec![
34666                        Trivia::missing(db).0,
34667                        TokenOrOr::missing(db).0,
34668                        Trivia::missing(db).0,
34669                    ],
34670                    width: TextWidth::default(),
34671                },
34672            })
34673            .intern(db),
34674        )
34675    }
34676    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
34677        let kind = node.kind(db);
34678        assert_eq!(
34679            kind,
34680            SyntaxKind::TerminalOrOr,
34681            "Unexpected SyntaxKind {:?}. Expected {:?}.",
34682            kind,
34683            SyntaxKind::TerminalOrOr
34684        );
34685        let children = db.get_children(node.clone());
34686        Self { node, children }
34687    }
34688    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
34689        let kind = node.kind(db);
34690        if kind == SyntaxKind::TerminalOrOr { Some(Self::from_syntax_node(db, node)) } else { None }
34691    }
34692    fn as_syntax_node(&self) -> SyntaxNode {
34693        self.node.clone()
34694    }
34695    fn stable_ptr(&self) -> Self::StablePtr {
34696        TerminalOrOrPtr(self.node.0.stable_ptr)
34697    }
34698}
34699impl From<&TerminalOrOr> for SyntaxStablePtrId {
34700    fn from(node: &TerminalOrOr) -> Self {
34701        node.stable_ptr().untyped()
34702    }
34703}
34704#[derive(Clone, Debug, Eq, Hash, PartialEq)]
34705pub struct TokenPlus {
34706    node: SyntaxNode,
34707}
34708impl Token for TokenPlus {
34709    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
34710        TokenPlusGreen(
34711            Arc::new(GreenNode {
34712                kind: SyntaxKind::TokenPlus,
34713                details: GreenNodeDetails::Token(text),
34714            })
34715            .intern(db),
34716        )
34717    }
34718    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
34719        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
34720            .clone()
34721    }
34722}
34723#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
34724pub struct TokenPlusPtr(pub SyntaxStablePtrId);
34725impl TypedStablePtr for TokenPlusPtr {
34726    type SyntaxNode = TokenPlus;
34727    fn untyped(&self) -> SyntaxStablePtrId {
34728        self.0
34729    }
34730    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenPlus {
34731        TokenPlus::from_syntax_node(db, self.0.lookup(db))
34732    }
34733}
34734impl From<TokenPlusPtr> for SyntaxStablePtrId {
34735    fn from(ptr: TokenPlusPtr) -> Self {
34736        ptr.untyped()
34737    }
34738}
34739#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
34740pub struct TokenPlusGreen(pub GreenId);
34741impl TokenPlusGreen {
34742    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
34743        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
34744    }
34745}
34746impl TypedSyntaxNode for TokenPlus {
34747    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenPlus);
34748    type StablePtr = TokenPlusPtr;
34749    type Green = TokenPlusGreen;
34750    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
34751        TokenPlusGreen(
34752            Arc::new(GreenNode {
34753                kind: SyntaxKind::TokenMissing,
34754                details: GreenNodeDetails::Token("".into()),
34755            })
34756            .intern(db),
34757        )
34758    }
34759    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
34760        match node.0.green.lookup_intern(db).details {
34761            GreenNodeDetails::Token(_) => Self { node },
34762            GreenNodeDetails::Node { .. } => {
34763                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenPlus)
34764            }
34765        }
34766    }
34767    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
34768        match node.0.green.lookup_intern(db).details {
34769            GreenNodeDetails::Token(_) => Some(Self { node }),
34770            GreenNodeDetails::Node { .. } => None,
34771        }
34772    }
34773    fn as_syntax_node(&self) -> SyntaxNode {
34774        self.node.clone()
34775    }
34776    fn stable_ptr(&self) -> Self::StablePtr {
34777        TokenPlusPtr(self.node.0.stable_ptr)
34778    }
34779}
34780impl From<&TokenPlus> for SyntaxStablePtrId {
34781    fn from(node: &TokenPlus) -> Self {
34782        node.stable_ptr().untyped()
34783    }
34784}
34785#[derive(Clone, Debug, Eq, Hash, PartialEq)]
34786pub struct TerminalPlus {
34787    node: SyntaxNode,
34788    children: Arc<[SyntaxNode]>,
34789}
34790impl Terminal for TerminalPlus {
34791    const KIND: SyntaxKind = SyntaxKind::TerminalPlus;
34792    type TokenType = TokenPlus;
34793    fn new_green(
34794        db: &dyn SyntaxGroup,
34795        leading_trivia: TriviaGreen,
34796        token: <<TerminalPlus as Terminal>::TokenType as TypedSyntaxNode>::Green,
34797        trailing_trivia: TriviaGreen,
34798    ) -> Self::Green {
34799        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
34800        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
34801        TerminalPlusGreen(
34802            Arc::new(GreenNode {
34803                kind: SyntaxKind::TerminalPlus,
34804                details: GreenNodeDetails::Node { children, width },
34805            })
34806            .intern(db),
34807        )
34808    }
34809    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
34810        self.token(db).text(db)
34811    }
34812}
34813impl TerminalPlus {
34814    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
34815        Trivia::from_syntax_node(db, self.children[0].clone())
34816    }
34817    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenPlus {
34818        TokenPlus::from_syntax_node(db, self.children[1].clone())
34819    }
34820    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
34821        Trivia::from_syntax_node(db, self.children[2].clone())
34822    }
34823}
34824#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
34825pub struct TerminalPlusPtr(pub SyntaxStablePtrId);
34826impl TerminalPlusPtr {}
34827impl TypedStablePtr for TerminalPlusPtr {
34828    type SyntaxNode = TerminalPlus;
34829    fn untyped(&self) -> SyntaxStablePtrId {
34830        self.0
34831    }
34832    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalPlus {
34833        TerminalPlus::from_syntax_node(db, self.0.lookup(db))
34834    }
34835}
34836impl From<TerminalPlusPtr> for SyntaxStablePtrId {
34837    fn from(ptr: TerminalPlusPtr) -> Self {
34838        ptr.untyped()
34839    }
34840}
34841#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
34842pub struct TerminalPlusGreen(pub GreenId);
34843impl TypedSyntaxNode for TerminalPlus {
34844    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalPlus);
34845    type StablePtr = TerminalPlusPtr;
34846    type Green = TerminalPlusGreen;
34847    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
34848        TerminalPlusGreen(
34849            Arc::new(GreenNode {
34850                kind: SyntaxKind::TerminalPlus,
34851                details: GreenNodeDetails::Node {
34852                    children: vec![
34853                        Trivia::missing(db).0,
34854                        TokenPlus::missing(db).0,
34855                        Trivia::missing(db).0,
34856                    ],
34857                    width: TextWidth::default(),
34858                },
34859            })
34860            .intern(db),
34861        )
34862    }
34863    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
34864        let kind = node.kind(db);
34865        assert_eq!(
34866            kind,
34867            SyntaxKind::TerminalPlus,
34868            "Unexpected SyntaxKind {:?}. Expected {:?}.",
34869            kind,
34870            SyntaxKind::TerminalPlus
34871        );
34872        let children = db.get_children(node.clone());
34873        Self { node, children }
34874    }
34875    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
34876        let kind = node.kind(db);
34877        if kind == SyntaxKind::TerminalPlus { Some(Self::from_syntax_node(db, node)) } else { None }
34878    }
34879    fn as_syntax_node(&self) -> SyntaxNode {
34880        self.node.clone()
34881    }
34882    fn stable_ptr(&self) -> Self::StablePtr {
34883        TerminalPlusPtr(self.node.0.stable_ptr)
34884    }
34885}
34886impl From<&TerminalPlus> for SyntaxStablePtrId {
34887    fn from(node: &TerminalPlus) -> Self {
34888        node.stable_ptr().untyped()
34889    }
34890}
34891#[derive(Clone, Debug, Eq, Hash, PartialEq)]
34892pub struct TokenPlusEq {
34893    node: SyntaxNode,
34894}
34895impl Token for TokenPlusEq {
34896    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
34897        TokenPlusEqGreen(
34898            Arc::new(GreenNode {
34899                kind: SyntaxKind::TokenPlusEq,
34900                details: GreenNodeDetails::Token(text),
34901            })
34902            .intern(db),
34903        )
34904    }
34905    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
34906        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
34907            .clone()
34908    }
34909}
34910#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
34911pub struct TokenPlusEqPtr(pub SyntaxStablePtrId);
34912impl TypedStablePtr for TokenPlusEqPtr {
34913    type SyntaxNode = TokenPlusEq;
34914    fn untyped(&self) -> SyntaxStablePtrId {
34915        self.0
34916    }
34917    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenPlusEq {
34918        TokenPlusEq::from_syntax_node(db, self.0.lookup(db))
34919    }
34920}
34921impl From<TokenPlusEqPtr> for SyntaxStablePtrId {
34922    fn from(ptr: TokenPlusEqPtr) -> Self {
34923        ptr.untyped()
34924    }
34925}
34926#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
34927pub struct TokenPlusEqGreen(pub GreenId);
34928impl TokenPlusEqGreen {
34929    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
34930        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
34931    }
34932}
34933impl TypedSyntaxNode for TokenPlusEq {
34934    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenPlusEq);
34935    type StablePtr = TokenPlusEqPtr;
34936    type Green = TokenPlusEqGreen;
34937    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
34938        TokenPlusEqGreen(
34939            Arc::new(GreenNode {
34940                kind: SyntaxKind::TokenMissing,
34941                details: GreenNodeDetails::Token("".into()),
34942            })
34943            .intern(db),
34944        )
34945    }
34946    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
34947        match node.0.green.lookup_intern(db).details {
34948            GreenNodeDetails::Token(_) => Self { node },
34949            GreenNodeDetails::Node { .. } => {
34950                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenPlusEq)
34951            }
34952        }
34953    }
34954    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
34955        match node.0.green.lookup_intern(db).details {
34956            GreenNodeDetails::Token(_) => Some(Self { node }),
34957            GreenNodeDetails::Node { .. } => None,
34958        }
34959    }
34960    fn as_syntax_node(&self) -> SyntaxNode {
34961        self.node.clone()
34962    }
34963    fn stable_ptr(&self) -> Self::StablePtr {
34964        TokenPlusEqPtr(self.node.0.stable_ptr)
34965    }
34966}
34967impl From<&TokenPlusEq> for SyntaxStablePtrId {
34968    fn from(node: &TokenPlusEq) -> Self {
34969        node.stable_ptr().untyped()
34970    }
34971}
34972#[derive(Clone, Debug, Eq, Hash, PartialEq)]
34973pub struct TerminalPlusEq {
34974    node: SyntaxNode,
34975    children: Arc<[SyntaxNode]>,
34976}
34977impl Terminal for TerminalPlusEq {
34978    const KIND: SyntaxKind = SyntaxKind::TerminalPlusEq;
34979    type TokenType = TokenPlusEq;
34980    fn new_green(
34981        db: &dyn SyntaxGroup,
34982        leading_trivia: TriviaGreen,
34983        token: <<TerminalPlusEq as Terminal>::TokenType as TypedSyntaxNode>::Green,
34984        trailing_trivia: TriviaGreen,
34985    ) -> Self::Green {
34986        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
34987        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
34988        TerminalPlusEqGreen(
34989            Arc::new(GreenNode {
34990                kind: SyntaxKind::TerminalPlusEq,
34991                details: GreenNodeDetails::Node { children, width },
34992            })
34993            .intern(db),
34994        )
34995    }
34996    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
34997        self.token(db).text(db)
34998    }
34999}
35000impl TerminalPlusEq {
35001    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
35002        Trivia::from_syntax_node(db, self.children[0].clone())
35003    }
35004    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenPlusEq {
35005        TokenPlusEq::from_syntax_node(db, self.children[1].clone())
35006    }
35007    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
35008        Trivia::from_syntax_node(db, self.children[2].clone())
35009    }
35010}
35011#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
35012pub struct TerminalPlusEqPtr(pub SyntaxStablePtrId);
35013impl TerminalPlusEqPtr {}
35014impl TypedStablePtr for TerminalPlusEqPtr {
35015    type SyntaxNode = TerminalPlusEq;
35016    fn untyped(&self) -> SyntaxStablePtrId {
35017        self.0
35018    }
35019    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalPlusEq {
35020        TerminalPlusEq::from_syntax_node(db, self.0.lookup(db))
35021    }
35022}
35023impl From<TerminalPlusEqPtr> for SyntaxStablePtrId {
35024    fn from(ptr: TerminalPlusEqPtr) -> Self {
35025        ptr.untyped()
35026    }
35027}
35028#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
35029pub struct TerminalPlusEqGreen(pub GreenId);
35030impl TypedSyntaxNode for TerminalPlusEq {
35031    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalPlusEq);
35032    type StablePtr = TerminalPlusEqPtr;
35033    type Green = TerminalPlusEqGreen;
35034    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
35035        TerminalPlusEqGreen(
35036            Arc::new(GreenNode {
35037                kind: SyntaxKind::TerminalPlusEq,
35038                details: GreenNodeDetails::Node {
35039                    children: vec![
35040                        Trivia::missing(db).0,
35041                        TokenPlusEq::missing(db).0,
35042                        Trivia::missing(db).0,
35043                    ],
35044                    width: TextWidth::default(),
35045                },
35046            })
35047            .intern(db),
35048        )
35049    }
35050    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
35051        let kind = node.kind(db);
35052        assert_eq!(
35053            kind,
35054            SyntaxKind::TerminalPlusEq,
35055            "Unexpected SyntaxKind {:?}. Expected {:?}.",
35056            kind,
35057            SyntaxKind::TerminalPlusEq
35058        );
35059        let children = db.get_children(node.clone());
35060        Self { node, children }
35061    }
35062    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
35063        let kind = node.kind(db);
35064        if kind == SyntaxKind::TerminalPlusEq {
35065            Some(Self::from_syntax_node(db, node))
35066        } else {
35067            None
35068        }
35069    }
35070    fn as_syntax_node(&self) -> SyntaxNode {
35071        self.node.clone()
35072    }
35073    fn stable_ptr(&self) -> Self::StablePtr {
35074        TerminalPlusEqPtr(self.node.0.stable_ptr)
35075    }
35076}
35077impl From<&TerminalPlusEq> for SyntaxStablePtrId {
35078    fn from(node: &TerminalPlusEq) -> Self {
35079        node.stable_ptr().untyped()
35080    }
35081}
35082#[derive(Clone, Debug, Eq, Hash, PartialEq)]
35083pub struct TokenQuestionMark {
35084    node: SyntaxNode,
35085}
35086impl Token for TokenQuestionMark {
35087    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
35088        TokenQuestionMarkGreen(
35089            Arc::new(GreenNode {
35090                kind: SyntaxKind::TokenQuestionMark,
35091                details: GreenNodeDetails::Token(text),
35092            })
35093            .intern(db),
35094        )
35095    }
35096    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
35097        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
35098            .clone()
35099    }
35100}
35101#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
35102pub struct TokenQuestionMarkPtr(pub SyntaxStablePtrId);
35103impl TypedStablePtr for TokenQuestionMarkPtr {
35104    type SyntaxNode = TokenQuestionMark;
35105    fn untyped(&self) -> SyntaxStablePtrId {
35106        self.0
35107    }
35108    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenQuestionMark {
35109        TokenQuestionMark::from_syntax_node(db, self.0.lookup(db))
35110    }
35111}
35112impl From<TokenQuestionMarkPtr> for SyntaxStablePtrId {
35113    fn from(ptr: TokenQuestionMarkPtr) -> Self {
35114        ptr.untyped()
35115    }
35116}
35117#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
35118pub struct TokenQuestionMarkGreen(pub GreenId);
35119impl TokenQuestionMarkGreen {
35120    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
35121        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
35122    }
35123}
35124impl TypedSyntaxNode for TokenQuestionMark {
35125    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenQuestionMark);
35126    type StablePtr = TokenQuestionMarkPtr;
35127    type Green = TokenQuestionMarkGreen;
35128    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
35129        TokenQuestionMarkGreen(
35130            Arc::new(GreenNode {
35131                kind: SyntaxKind::TokenMissing,
35132                details: GreenNodeDetails::Token("".into()),
35133            })
35134            .intern(db),
35135        )
35136    }
35137    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
35138        match node.0.green.lookup_intern(db).details {
35139            GreenNodeDetails::Token(_) => Self { node },
35140            GreenNodeDetails::Node { .. } => {
35141                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenQuestionMark)
35142            }
35143        }
35144    }
35145    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
35146        match node.0.green.lookup_intern(db).details {
35147            GreenNodeDetails::Token(_) => Some(Self { node }),
35148            GreenNodeDetails::Node { .. } => None,
35149        }
35150    }
35151    fn as_syntax_node(&self) -> SyntaxNode {
35152        self.node.clone()
35153    }
35154    fn stable_ptr(&self) -> Self::StablePtr {
35155        TokenQuestionMarkPtr(self.node.0.stable_ptr)
35156    }
35157}
35158impl From<&TokenQuestionMark> for SyntaxStablePtrId {
35159    fn from(node: &TokenQuestionMark) -> Self {
35160        node.stable_ptr().untyped()
35161    }
35162}
35163#[derive(Clone, Debug, Eq, Hash, PartialEq)]
35164pub struct TerminalQuestionMark {
35165    node: SyntaxNode,
35166    children: Arc<[SyntaxNode]>,
35167}
35168impl Terminal for TerminalQuestionMark {
35169    const KIND: SyntaxKind = SyntaxKind::TerminalQuestionMark;
35170    type TokenType = TokenQuestionMark;
35171    fn new_green(
35172        db: &dyn SyntaxGroup,
35173        leading_trivia: TriviaGreen,
35174        token: <<TerminalQuestionMark as Terminal>::TokenType as TypedSyntaxNode>::Green,
35175        trailing_trivia: TriviaGreen,
35176    ) -> Self::Green {
35177        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
35178        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
35179        TerminalQuestionMarkGreen(
35180            Arc::new(GreenNode {
35181                kind: SyntaxKind::TerminalQuestionMark,
35182                details: GreenNodeDetails::Node { children, width },
35183            })
35184            .intern(db),
35185        )
35186    }
35187    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
35188        self.token(db).text(db)
35189    }
35190}
35191impl TerminalQuestionMark {
35192    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
35193        Trivia::from_syntax_node(db, self.children[0].clone())
35194    }
35195    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenQuestionMark {
35196        TokenQuestionMark::from_syntax_node(db, self.children[1].clone())
35197    }
35198    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
35199        Trivia::from_syntax_node(db, self.children[2].clone())
35200    }
35201}
35202#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
35203pub struct TerminalQuestionMarkPtr(pub SyntaxStablePtrId);
35204impl TerminalQuestionMarkPtr {}
35205impl TypedStablePtr for TerminalQuestionMarkPtr {
35206    type SyntaxNode = TerminalQuestionMark;
35207    fn untyped(&self) -> SyntaxStablePtrId {
35208        self.0
35209    }
35210    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalQuestionMark {
35211        TerminalQuestionMark::from_syntax_node(db, self.0.lookup(db))
35212    }
35213}
35214impl From<TerminalQuestionMarkPtr> for SyntaxStablePtrId {
35215    fn from(ptr: TerminalQuestionMarkPtr) -> Self {
35216        ptr.untyped()
35217    }
35218}
35219#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
35220pub struct TerminalQuestionMarkGreen(pub GreenId);
35221impl TypedSyntaxNode for TerminalQuestionMark {
35222    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalQuestionMark);
35223    type StablePtr = TerminalQuestionMarkPtr;
35224    type Green = TerminalQuestionMarkGreen;
35225    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
35226        TerminalQuestionMarkGreen(
35227            Arc::new(GreenNode {
35228                kind: SyntaxKind::TerminalQuestionMark,
35229                details: GreenNodeDetails::Node {
35230                    children: vec![
35231                        Trivia::missing(db).0,
35232                        TokenQuestionMark::missing(db).0,
35233                        Trivia::missing(db).0,
35234                    ],
35235                    width: TextWidth::default(),
35236                },
35237            })
35238            .intern(db),
35239        )
35240    }
35241    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
35242        let kind = node.kind(db);
35243        assert_eq!(
35244            kind,
35245            SyntaxKind::TerminalQuestionMark,
35246            "Unexpected SyntaxKind {:?}. Expected {:?}.",
35247            kind,
35248            SyntaxKind::TerminalQuestionMark
35249        );
35250        let children = db.get_children(node.clone());
35251        Self { node, children }
35252    }
35253    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
35254        let kind = node.kind(db);
35255        if kind == SyntaxKind::TerminalQuestionMark {
35256            Some(Self::from_syntax_node(db, node))
35257        } else {
35258            None
35259        }
35260    }
35261    fn as_syntax_node(&self) -> SyntaxNode {
35262        self.node.clone()
35263    }
35264    fn stable_ptr(&self) -> Self::StablePtr {
35265        TerminalQuestionMarkPtr(self.node.0.stable_ptr)
35266    }
35267}
35268impl From<&TerminalQuestionMark> for SyntaxStablePtrId {
35269    fn from(node: &TerminalQuestionMark) -> Self {
35270        node.stable_ptr().untyped()
35271    }
35272}
35273#[derive(Clone, Debug, Eq, Hash, PartialEq)]
35274pub struct TokenRBrace {
35275    node: SyntaxNode,
35276}
35277impl Token for TokenRBrace {
35278    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
35279        TokenRBraceGreen(
35280            Arc::new(GreenNode {
35281                kind: SyntaxKind::TokenRBrace,
35282                details: GreenNodeDetails::Token(text),
35283            })
35284            .intern(db),
35285        )
35286    }
35287    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
35288        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
35289            .clone()
35290    }
35291}
35292#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
35293pub struct TokenRBracePtr(pub SyntaxStablePtrId);
35294impl TypedStablePtr for TokenRBracePtr {
35295    type SyntaxNode = TokenRBrace;
35296    fn untyped(&self) -> SyntaxStablePtrId {
35297        self.0
35298    }
35299    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenRBrace {
35300        TokenRBrace::from_syntax_node(db, self.0.lookup(db))
35301    }
35302}
35303impl From<TokenRBracePtr> for SyntaxStablePtrId {
35304    fn from(ptr: TokenRBracePtr) -> Self {
35305        ptr.untyped()
35306    }
35307}
35308#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
35309pub struct TokenRBraceGreen(pub GreenId);
35310impl TokenRBraceGreen {
35311    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
35312        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
35313    }
35314}
35315impl TypedSyntaxNode for TokenRBrace {
35316    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenRBrace);
35317    type StablePtr = TokenRBracePtr;
35318    type Green = TokenRBraceGreen;
35319    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
35320        TokenRBraceGreen(
35321            Arc::new(GreenNode {
35322                kind: SyntaxKind::TokenMissing,
35323                details: GreenNodeDetails::Token("".into()),
35324            })
35325            .intern(db),
35326        )
35327    }
35328    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
35329        match node.0.green.lookup_intern(db).details {
35330            GreenNodeDetails::Token(_) => Self { node },
35331            GreenNodeDetails::Node { .. } => {
35332                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenRBrace)
35333            }
35334        }
35335    }
35336    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
35337        match node.0.green.lookup_intern(db).details {
35338            GreenNodeDetails::Token(_) => Some(Self { node }),
35339            GreenNodeDetails::Node { .. } => None,
35340        }
35341    }
35342    fn as_syntax_node(&self) -> SyntaxNode {
35343        self.node.clone()
35344    }
35345    fn stable_ptr(&self) -> Self::StablePtr {
35346        TokenRBracePtr(self.node.0.stable_ptr)
35347    }
35348}
35349impl From<&TokenRBrace> for SyntaxStablePtrId {
35350    fn from(node: &TokenRBrace) -> Self {
35351        node.stable_ptr().untyped()
35352    }
35353}
35354#[derive(Clone, Debug, Eq, Hash, PartialEq)]
35355pub struct TerminalRBrace {
35356    node: SyntaxNode,
35357    children: Arc<[SyntaxNode]>,
35358}
35359impl Terminal for TerminalRBrace {
35360    const KIND: SyntaxKind = SyntaxKind::TerminalRBrace;
35361    type TokenType = TokenRBrace;
35362    fn new_green(
35363        db: &dyn SyntaxGroup,
35364        leading_trivia: TriviaGreen,
35365        token: <<TerminalRBrace as Terminal>::TokenType as TypedSyntaxNode>::Green,
35366        trailing_trivia: TriviaGreen,
35367    ) -> Self::Green {
35368        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
35369        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
35370        TerminalRBraceGreen(
35371            Arc::new(GreenNode {
35372                kind: SyntaxKind::TerminalRBrace,
35373                details: GreenNodeDetails::Node { children, width },
35374            })
35375            .intern(db),
35376        )
35377    }
35378    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
35379        self.token(db).text(db)
35380    }
35381}
35382impl TerminalRBrace {
35383    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
35384        Trivia::from_syntax_node(db, self.children[0].clone())
35385    }
35386    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenRBrace {
35387        TokenRBrace::from_syntax_node(db, self.children[1].clone())
35388    }
35389    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
35390        Trivia::from_syntax_node(db, self.children[2].clone())
35391    }
35392}
35393#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
35394pub struct TerminalRBracePtr(pub SyntaxStablePtrId);
35395impl TerminalRBracePtr {}
35396impl TypedStablePtr for TerminalRBracePtr {
35397    type SyntaxNode = TerminalRBrace;
35398    fn untyped(&self) -> SyntaxStablePtrId {
35399        self.0
35400    }
35401    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalRBrace {
35402        TerminalRBrace::from_syntax_node(db, self.0.lookup(db))
35403    }
35404}
35405impl From<TerminalRBracePtr> for SyntaxStablePtrId {
35406    fn from(ptr: TerminalRBracePtr) -> Self {
35407        ptr.untyped()
35408    }
35409}
35410#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
35411pub struct TerminalRBraceGreen(pub GreenId);
35412impl TypedSyntaxNode for TerminalRBrace {
35413    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalRBrace);
35414    type StablePtr = TerminalRBracePtr;
35415    type Green = TerminalRBraceGreen;
35416    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
35417        TerminalRBraceGreen(
35418            Arc::new(GreenNode {
35419                kind: SyntaxKind::TerminalRBrace,
35420                details: GreenNodeDetails::Node {
35421                    children: vec![
35422                        Trivia::missing(db).0,
35423                        TokenRBrace::missing(db).0,
35424                        Trivia::missing(db).0,
35425                    ],
35426                    width: TextWidth::default(),
35427                },
35428            })
35429            .intern(db),
35430        )
35431    }
35432    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
35433        let kind = node.kind(db);
35434        assert_eq!(
35435            kind,
35436            SyntaxKind::TerminalRBrace,
35437            "Unexpected SyntaxKind {:?}. Expected {:?}.",
35438            kind,
35439            SyntaxKind::TerminalRBrace
35440        );
35441        let children = db.get_children(node.clone());
35442        Self { node, children }
35443    }
35444    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
35445        let kind = node.kind(db);
35446        if kind == SyntaxKind::TerminalRBrace {
35447            Some(Self::from_syntax_node(db, node))
35448        } else {
35449            None
35450        }
35451    }
35452    fn as_syntax_node(&self) -> SyntaxNode {
35453        self.node.clone()
35454    }
35455    fn stable_ptr(&self) -> Self::StablePtr {
35456        TerminalRBracePtr(self.node.0.stable_ptr)
35457    }
35458}
35459impl From<&TerminalRBrace> for SyntaxStablePtrId {
35460    fn from(node: &TerminalRBrace) -> Self {
35461        node.stable_ptr().untyped()
35462    }
35463}
35464#[derive(Clone, Debug, Eq, Hash, PartialEq)]
35465pub struct TokenRBrack {
35466    node: SyntaxNode,
35467}
35468impl Token for TokenRBrack {
35469    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
35470        TokenRBrackGreen(
35471            Arc::new(GreenNode {
35472                kind: SyntaxKind::TokenRBrack,
35473                details: GreenNodeDetails::Token(text),
35474            })
35475            .intern(db),
35476        )
35477    }
35478    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
35479        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
35480            .clone()
35481    }
35482}
35483#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
35484pub struct TokenRBrackPtr(pub SyntaxStablePtrId);
35485impl TypedStablePtr for TokenRBrackPtr {
35486    type SyntaxNode = TokenRBrack;
35487    fn untyped(&self) -> SyntaxStablePtrId {
35488        self.0
35489    }
35490    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenRBrack {
35491        TokenRBrack::from_syntax_node(db, self.0.lookup(db))
35492    }
35493}
35494impl From<TokenRBrackPtr> for SyntaxStablePtrId {
35495    fn from(ptr: TokenRBrackPtr) -> Self {
35496        ptr.untyped()
35497    }
35498}
35499#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
35500pub struct TokenRBrackGreen(pub GreenId);
35501impl TokenRBrackGreen {
35502    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
35503        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
35504    }
35505}
35506impl TypedSyntaxNode for TokenRBrack {
35507    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenRBrack);
35508    type StablePtr = TokenRBrackPtr;
35509    type Green = TokenRBrackGreen;
35510    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
35511        TokenRBrackGreen(
35512            Arc::new(GreenNode {
35513                kind: SyntaxKind::TokenMissing,
35514                details: GreenNodeDetails::Token("".into()),
35515            })
35516            .intern(db),
35517        )
35518    }
35519    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
35520        match node.0.green.lookup_intern(db).details {
35521            GreenNodeDetails::Token(_) => Self { node },
35522            GreenNodeDetails::Node { .. } => {
35523                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenRBrack)
35524            }
35525        }
35526    }
35527    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
35528        match node.0.green.lookup_intern(db).details {
35529            GreenNodeDetails::Token(_) => Some(Self { node }),
35530            GreenNodeDetails::Node { .. } => None,
35531        }
35532    }
35533    fn as_syntax_node(&self) -> SyntaxNode {
35534        self.node.clone()
35535    }
35536    fn stable_ptr(&self) -> Self::StablePtr {
35537        TokenRBrackPtr(self.node.0.stable_ptr)
35538    }
35539}
35540impl From<&TokenRBrack> for SyntaxStablePtrId {
35541    fn from(node: &TokenRBrack) -> Self {
35542        node.stable_ptr().untyped()
35543    }
35544}
35545#[derive(Clone, Debug, Eq, Hash, PartialEq)]
35546pub struct TerminalRBrack {
35547    node: SyntaxNode,
35548    children: Arc<[SyntaxNode]>,
35549}
35550impl Terminal for TerminalRBrack {
35551    const KIND: SyntaxKind = SyntaxKind::TerminalRBrack;
35552    type TokenType = TokenRBrack;
35553    fn new_green(
35554        db: &dyn SyntaxGroup,
35555        leading_trivia: TriviaGreen,
35556        token: <<TerminalRBrack as Terminal>::TokenType as TypedSyntaxNode>::Green,
35557        trailing_trivia: TriviaGreen,
35558    ) -> Self::Green {
35559        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
35560        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
35561        TerminalRBrackGreen(
35562            Arc::new(GreenNode {
35563                kind: SyntaxKind::TerminalRBrack,
35564                details: GreenNodeDetails::Node { children, width },
35565            })
35566            .intern(db),
35567        )
35568    }
35569    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
35570        self.token(db).text(db)
35571    }
35572}
35573impl TerminalRBrack {
35574    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
35575        Trivia::from_syntax_node(db, self.children[0].clone())
35576    }
35577    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenRBrack {
35578        TokenRBrack::from_syntax_node(db, self.children[1].clone())
35579    }
35580    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
35581        Trivia::from_syntax_node(db, self.children[2].clone())
35582    }
35583}
35584#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
35585pub struct TerminalRBrackPtr(pub SyntaxStablePtrId);
35586impl TerminalRBrackPtr {}
35587impl TypedStablePtr for TerminalRBrackPtr {
35588    type SyntaxNode = TerminalRBrack;
35589    fn untyped(&self) -> SyntaxStablePtrId {
35590        self.0
35591    }
35592    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalRBrack {
35593        TerminalRBrack::from_syntax_node(db, self.0.lookup(db))
35594    }
35595}
35596impl From<TerminalRBrackPtr> for SyntaxStablePtrId {
35597    fn from(ptr: TerminalRBrackPtr) -> Self {
35598        ptr.untyped()
35599    }
35600}
35601#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
35602pub struct TerminalRBrackGreen(pub GreenId);
35603impl TypedSyntaxNode for TerminalRBrack {
35604    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalRBrack);
35605    type StablePtr = TerminalRBrackPtr;
35606    type Green = TerminalRBrackGreen;
35607    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
35608        TerminalRBrackGreen(
35609            Arc::new(GreenNode {
35610                kind: SyntaxKind::TerminalRBrack,
35611                details: GreenNodeDetails::Node {
35612                    children: vec![
35613                        Trivia::missing(db).0,
35614                        TokenRBrack::missing(db).0,
35615                        Trivia::missing(db).0,
35616                    ],
35617                    width: TextWidth::default(),
35618                },
35619            })
35620            .intern(db),
35621        )
35622    }
35623    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
35624        let kind = node.kind(db);
35625        assert_eq!(
35626            kind,
35627            SyntaxKind::TerminalRBrack,
35628            "Unexpected SyntaxKind {:?}. Expected {:?}.",
35629            kind,
35630            SyntaxKind::TerminalRBrack
35631        );
35632        let children = db.get_children(node.clone());
35633        Self { node, children }
35634    }
35635    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
35636        let kind = node.kind(db);
35637        if kind == SyntaxKind::TerminalRBrack {
35638            Some(Self::from_syntax_node(db, node))
35639        } else {
35640            None
35641        }
35642    }
35643    fn as_syntax_node(&self) -> SyntaxNode {
35644        self.node.clone()
35645    }
35646    fn stable_ptr(&self) -> Self::StablePtr {
35647        TerminalRBrackPtr(self.node.0.stable_ptr)
35648    }
35649}
35650impl From<&TerminalRBrack> for SyntaxStablePtrId {
35651    fn from(node: &TerminalRBrack) -> Self {
35652        node.stable_ptr().untyped()
35653    }
35654}
35655#[derive(Clone, Debug, Eq, Hash, PartialEq)]
35656pub struct TokenRParen {
35657    node: SyntaxNode,
35658}
35659impl Token for TokenRParen {
35660    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
35661        TokenRParenGreen(
35662            Arc::new(GreenNode {
35663                kind: SyntaxKind::TokenRParen,
35664                details: GreenNodeDetails::Token(text),
35665            })
35666            .intern(db),
35667        )
35668    }
35669    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
35670        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
35671            .clone()
35672    }
35673}
35674#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
35675pub struct TokenRParenPtr(pub SyntaxStablePtrId);
35676impl TypedStablePtr for TokenRParenPtr {
35677    type SyntaxNode = TokenRParen;
35678    fn untyped(&self) -> SyntaxStablePtrId {
35679        self.0
35680    }
35681    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenRParen {
35682        TokenRParen::from_syntax_node(db, self.0.lookup(db))
35683    }
35684}
35685impl From<TokenRParenPtr> for SyntaxStablePtrId {
35686    fn from(ptr: TokenRParenPtr) -> Self {
35687        ptr.untyped()
35688    }
35689}
35690#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
35691pub struct TokenRParenGreen(pub GreenId);
35692impl TokenRParenGreen {
35693    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
35694        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
35695    }
35696}
35697impl TypedSyntaxNode for TokenRParen {
35698    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenRParen);
35699    type StablePtr = TokenRParenPtr;
35700    type Green = TokenRParenGreen;
35701    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
35702        TokenRParenGreen(
35703            Arc::new(GreenNode {
35704                kind: SyntaxKind::TokenMissing,
35705                details: GreenNodeDetails::Token("".into()),
35706            })
35707            .intern(db),
35708        )
35709    }
35710    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
35711        match node.0.green.lookup_intern(db).details {
35712            GreenNodeDetails::Token(_) => Self { node },
35713            GreenNodeDetails::Node { .. } => {
35714                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenRParen)
35715            }
35716        }
35717    }
35718    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
35719        match node.0.green.lookup_intern(db).details {
35720            GreenNodeDetails::Token(_) => Some(Self { node }),
35721            GreenNodeDetails::Node { .. } => None,
35722        }
35723    }
35724    fn as_syntax_node(&self) -> SyntaxNode {
35725        self.node.clone()
35726    }
35727    fn stable_ptr(&self) -> Self::StablePtr {
35728        TokenRParenPtr(self.node.0.stable_ptr)
35729    }
35730}
35731impl From<&TokenRParen> for SyntaxStablePtrId {
35732    fn from(node: &TokenRParen) -> Self {
35733        node.stable_ptr().untyped()
35734    }
35735}
35736#[derive(Clone, Debug, Eq, Hash, PartialEq)]
35737pub struct TerminalRParen {
35738    node: SyntaxNode,
35739    children: Arc<[SyntaxNode]>,
35740}
35741impl Terminal for TerminalRParen {
35742    const KIND: SyntaxKind = SyntaxKind::TerminalRParen;
35743    type TokenType = TokenRParen;
35744    fn new_green(
35745        db: &dyn SyntaxGroup,
35746        leading_trivia: TriviaGreen,
35747        token: <<TerminalRParen as Terminal>::TokenType as TypedSyntaxNode>::Green,
35748        trailing_trivia: TriviaGreen,
35749    ) -> Self::Green {
35750        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
35751        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
35752        TerminalRParenGreen(
35753            Arc::new(GreenNode {
35754                kind: SyntaxKind::TerminalRParen,
35755                details: GreenNodeDetails::Node { children, width },
35756            })
35757            .intern(db),
35758        )
35759    }
35760    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
35761        self.token(db).text(db)
35762    }
35763}
35764impl TerminalRParen {
35765    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
35766        Trivia::from_syntax_node(db, self.children[0].clone())
35767    }
35768    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenRParen {
35769        TokenRParen::from_syntax_node(db, self.children[1].clone())
35770    }
35771    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
35772        Trivia::from_syntax_node(db, self.children[2].clone())
35773    }
35774}
35775#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
35776pub struct TerminalRParenPtr(pub SyntaxStablePtrId);
35777impl TerminalRParenPtr {}
35778impl TypedStablePtr for TerminalRParenPtr {
35779    type SyntaxNode = TerminalRParen;
35780    fn untyped(&self) -> SyntaxStablePtrId {
35781        self.0
35782    }
35783    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalRParen {
35784        TerminalRParen::from_syntax_node(db, self.0.lookup(db))
35785    }
35786}
35787impl From<TerminalRParenPtr> for SyntaxStablePtrId {
35788    fn from(ptr: TerminalRParenPtr) -> Self {
35789        ptr.untyped()
35790    }
35791}
35792#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
35793pub struct TerminalRParenGreen(pub GreenId);
35794impl TypedSyntaxNode for TerminalRParen {
35795    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalRParen);
35796    type StablePtr = TerminalRParenPtr;
35797    type Green = TerminalRParenGreen;
35798    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
35799        TerminalRParenGreen(
35800            Arc::new(GreenNode {
35801                kind: SyntaxKind::TerminalRParen,
35802                details: GreenNodeDetails::Node {
35803                    children: vec![
35804                        Trivia::missing(db).0,
35805                        TokenRParen::missing(db).0,
35806                        Trivia::missing(db).0,
35807                    ],
35808                    width: TextWidth::default(),
35809                },
35810            })
35811            .intern(db),
35812        )
35813    }
35814    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
35815        let kind = node.kind(db);
35816        assert_eq!(
35817            kind,
35818            SyntaxKind::TerminalRParen,
35819            "Unexpected SyntaxKind {:?}. Expected {:?}.",
35820            kind,
35821            SyntaxKind::TerminalRParen
35822        );
35823        let children = db.get_children(node.clone());
35824        Self { node, children }
35825    }
35826    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
35827        let kind = node.kind(db);
35828        if kind == SyntaxKind::TerminalRParen {
35829            Some(Self::from_syntax_node(db, node))
35830        } else {
35831            None
35832        }
35833    }
35834    fn as_syntax_node(&self) -> SyntaxNode {
35835        self.node.clone()
35836    }
35837    fn stable_ptr(&self) -> Self::StablePtr {
35838        TerminalRParenPtr(self.node.0.stable_ptr)
35839    }
35840}
35841impl From<&TerminalRParen> for SyntaxStablePtrId {
35842    fn from(node: &TerminalRParen) -> Self {
35843        node.stable_ptr().untyped()
35844    }
35845}
35846#[derive(Clone, Debug, Eq, Hash, PartialEq)]
35847pub struct TokenSemicolon {
35848    node: SyntaxNode,
35849}
35850impl Token for TokenSemicolon {
35851    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
35852        TokenSemicolonGreen(
35853            Arc::new(GreenNode {
35854                kind: SyntaxKind::TokenSemicolon,
35855                details: GreenNodeDetails::Token(text),
35856            })
35857            .intern(db),
35858        )
35859    }
35860    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
35861        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
35862            .clone()
35863    }
35864}
35865#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
35866pub struct TokenSemicolonPtr(pub SyntaxStablePtrId);
35867impl TypedStablePtr for TokenSemicolonPtr {
35868    type SyntaxNode = TokenSemicolon;
35869    fn untyped(&self) -> SyntaxStablePtrId {
35870        self.0
35871    }
35872    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenSemicolon {
35873        TokenSemicolon::from_syntax_node(db, self.0.lookup(db))
35874    }
35875}
35876impl From<TokenSemicolonPtr> for SyntaxStablePtrId {
35877    fn from(ptr: TokenSemicolonPtr) -> Self {
35878        ptr.untyped()
35879    }
35880}
35881#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
35882pub struct TokenSemicolonGreen(pub GreenId);
35883impl TokenSemicolonGreen {
35884    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
35885        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
35886    }
35887}
35888impl TypedSyntaxNode for TokenSemicolon {
35889    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenSemicolon);
35890    type StablePtr = TokenSemicolonPtr;
35891    type Green = TokenSemicolonGreen;
35892    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
35893        TokenSemicolonGreen(
35894            Arc::new(GreenNode {
35895                kind: SyntaxKind::TokenMissing,
35896                details: GreenNodeDetails::Token("".into()),
35897            })
35898            .intern(db),
35899        )
35900    }
35901    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
35902        match node.0.green.lookup_intern(db).details {
35903            GreenNodeDetails::Token(_) => Self { node },
35904            GreenNodeDetails::Node { .. } => {
35905                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenSemicolon)
35906            }
35907        }
35908    }
35909    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
35910        match node.0.green.lookup_intern(db).details {
35911            GreenNodeDetails::Token(_) => Some(Self { node }),
35912            GreenNodeDetails::Node { .. } => None,
35913        }
35914    }
35915    fn as_syntax_node(&self) -> SyntaxNode {
35916        self.node.clone()
35917    }
35918    fn stable_ptr(&self) -> Self::StablePtr {
35919        TokenSemicolonPtr(self.node.0.stable_ptr)
35920    }
35921}
35922impl From<&TokenSemicolon> for SyntaxStablePtrId {
35923    fn from(node: &TokenSemicolon) -> Self {
35924        node.stable_ptr().untyped()
35925    }
35926}
35927#[derive(Clone, Debug, Eq, Hash, PartialEq)]
35928pub struct TerminalSemicolon {
35929    node: SyntaxNode,
35930    children: Arc<[SyntaxNode]>,
35931}
35932impl Terminal for TerminalSemicolon {
35933    const KIND: SyntaxKind = SyntaxKind::TerminalSemicolon;
35934    type TokenType = TokenSemicolon;
35935    fn new_green(
35936        db: &dyn SyntaxGroup,
35937        leading_trivia: TriviaGreen,
35938        token: <<TerminalSemicolon as Terminal>::TokenType as TypedSyntaxNode>::Green,
35939        trailing_trivia: TriviaGreen,
35940    ) -> Self::Green {
35941        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
35942        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
35943        TerminalSemicolonGreen(
35944            Arc::new(GreenNode {
35945                kind: SyntaxKind::TerminalSemicolon,
35946                details: GreenNodeDetails::Node { children, width },
35947            })
35948            .intern(db),
35949        )
35950    }
35951    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
35952        self.token(db).text(db)
35953    }
35954}
35955impl TerminalSemicolon {
35956    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
35957        Trivia::from_syntax_node(db, self.children[0].clone())
35958    }
35959    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenSemicolon {
35960        TokenSemicolon::from_syntax_node(db, self.children[1].clone())
35961    }
35962    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
35963        Trivia::from_syntax_node(db, self.children[2].clone())
35964    }
35965}
35966#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
35967pub struct TerminalSemicolonPtr(pub SyntaxStablePtrId);
35968impl TerminalSemicolonPtr {}
35969impl TypedStablePtr for TerminalSemicolonPtr {
35970    type SyntaxNode = TerminalSemicolon;
35971    fn untyped(&self) -> SyntaxStablePtrId {
35972        self.0
35973    }
35974    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalSemicolon {
35975        TerminalSemicolon::from_syntax_node(db, self.0.lookup(db))
35976    }
35977}
35978impl From<TerminalSemicolonPtr> for SyntaxStablePtrId {
35979    fn from(ptr: TerminalSemicolonPtr) -> Self {
35980        ptr.untyped()
35981    }
35982}
35983#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
35984pub struct TerminalSemicolonGreen(pub GreenId);
35985impl TypedSyntaxNode for TerminalSemicolon {
35986    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalSemicolon);
35987    type StablePtr = TerminalSemicolonPtr;
35988    type Green = TerminalSemicolonGreen;
35989    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
35990        TerminalSemicolonGreen(
35991            Arc::new(GreenNode {
35992                kind: SyntaxKind::TerminalSemicolon,
35993                details: GreenNodeDetails::Node {
35994                    children: vec![
35995                        Trivia::missing(db).0,
35996                        TokenSemicolon::missing(db).0,
35997                        Trivia::missing(db).0,
35998                    ],
35999                    width: TextWidth::default(),
36000                },
36001            })
36002            .intern(db),
36003        )
36004    }
36005    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
36006        let kind = node.kind(db);
36007        assert_eq!(
36008            kind,
36009            SyntaxKind::TerminalSemicolon,
36010            "Unexpected SyntaxKind {:?}. Expected {:?}.",
36011            kind,
36012            SyntaxKind::TerminalSemicolon
36013        );
36014        let children = db.get_children(node.clone());
36015        Self { node, children }
36016    }
36017    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
36018        let kind = node.kind(db);
36019        if kind == SyntaxKind::TerminalSemicolon {
36020            Some(Self::from_syntax_node(db, node))
36021        } else {
36022            None
36023        }
36024    }
36025    fn as_syntax_node(&self) -> SyntaxNode {
36026        self.node.clone()
36027    }
36028    fn stable_ptr(&self) -> Self::StablePtr {
36029        TerminalSemicolonPtr(self.node.0.stable_ptr)
36030    }
36031}
36032impl From<&TerminalSemicolon> for SyntaxStablePtrId {
36033    fn from(node: &TerminalSemicolon) -> Self {
36034        node.stable_ptr().untyped()
36035    }
36036}
36037#[derive(Clone, Debug, Eq, Hash, PartialEq)]
36038pub struct TokenUnderscore {
36039    node: SyntaxNode,
36040}
36041impl Token for TokenUnderscore {
36042    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
36043        TokenUnderscoreGreen(
36044            Arc::new(GreenNode {
36045                kind: SyntaxKind::TokenUnderscore,
36046                details: GreenNodeDetails::Token(text),
36047            })
36048            .intern(db),
36049        )
36050    }
36051    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
36052        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
36053            .clone()
36054    }
36055}
36056#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
36057pub struct TokenUnderscorePtr(pub SyntaxStablePtrId);
36058impl TypedStablePtr for TokenUnderscorePtr {
36059    type SyntaxNode = TokenUnderscore;
36060    fn untyped(&self) -> SyntaxStablePtrId {
36061        self.0
36062    }
36063    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenUnderscore {
36064        TokenUnderscore::from_syntax_node(db, self.0.lookup(db))
36065    }
36066}
36067impl From<TokenUnderscorePtr> for SyntaxStablePtrId {
36068    fn from(ptr: TokenUnderscorePtr) -> Self {
36069        ptr.untyped()
36070    }
36071}
36072#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
36073pub struct TokenUnderscoreGreen(pub GreenId);
36074impl TokenUnderscoreGreen {
36075    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
36076        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
36077    }
36078}
36079impl TypedSyntaxNode for TokenUnderscore {
36080    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenUnderscore);
36081    type StablePtr = TokenUnderscorePtr;
36082    type Green = TokenUnderscoreGreen;
36083    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
36084        TokenUnderscoreGreen(
36085            Arc::new(GreenNode {
36086                kind: SyntaxKind::TokenMissing,
36087                details: GreenNodeDetails::Token("".into()),
36088            })
36089            .intern(db),
36090        )
36091    }
36092    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
36093        match node.0.green.lookup_intern(db).details {
36094            GreenNodeDetails::Token(_) => Self { node },
36095            GreenNodeDetails::Node { .. } => {
36096                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenUnderscore)
36097            }
36098        }
36099    }
36100    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
36101        match node.0.green.lookup_intern(db).details {
36102            GreenNodeDetails::Token(_) => Some(Self { node }),
36103            GreenNodeDetails::Node { .. } => None,
36104        }
36105    }
36106    fn as_syntax_node(&self) -> SyntaxNode {
36107        self.node.clone()
36108    }
36109    fn stable_ptr(&self) -> Self::StablePtr {
36110        TokenUnderscorePtr(self.node.0.stable_ptr)
36111    }
36112}
36113impl From<&TokenUnderscore> for SyntaxStablePtrId {
36114    fn from(node: &TokenUnderscore) -> Self {
36115        node.stable_ptr().untyped()
36116    }
36117}
36118#[derive(Clone, Debug, Eq, Hash, PartialEq)]
36119pub struct TerminalUnderscore {
36120    node: SyntaxNode,
36121    children: Arc<[SyntaxNode]>,
36122}
36123impl Terminal for TerminalUnderscore {
36124    const KIND: SyntaxKind = SyntaxKind::TerminalUnderscore;
36125    type TokenType = TokenUnderscore;
36126    fn new_green(
36127        db: &dyn SyntaxGroup,
36128        leading_trivia: TriviaGreen,
36129        token: <<TerminalUnderscore as Terminal>::TokenType as TypedSyntaxNode>::Green,
36130        trailing_trivia: TriviaGreen,
36131    ) -> Self::Green {
36132        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
36133        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
36134        TerminalUnderscoreGreen(
36135            Arc::new(GreenNode {
36136                kind: SyntaxKind::TerminalUnderscore,
36137                details: GreenNodeDetails::Node { children, width },
36138            })
36139            .intern(db),
36140        )
36141    }
36142    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
36143        self.token(db).text(db)
36144    }
36145}
36146impl TerminalUnderscore {
36147    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
36148        Trivia::from_syntax_node(db, self.children[0].clone())
36149    }
36150    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenUnderscore {
36151        TokenUnderscore::from_syntax_node(db, self.children[1].clone())
36152    }
36153    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
36154        Trivia::from_syntax_node(db, self.children[2].clone())
36155    }
36156}
36157#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
36158pub struct TerminalUnderscorePtr(pub SyntaxStablePtrId);
36159impl TerminalUnderscorePtr {}
36160impl TypedStablePtr for TerminalUnderscorePtr {
36161    type SyntaxNode = TerminalUnderscore;
36162    fn untyped(&self) -> SyntaxStablePtrId {
36163        self.0
36164    }
36165    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalUnderscore {
36166        TerminalUnderscore::from_syntax_node(db, self.0.lookup(db))
36167    }
36168}
36169impl From<TerminalUnderscorePtr> for SyntaxStablePtrId {
36170    fn from(ptr: TerminalUnderscorePtr) -> Self {
36171        ptr.untyped()
36172    }
36173}
36174#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
36175pub struct TerminalUnderscoreGreen(pub GreenId);
36176impl TypedSyntaxNode for TerminalUnderscore {
36177    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalUnderscore);
36178    type StablePtr = TerminalUnderscorePtr;
36179    type Green = TerminalUnderscoreGreen;
36180    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
36181        TerminalUnderscoreGreen(
36182            Arc::new(GreenNode {
36183                kind: SyntaxKind::TerminalUnderscore,
36184                details: GreenNodeDetails::Node {
36185                    children: vec![
36186                        Trivia::missing(db).0,
36187                        TokenUnderscore::missing(db).0,
36188                        Trivia::missing(db).0,
36189                    ],
36190                    width: TextWidth::default(),
36191                },
36192            })
36193            .intern(db),
36194        )
36195    }
36196    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
36197        let kind = node.kind(db);
36198        assert_eq!(
36199            kind,
36200            SyntaxKind::TerminalUnderscore,
36201            "Unexpected SyntaxKind {:?}. Expected {:?}.",
36202            kind,
36203            SyntaxKind::TerminalUnderscore
36204        );
36205        let children = db.get_children(node.clone());
36206        Self { node, children }
36207    }
36208    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
36209        let kind = node.kind(db);
36210        if kind == SyntaxKind::TerminalUnderscore {
36211            Some(Self::from_syntax_node(db, node))
36212        } else {
36213            None
36214        }
36215    }
36216    fn as_syntax_node(&self) -> SyntaxNode {
36217        self.node.clone()
36218    }
36219    fn stable_ptr(&self) -> Self::StablePtr {
36220        TerminalUnderscorePtr(self.node.0.stable_ptr)
36221    }
36222}
36223impl From<&TerminalUnderscore> for SyntaxStablePtrId {
36224    fn from(node: &TerminalUnderscore) -> Self {
36225        node.stable_ptr().untyped()
36226    }
36227}
36228#[derive(Clone, Debug, Eq, Hash, PartialEq)]
36229pub struct TokenXor {
36230    node: SyntaxNode,
36231}
36232impl Token for TokenXor {
36233    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
36234        TokenXorGreen(
36235            Arc::new(GreenNode {
36236                kind: SyntaxKind::TokenXor,
36237                details: GreenNodeDetails::Token(text),
36238            })
36239            .intern(db),
36240        )
36241    }
36242    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
36243        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
36244            .clone()
36245    }
36246}
36247#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
36248pub struct TokenXorPtr(pub SyntaxStablePtrId);
36249impl TypedStablePtr for TokenXorPtr {
36250    type SyntaxNode = TokenXor;
36251    fn untyped(&self) -> SyntaxStablePtrId {
36252        self.0
36253    }
36254    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenXor {
36255        TokenXor::from_syntax_node(db, self.0.lookup(db))
36256    }
36257}
36258impl From<TokenXorPtr> for SyntaxStablePtrId {
36259    fn from(ptr: TokenXorPtr) -> Self {
36260        ptr.untyped()
36261    }
36262}
36263#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
36264pub struct TokenXorGreen(pub GreenId);
36265impl TokenXorGreen {
36266    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
36267        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
36268    }
36269}
36270impl TypedSyntaxNode for TokenXor {
36271    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenXor);
36272    type StablePtr = TokenXorPtr;
36273    type Green = TokenXorGreen;
36274    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
36275        TokenXorGreen(
36276            Arc::new(GreenNode {
36277                kind: SyntaxKind::TokenMissing,
36278                details: GreenNodeDetails::Token("".into()),
36279            })
36280            .intern(db),
36281        )
36282    }
36283    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
36284        match node.0.green.lookup_intern(db).details {
36285            GreenNodeDetails::Token(_) => Self { node },
36286            GreenNodeDetails::Node { .. } => {
36287                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenXor)
36288            }
36289        }
36290    }
36291    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
36292        match node.0.green.lookup_intern(db).details {
36293            GreenNodeDetails::Token(_) => Some(Self { node }),
36294            GreenNodeDetails::Node { .. } => None,
36295        }
36296    }
36297    fn as_syntax_node(&self) -> SyntaxNode {
36298        self.node.clone()
36299    }
36300    fn stable_ptr(&self) -> Self::StablePtr {
36301        TokenXorPtr(self.node.0.stable_ptr)
36302    }
36303}
36304impl From<&TokenXor> for SyntaxStablePtrId {
36305    fn from(node: &TokenXor) -> Self {
36306        node.stable_ptr().untyped()
36307    }
36308}
36309#[derive(Clone, Debug, Eq, Hash, PartialEq)]
36310pub struct TerminalXor {
36311    node: SyntaxNode,
36312    children: Arc<[SyntaxNode]>,
36313}
36314impl Terminal for TerminalXor {
36315    const KIND: SyntaxKind = SyntaxKind::TerminalXor;
36316    type TokenType = TokenXor;
36317    fn new_green(
36318        db: &dyn SyntaxGroup,
36319        leading_trivia: TriviaGreen,
36320        token: <<TerminalXor as Terminal>::TokenType as TypedSyntaxNode>::Green,
36321        trailing_trivia: TriviaGreen,
36322    ) -> Self::Green {
36323        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
36324        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
36325        TerminalXorGreen(
36326            Arc::new(GreenNode {
36327                kind: SyntaxKind::TerminalXor,
36328                details: GreenNodeDetails::Node { children, width },
36329            })
36330            .intern(db),
36331        )
36332    }
36333    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
36334        self.token(db).text(db)
36335    }
36336}
36337impl TerminalXor {
36338    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
36339        Trivia::from_syntax_node(db, self.children[0].clone())
36340    }
36341    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenXor {
36342        TokenXor::from_syntax_node(db, self.children[1].clone())
36343    }
36344    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
36345        Trivia::from_syntax_node(db, self.children[2].clone())
36346    }
36347}
36348#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
36349pub struct TerminalXorPtr(pub SyntaxStablePtrId);
36350impl TerminalXorPtr {}
36351impl TypedStablePtr for TerminalXorPtr {
36352    type SyntaxNode = TerminalXor;
36353    fn untyped(&self) -> SyntaxStablePtrId {
36354        self.0
36355    }
36356    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalXor {
36357        TerminalXor::from_syntax_node(db, self.0.lookup(db))
36358    }
36359}
36360impl From<TerminalXorPtr> for SyntaxStablePtrId {
36361    fn from(ptr: TerminalXorPtr) -> Self {
36362        ptr.untyped()
36363    }
36364}
36365#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
36366pub struct TerminalXorGreen(pub GreenId);
36367impl TypedSyntaxNode for TerminalXor {
36368    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalXor);
36369    type StablePtr = TerminalXorPtr;
36370    type Green = TerminalXorGreen;
36371    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
36372        TerminalXorGreen(
36373            Arc::new(GreenNode {
36374                kind: SyntaxKind::TerminalXor,
36375                details: GreenNodeDetails::Node {
36376                    children: vec![
36377                        Trivia::missing(db).0,
36378                        TokenXor::missing(db).0,
36379                        Trivia::missing(db).0,
36380                    ],
36381                    width: TextWidth::default(),
36382                },
36383            })
36384            .intern(db),
36385        )
36386    }
36387    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
36388        let kind = node.kind(db);
36389        assert_eq!(
36390            kind,
36391            SyntaxKind::TerminalXor,
36392            "Unexpected SyntaxKind {:?}. Expected {:?}.",
36393            kind,
36394            SyntaxKind::TerminalXor
36395        );
36396        let children = db.get_children(node.clone());
36397        Self { node, children }
36398    }
36399    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
36400        let kind = node.kind(db);
36401        if kind == SyntaxKind::TerminalXor { Some(Self::from_syntax_node(db, node)) } else { None }
36402    }
36403    fn as_syntax_node(&self) -> SyntaxNode {
36404        self.node.clone()
36405    }
36406    fn stable_ptr(&self) -> Self::StablePtr {
36407        TerminalXorPtr(self.node.0.stable_ptr)
36408    }
36409}
36410impl From<&TerminalXor> for SyntaxStablePtrId {
36411    fn from(node: &TerminalXor) -> Self {
36412        node.stable_ptr().untyped()
36413    }
36414}
36415#[derive(Clone, Debug, Eq, Hash, PartialEq)]
36416pub struct SyntaxFile {
36417    node: SyntaxNode,
36418    children: Arc<[SyntaxNode]>,
36419}
36420impl SyntaxFile {
36421    pub const INDEX_ITEMS: usize = 0;
36422    pub const INDEX_EOF: usize = 1;
36423    pub fn new_green(
36424        db: &dyn SyntaxGroup,
36425        items: ModuleItemListGreen,
36426        eof: TerminalEndOfFileGreen,
36427    ) -> SyntaxFileGreen {
36428        let children: Vec<GreenId> = vec![items.0, eof.0];
36429        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
36430        SyntaxFileGreen(
36431            Arc::new(GreenNode {
36432                kind: SyntaxKind::SyntaxFile,
36433                details: GreenNodeDetails::Node { children, width },
36434            })
36435            .intern(db),
36436        )
36437    }
36438}
36439impl SyntaxFile {
36440    pub fn items(&self, db: &dyn SyntaxGroup) -> ModuleItemList {
36441        ModuleItemList::from_syntax_node(db, self.children[0].clone())
36442    }
36443    pub fn eof(&self, db: &dyn SyntaxGroup) -> TerminalEndOfFile {
36444        TerminalEndOfFile::from_syntax_node(db, self.children[1].clone())
36445    }
36446}
36447#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
36448pub struct SyntaxFilePtr(pub SyntaxStablePtrId);
36449impl SyntaxFilePtr {}
36450impl TypedStablePtr for SyntaxFilePtr {
36451    type SyntaxNode = SyntaxFile;
36452    fn untyped(&self) -> SyntaxStablePtrId {
36453        self.0
36454    }
36455    fn lookup(&self, db: &dyn SyntaxGroup) -> SyntaxFile {
36456        SyntaxFile::from_syntax_node(db, self.0.lookup(db))
36457    }
36458}
36459impl From<SyntaxFilePtr> for SyntaxStablePtrId {
36460    fn from(ptr: SyntaxFilePtr) -> Self {
36461        ptr.untyped()
36462    }
36463}
36464#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
36465pub struct SyntaxFileGreen(pub GreenId);
36466impl TypedSyntaxNode for SyntaxFile {
36467    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::SyntaxFile);
36468    type StablePtr = SyntaxFilePtr;
36469    type Green = SyntaxFileGreen;
36470    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
36471        SyntaxFileGreen(
36472            Arc::new(GreenNode {
36473                kind: SyntaxKind::SyntaxFile,
36474                details: GreenNodeDetails::Node {
36475                    children: vec![ModuleItemList::missing(db).0, TerminalEndOfFile::missing(db).0],
36476                    width: TextWidth::default(),
36477                },
36478            })
36479            .intern(db),
36480        )
36481    }
36482    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
36483        let kind = node.kind(db);
36484        assert_eq!(
36485            kind,
36486            SyntaxKind::SyntaxFile,
36487            "Unexpected SyntaxKind {:?}. Expected {:?}.",
36488            kind,
36489            SyntaxKind::SyntaxFile
36490        );
36491        let children = db.get_children(node.clone());
36492        Self { node, children }
36493    }
36494    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
36495        let kind = node.kind(db);
36496        if kind == SyntaxKind::SyntaxFile { Some(Self::from_syntax_node(db, node)) } else { None }
36497    }
36498    fn as_syntax_node(&self) -> SyntaxNode {
36499        self.node.clone()
36500    }
36501    fn stable_ptr(&self) -> Self::StablePtr {
36502        SyntaxFilePtr(self.node.0.stable_ptr)
36503    }
36504}
36505impl From<&SyntaxFile> for SyntaxStablePtrId {
36506    fn from(node: &SyntaxFile) -> Self {
36507        node.stable_ptr().untyped()
36508    }
36509}
36510#[derive(Clone, Debug, Eq, Hash, PartialEq)]
36511pub struct TokenEmpty {
36512    node: SyntaxNode,
36513}
36514impl Token for TokenEmpty {
36515    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
36516        TokenEmptyGreen(
36517            Arc::new(GreenNode {
36518                kind: SyntaxKind::TokenEmpty,
36519                details: GreenNodeDetails::Token(text),
36520            })
36521            .intern(db),
36522        )
36523    }
36524    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
36525        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
36526            .clone()
36527    }
36528}
36529#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
36530pub struct TokenEmptyPtr(pub SyntaxStablePtrId);
36531impl TypedStablePtr for TokenEmptyPtr {
36532    type SyntaxNode = TokenEmpty;
36533    fn untyped(&self) -> SyntaxStablePtrId {
36534        self.0
36535    }
36536    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenEmpty {
36537        TokenEmpty::from_syntax_node(db, self.0.lookup(db))
36538    }
36539}
36540impl From<TokenEmptyPtr> for SyntaxStablePtrId {
36541    fn from(ptr: TokenEmptyPtr) -> Self {
36542        ptr.untyped()
36543    }
36544}
36545#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
36546pub struct TokenEmptyGreen(pub GreenId);
36547impl TokenEmptyGreen {
36548    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
36549        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
36550    }
36551}
36552impl TypedSyntaxNode for TokenEmpty {
36553    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenEmpty);
36554    type StablePtr = TokenEmptyPtr;
36555    type Green = TokenEmptyGreen;
36556    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
36557        TokenEmptyGreen(
36558            Arc::new(GreenNode {
36559                kind: SyntaxKind::TokenMissing,
36560                details: GreenNodeDetails::Token("".into()),
36561            })
36562            .intern(db),
36563        )
36564    }
36565    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
36566        match node.0.green.lookup_intern(db).details {
36567            GreenNodeDetails::Token(_) => Self { node },
36568            GreenNodeDetails::Node { .. } => {
36569                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenEmpty)
36570            }
36571        }
36572    }
36573    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
36574        match node.0.green.lookup_intern(db).details {
36575            GreenNodeDetails::Token(_) => Some(Self { node }),
36576            GreenNodeDetails::Node { .. } => None,
36577        }
36578    }
36579    fn as_syntax_node(&self) -> SyntaxNode {
36580        self.node.clone()
36581    }
36582    fn stable_ptr(&self) -> Self::StablePtr {
36583        TokenEmptyPtr(self.node.0.stable_ptr)
36584    }
36585}
36586impl From<&TokenEmpty> for SyntaxStablePtrId {
36587    fn from(node: &TokenEmpty) -> Self {
36588        node.stable_ptr().untyped()
36589    }
36590}
36591#[derive(Clone, Debug, Eq, Hash, PartialEq)]
36592pub struct TerminalEmpty {
36593    node: SyntaxNode,
36594    children: Arc<[SyntaxNode]>,
36595}
36596impl Terminal for TerminalEmpty {
36597    const KIND: SyntaxKind = SyntaxKind::TerminalEmpty;
36598    type TokenType = TokenEmpty;
36599    fn new_green(
36600        db: &dyn SyntaxGroup,
36601        leading_trivia: TriviaGreen,
36602        token: <<TerminalEmpty as Terminal>::TokenType as TypedSyntaxNode>::Green,
36603        trailing_trivia: TriviaGreen,
36604    ) -> Self::Green {
36605        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
36606        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
36607        TerminalEmptyGreen(
36608            Arc::new(GreenNode {
36609                kind: SyntaxKind::TerminalEmpty,
36610                details: GreenNodeDetails::Node { children, width },
36611            })
36612            .intern(db),
36613        )
36614    }
36615    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
36616        self.token(db).text(db)
36617    }
36618}
36619impl TerminalEmpty {
36620    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
36621        Trivia::from_syntax_node(db, self.children[0].clone())
36622    }
36623    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenEmpty {
36624        TokenEmpty::from_syntax_node(db, self.children[1].clone())
36625    }
36626    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
36627        Trivia::from_syntax_node(db, self.children[2].clone())
36628    }
36629}
36630#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
36631pub struct TerminalEmptyPtr(pub SyntaxStablePtrId);
36632impl TerminalEmptyPtr {}
36633impl TypedStablePtr for TerminalEmptyPtr {
36634    type SyntaxNode = TerminalEmpty;
36635    fn untyped(&self) -> SyntaxStablePtrId {
36636        self.0
36637    }
36638    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalEmpty {
36639        TerminalEmpty::from_syntax_node(db, self.0.lookup(db))
36640    }
36641}
36642impl From<TerminalEmptyPtr> for SyntaxStablePtrId {
36643    fn from(ptr: TerminalEmptyPtr) -> Self {
36644        ptr.untyped()
36645    }
36646}
36647#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
36648pub struct TerminalEmptyGreen(pub GreenId);
36649impl TypedSyntaxNode for TerminalEmpty {
36650    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalEmpty);
36651    type StablePtr = TerminalEmptyPtr;
36652    type Green = TerminalEmptyGreen;
36653    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
36654        TerminalEmptyGreen(
36655            Arc::new(GreenNode {
36656                kind: SyntaxKind::TerminalEmpty,
36657                details: GreenNodeDetails::Node {
36658                    children: vec![
36659                        Trivia::missing(db).0,
36660                        TokenEmpty::missing(db).0,
36661                        Trivia::missing(db).0,
36662                    ],
36663                    width: TextWidth::default(),
36664                },
36665            })
36666            .intern(db),
36667        )
36668    }
36669    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
36670        let kind = node.kind(db);
36671        assert_eq!(
36672            kind,
36673            SyntaxKind::TerminalEmpty,
36674            "Unexpected SyntaxKind {:?}. Expected {:?}.",
36675            kind,
36676            SyntaxKind::TerminalEmpty
36677        );
36678        let children = db.get_children(node.clone());
36679        Self { node, children }
36680    }
36681    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
36682        let kind = node.kind(db);
36683        if kind == SyntaxKind::TerminalEmpty {
36684            Some(Self::from_syntax_node(db, node))
36685        } else {
36686            None
36687        }
36688    }
36689    fn as_syntax_node(&self) -> SyntaxNode {
36690        self.node.clone()
36691    }
36692    fn stable_ptr(&self) -> Self::StablePtr {
36693        TerminalEmptyPtr(self.node.0.stable_ptr)
36694    }
36695}
36696impl From<&TerminalEmpty> for SyntaxStablePtrId {
36697    fn from(node: &TerminalEmpty) -> Self {
36698        node.stable_ptr().untyped()
36699    }
36700}
36701#[derive(Clone, Debug, Eq, Hash, PartialEq)]
36702pub struct TokenSingleLineComment {
36703    node: SyntaxNode,
36704}
36705impl Token for TokenSingleLineComment {
36706    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
36707        TokenSingleLineCommentGreen(
36708            Arc::new(GreenNode {
36709                kind: SyntaxKind::TokenSingleLineComment,
36710                details: GreenNodeDetails::Token(text),
36711            })
36712            .intern(db),
36713        )
36714    }
36715    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
36716        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
36717            .clone()
36718    }
36719}
36720#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
36721pub struct TokenSingleLineCommentPtr(pub SyntaxStablePtrId);
36722impl TypedStablePtr for TokenSingleLineCommentPtr {
36723    type SyntaxNode = TokenSingleLineComment;
36724    fn untyped(&self) -> SyntaxStablePtrId {
36725        self.0
36726    }
36727    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenSingleLineComment {
36728        TokenSingleLineComment::from_syntax_node(db, self.0.lookup(db))
36729    }
36730}
36731impl From<TokenSingleLineCommentPtr> for SyntaxStablePtrId {
36732    fn from(ptr: TokenSingleLineCommentPtr) -> Self {
36733        ptr.untyped()
36734    }
36735}
36736#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
36737pub struct TokenSingleLineCommentGreen(pub GreenId);
36738impl TokenSingleLineCommentGreen {
36739    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
36740        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
36741    }
36742}
36743impl TypedSyntaxNode for TokenSingleLineComment {
36744    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenSingleLineComment);
36745    type StablePtr = TokenSingleLineCommentPtr;
36746    type Green = TokenSingleLineCommentGreen;
36747    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
36748        TokenSingleLineCommentGreen(
36749            Arc::new(GreenNode {
36750                kind: SyntaxKind::TokenMissing,
36751                details: GreenNodeDetails::Token("".into()),
36752            })
36753            .intern(db),
36754        )
36755    }
36756    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
36757        match node.0.green.lookup_intern(db).details {
36758            GreenNodeDetails::Token(_) => Self { node },
36759            GreenNodeDetails::Node { .. } => panic!(
36760                "Expected a token {:?}, not an internal node",
36761                SyntaxKind::TokenSingleLineComment
36762            ),
36763        }
36764    }
36765    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
36766        match node.0.green.lookup_intern(db).details {
36767            GreenNodeDetails::Token(_) => Some(Self { node }),
36768            GreenNodeDetails::Node { .. } => None,
36769        }
36770    }
36771    fn as_syntax_node(&self) -> SyntaxNode {
36772        self.node.clone()
36773    }
36774    fn stable_ptr(&self) -> Self::StablePtr {
36775        TokenSingleLineCommentPtr(self.node.0.stable_ptr)
36776    }
36777}
36778impl From<&TokenSingleLineComment> for SyntaxStablePtrId {
36779    fn from(node: &TokenSingleLineComment) -> Self {
36780        node.stable_ptr().untyped()
36781    }
36782}
36783#[derive(Clone, Debug, Eq, Hash, PartialEq)]
36784pub struct TokenSingleLineInnerComment {
36785    node: SyntaxNode,
36786}
36787impl Token for TokenSingleLineInnerComment {
36788    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
36789        TokenSingleLineInnerCommentGreen(
36790            Arc::new(GreenNode {
36791                kind: SyntaxKind::TokenSingleLineInnerComment,
36792                details: GreenNodeDetails::Token(text),
36793            })
36794            .intern(db),
36795        )
36796    }
36797    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
36798        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
36799            .clone()
36800    }
36801}
36802#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
36803pub struct TokenSingleLineInnerCommentPtr(pub SyntaxStablePtrId);
36804impl TypedStablePtr for TokenSingleLineInnerCommentPtr {
36805    type SyntaxNode = TokenSingleLineInnerComment;
36806    fn untyped(&self) -> SyntaxStablePtrId {
36807        self.0
36808    }
36809    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenSingleLineInnerComment {
36810        TokenSingleLineInnerComment::from_syntax_node(db, self.0.lookup(db))
36811    }
36812}
36813impl From<TokenSingleLineInnerCommentPtr> for SyntaxStablePtrId {
36814    fn from(ptr: TokenSingleLineInnerCommentPtr) -> Self {
36815        ptr.untyped()
36816    }
36817}
36818#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
36819pub struct TokenSingleLineInnerCommentGreen(pub GreenId);
36820impl TokenSingleLineInnerCommentGreen {
36821    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
36822        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
36823    }
36824}
36825impl TypedSyntaxNode for TokenSingleLineInnerComment {
36826    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenSingleLineInnerComment);
36827    type StablePtr = TokenSingleLineInnerCommentPtr;
36828    type Green = TokenSingleLineInnerCommentGreen;
36829    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
36830        TokenSingleLineInnerCommentGreen(
36831            Arc::new(GreenNode {
36832                kind: SyntaxKind::TokenMissing,
36833                details: GreenNodeDetails::Token("".into()),
36834            })
36835            .intern(db),
36836        )
36837    }
36838    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
36839        match node.0.green.lookup_intern(db).details {
36840            GreenNodeDetails::Token(_) => Self { node },
36841            GreenNodeDetails::Node { .. } => panic!(
36842                "Expected a token {:?}, not an internal node",
36843                SyntaxKind::TokenSingleLineInnerComment
36844            ),
36845        }
36846    }
36847    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
36848        match node.0.green.lookup_intern(db).details {
36849            GreenNodeDetails::Token(_) => Some(Self { node }),
36850            GreenNodeDetails::Node { .. } => None,
36851        }
36852    }
36853    fn as_syntax_node(&self) -> SyntaxNode {
36854        self.node.clone()
36855    }
36856    fn stable_ptr(&self) -> Self::StablePtr {
36857        TokenSingleLineInnerCommentPtr(self.node.0.stable_ptr)
36858    }
36859}
36860impl From<&TokenSingleLineInnerComment> for SyntaxStablePtrId {
36861    fn from(node: &TokenSingleLineInnerComment) -> Self {
36862        node.stable_ptr().untyped()
36863    }
36864}
36865#[derive(Clone, Debug, Eq, Hash, PartialEq)]
36866pub struct TokenSingleLineDocComment {
36867    node: SyntaxNode,
36868}
36869impl Token for TokenSingleLineDocComment {
36870    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
36871        TokenSingleLineDocCommentGreen(
36872            Arc::new(GreenNode {
36873                kind: SyntaxKind::TokenSingleLineDocComment,
36874                details: GreenNodeDetails::Token(text),
36875            })
36876            .intern(db),
36877        )
36878    }
36879    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
36880        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
36881            .clone()
36882    }
36883}
36884#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
36885pub struct TokenSingleLineDocCommentPtr(pub SyntaxStablePtrId);
36886impl TypedStablePtr for TokenSingleLineDocCommentPtr {
36887    type SyntaxNode = TokenSingleLineDocComment;
36888    fn untyped(&self) -> SyntaxStablePtrId {
36889        self.0
36890    }
36891    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenSingleLineDocComment {
36892        TokenSingleLineDocComment::from_syntax_node(db, self.0.lookup(db))
36893    }
36894}
36895impl From<TokenSingleLineDocCommentPtr> for SyntaxStablePtrId {
36896    fn from(ptr: TokenSingleLineDocCommentPtr) -> Self {
36897        ptr.untyped()
36898    }
36899}
36900#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
36901pub struct TokenSingleLineDocCommentGreen(pub GreenId);
36902impl TokenSingleLineDocCommentGreen {
36903    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
36904        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
36905    }
36906}
36907impl TypedSyntaxNode for TokenSingleLineDocComment {
36908    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenSingleLineDocComment);
36909    type StablePtr = TokenSingleLineDocCommentPtr;
36910    type Green = TokenSingleLineDocCommentGreen;
36911    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
36912        TokenSingleLineDocCommentGreen(
36913            Arc::new(GreenNode {
36914                kind: SyntaxKind::TokenMissing,
36915                details: GreenNodeDetails::Token("".into()),
36916            })
36917            .intern(db),
36918        )
36919    }
36920    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
36921        match node.0.green.lookup_intern(db).details {
36922            GreenNodeDetails::Token(_) => Self { node },
36923            GreenNodeDetails::Node { .. } => panic!(
36924                "Expected a token {:?}, not an internal node",
36925                SyntaxKind::TokenSingleLineDocComment
36926            ),
36927        }
36928    }
36929    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
36930        match node.0.green.lookup_intern(db).details {
36931            GreenNodeDetails::Token(_) => Some(Self { node }),
36932            GreenNodeDetails::Node { .. } => None,
36933        }
36934    }
36935    fn as_syntax_node(&self) -> SyntaxNode {
36936        self.node.clone()
36937    }
36938    fn stable_ptr(&self) -> Self::StablePtr {
36939        TokenSingleLineDocCommentPtr(self.node.0.stable_ptr)
36940    }
36941}
36942impl From<&TokenSingleLineDocComment> for SyntaxStablePtrId {
36943    fn from(node: &TokenSingleLineDocComment) -> Self {
36944        node.stable_ptr().untyped()
36945    }
36946}
36947#[derive(Clone, Debug, Eq, Hash, PartialEq)]
36948pub struct TokenWhitespace {
36949    node: SyntaxNode,
36950}
36951impl Token for TokenWhitespace {
36952    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
36953        TokenWhitespaceGreen(
36954            Arc::new(GreenNode {
36955                kind: SyntaxKind::TokenWhitespace,
36956                details: GreenNodeDetails::Token(text),
36957            })
36958            .intern(db),
36959        )
36960    }
36961    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
36962        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
36963            .clone()
36964    }
36965}
36966#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
36967pub struct TokenWhitespacePtr(pub SyntaxStablePtrId);
36968impl TypedStablePtr for TokenWhitespacePtr {
36969    type SyntaxNode = TokenWhitespace;
36970    fn untyped(&self) -> SyntaxStablePtrId {
36971        self.0
36972    }
36973    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenWhitespace {
36974        TokenWhitespace::from_syntax_node(db, self.0.lookup(db))
36975    }
36976}
36977impl From<TokenWhitespacePtr> for SyntaxStablePtrId {
36978    fn from(ptr: TokenWhitespacePtr) -> Self {
36979        ptr.untyped()
36980    }
36981}
36982#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
36983pub struct TokenWhitespaceGreen(pub GreenId);
36984impl TokenWhitespaceGreen {
36985    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
36986        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
36987    }
36988}
36989impl TypedSyntaxNode for TokenWhitespace {
36990    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenWhitespace);
36991    type StablePtr = TokenWhitespacePtr;
36992    type Green = TokenWhitespaceGreen;
36993    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
36994        TokenWhitespaceGreen(
36995            Arc::new(GreenNode {
36996                kind: SyntaxKind::TokenMissing,
36997                details: GreenNodeDetails::Token("".into()),
36998            })
36999            .intern(db),
37000        )
37001    }
37002    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
37003        match node.0.green.lookup_intern(db).details {
37004            GreenNodeDetails::Token(_) => Self { node },
37005            GreenNodeDetails::Node { .. } => {
37006                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenWhitespace)
37007            }
37008        }
37009    }
37010    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
37011        match node.0.green.lookup_intern(db).details {
37012            GreenNodeDetails::Token(_) => Some(Self { node }),
37013            GreenNodeDetails::Node { .. } => None,
37014        }
37015    }
37016    fn as_syntax_node(&self) -> SyntaxNode {
37017        self.node.clone()
37018    }
37019    fn stable_ptr(&self) -> Self::StablePtr {
37020        TokenWhitespacePtr(self.node.0.stable_ptr)
37021    }
37022}
37023impl From<&TokenWhitespace> for SyntaxStablePtrId {
37024    fn from(node: &TokenWhitespace) -> Self {
37025        node.stable_ptr().untyped()
37026    }
37027}
37028#[derive(Clone, Debug, Eq, Hash, PartialEq)]
37029pub struct TokenNewline {
37030    node: SyntaxNode,
37031}
37032impl Token for TokenNewline {
37033    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
37034        TokenNewlineGreen(
37035            Arc::new(GreenNode {
37036                kind: SyntaxKind::TokenNewline,
37037                details: GreenNodeDetails::Token(text),
37038            })
37039            .intern(db),
37040        )
37041    }
37042    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
37043        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
37044            .clone()
37045    }
37046}
37047#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
37048pub struct TokenNewlinePtr(pub SyntaxStablePtrId);
37049impl TypedStablePtr for TokenNewlinePtr {
37050    type SyntaxNode = TokenNewline;
37051    fn untyped(&self) -> SyntaxStablePtrId {
37052        self.0
37053    }
37054    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenNewline {
37055        TokenNewline::from_syntax_node(db, self.0.lookup(db))
37056    }
37057}
37058impl From<TokenNewlinePtr> for SyntaxStablePtrId {
37059    fn from(ptr: TokenNewlinePtr) -> Self {
37060        ptr.untyped()
37061    }
37062}
37063#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
37064pub struct TokenNewlineGreen(pub GreenId);
37065impl TokenNewlineGreen {
37066    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
37067        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
37068    }
37069}
37070impl TypedSyntaxNode for TokenNewline {
37071    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenNewline);
37072    type StablePtr = TokenNewlinePtr;
37073    type Green = TokenNewlineGreen;
37074    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
37075        TokenNewlineGreen(
37076            Arc::new(GreenNode {
37077                kind: SyntaxKind::TokenMissing,
37078                details: GreenNodeDetails::Token("".into()),
37079            })
37080            .intern(db),
37081        )
37082    }
37083    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
37084        match node.0.green.lookup_intern(db).details {
37085            GreenNodeDetails::Token(_) => Self { node },
37086            GreenNodeDetails::Node { .. } => {
37087                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenNewline)
37088            }
37089        }
37090    }
37091    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
37092        match node.0.green.lookup_intern(db).details {
37093            GreenNodeDetails::Token(_) => Some(Self { node }),
37094            GreenNodeDetails::Node { .. } => None,
37095        }
37096    }
37097    fn as_syntax_node(&self) -> SyntaxNode {
37098        self.node.clone()
37099    }
37100    fn stable_ptr(&self) -> Self::StablePtr {
37101        TokenNewlinePtr(self.node.0.stable_ptr)
37102    }
37103}
37104impl From<&TokenNewline> for SyntaxStablePtrId {
37105    fn from(node: &TokenNewline) -> Self {
37106        node.stable_ptr().untyped()
37107    }
37108}
37109#[derive(Clone, Debug, Eq, Hash, PartialEq)]
37110pub struct TokenMissing {
37111    node: SyntaxNode,
37112}
37113impl Token for TokenMissing {
37114    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
37115        TokenMissingGreen(
37116            Arc::new(GreenNode {
37117                kind: SyntaxKind::TokenMissing,
37118                details: GreenNodeDetails::Token(text),
37119            })
37120            .intern(db),
37121        )
37122    }
37123    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
37124        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
37125            .clone()
37126    }
37127}
37128#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
37129pub struct TokenMissingPtr(pub SyntaxStablePtrId);
37130impl TypedStablePtr for TokenMissingPtr {
37131    type SyntaxNode = TokenMissing;
37132    fn untyped(&self) -> SyntaxStablePtrId {
37133        self.0
37134    }
37135    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenMissing {
37136        TokenMissing::from_syntax_node(db, self.0.lookup(db))
37137    }
37138}
37139impl From<TokenMissingPtr> for SyntaxStablePtrId {
37140    fn from(ptr: TokenMissingPtr) -> Self {
37141        ptr.untyped()
37142    }
37143}
37144#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
37145pub struct TokenMissingGreen(pub GreenId);
37146impl TokenMissingGreen {
37147    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
37148        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
37149    }
37150}
37151impl TypedSyntaxNode for TokenMissing {
37152    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenMissing);
37153    type StablePtr = TokenMissingPtr;
37154    type Green = TokenMissingGreen;
37155    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
37156        TokenMissingGreen(
37157            Arc::new(GreenNode {
37158                kind: SyntaxKind::TokenMissing,
37159                details: GreenNodeDetails::Token("".into()),
37160            })
37161            .intern(db),
37162        )
37163    }
37164    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
37165        match node.0.green.lookup_intern(db).details {
37166            GreenNodeDetails::Token(_) => Self { node },
37167            GreenNodeDetails::Node { .. } => {
37168                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenMissing)
37169            }
37170        }
37171    }
37172    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
37173        match node.0.green.lookup_intern(db).details {
37174            GreenNodeDetails::Token(_) => Some(Self { node }),
37175            GreenNodeDetails::Node { .. } => None,
37176        }
37177    }
37178    fn as_syntax_node(&self) -> SyntaxNode {
37179        self.node.clone()
37180    }
37181    fn stable_ptr(&self) -> Self::StablePtr {
37182        TokenMissingPtr(self.node.0.stable_ptr)
37183    }
37184}
37185impl From<&TokenMissing> for SyntaxStablePtrId {
37186    fn from(node: &TokenMissing) -> Self {
37187        node.stable_ptr().untyped()
37188    }
37189}
37190#[derive(Clone, Debug, Eq, Hash, PartialEq)]
37191pub struct TokenSkipped {
37192    node: SyntaxNode,
37193}
37194impl Token for TokenSkipped {
37195    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
37196        TokenSkippedGreen(
37197            Arc::new(GreenNode {
37198                kind: SyntaxKind::TokenSkipped,
37199                details: GreenNodeDetails::Token(text),
37200            })
37201            .intern(db),
37202        )
37203    }
37204    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
37205        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
37206            .clone()
37207    }
37208}
37209#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
37210pub struct TokenSkippedPtr(pub SyntaxStablePtrId);
37211impl TypedStablePtr for TokenSkippedPtr {
37212    type SyntaxNode = TokenSkipped;
37213    fn untyped(&self) -> SyntaxStablePtrId {
37214        self.0
37215    }
37216    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenSkipped {
37217        TokenSkipped::from_syntax_node(db, self.0.lookup(db))
37218    }
37219}
37220impl From<TokenSkippedPtr> for SyntaxStablePtrId {
37221    fn from(ptr: TokenSkippedPtr) -> Self {
37222        ptr.untyped()
37223    }
37224}
37225#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
37226pub struct TokenSkippedGreen(pub GreenId);
37227impl TokenSkippedGreen {
37228    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
37229        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
37230    }
37231}
37232impl TypedSyntaxNode for TokenSkipped {
37233    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenSkipped);
37234    type StablePtr = TokenSkippedPtr;
37235    type Green = TokenSkippedGreen;
37236    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
37237        TokenSkippedGreen(
37238            Arc::new(GreenNode {
37239                kind: SyntaxKind::TokenMissing,
37240                details: GreenNodeDetails::Token("".into()),
37241            })
37242            .intern(db),
37243        )
37244    }
37245    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
37246        match node.0.green.lookup_intern(db).details {
37247            GreenNodeDetails::Token(_) => Self { node },
37248            GreenNodeDetails::Node { .. } => {
37249                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenSkipped)
37250            }
37251        }
37252    }
37253    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
37254        match node.0.green.lookup_intern(db).details {
37255            GreenNodeDetails::Token(_) => Some(Self { node }),
37256            GreenNodeDetails::Node { .. } => None,
37257        }
37258    }
37259    fn as_syntax_node(&self) -> SyntaxNode {
37260        self.node.clone()
37261    }
37262    fn stable_ptr(&self) -> Self::StablePtr {
37263        TokenSkippedPtr(self.node.0.stable_ptr)
37264    }
37265}
37266impl From<&TokenSkipped> for SyntaxStablePtrId {
37267    fn from(node: &TokenSkipped) -> Self {
37268        node.stable_ptr().untyped()
37269    }
37270}
37271#[derive(Clone, Debug, Eq, Hash, PartialEq)]
37272pub enum TokenNode {
37273    TerminalIdentifier(TerminalIdentifier),
37274    TerminalLiteralNumber(TerminalLiteralNumber),
37275    TerminalShortString(TerminalShortString),
37276    TerminalString(TerminalString),
37277    TerminalAs(TerminalAs),
37278    TerminalConst(TerminalConst),
37279    TerminalElse(TerminalElse),
37280    TerminalEnum(TerminalEnum),
37281    TerminalExtern(TerminalExtern),
37282    TerminalFalse(TerminalFalse),
37283    TerminalFunction(TerminalFunction),
37284    TerminalIf(TerminalIf),
37285    TerminalWhile(TerminalWhile),
37286    TerminalFor(TerminalFor),
37287    TerminalLoop(TerminalLoop),
37288    TerminalImpl(TerminalImpl),
37289    TerminalImplicits(TerminalImplicits),
37290    TerminalLet(TerminalLet),
37291    TerminalMatch(TerminalMatch),
37292    TerminalModule(TerminalModule),
37293    TerminalMut(TerminalMut),
37294    TerminalNoPanic(TerminalNoPanic),
37295    TerminalOf(TerminalOf),
37296    TerminalRef(TerminalRef),
37297    TerminalContinue(TerminalContinue),
37298    TerminalReturn(TerminalReturn),
37299    TerminalBreak(TerminalBreak),
37300    TerminalStruct(TerminalStruct),
37301    TerminalTrait(TerminalTrait),
37302    TerminalTrue(TerminalTrue),
37303    TerminalType(TerminalType),
37304    TerminalUse(TerminalUse),
37305    TerminalPub(TerminalPub),
37306    TerminalAnd(TerminalAnd),
37307    TerminalAndAnd(TerminalAndAnd),
37308    TerminalArrow(TerminalArrow),
37309    TerminalAt(TerminalAt),
37310    TerminalBadCharacters(TerminalBadCharacters),
37311    TerminalColon(TerminalColon),
37312    TerminalColonColon(TerminalColonColon),
37313    TerminalComma(TerminalComma),
37314    TerminalDiv(TerminalDiv),
37315    TerminalDivEq(TerminalDivEq),
37316    TerminalDot(TerminalDot),
37317    TerminalDotDot(TerminalDotDot),
37318    TerminalDotDotEq(TerminalDotDotEq),
37319    TerminalEndOfFile(TerminalEndOfFile),
37320    TerminalEq(TerminalEq),
37321    TerminalEqEq(TerminalEqEq),
37322    TerminalGE(TerminalGE),
37323    TerminalGT(TerminalGT),
37324    TerminalHash(TerminalHash),
37325    TerminalLBrace(TerminalLBrace),
37326    TerminalLBrack(TerminalLBrack),
37327    TerminalLE(TerminalLE),
37328    TerminalLParen(TerminalLParen),
37329    TerminalLT(TerminalLT),
37330    TerminalMatchArrow(TerminalMatchArrow),
37331    TerminalMinus(TerminalMinus),
37332    TerminalMinusEq(TerminalMinusEq),
37333    TerminalMod(TerminalMod),
37334    TerminalModEq(TerminalModEq),
37335    TerminalMul(TerminalMul),
37336    TerminalMulEq(TerminalMulEq),
37337    TerminalNeq(TerminalNeq),
37338    TerminalNot(TerminalNot),
37339    TerminalBitNot(TerminalBitNot),
37340    TerminalOr(TerminalOr),
37341    TerminalOrOr(TerminalOrOr),
37342    TerminalPlus(TerminalPlus),
37343    TerminalPlusEq(TerminalPlusEq),
37344    TerminalQuestionMark(TerminalQuestionMark),
37345    TerminalRBrace(TerminalRBrace),
37346    TerminalRBrack(TerminalRBrack),
37347    TerminalRParen(TerminalRParen),
37348    TerminalSemicolon(TerminalSemicolon),
37349    TerminalUnderscore(TerminalUnderscore),
37350    TerminalXor(TerminalXor),
37351    TerminalEmpty(TerminalEmpty),
37352}
37353#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
37354pub struct TokenNodePtr(pub SyntaxStablePtrId);
37355impl TypedStablePtr for TokenNodePtr {
37356    type SyntaxNode = TokenNode;
37357    fn untyped(&self) -> SyntaxStablePtrId {
37358        self.0
37359    }
37360    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenNode {
37361        TokenNode::from_syntax_node(db, self.0.lookup(db))
37362    }
37363}
37364impl From<TokenNodePtr> for SyntaxStablePtrId {
37365    fn from(ptr: TokenNodePtr) -> Self {
37366        ptr.untyped()
37367    }
37368}
37369impl From<TerminalIdentifierPtr> for TokenNodePtr {
37370    fn from(value: TerminalIdentifierPtr) -> Self {
37371        Self(value.0)
37372    }
37373}
37374impl From<TerminalLiteralNumberPtr> for TokenNodePtr {
37375    fn from(value: TerminalLiteralNumberPtr) -> Self {
37376        Self(value.0)
37377    }
37378}
37379impl From<TerminalShortStringPtr> for TokenNodePtr {
37380    fn from(value: TerminalShortStringPtr) -> Self {
37381        Self(value.0)
37382    }
37383}
37384impl From<TerminalStringPtr> for TokenNodePtr {
37385    fn from(value: TerminalStringPtr) -> Self {
37386        Self(value.0)
37387    }
37388}
37389impl From<TerminalAsPtr> for TokenNodePtr {
37390    fn from(value: TerminalAsPtr) -> Self {
37391        Self(value.0)
37392    }
37393}
37394impl From<TerminalConstPtr> for TokenNodePtr {
37395    fn from(value: TerminalConstPtr) -> Self {
37396        Self(value.0)
37397    }
37398}
37399impl From<TerminalElsePtr> for TokenNodePtr {
37400    fn from(value: TerminalElsePtr) -> Self {
37401        Self(value.0)
37402    }
37403}
37404impl From<TerminalEnumPtr> for TokenNodePtr {
37405    fn from(value: TerminalEnumPtr) -> Self {
37406        Self(value.0)
37407    }
37408}
37409impl From<TerminalExternPtr> for TokenNodePtr {
37410    fn from(value: TerminalExternPtr) -> Self {
37411        Self(value.0)
37412    }
37413}
37414impl From<TerminalFalsePtr> for TokenNodePtr {
37415    fn from(value: TerminalFalsePtr) -> Self {
37416        Self(value.0)
37417    }
37418}
37419impl From<TerminalFunctionPtr> for TokenNodePtr {
37420    fn from(value: TerminalFunctionPtr) -> Self {
37421        Self(value.0)
37422    }
37423}
37424impl From<TerminalIfPtr> for TokenNodePtr {
37425    fn from(value: TerminalIfPtr) -> Self {
37426        Self(value.0)
37427    }
37428}
37429impl From<TerminalWhilePtr> for TokenNodePtr {
37430    fn from(value: TerminalWhilePtr) -> Self {
37431        Self(value.0)
37432    }
37433}
37434impl From<TerminalForPtr> for TokenNodePtr {
37435    fn from(value: TerminalForPtr) -> Self {
37436        Self(value.0)
37437    }
37438}
37439impl From<TerminalLoopPtr> for TokenNodePtr {
37440    fn from(value: TerminalLoopPtr) -> Self {
37441        Self(value.0)
37442    }
37443}
37444impl From<TerminalImplPtr> for TokenNodePtr {
37445    fn from(value: TerminalImplPtr) -> Self {
37446        Self(value.0)
37447    }
37448}
37449impl From<TerminalImplicitsPtr> for TokenNodePtr {
37450    fn from(value: TerminalImplicitsPtr) -> Self {
37451        Self(value.0)
37452    }
37453}
37454impl From<TerminalLetPtr> for TokenNodePtr {
37455    fn from(value: TerminalLetPtr) -> Self {
37456        Self(value.0)
37457    }
37458}
37459impl From<TerminalMatchPtr> for TokenNodePtr {
37460    fn from(value: TerminalMatchPtr) -> Self {
37461        Self(value.0)
37462    }
37463}
37464impl From<TerminalModulePtr> for TokenNodePtr {
37465    fn from(value: TerminalModulePtr) -> Self {
37466        Self(value.0)
37467    }
37468}
37469impl From<TerminalMutPtr> for TokenNodePtr {
37470    fn from(value: TerminalMutPtr) -> Self {
37471        Self(value.0)
37472    }
37473}
37474impl From<TerminalNoPanicPtr> for TokenNodePtr {
37475    fn from(value: TerminalNoPanicPtr) -> Self {
37476        Self(value.0)
37477    }
37478}
37479impl From<TerminalOfPtr> for TokenNodePtr {
37480    fn from(value: TerminalOfPtr) -> Self {
37481        Self(value.0)
37482    }
37483}
37484impl From<TerminalRefPtr> for TokenNodePtr {
37485    fn from(value: TerminalRefPtr) -> Self {
37486        Self(value.0)
37487    }
37488}
37489impl From<TerminalContinuePtr> for TokenNodePtr {
37490    fn from(value: TerminalContinuePtr) -> Self {
37491        Self(value.0)
37492    }
37493}
37494impl From<TerminalReturnPtr> for TokenNodePtr {
37495    fn from(value: TerminalReturnPtr) -> Self {
37496        Self(value.0)
37497    }
37498}
37499impl From<TerminalBreakPtr> for TokenNodePtr {
37500    fn from(value: TerminalBreakPtr) -> Self {
37501        Self(value.0)
37502    }
37503}
37504impl From<TerminalStructPtr> for TokenNodePtr {
37505    fn from(value: TerminalStructPtr) -> Self {
37506        Self(value.0)
37507    }
37508}
37509impl From<TerminalTraitPtr> for TokenNodePtr {
37510    fn from(value: TerminalTraitPtr) -> Self {
37511        Self(value.0)
37512    }
37513}
37514impl From<TerminalTruePtr> for TokenNodePtr {
37515    fn from(value: TerminalTruePtr) -> Self {
37516        Self(value.0)
37517    }
37518}
37519impl From<TerminalTypePtr> for TokenNodePtr {
37520    fn from(value: TerminalTypePtr) -> Self {
37521        Self(value.0)
37522    }
37523}
37524impl From<TerminalUsePtr> for TokenNodePtr {
37525    fn from(value: TerminalUsePtr) -> Self {
37526        Self(value.0)
37527    }
37528}
37529impl From<TerminalPubPtr> for TokenNodePtr {
37530    fn from(value: TerminalPubPtr) -> Self {
37531        Self(value.0)
37532    }
37533}
37534impl From<TerminalAndPtr> for TokenNodePtr {
37535    fn from(value: TerminalAndPtr) -> Self {
37536        Self(value.0)
37537    }
37538}
37539impl From<TerminalAndAndPtr> for TokenNodePtr {
37540    fn from(value: TerminalAndAndPtr) -> Self {
37541        Self(value.0)
37542    }
37543}
37544impl From<TerminalArrowPtr> for TokenNodePtr {
37545    fn from(value: TerminalArrowPtr) -> Self {
37546        Self(value.0)
37547    }
37548}
37549impl From<TerminalAtPtr> for TokenNodePtr {
37550    fn from(value: TerminalAtPtr) -> Self {
37551        Self(value.0)
37552    }
37553}
37554impl From<TerminalBadCharactersPtr> for TokenNodePtr {
37555    fn from(value: TerminalBadCharactersPtr) -> Self {
37556        Self(value.0)
37557    }
37558}
37559impl From<TerminalColonPtr> for TokenNodePtr {
37560    fn from(value: TerminalColonPtr) -> Self {
37561        Self(value.0)
37562    }
37563}
37564impl From<TerminalColonColonPtr> for TokenNodePtr {
37565    fn from(value: TerminalColonColonPtr) -> Self {
37566        Self(value.0)
37567    }
37568}
37569impl From<TerminalCommaPtr> for TokenNodePtr {
37570    fn from(value: TerminalCommaPtr) -> Self {
37571        Self(value.0)
37572    }
37573}
37574impl From<TerminalDivPtr> for TokenNodePtr {
37575    fn from(value: TerminalDivPtr) -> Self {
37576        Self(value.0)
37577    }
37578}
37579impl From<TerminalDivEqPtr> for TokenNodePtr {
37580    fn from(value: TerminalDivEqPtr) -> Self {
37581        Self(value.0)
37582    }
37583}
37584impl From<TerminalDotPtr> for TokenNodePtr {
37585    fn from(value: TerminalDotPtr) -> Self {
37586        Self(value.0)
37587    }
37588}
37589impl From<TerminalDotDotPtr> for TokenNodePtr {
37590    fn from(value: TerminalDotDotPtr) -> Self {
37591        Self(value.0)
37592    }
37593}
37594impl From<TerminalDotDotEqPtr> for TokenNodePtr {
37595    fn from(value: TerminalDotDotEqPtr) -> Self {
37596        Self(value.0)
37597    }
37598}
37599impl From<TerminalEndOfFilePtr> for TokenNodePtr {
37600    fn from(value: TerminalEndOfFilePtr) -> Self {
37601        Self(value.0)
37602    }
37603}
37604impl From<TerminalEqPtr> for TokenNodePtr {
37605    fn from(value: TerminalEqPtr) -> Self {
37606        Self(value.0)
37607    }
37608}
37609impl From<TerminalEqEqPtr> for TokenNodePtr {
37610    fn from(value: TerminalEqEqPtr) -> Self {
37611        Self(value.0)
37612    }
37613}
37614impl From<TerminalGEPtr> for TokenNodePtr {
37615    fn from(value: TerminalGEPtr) -> Self {
37616        Self(value.0)
37617    }
37618}
37619impl From<TerminalGTPtr> for TokenNodePtr {
37620    fn from(value: TerminalGTPtr) -> Self {
37621        Self(value.0)
37622    }
37623}
37624impl From<TerminalHashPtr> for TokenNodePtr {
37625    fn from(value: TerminalHashPtr) -> Self {
37626        Self(value.0)
37627    }
37628}
37629impl From<TerminalLBracePtr> for TokenNodePtr {
37630    fn from(value: TerminalLBracePtr) -> Self {
37631        Self(value.0)
37632    }
37633}
37634impl From<TerminalLBrackPtr> for TokenNodePtr {
37635    fn from(value: TerminalLBrackPtr) -> Self {
37636        Self(value.0)
37637    }
37638}
37639impl From<TerminalLEPtr> for TokenNodePtr {
37640    fn from(value: TerminalLEPtr) -> Self {
37641        Self(value.0)
37642    }
37643}
37644impl From<TerminalLParenPtr> for TokenNodePtr {
37645    fn from(value: TerminalLParenPtr) -> Self {
37646        Self(value.0)
37647    }
37648}
37649impl From<TerminalLTPtr> for TokenNodePtr {
37650    fn from(value: TerminalLTPtr) -> Self {
37651        Self(value.0)
37652    }
37653}
37654impl From<TerminalMatchArrowPtr> for TokenNodePtr {
37655    fn from(value: TerminalMatchArrowPtr) -> Self {
37656        Self(value.0)
37657    }
37658}
37659impl From<TerminalMinusPtr> for TokenNodePtr {
37660    fn from(value: TerminalMinusPtr) -> Self {
37661        Self(value.0)
37662    }
37663}
37664impl From<TerminalMinusEqPtr> for TokenNodePtr {
37665    fn from(value: TerminalMinusEqPtr) -> Self {
37666        Self(value.0)
37667    }
37668}
37669impl From<TerminalModPtr> for TokenNodePtr {
37670    fn from(value: TerminalModPtr) -> Self {
37671        Self(value.0)
37672    }
37673}
37674impl From<TerminalModEqPtr> for TokenNodePtr {
37675    fn from(value: TerminalModEqPtr) -> Self {
37676        Self(value.0)
37677    }
37678}
37679impl From<TerminalMulPtr> for TokenNodePtr {
37680    fn from(value: TerminalMulPtr) -> Self {
37681        Self(value.0)
37682    }
37683}
37684impl From<TerminalMulEqPtr> for TokenNodePtr {
37685    fn from(value: TerminalMulEqPtr) -> Self {
37686        Self(value.0)
37687    }
37688}
37689impl From<TerminalNeqPtr> for TokenNodePtr {
37690    fn from(value: TerminalNeqPtr) -> Self {
37691        Self(value.0)
37692    }
37693}
37694impl From<TerminalNotPtr> for TokenNodePtr {
37695    fn from(value: TerminalNotPtr) -> Self {
37696        Self(value.0)
37697    }
37698}
37699impl From<TerminalBitNotPtr> for TokenNodePtr {
37700    fn from(value: TerminalBitNotPtr) -> Self {
37701        Self(value.0)
37702    }
37703}
37704impl From<TerminalOrPtr> for TokenNodePtr {
37705    fn from(value: TerminalOrPtr) -> Self {
37706        Self(value.0)
37707    }
37708}
37709impl From<TerminalOrOrPtr> for TokenNodePtr {
37710    fn from(value: TerminalOrOrPtr) -> Self {
37711        Self(value.0)
37712    }
37713}
37714impl From<TerminalPlusPtr> for TokenNodePtr {
37715    fn from(value: TerminalPlusPtr) -> Self {
37716        Self(value.0)
37717    }
37718}
37719impl From<TerminalPlusEqPtr> for TokenNodePtr {
37720    fn from(value: TerminalPlusEqPtr) -> Self {
37721        Self(value.0)
37722    }
37723}
37724impl From<TerminalQuestionMarkPtr> for TokenNodePtr {
37725    fn from(value: TerminalQuestionMarkPtr) -> Self {
37726        Self(value.0)
37727    }
37728}
37729impl From<TerminalRBracePtr> for TokenNodePtr {
37730    fn from(value: TerminalRBracePtr) -> Self {
37731        Self(value.0)
37732    }
37733}
37734impl From<TerminalRBrackPtr> for TokenNodePtr {
37735    fn from(value: TerminalRBrackPtr) -> Self {
37736        Self(value.0)
37737    }
37738}
37739impl From<TerminalRParenPtr> for TokenNodePtr {
37740    fn from(value: TerminalRParenPtr) -> Self {
37741        Self(value.0)
37742    }
37743}
37744impl From<TerminalSemicolonPtr> for TokenNodePtr {
37745    fn from(value: TerminalSemicolonPtr) -> Self {
37746        Self(value.0)
37747    }
37748}
37749impl From<TerminalUnderscorePtr> for TokenNodePtr {
37750    fn from(value: TerminalUnderscorePtr) -> Self {
37751        Self(value.0)
37752    }
37753}
37754impl From<TerminalXorPtr> for TokenNodePtr {
37755    fn from(value: TerminalXorPtr) -> Self {
37756        Self(value.0)
37757    }
37758}
37759impl From<TerminalEmptyPtr> for TokenNodePtr {
37760    fn from(value: TerminalEmptyPtr) -> Self {
37761        Self(value.0)
37762    }
37763}
37764impl From<TerminalIdentifierGreen> for TokenNodeGreen {
37765    fn from(value: TerminalIdentifierGreen) -> Self {
37766        Self(value.0)
37767    }
37768}
37769impl From<TerminalLiteralNumberGreen> for TokenNodeGreen {
37770    fn from(value: TerminalLiteralNumberGreen) -> Self {
37771        Self(value.0)
37772    }
37773}
37774impl From<TerminalShortStringGreen> for TokenNodeGreen {
37775    fn from(value: TerminalShortStringGreen) -> Self {
37776        Self(value.0)
37777    }
37778}
37779impl From<TerminalStringGreen> for TokenNodeGreen {
37780    fn from(value: TerminalStringGreen) -> Self {
37781        Self(value.0)
37782    }
37783}
37784impl From<TerminalAsGreen> for TokenNodeGreen {
37785    fn from(value: TerminalAsGreen) -> Self {
37786        Self(value.0)
37787    }
37788}
37789impl From<TerminalConstGreen> for TokenNodeGreen {
37790    fn from(value: TerminalConstGreen) -> Self {
37791        Self(value.0)
37792    }
37793}
37794impl From<TerminalElseGreen> for TokenNodeGreen {
37795    fn from(value: TerminalElseGreen) -> Self {
37796        Self(value.0)
37797    }
37798}
37799impl From<TerminalEnumGreen> for TokenNodeGreen {
37800    fn from(value: TerminalEnumGreen) -> Self {
37801        Self(value.0)
37802    }
37803}
37804impl From<TerminalExternGreen> for TokenNodeGreen {
37805    fn from(value: TerminalExternGreen) -> Self {
37806        Self(value.0)
37807    }
37808}
37809impl From<TerminalFalseGreen> for TokenNodeGreen {
37810    fn from(value: TerminalFalseGreen) -> Self {
37811        Self(value.0)
37812    }
37813}
37814impl From<TerminalFunctionGreen> for TokenNodeGreen {
37815    fn from(value: TerminalFunctionGreen) -> Self {
37816        Self(value.0)
37817    }
37818}
37819impl From<TerminalIfGreen> for TokenNodeGreen {
37820    fn from(value: TerminalIfGreen) -> Self {
37821        Self(value.0)
37822    }
37823}
37824impl From<TerminalWhileGreen> for TokenNodeGreen {
37825    fn from(value: TerminalWhileGreen) -> Self {
37826        Self(value.0)
37827    }
37828}
37829impl From<TerminalForGreen> for TokenNodeGreen {
37830    fn from(value: TerminalForGreen) -> Self {
37831        Self(value.0)
37832    }
37833}
37834impl From<TerminalLoopGreen> for TokenNodeGreen {
37835    fn from(value: TerminalLoopGreen) -> Self {
37836        Self(value.0)
37837    }
37838}
37839impl From<TerminalImplGreen> for TokenNodeGreen {
37840    fn from(value: TerminalImplGreen) -> Self {
37841        Self(value.0)
37842    }
37843}
37844impl From<TerminalImplicitsGreen> for TokenNodeGreen {
37845    fn from(value: TerminalImplicitsGreen) -> Self {
37846        Self(value.0)
37847    }
37848}
37849impl From<TerminalLetGreen> for TokenNodeGreen {
37850    fn from(value: TerminalLetGreen) -> Self {
37851        Self(value.0)
37852    }
37853}
37854impl From<TerminalMatchGreen> for TokenNodeGreen {
37855    fn from(value: TerminalMatchGreen) -> Self {
37856        Self(value.0)
37857    }
37858}
37859impl From<TerminalModuleGreen> for TokenNodeGreen {
37860    fn from(value: TerminalModuleGreen) -> Self {
37861        Self(value.0)
37862    }
37863}
37864impl From<TerminalMutGreen> for TokenNodeGreen {
37865    fn from(value: TerminalMutGreen) -> Self {
37866        Self(value.0)
37867    }
37868}
37869impl From<TerminalNoPanicGreen> for TokenNodeGreen {
37870    fn from(value: TerminalNoPanicGreen) -> Self {
37871        Self(value.0)
37872    }
37873}
37874impl From<TerminalOfGreen> for TokenNodeGreen {
37875    fn from(value: TerminalOfGreen) -> Self {
37876        Self(value.0)
37877    }
37878}
37879impl From<TerminalRefGreen> for TokenNodeGreen {
37880    fn from(value: TerminalRefGreen) -> Self {
37881        Self(value.0)
37882    }
37883}
37884impl From<TerminalContinueGreen> for TokenNodeGreen {
37885    fn from(value: TerminalContinueGreen) -> Self {
37886        Self(value.0)
37887    }
37888}
37889impl From<TerminalReturnGreen> for TokenNodeGreen {
37890    fn from(value: TerminalReturnGreen) -> Self {
37891        Self(value.0)
37892    }
37893}
37894impl From<TerminalBreakGreen> for TokenNodeGreen {
37895    fn from(value: TerminalBreakGreen) -> Self {
37896        Self(value.0)
37897    }
37898}
37899impl From<TerminalStructGreen> for TokenNodeGreen {
37900    fn from(value: TerminalStructGreen) -> Self {
37901        Self(value.0)
37902    }
37903}
37904impl From<TerminalTraitGreen> for TokenNodeGreen {
37905    fn from(value: TerminalTraitGreen) -> Self {
37906        Self(value.0)
37907    }
37908}
37909impl From<TerminalTrueGreen> for TokenNodeGreen {
37910    fn from(value: TerminalTrueGreen) -> Self {
37911        Self(value.0)
37912    }
37913}
37914impl From<TerminalTypeGreen> for TokenNodeGreen {
37915    fn from(value: TerminalTypeGreen) -> Self {
37916        Self(value.0)
37917    }
37918}
37919impl From<TerminalUseGreen> for TokenNodeGreen {
37920    fn from(value: TerminalUseGreen) -> Self {
37921        Self(value.0)
37922    }
37923}
37924impl From<TerminalPubGreen> for TokenNodeGreen {
37925    fn from(value: TerminalPubGreen) -> Self {
37926        Self(value.0)
37927    }
37928}
37929impl From<TerminalAndGreen> for TokenNodeGreen {
37930    fn from(value: TerminalAndGreen) -> Self {
37931        Self(value.0)
37932    }
37933}
37934impl From<TerminalAndAndGreen> for TokenNodeGreen {
37935    fn from(value: TerminalAndAndGreen) -> Self {
37936        Self(value.0)
37937    }
37938}
37939impl From<TerminalArrowGreen> for TokenNodeGreen {
37940    fn from(value: TerminalArrowGreen) -> Self {
37941        Self(value.0)
37942    }
37943}
37944impl From<TerminalAtGreen> for TokenNodeGreen {
37945    fn from(value: TerminalAtGreen) -> Self {
37946        Self(value.0)
37947    }
37948}
37949impl From<TerminalBadCharactersGreen> for TokenNodeGreen {
37950    fn from(value: TerminalBadCharactersGreen) -> Self {
37951        Self(value.0)
37952    }
37953}
37954impl From<TerminalColonGreen> for TokenNodeGreen {
37955    fn from(value: TerminalColonGreen) -> Self {
37956        Self(value.0)
37957    }
37958}
37959impl From<TerminalColonColonGreen> for TokenNodeGreen {
37960    fn from(value: TerminalColonColonGreen) -> Self {
37961        Self(value.0)
37962    }
37963}
37964impl From<TerminalCommaGreen> for TokenNodeGreen {
37965    fn from(value: TerminalCommaGreen) -> Self {
37966        Self(value.0)
37967    }
37968}
37969impl From<TerminalDivGreen> for TokenNodeGreen {
37970    fn from(value: TerminalDivGreen) -> Self {
37971        Self(value.0)
37972    }
37973}
37974impl From<TerminalDivEqGreen> for TokenNodeGreen {
37975    fn from(value: TerminalDivEqGreen) -> Self {
37976        Self(value.0)
37977    }
37978}
37979impl From<TerminalDotGreen> for TokenNodeGreen {
37980    fn from(value: TerminalDotGreen) -> Self {
37981        Self(value.0)
37982    }
37983}
37984impl From<TerminalDotDotGreen> for TokenNodeGreen {
37985    fn from(value: TerminalDotDotGreen) -> Self {
37986        Self(value.0)
37987    }
37988}
37989impl From<TerminalDotDotEqGreen> for TokenNodeGreen {
37990    fn from(value: TerminalDotDotEqGreen) -> Self {
37991        Self(value.0)
37992    }
37993}
37994impl From<TerminalEndOfFileGreen> for TokenNodeGreen {
37995    fn from(value: TerminalEndOfFileGreen) -> Self {
37996        Self(value.0)
37997    }
37998}
37999impl From<TerminalEqGreen> for TokenNodeGreen {
38000    fn from(value: TerminalEqGreen) -> Self {
38001        Self(value.0)
38002    }
38003}
38004impl From<TerminalEqEqGreen> for TokenNodeGreen {
38005    fn from(value: TerminalEqEqGreen) -> Self {
38006        Self(value.0)
38007    }
38008}
38009impl From<TerminalGEGreen> for TokenNodeGreen {
38010    fn from(value: TerminalGEGreen) -> Self {
38011        Self(value.0)
38012    }
38013}
38014impl From<TerminalGTGreen> for TokenNodeGreen {
38015    fn from(value: TerminalGTGreen) -> Self {
38016        Self(value.0)
38017    }
38018}
38019impl From<TerminalHashGreen> for TokenNodeGreen {
38020    fn from(value: TerminalHashGreen) -> Self {
38021        Self(value.0)
38022    }
38023}
38024impl From<TerminalLBraceGreen> for TokenNodeGreen {
38025    fn from(value: TerminalLBraceGreen) -> Self {
38026        Self(value.0)
38027    }
38028}
38029impl From<TerminalLBrackGreen> for TokenNodeGreen {
38030    fn from(value: TerminalLBrackGreen) -> Self {
38031        Self(value.0)
38032    }
38033}
38034impl From<TerminalLEGreen> for TokenNodeGreen {
38035    fn from(value: TerminalLEGreen) -> Self {
38036        Self(value.0)
38037    }
38038}
38039impl From<TerminalLParenGreen> for TokenNodeGreen {
38040    fn from(value: TerminalLParenGreen) -> Self {
38041        Self(value.0)
38042    }
38043}
38044impl From<TerminalLTGreen> for TokenNodeGreen {
38045    fn from(value: TerminalLTGreen) -> Self {
38046        Self(value.0)
38047    }
38048}
38049impl From<TerminalMatchArrowGreen> for TokenNodeGreen {
38050    fn from(value: TerminalMatchArrowGreen) -> Self {
38051        Self(value.0)
38052    }
38053}
38054impl From<TerminalMinusGreen> for TokenNodeGreen {
38055    fn from(value: TerminalMinusGreen) -> Self {
38056        Self(value.0)
38057    }
38058}
38059impl From<TerminalMinusEqGreen> for TokenNodeGreen {
38060    fn from(value: TerminalMinusEqGreen) -> Self {
38061        Self(value.0)
38062    }
38063}
38064impl From<TerminalModGreen> for TokenNodeGreen {
38065    fn from(value: TerminalModGreen) -> Self {
38066        Self(value.0)
38067    }
38068}
38069impl From<TerminalModEqGreen> for TokenNodeGreen {
38070    fn from(value: TerminalModEqGreen) -> Self {
38071        Self(value.0)
38072    }
38073}
38074impl From<TerminalMulGreen> for TokenNodeGreen {
38075    fn from(value: TerminalMulGreen) -> Self {
38076        Self(value.0)
38077    }
38078}
38079impl From<TerminalMulEqGreen> for TokenNodeGreen {
38080    fn from(value: TerminalMulEqGreen) -> Self {
38081        Self(value.0)
38082    }
38083}
38084impl From<TerminalNeqGreen> for TokenNodeGreen {
38085    fn from(value: TerminalNeqGreen) -> Self {
38086        Self(value.0)
38087    }
38088}
38089impl From<TerminalNotGreen> for TokenNodeGreen {
38090    fn from(value: TerminalNotGreen) -> Self {
38091        Self(value.0)
38092    }
38093}
38094impl From<TerminalBitNotGreen> for TokenNodeGreen {
38095    fn from(value: TerminalBitNotGreen) -> Self {
38096        Self(value.0)
38097    }
38098}
38099impl From<TerminalOrGreen> for TokenNodeGreen {
38100    fn from(value: TerminalOrGreen) -> Self {
38101        Self(value.0)
38102    }
38103}
38104impl From<TerminalOrOrGreen> for TokenNodeGreen {
38105    fn from(value: TerminalOrOrGreen) -> Self {
38106        Self(value.0)
38107    }
38108}
38109impl From<TerminalPlusGreen> for TokenNodeGreen {
38110    fn from(value: TerminalPlusGreen) -> Self {
38111        Self(value.0)
38112    }
38113}
38114impl From<TerminalPlusEqGreen> for TokenNodeGreen {
38115    fn from(value: TerminalPlusEqGreen) -> Self {
38116        Self(value.0)
38117    }
38118}
38119impl From<TerminalQuestionMarkGreen> for TokenNodeGreen {
38120    fn from(value: TerminalQuestionMarkGreen) -> Self {
38121        Self(value.0)
38122    }
38123}
38124impl From<TerminalRBraceGreen> for TokenNodeGreen {
38125    fn from(value: TerminalRBraceGreen) -> Self {
38126        Self(value.0)
38127    }
38128}
38129impl From<TerminalRBrackGreen> for TokenNodeGreen {
38130    fn from(value: TerminalRBrackGreen) -> Self {
38131        Self(value.0)
38132    }
38133}
38134impl From<TerminalRParenGreen> for TokenNodeGreen {
38135    fn from(value: TerminalRParenGreen) -> Self {
38136        Self(value.0)
38137    }
38138}
38139impl From<TerminalSemicolonGreen> for TokenNodeGreen {
38140    fn from(value: TerminalSemicolonGreen) -> Self {
38141        Self(value.0)
38142    }
38143}
38144impl From<TerminalUnderscoreGreen> for TokenNodeGreen {
38145    fn from(value: TerminalUnderscoreGreen) -> Self {
38146        Self(value.0)
38147    }
38148}
38149impl From<TerminalXorGreen> for TokenNodeGreen {
38150    fn from(value: TerminalXorGreen) -> Self {
38151        Self(value.0)
38152    }
38153}
38154impl From<TerminalEmptyGreen> for TokenNodeGreen {
38155    fn from(value: TerminalEmptyGreen) -> Self {
38156        Self(value.0)
38157    }
38158}
38159#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
38160pub struct TokenNodeGreen(pub GreenId);
38161impl TypedSyntaxNode for TokenNode {
38162    const OPTIONAL_KIND: Option<SyntaxKind> = None;
38163    type StablePtr = TokenNodePtr;
38164    type Green = TokenNodeGreen;
38165    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
38166        panic!("No missing variant.");
38167    }
38168    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
38169        let kind = node.kind(db);
38170        match kind {
38171            SyntaxKind::TerminalIdentifier => {
38172                TokenNode::TerminalIdentifier(TerminalIdentifier::from_syntax_node(db, node))
38173            }
38174            SyntaxKind::TerminalLiteralNumber => {
38175                TokenNode::TerminalLiteralNumber(TerminalLiteralNumber::from_syntax_node(db, node))
38176            }
38177            SyntaxKind::TerminalShortString => {
38178                TokenNode::TerminalShortString(TerminalShortString::from_syntax_node(db, node))
38179            }
38180            SyntaxKind::TerminalString => {
38181                TokenNode::TerminalString(TerminalString::from_syntax_node(db, node))
38182            }
38183            SyntaxKind::TerminalAs => TokenNode::TerminalAs(TerminalAs::from_syntax_node(db, node)),
38184            SyntaxKind::TerminalConst => {
38185                TokenNode::TerminalConst(TerminalConst::from_syntax_node(db, node))
38186            }
38187            SyntaxKind::TerminalElse => {
38188                TokenNode::TerminalElse(TerminalElse::from_syntax_node(db, node))
38189            }
38190            SyntaxKind::TerminalEnum => {
38191                TokenNode::TerminalEnum(TerminalEnum::from_syntax_node(db, node))
38192            }
38193            SyntaxKind::TerminalExtern => {
38194                TokenNode::TerminalExtern(TerminalExtern::from_syntax_node(db, node))
38195            }
38196            SyntaxKind::TerminalFalse => {
38197                TokenNode::TerminalFalse(TerminalFalse::from_syntax_node(db, node))
38198            }
38199            SyntaxKind::TerminalFunction => {
38200                TokenNode::TerminalFunction(TerminalFunction::from_syntax_node(db, node))
38201            }
38202            SyntaxKind::TerminalIf => TokenNode::TerminalIf(TerminalIf::from_syntax_node(db, node)),
38203            SyntaxKind::TerminalWhile => {
38204                TokenNode::TerminalWhile(TerminalWhile::from_syntax_node(db, node))
38205            }
38206            SyntaxKind::TerminalFor => {
38207                TokenNode::TerminalFor(TerminalFor::from_syntax_node(db, node))
38208            }
38209            SyntaxKind::TerminalLoop => {
38210                TokenNode::TerminalLoop(TerminalLoop::from_syntax_node(db, node))
38211            }
38212            SyntaxKind::TerminalImpl => {
38213                TokenNode::TerminalImpl(TerminalImpl::from_syntax_node(db, node))
38214            }
38215            SyntaxKind::TerminalImplicits => {
38216                TokenNode::TerminalImplicits(TerminalImplicits::from_syntax_node(db, node))
38217            }
38218            SyntaxKind::TerminalLet => {
38219                TokenNode::TerminalLet(TerminalLet::from_syntax_node(db, node))
38220            }
38221            SyntaxKind::TerminalMatch => {
38222                TokenNode::TerminalMatch(TerminalMatch::from_syntax_node(db, node))
38223            }
38224            SyntaxKind::TerminalModule => {
38225                TokenNode::TerminalModule(TerminalModule::from_syntax_node(db, node))
38226            }
38227            SyntaxKind::TerminalMut => {
38228                TokenNode::TerminalMut(TerminalMut::from_syntax_node(db, node))
38229            }
38230            SyntaxKind::TerminalNoPanic => {
38231                TokenNode::TerminalNoPanic(TerminalNoPanic::from_syntax_node(db, node))
38232            }
38233            SyntaxKind::TerminalOf => TokenNode::TerminalOf(TerminalOf::from_syntax_node(db, node)),
38234            SyntaxKind::TerminalRef => {
38235                TokenNode::TerminalRef(TerminalRef::from_syntax_node(db, node))
38236            }
38237            SyntaxKind::TerminalContinue => {
38238                TokenNode::TerminalContinue(TerminalContinue::from_syntax_node(db, node))
38239            }
38240            SyntaxKind::TerminalReturn => {
38241                TokenNode::TerminalReturn(TerminalReturn::from_syntax_node(db, node))
38242            }
38243            SyntaxKind::TerminalBreak => {
38244                TokenNode::TerminalBreak(TerminalBreak::from_syntax_node(db, node))
38245            }
38246            SyntaxKind::TerminalStruct => {
38247                TokenNode::TerminalStruct(TerminalStruct::from_syntax_node(db, node))
38248            }
38249            SyntaxKind::TerminalTrait => {
38250                TokenNode::TerminalTrait(TerminalTrait::from_syntax_node(db, node))
38251            }
38252            SyntaxKind::TerminalTrue => {
38253                TokenNode::TerminalTrue(TerminalTrue::from_syntax_node(db, node))
38254            }
38255            SyntaxKind::TerminalType => {
38256                TokenNode::TerminalType(TerminalType::from_syntax_node(db, node))
38257            }
38258            SyntaxKind::TerminalUse => {
38259                TokenNode::TerminalUse(TerminalUse::from_syntax_node(db, node))
38260            }
38261            SyntaxKind::TerminalPub => {
38262                TokenNode::TerminalPub(TerminalPub::from_syntax_node(db, node))
38263            }
38264            SyntaxKind::TerminalAnd => {
38265                TokenNode::TerminalAnd(TerminalAnd::from_syntax_node(db, node))
38266            }
38267            SyntaxKind::TerminalAndAnd => {
38268                TokenNode::TerminalAndAnd(TerminalAndAnd::from_syntax_node(db, node))
38269            }
38270            SyntaxKind::TerminalArrow => {
38271                TokenNode::TerminalArrow(TerminalArrow::from_syntax_node(db, node))
38272            }
38273            SyntaxKind::TerminalAt => TokenNode::TerminalAt(TerminalAt::from_syntax_node(db, node)),
38274            SyntaxKind::TerminalBadCharacters => {
38275                TokenNode::TerminalBadCharacters(TerminalBadCharacters::from_syntax_node(db, node))
38276            }
38277            SyntaxKind::TerminalColon => {
38278                TokenNode::TerminalColon(TerminalColon::from_syntax_node(db, node))
38279            }
38280            SyntaxKind::TerminalColonColon => {
38281                TokenNode::TerminalColonColon(TerminalColonColon::from_syntax_node(db, node))
38282            }
38283            SyntaxKind::TerminalComma => {
38284                TokenNode::TerminalComma(TerminalComma::from_syntax_node(db, node))
38285            }
38286            SyntaxKind::TerminalDiv => {
38287                TokenNode::TerminalDiv(TerminalDiv::from_syntax_node(db, node))
38288            }
38289            SyntaxKind::TerminalDivEq => {
38290                TokenNode::TerminalDivEq(TerminalDivEq::from_syntax_node(db, node))
38291            }
38292            SyntaxKind::TerminalDot => {
38293                TokenNode::TerminalDot(TerminalDot::from_syntax_node(db, node))
38294            }
38295            SyntaxKind::TerminalDotDot => {
38296                TokenNode::TerminalDotDot(TerminalDotDot::from_syntax_node(db, node))
38297            }
38298            SyntaxKind::TerminalDotDotEq => {
38299                TokenNode::TerminalDotDotEq(TerminalDotDotEq::from_syntax_node(db, node))
38300            }
38301            SyntaxKind::TerminalEndOfFile => {
38302                TokenNode::TerminalEndOfFile(TerminalEndOfFile::from_syntax_node(db, node))
38303            }
38304            SyntaxKind::TerminalEq => TokenNode::TerminalEq(TerminalEq::from_syntax_node(db, node)),
38305            SyntaxKind::TerminalEqEq => {
38306                TokenNode::TerminalEqEq(TerminalEqEq::from_syntax_node(db, node))
38307            }
38308            SyntaxKind::TerminalGE => TokenNode::TerminalGE(TerminalGE::from_syntax_node(db, node)),
38309            SyntaxKind::TerminalGT => TokenNode::TerminalGT(TerminalGT::from_syntax_node(db, node)),
38310            SyntaxKind::TerminalHash => {
38311                TokenNode::TerminalHash(TerminalHash::from_syntax_node(db, node))
38312            }
38313            SyntaxKind::TerminalLBrace => {
38314                TokenNode::TerminalLBrace(TerminalLBrace::from_syntax_node(db, node))
38315            }
38316            SyntaxKind::TerminalLBrack => {
38317                TokenNode::TerminalLBrack(TerminalLBrack::from_syntax_node(db, node))
38318            }
38319            SyntaxKind::TerminalLE => TokenNode::TerminalLE(TerminalLE::from_syntax_node(db, node)),
38320            SyntaxKind::TerminalLParen => {
38321                TokenNode::TerminalLParen(TerminalLParen::from_syntax_node(db, node))
38322            }
38323            SyntaxKind::TerminalLT => TokenNode::TerminalLT(TerminalLT::from_syntax_node(db, node)),
38324            SyntaxKind::TerminalMatchArrow => {
38325                TokenNode::TerminalMatchArrow(TerminalMatchArrow::from_syntax_node(db, node))
38326            }
38327            SyntaxKind::TerminalMinus => {
38328                TokenNode::TerminalMinus(TerminalMinus::from_syntax_node(db, node))
38329            }
38330            SyntaxKind::TerminalMinusEq => {
38331                TokenNode::TerminalMinusEq(TerminalMinusEq::from_syntax_node(db, node))
38332            }
38333            SyntaxKind::TerminalMod => {
38334                TokenNode::TerminalMod(TerminalMod::from_syntax_node(db, node))
38335            }
38336            SyntaxKind::TerminalModEq => {
38337                TokenNode::TerminalModEq(TerminalModEq::from_syntax_node(db, node))
38338            }
38339            SyntaxKind::TerminalMul => {
38340                TokenNode::TerminalMul(TerminalMul::from_syntax_node(db, node))
38341            }
38342            SyntaxKind::TerminalMulEq => {
38343                TokenNode::TerminalMulEq(TerminalMulEq::from_syntax_node(db, node))
38344            }
38345            SyntaxKind::TerminalNeq => {
38346                TokenNode::TerminalNeq(TerminalNeq::from_syntax_node(db, node))
38347            }
38348            SyntaxKind::TerminalNot => {
38349                TokenNode::TerminalNot(TerminalNot::from_syntax_node(db, node))
38350            }
38351            SyntaxKind::TerminalBitNot => {
38352                TokenNode::TerminalBitNot(TerminalBitNot::from_syntax_node(db, node))
38353            }
38354            SyntaxKind::TerminalOr => TokenNode::TerminalOr(TerminalOr::from_syntax_node(db, node)),
38355            SyntaxKind::TerminalOrOr => {
38356                TokenNode::TerminalOrOr(TerminalOrOr::from_syntax_node(db, node))
38357            }
38358            SyntaxKind::TerminalPlus => {
38359                TokenNode::TerminalPlus(TerminalPlus::from_syntax_node(db, node))
38360            }
38361            SyntaxKind::TerminalPlusEq => {
38362                TokenNode::TerminalPlusEq(TerminalPlusEq::from_syntax_node(db, node))
38363            }
38364            SyntaxKind::TerminalQuestionMark => {
38365                TokenNode::TerminalQuestionMark(TerminalQuestionMark::from_syntax_node(db, node))
38366            }
38367            SyntaxKind::TerminalRBrace => {
38368                TokenNode::TerminalRBrace(TerminalRBrace::from_syntax_node(db, node))
38369            }
38370            SyntaxKind::TerminalRBrack => {
38371                TokenNode::TerminalRBrack(TerminalRBrack::from_syntax_node(db, node))
38372            }
38373            SyntaxKind::TerminalRParen => {
38374                TokenNode::TerminalRParen(TerminalRParen::from_syntax_node(db, node))
38375            }
38376            SyntaxKind::TerminalSemicolon => {
38377                TokenNode::TerminalSemicolon(TerminalSemicolon::from_syntax_node(db, node))
38378            }
38379            SyntaxKind::TerminalUnderscore => {
38380                TokenNode::TerminalUnderscore(TerminalUnderscore::from_syntax_node(db, node))
38381            }
38382            SyntaxKind::TerminalXor => {
38383                TokenNode::TerminalXor(TerminalXor::from_syntax_node(db, node))
38384            }
38385            SyntaxKind::TerminalEmpty => {
38386                TokenNode::TerminalEmpty(TerminalEmpty::from_syntax_node(db, node))
38387            }
38388            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "TokenNode"),
38389        }
38390    }
38391    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
38392        let kind = node.kind(db);
38393        match kind {
38394            SyntaxKind::TerminalIdentifier => {
38395                Some(TokenNode::TerminalIdentifier(TerminalIdentifier::from_syntax_node(db, node)))
38396            }
38397            SyntaxKind::TerminalLiteralNumber => Some(TokenNode::TerminalLiteralNumber(
38398                TerminalLiteralNumber::from_syntax_node(db, node),
38399            )),
38400            SyntaxKind::TerminalShortString => Some(TokenNode::TerminalShortString(
38401                TerminalShortString::from_syntax_node(db, node),
38402            )),
38403            SyntaxKind::TerminalString => {
38404                Some(TokenNode::TerminalString(TerminalString::from_syntax_node(db, node)))
38405            }
38406            SyntaxKind::TerminalAs => {
38407                Some(TokenNode::TerminalAs(TerminalAs::from_syntax_node(db, node)))
38408            }
38409            SyntaxKind::TerminalConst => {
38410                Some(TokenNode::TerminalConst(TerminalConst::from_syntax_node(db, node)))
38411            }
38412            SyntaxKind::TerminalElse => {
38413                Some(TokenNode::TerminalElse(TerminalElse::from_syntax_node(db, node)))
38414            }
38415            SyntaxKind::TerminalEnum => {
38416                Some(TokenNode::TerminalEnum(TerminalEnum::from_syntax_node(db, node)))
38417            }
38418            SyntaxKind::TerminalExtern => {
38419                Some(TokenNode::TerminalExtern(TerminalExtern::from_syntax_node(db, node)))
38420            }
38421            SyntaxKind::TerminalFalse => {
38422                Some(TokenNode::TerminalFalse(TerminalFalse::from_syntax_node(db, node)))
38423            }
38424            SyntaxKind::TerminalFunction => {
38425                Some(TokenNode::TerminalFunction(TerminalFunction::from_syntax_node(db, node)))
38426            }
38427            SyntaxKind::TerminalIf => {
38428                Some(TokenNode::TerminalIf(TerminalIf::from_syntax_node(db, node)))
38429            }
38430            SyntaxKind::TerminalWhile => {
38431                Some(TokenNode::TerminalWhile(TerminalWhile::from_syntax_node(db, node)))
38432            }
38433            SyntaxKind::TerminalFor => {
38434                Some(TokenNode::TerminalFor(TerminalFor::from_syntax_node(db, node)))
38435            }
38436            SyntaxKind::TerminalLoop => {
38437                Some(TokenNode::TerminalLoop(TerminalLoop::from_syntax_node(db, node)))
38438            }
38439            SyntaxKind::TerminalImpl => {
38440                Some(TokenNode::TerminalImpl(TerminalImpl::from_syntax_node(db, node)))
38441            }
38442            SyntaxKind::TerminalImplicits => {
38443                Some(TokenNode::TerminalImplicits(TerminalImplicits::from_syntax_node(db, node)))
38444            }
38445            SyntaxKind::TerminalLet => {
38446                Some(TokenNode::TerminalLet(TerminalLet::from_syntax_node(db, node)))
38447            }
38448            SyntaxKind::TerminalMatch => {
38449                Some(TokenNode::TerminalMatch(TerminalMatch::from_syntax_node(db, node)))
38450            }
38451            SyntaxKind::TerminalModule => {
38452                Some(TokenNode::TerminalModule(TerminalModule::from_syntax_node(db, node)))
38453            }
38454            SyntaxKind::TerminalMut => {
38455                Some(TokenNode::TerminalMut(TerminalMut::from_syntax_node(db, node)))
38456            }
38457            SyntaxKind::TerminalNoPanic => {
38458                Some(TokenNode::TerminalNoPanic(TerminalNoPanic::from_syntax_node(db, node)))
38459            }
38460            SyntaxKind::TerminalOf => {
38461                Some(TokenNode::TerminalOf(TerminalOf::from_syntax_node(db, node)))
38462            }
38463            SyntaxKind::TerminalRef => {
38464                Some(TokenNode::TerminalRef(TerminalRef::from_syntax_node(db, node)))
38465            }
38466            SyntaxKind::TerminalContinue => {
38467                Some(TokenNode::TerminalContinue(TerminalContinue::from_syntax_node(db, node)))
38468            }
38469            SyntaxKind::TerminalReturn => {
38470                Some(TokenNode::TerminalReturn(TerminalReturn::from_syntax_node(db, node)))
38471            }
38472            SyntaxKind::TerminalBreak => {
38473                Some(TokenNode::TerminalBreak(TerminalBreak::from_syntax_node(db, node)))
38474            }
38475            SyntaxKind::TerminalStruct => {
38476                Some(TokenNode::TerminalStruct(TerminalStruct::from_syntax_node(db, node)))
38477            }
38478            SyntaxKind::TerminalTrait => {
38479                Some(TokenNode::TerminalTrait(TerminalTrait::from_syntax_node(db, node)))
38480            }
38481            SyntaxKind::TerminalTrue => {
38482                Some(TokenNode::TerminalTrue(TerminalTrue::from_syntax_node(db, node)))
38483            }
38484            SyntaxKind::TerminalType => {
38485                Some(TokenNode::TerminalType(TerminalType::from_syntax_node(db, node)))
38486            }
38487            SyntaxKind::TerminalUse => {
38488                Some(TokenNode::TerminalUse(TerminalUse::from_syntax_node(db, node)))
38489            }
38490            SyntaxKind::TerminalPub => {
38491                Some(TokenNode::TerminalPub(TerminalPub::from_syntax_node(db, node)))
38492            }
38493            SyntaxKind::TerminalAnd => {
38494                Some(TokenNode::TerminalAnd(TerminalAnd::from_syntax_node(db, node)))
38495            }
38496            SyntaxKind::TerminalAndAnd => {
38497                Some(TokenNode::TerminalAndAnd(TerminalAndAnd::from_syntax_node(db, node)))
38498            }
38499            SyntaxKind::TerminalArrow => {
38500                Some(TokenNode::TerminalArrow(TerminalArrow::from_syntax_node(db, node)))
38501            }
38502            SyntaxKind::TerminalAt => {
38503                Some(TokenNode::TerminalAt(TerminalAt::from_syntax_node(db, node)))
38504            }
38505            SyntaxKind::TerminalBadCharacters => Some(TokenNode::TerminalBadCharacters(
38506                TerminalBadCharacters::from_syntax_node(db, node),
38507            )),
38508            SyntaxKind::TerminalColon => {
38509                Some(TokenNode::TerminalColon(TerminalColon::from_syntax_node(db, node)))
38510            }
38511            SyntaxKind::TerminalColonColon => {
38512                Some(TokenNode::TerminalColonColon(TerminalColonColon::from_syntax_node(db, node)))
38513            }
38514            SyntaxKind::TerminalComma => {
38515                Some(TokenNode::TerminalComma(TerminalComma::from_syntax_node(db, node)))
38516            }
38517            SyntaxKind::TerminalDiv => {
38518                Some(TokenNode::TerminalDiv(TerminalDiv::from_syntax_node(db, node)))
38519            }
38520            SyntaxKind::TerminalDivEq => {
38521                Some(TokenNode::TerminalDivEq(TerminalDivEq::from_syntax_node(db, node)))
38522            }
38523            SyntaxKind::TerminalDot => {
38524                Some(TokenNode::TerminalDot(TerminalDot::from_syntax_node(db, node)))
38525            }
38526            SyntaxKind::TerminalDotDot => {
38527                Some(TokenNode::TerminalDotDot(TerminalDotDot::from_syntax_node(db, node)))
38528            }
38529            SyntaxKind::TerminalDotDotEq => {
38530                Some(TokenNode::TerminalDotDotEq(TerminalDotDotEq::from_syntax_node(db, node)))
38531            }
38532            SyntaxKind::TerminalEndOfFile => {
38533                Some(TokenNode::TerminalEndOfFile(TerminalEndOfFile::from_syntax_node(db, node)))
38534            }
38535            SyntaxKind::TerminalEq => {
38536                Some(TokenNode::TerminalEq(TerminalEq::from_syntax_node(db, node)))
38537            }
38538            SyntaxKind::TerminalEqEq => {
38539                Some(TokenNode::TerminalEqEq(TerminalEqEq::from_syntax_node(db, node)))
38540            }
38541            SyntaxKind::TerminalGE => {
38542                Some(TokenNode::TerminalGE(TerminalGE::from_syntax_node(db, node)))
38543            }
38544            SyntaxKind::TerminalGT => {
38545                Some(TokenNode::TerminalGT(TerminalGT::from_syntax_node(db, node)))
38546            }
38547            SyntaxKind::TerminalHash => {
38548                Some(TokenNode::TerminalHash(TerminalHash::from_syntax_node(db, node)))
38549            }
38550            SyntaxKind::TerminalLBrace => {
38551                Some(TokenNode::TerminalLBrace(TerminalLBrace::from_syntax_node(db, node)))
38552            }
38553            SyntaxKind::TerminalLBrack => {
38554                Some(TokenNode::TerminalLBrack(TerminalLBrack::from_syntax_node(db, node)))
38555            }
38556            SyntaxKind::TerminalLE => {
38557                Some(TokenNode::TerminalLE(TerminalLE::from_syntax_node(db, node)))
38558            }
38559            SyntaxKind::TerminalLParen => {
38560                Some(TokenNode::TerminalLParen(TerminalLParen::from_syntax_node(db, node)))
38561            }
38562            SyntaxKind::TerminalLT => {
38563                Some(TokenNode::TerminalLT(TerminalLT::from_syntax_node(db, node)))
38564            }
38565            SyntaxKind::TerminalMatchArrow => {
38566                Some(TokenNode::TerminalMatchArrow(TerminalMatchArrow::from_syntax_node(db, node)))
38567            }
38568            SyntaxKind::TerminalMinus => {
38569                Some(TokenNode::TerminalMinus(TerminalMinus::from_syntax_node(db, node)))
38570            }
38571            SyntaxKind::TerminalMinusEq => {
38572                Some(TokenNode::TerminalMinusEq(TerminalMinusEq::from_syntax_node(db, node)))
38573            }
38574            SyntaxKind::TerminalMod => {
38575                Some(TokenNode::TerminalMod(TerminalMod::from_syntax_node(db, node)))
38576            }
38577            SyntaxKind::TerminalModEq => {
38578                Some(TokenNode::TerminalModEq(TerminalModEq::from_syntax_node(db, node)))
38579            }
38580            SyntaxKind::TerminalMul => {
38581                Some(TokenNode::TerminalMul(TerminalMul::from_syntax_node(db, node)))
38582            }
38583            SyntaxKind::TerminalMulEq => {
38584                Some(TokenNode::TerminalMulEq(TerminalMulEq::from_syntax_node(db, node)))
38585            }
38586            SyntaxKind::TerminalNeq => {
38587                Some(TokenNode::TerminalNeq(TerminalNeq::from_syntax_node(db, node)))
38588            }
38589            SyntaxKind::TerminalNot => {
38590                Some(TokenNode::TerminalNot(TerminalNot::from_syntax_node(db, node)))
38591            }
38592            SyntaxKind::TerminalBitNot => {
38593                Some(TokenNode::TerminalBitNot(TerminalBitNot::from_syntax_node(db, node)))
38594            }
38595            SyntaxKind::TerminalOr => {
38596                Some(TokenNode::TerminalOr(TerminalOr::from_syntax_node(db, node)))
38597            }
38598            SyntaxKind::TerminalOrOr => {
38599                Some(TokenNode::TerminalOrOr(TerminalOrOr::from_syntax_node(db, node)))
38600            }
38601            SyntaxKind::TerminalPlus => {
38602                Some(TokenNode::TerminalPlus(TerminalPlus::from_syntax_node(db, node)))
38603            }
38604            SyntaxKind::TerminalPlusEq => {
38605                Some(TokenNode::TerminalPlusEq(TerminalPlusEq::from_syntax_node(db, node)))
38606            }
38607            SyntaxKind::TerminalQuestionMark => Some(TokenNode::TerminalQuestionMark(
38608                TerminalQuestionMark::from_syntax_node(db, node),
38609            )),
38610            SyntaxKind::TerminalRBrace => {
38611                Some(TokenNode::TerminalRBrace(TerminalRBrace::from_syntax_node(db, node)))
38612            }
38613            SyntaxKind::TerminalRBrack => {
38614                Some(TokenNode::TerminalRBrack(TerminalRBrack::from_syntax_node(db, node)))
38615            }
38616            SyntaxKind::TerminalRParen => {
38617                Some(TokenNode::TerminalRParen(TerminalRParen::from_syntax_node(db, node)))
38618            }
38619            SyntaxKind::TerminalSemicolon => {
38620                Some(TokenNode::TerminalSemicolon(TerminalSemicolon::from_syntax_node(db, node)))
38621            }
38622            SyntaxKind::TerminalUnderscore => {
38623                Some(TokenNode::TerminalUnderscore(TerminalUnderscore::from_syntax_node(db, node)))
38624            }
38625            SyntaxKind::TerminalXor => {
38626                Some(TokenNode::TerminalXor(TerminalXor::from_syntax_node(db, node)))
38627            }
38628            SyntaxKind::TerminalEmpty => {
38629                Some(TokenNode::TerminalEmpty(TerminalEmpty::from_syntax_node(db, node)))
38630            }
38631            _ => None,
38632        }
38633    }
38634    fn as_syntax_node(&self) -> SyntaxNode {
38635        match self {
38636            TokenNode::TerminalIdentifier(x) => x.as_syntax_node(),
38637            TokenNode::TerminalLiteralNumber(x) => x.as_syntax_node(),
38638            TokenNode::TerminalShortString(x) => x.as_syntax_node(),
38639            TokenNode::TerminalString(x) => x.as_syntax_node(),
38640            TokenNode::TerminalAs(x) => x.as_syntax_node(),
38641            TokenNode::TerminalConst(x) => x.as_syntax_node(),
38642            TokenNode::TerminalElse(x) => x.as_syntax_node(),
38643            TokenNode::TerminalEnum(x) => x.as_syntax_node(),
38644            TokenNode::TerminalExtern(x) => x.as_syntax_node(),
38645            TokenNode::TerminalFalse(x) => x.as_syntax_node(),
38646            TokenNode::TerminalFunction(x) => x.as_syntax_node(),
38647            TokenNode::TerminalIf(x) => x.as_syntax_node(),
38648            TokenNode::TerminalWhile(x) => x.as_syntax_node(),
38649            TokenNode::TerminalFor(x) => x.as_syntax_node(),
38650            TokenNode::TerminalLoop(x) => x.as_syntax_node(),
38651            TokenNode::TerminalImpl(x) => x.as_syntax_node(),
38652            TokenNode::TerminalImplicits(x) => x.as_syntax_node(),
38653            TokenNode::TerminalLet(x) => x.as_syntax_node(),
38654            TokenNode::TerminalMatch(x) => x.as_syntax_node(),
38655            TokenNode::TerminalModule(x) => x.as_syntax_node(),
38656            TokenNode::TerminalMut(x) => x.as_syntax_node(),
38657            TokenNode::TerminalNoPanic(x) => x.as_syntax_node(),
38658            TokenNode::TerminalOf(x) => x.as_syntax_node(),
38659            TokenNode::TerminalRef(x) => x.as_syntax_node(),
38660            TokenNode::TerminalContinue(x) => x.as_syntax_node(),
38661            TokenNode::TerminalReturn(x) => x.as_syntax_node(),
38662            TokenNode::TerminalBreak(x) => x.as_syntax_node(),
38663            TokenNode::TerminalStruct(x) => x.as_syntax_node(),
38664            TokenNode::TerminalTrait(x) => x.as_syntax_node(),
38665            TokenNode::TerminalTrue(x) => x.as_syntax_node(),
38666            TokenNode::TerminalType(x) => x.as_syntax_node(),
38667            TokenNode::TerminalUse(x) => x.as_syntax_node(),
38668            TokenNode::TerminalPub(x) => x.as_syntax_node(),
38669            TokenNode::TerminalAnd(x) => x.as_syntax_node(),
38670            TokenNode::TerminalAndAnd(x) => x.as_syntax_node(),
38671            TokenNode::TerminalArrow(x) => x.as_syntax_node(),
38672            TokenNode::TerminalAt(x) => x.as_syntax_node(),
38673            TokenNode::TerminalBadCharacters(x) => x.as_syntax_node(),
38674            TokenNode::TerminalColon(x) => x.as_syntax_node(),
38675            TokenNode::TerminalColonColon(x) => x.as_syntax_node(),
38676            TokenNode::TerminalComma(x) => x.as_syntax_node(),
38677            TokenNode::TerminalDiv(x) => x.as_syntax_node(),
38678            TokenNode::TerminalDivEq(x) => x.as_syntax_node(),
38679            TokenNode::TerminalDot(x) => x.as_syntax_node(),
38680            TokenNode::TerminalDotDot(x) => x.as_syntax_node(),
38681            TokenNode::TerminalDotDotEq(x) => x.as_syntax_node(),
38682            TokenNode::TerminalEndOfFile(x) => x.as_syntax_node(),
38683            TokenNode::TerminalEq(x) => x.as_syntax_node(),
38684            TokenNode::TerminalEqEq(x) => x.as_syntax_node(),
38685            TokenNode::TerminalGE(x) => x.as_syntax_node(),
38686            TokenNode::TerminalGT(x) => x.as_syntax_node(),
38687            TokenNode::TerminalHash(x) => x.as_syntax_node(),
38688            TokenNode::TerminalLBrace(x) => x.as_syntax_node(),
38689            TokenNode::TerminalLBrack(x) => x.as_syntax_node(),
38690            TokenNode::TerminalLE(x) => x.as_syntax_node(),
38691            TokenNode::TerminalLParen(x) => x.as_syntax_node(),
38692            TokenNode::TerminalLT(x) => x.as_syntax_node(),
38693            TokenNode::TerminalMatchArrow(x) => x.as_syntax_node(),
38694            TokenNode::TerminalMinus(x) => x.as_syntax_node(),
38695            TokenNode::TerminalMinusEq(x) => x.as_syntax_node(),
38696            TokenNode::TerminalMod(x) => x.as_syntax_node(),
38697            TokenNode::TerminalModEq(x) => x.as_syntax_node(),
38698            TokenNode::TerminalMul(x) => x.as_syntax_node(),
38699            TokenNode::TerminalMulEq(x) => x.as_syntax_node(),
38700            TokenNode::TerminalNeq(x) => x.as_syntax_node(),
38701            TokenNode::TerminalNot(x) => x.as_syntax_node(),
38702            TokenNode::TerminalBitNot(x) => x.as_syntax_node(),
38703            TokenNode::TerminalOr(x) => x.as_syntax_node(),
38704            TokenNode::TerminalOrOr(x) => x.as_syntax_node(),
38705            TokenNode::TerminalPlus(x) => x.as_syntax_node(),
38706            TokenNode::TerminalPlusEq(x) => x.as_syntax_node(),
38707            TokenNode::TerminalQuestionMark(x) => x.as_syntax_node(),
38708            TokenNode::TerminalRBrace(x) => x.as_syntax_node(),
38709            TokenNode::TerminalRBrack(x) => x.as_syntax_node(),
38710            TokenNode::TerminalRParen(x) => x.as_syntax_node(),
38711            TokenNode::TerminalSemicolon(x) => x.as_syntax_node(),
38712            TokenNode::TerminalUnderscore(x) => x.as_syntax_node(),
38713            TokenNode::TerminalXor(x) => x.as_syntax_node(),
38714            TokenNode::TerminalEmpty(x) => x.as_syntax_node(),
38715        }
38716    }
38717    fn stable_ptr(&self) -> Self::StablePtr {
38718        TokenNodePtr(self.as_syntax_node().0.stable_ptr)
38719    }
38720}
38721impl From<&TokenNode> for SyntaxStablePtrId {
38722    fn from(node: &TokenNode) -> Self {
38723        node.stable_ptr().untyped()
38724    }
38725}
38726impl TokenNode {
38727    /// Checks if a kind of a variant of [TokenNode].
38728    pub fn is_variant(kind: SyntaxKind) -> bool {
38729        matches!(
38730            kind,
38731            SyntaxKind::TerminalIdentifier
38732                | SyntaxKind::TerminalLiteralNumber
38733                | SyntaxKind::TerminalShortString
38734                | SyntaxKind::TerminalString
38735                | SyntaxKind::TerminalAs
38736                | SyntaxKind::TerminalConst
38737                | SyntaxKind::TerminalElse
38738                | SyntaxKind::TerminalEnum
38739                | SyntaxKind::TerminalExtern
38740                | SyntaxKind::TerminalFalse
38741                | SyntaxKind::TerminalFunction
38742                | SyntaxKind::TerminalIf
38743                | SyntaxKind::TerminalWhile
38744                | SyntaxKind::TerminalFor
38745                | SyntaxKind::TerminalLoop
38746                | SyntaxKind::TerminalImpl
38747                | SyntaxKind::TerminalImplicits
38748                | SyntaxKind::TerminalLet
38749                | SyntaxKind::TerminalMatch
38750                | SyntaxKind::TerminalModule
38751                | SyntaxKind::TerminalMut
38752                | SyntaxKind::TerminalNoPanic
38753                | SyntaxKind::TerminalOf
38754                | SyntaxKind::TerminalRef
38755                | SyntaxKind::TerminalContinue
38756                | SyntaxKind::TerminalReturn
38757                | SyntaxKind::TerminalBreak
38758                | SyntaxKind::TerminalStruct
38759                | SyntaxKind::TerminalTrait
38760                | SyntaxKind::TerminalTrue
38761                | SyntaxKind::TerminalType
38762                | SyntaxKind::TerminalUse
38763                | SyntaxKind::TerminalPub
38764                | SyntaxKind::TerminalAnd
38765                | SyntaxKind::TerminalAndAnd
38766                | SyntaxKind::TerminalArrow
38767                | SyntaxKind::TerminalAt
38768                | SyntaxKind::TerminalBadCharacters
38769                | SyntaxKind::TerminalColon
38770                | SyntaxKind::TerminalColonColon
38771                | SyntaxKind::TerminalComma
38772                | SyntaxKind::TerminalDiv
38773                | SyntaxKind::TerminalDivEq
38774                | SyntaxKind::TerminalDot
38775                | SyntaxKind::TerminalDotDot
38776                | SyntaxKind::TerminalDotDotEq
38777                | SyntaxKind::TerminalEndOfFile
38778                | SyntaxKind::TerminalEq
38779                | SyntaxKind::TerminalEqEq
38780                | SyntaxKind::TerminalGE
38781                | SyntaxKind::TerminalGT
38782                | SyntaxKind::TerminalHash
38783                | SyntaxKind::TerminalLBrace
38784                | SyntaxKind::TerminalLBrack
38785                | SyntaxKind::TerminalLE
38786                | SyntaxKind::TerminalLParen
38787                | SyntaxKind::TerminalLT
38788                | SyntaxKind::TerminalMatchArrow
38789                | SyntaxKind::TerminalMinus
38790                | SyntaxKind::TerminalMinusEq
38791                | SyntaxKind::TerminalMod
38792                | SyntaxKind::TerminalModEq
38793                | SyntaxKind::TerminalMul
38794                | SyntaxKind::TerminalMulEq
38795                | SyntaxKind::TerminalNeq
38796                | SyntaxKind::TerminalNot
38797                | SyntaxKind::TerminalBitNot
38798                | SyntaxKind::TerminalOr
38799                | SyntaxKind::TerminalOrOr
38800                | SyntaxKind::TerminalPlus
38801                | SyntaxKind::TerminalPlusEq
38802                | SyntaxKind::TerminalQuestionMark
38803                | SyntaxKind::TerminalRBrace
38804                | SyntaxKind::TerminalRBrack
38805                | SyntaxKind::TerminalRParen
38806                | SyntaxKind::TerminalSemicolon
38807                | SyntaxKind::TerminalUnderscore
38808                | SyntaxKind::TerminalXor
38809                | SyntaxKind::TerminalEmpty
38810        )
38811    }
38812}