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    Simple(PathSegmentSimple),
1654    WithGenericArgs(PathSegmentWithGenericArgs),
1655    Missing(PathSegmentMissing),
1656}
1657#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
1658pub struct PathSegmentPtr(pub SyntaxStablePtrId);
1659impl TypedStablePtr for PathSegmentPtr {
1660    type SyntaxNode = PathSegment;
1661    fn untyped(&self) -> SyntaxStablePtrId {
1662        self.0
1663    }
1664    fn lookup(&self, db: &dyn SyntaxGroup) -> PathSegment {
1665        PathSegment::from_syntax_node(db, self.0.lookup(db))
1666    }
1667}
1668impl From<PathSegmentPtr> for SyntaxStablePtrId {
1669    fn from(ptr: PathSegmentPtr) -> Self {
1670        ptr.untyped()
1671    }
1672}
1673impl From<PathSegmentSimplePtr> for PathSegmentPtr {
1674    fn from(value: PathSegmentSimplePtr) -> Self {
1675        Self(value.0)
1676    }
1677}
1678impl From<PathSegmentWithGenericArgsPtr> for PathSegmentPtr {
1679    fn from(value: PathSegmentWithGenericArgsPtr) -> Self {
1680        Self(value.0)
1681    }
1682}
1683impl From<PathSegmentMissingPtr> for PathSegmentPtr {
1684    fn from(value: PathSegmentMissingPtr) -> Self {
1685        Self(value.0)
1686    }
1687}
1688impl From<PathSegmentSimpleGreen> for PathSegmentGreen {
1689    fn from(value: PathSegmentSimpleGreen) -> Self {
1690        Self(value.0)
1691    }
1692}
1693impl From<PathSegmentWithGenericArgsGreen> for PathSegmentGreen {
1694    fn from(value: PathSegmentWithGenericArgsGreen) -> Self {
1695        Self(value.0)
1696    }
1697}
1698impl From<PathSegmentMissingGreen> for PathSegmentGreen {
1699    fn from(value: PathSegmentMissingGreen) -> Self {
1700        Self(value.0)
1701    }
1702}
1703#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
1704pub struct PathSegmentGreen(pub GreenId);
1705impl TypedSyntaxNode for PathSegment {
1706    const OPTIONAL_KIND: Option<SyntaxKind> = None;
1707    type StablePtr = PathSegmentPtr;
1708    type Green = PathSegmentGreen;
1709    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
1710        PathSegmentGreen(PathSegmentMissing::missing(db).0)
1711    }
1712    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
1713        let kind = node.kind(db);
1714        match kind {
1715            SyntaxKind::PathSegmentSimple => {
1716                PathSegment::Simple(PathSegmentSimple::from_syntax_node(db, node))
1717            }
1718            SyntaxKind::PathSegmentWithGenericArgs => {
1719                PathSegment::WithGenericArgs(PathSegmentWithGenericArgs::from_syntax_node(db, node))
1720            }
1721            SyntaxKind::PathSegmentMissing => {
1722                PathSegment::Missing(PathSegmentMissing::from_syntax_node(db, node))
1723            }
1724            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "PathSegment"),
1725        }
1726    }
1727    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
1728        let kind = node.kind(db);
1729        match kind {
1730            SyntaxKind::PathSegmentSimple => {
1731                Some(PathSegment::Simple(PathSegmentSimple::from_syntax_node(db, node)))
1732            }
1733            SyntaxKind::PathSegmentWithGenericArgs => Some(PathSegment::WithGenericArgs(
1734                PathSegmentWithGenericArgs::from_syntax_node(db, node),
1735            )),
1736            SyntaxKind::PathSegmentMissing => {
1737                Some(PathSegment::Missing(PathSegmentMissing::from_syntax_node(db, node)))
1738            }
1739            _ => None,
1740        }
1741    }
1742    fn as_syntax_node(&self) -> SyntaxNode {
1743        match self {
1744            PathSegment::Simple(x) => x.as_syntax_node(),
1745            PathSegment::WithGenericArgs(x) => x.as_syntax_node(),
1746            PathSegment::Missing(x) => x.as_syntax_node(),
1747        }
1748    }
1749    fn stable_ptr(&self) -> Self::StablePtr {
1750        PathSegmentPtr(self.as_syntax_node().0.stable_ptr)
1751    }
1752}
1753impl From<&PathSegment> for SyntaxStablePtrId {
1754    fn from(node: &PathSegment) -> Self {
1755        node.stable_ptr().untyped()
1756    }
1757}
1758impl PathSegment {
1759    /// Checks if a kind of a variant of [PathSegment].
1760    pub fn is_variant(kind: SyntaxKind) -> bool {
1761        matches!(
1762            kind,
1763            SyntaxKind::PathSegmentSimple
1764                | SyntaxKind::PathSegmentWithGenericArgs
1765                | SyntaxKind::PathSegmentMissing
1766        )
1767    }
1768}
1769#[derive(Clone, Debug, Eq, Hash, PartialEq)]
1770pub struct PathSegmentSimple {
1771    node: SyntaxNode,
1772    children: Arc<[SyntaxNode]>,
1773}
1774impl PathSegmentSimple {
1775    pub const INDEX_IDENT: usize = 0;
1776    pub fn new_green(
1777        db: &dyn SyntaxGroup,
1778        ident: TerminalIdentifierGreen,
1779    ) -> PathSegmentSimpleGreen {
1780        let children: Vec<GreenId> = vec![ident.0];
1781        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
1782        PathSegmentSimpleGreen(
1783            Arc::new(GreenNode {
1784                kind: SyntaxKind::PathSegmentSimple,
1785                details: GreenNodeDetails::Node { children, width },
1786            })
1787            .intern(db),
1788        )
1789    }
1790}
1791impl PathSegmentSimple {
1792    pub fn ident(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier {
1793        TerminalIdentifier::from_syntax_node(db, self.children[0].clone())
1794    }
1795}
1796#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
1797pub struct PathSegmentSimplePtr(pub SyntaxStablePtrId);
1798impl PathSegmentSimplePtr {}
1799impl TypedStablePtr for PathSegmentSimplePtr {
1800    type SyntaxNode = PathSegmentSimple;
1801    fn untyped(&self) -> SyntaxStablePtrId {
1802        self.0
1803    }
1804    fn lookup(&self, db: &dyn SyntaxGroup) -> PathSegmentSimple {
1805        PathSegmentSimple::from_syntax_node(db, self.0.lookup(db))
1806    }
1807}
1808impl From<PathSegmentSimplePtr> for SyntaxStablePtrId {
1809    fn from(ptr: PathSegmentSimplePtr) -> Self {
1810        ptr.untyped()
1811    }
1812}
1813#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
1814pub struct PathSegmentSimpleGreen(pub GreenId);
1815impl TypedSyntaxNode for PathSegmentSimple {
1816    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PathSegmentSimple);
1817    type StablePtr = PathSegmentSimplePtr;
1818    type Green = PathSegmentSimpleGreen;
1819    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
1820        PathSegmentSimpleGreen(
1821            Arc::new(GreenNode {
1822                kind: SyntaxKind::PathSegmentSimple,
1823                details: GreenNodeDetails::Node {
1824                    children: vec![TerminalIdentifier::missing(db).0],
1825                    width: TextWidth::default(),
1826                },
1827            })
1828            .intern(db),
1829        )
1830    }
1831    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
1832        let kind = node.kind(db);
1833        assert_eq!(
1834            kind,
1835            SyntaxKind::PathSegmentSimple,
1836            "Unexpected SyntaxKind {:?}. Expected {:?}.",
1837            kind,
1838            SyntaxKind::PathSegmentSimple
1839        );
1840        let children = db.get_children(node.clone());
1841        Self { node, children }
1842    }
1843    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
1844        let kind = node.kind(db);
1845        if kind == SyntaxKind::PathSegmentSimple {
1846            Some(Self::from_syntax_node(db, node))
1847        } else {
1848            None
1849        }
1850    }
1851    fn as_syntax_node(&self) -> SyntaxNode {
1852        self.node.clone()
1853    }
1854    fn stable_ptr(&self) -> Self::StablePtr {
1855        PathSegmentSimplePtr(self.node.0.stable_ptr)
1856    }
1857}
1858impl From<&PathSegmentSimple> for SyntaxStablePtrId {
1859    fn from(node: &PathSegmentSimple) -> Self {
1860        node.stable_ptr().untyped()
1861    }
1862}
1863#[derive(Clone, Debug, Eq, Hash, PartialEq)]
1864pub enum OptionTerminalColonColon {
1865    Empty(OptionTerminalColonColonEmpty),
1866    TerminalColonColon(TerminalColonColon),
1867}
1868#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
1869pub struct OptionTerminalColonColonPtr(pub SyntaxStablePtrId);
1870impl TypedStablePtr for OptionTerminalColonColonPtr {
1871    type SyntaxNode = OptionTerminalColonColon;
1872    fn untyped(&self) -> SyntaxStablePtrId {
1873        self.0
1874    }
1875    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionTerminalColonColon {
1876        OptionTerminalColonColon::from_syntax_node(db, self.0.lookup(db))
1877    }
1878}
1879impl From<OptionTerminalColonColonPtr> for SyntaxStablePtrId {
1880    fn from(ptr: OptionTerminalColonColonPtr) -> Self {
1881        ptr.untyped()
1882    }
1883}
1884impl From<OptionTerminalColonColonEmptyPtr> for OptionTerminalColonColonPtr {
1885    fn from(value: OptionTerminalColonColonEmptyPtr) -> Self {
1886        Self(value.0)
1887    }
1888}
1889impl From<TerminalColonColonPtr> for OptionTerminalColonColonPtr {
1890    fn from(value: TerminalColonColonPtr) -> Self {
1891        Self(value.0)
1892    }
1893}
1894impl From<OptionTerminalColonColonEmptyGreen> for OptionTerminalColonColonGreen {
1895    fn from(value: OptionTerminalColonColonEmptyGreen) -> Self {
1896        Self(value.0)
1897    }
1898}
1899impl From<TerminalColonColonGreen> for OptionTerminalColonColonGreen {
1900    fn from(value: TerminalColonColonGreen) -> Self {
1901        Self(value.0)
1902    }
1903}
1904#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
1905pub struct OptionTerminalColonColonGreen(pub GreenId);
1906impl TypedSyntaxNode for OptionTerminalColonColon {
1907    const OPTIONAL_KIND: Option<SyntaxKind> = None;
1908    type StablePtr = OptionTerminalColonColonPtr;
1909    type Green = OptionTerminalColonColonGreen;
1910    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
1911        panic!("No missing variant.");
1912    }
1913    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
1914        let kind = node.kind(db);
1915        match kind {
1916            SyntaxKind::OptionTerminalColonColonEmpty => OptionTerminalColonColon::Empty(
1917                OptionTerminalColonColonEmpty::from_syntax_node(db, node),
1918            ),
1919            SyntaxKind::TerminalColonColon => OptionTerminalColonColon::TerminalColonColon(
1920                TerminalColonColon::from_syntax_node(db, node),
1921            ),
1922            _ => panic!(
1923                "Unexpected syntax kind {:?} when constructing {}.",
1924                kind, "OptionTerminalColonColon"
1925            ),
1926        }
1927    }
1928    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
1929        let kind = node.kind(db);
1930        match kind {
1931            SyntaxKind::OptionTerminalColonColonEmpty => Some(OptionTerminalColonColon::Empty(
1932                OptionTerminalColonColonEmpty::from_syntax_node(db, node),
1933            )),
1934            SyntaxKind::TerminalColonColon => Some(OptionTerminalColonColon::TerminalColonColon(
1935                TerminalColonColon::from_syntax_node(db, node),
1936            )),
1937            _ => None,
1938        }
1939    }
1940    fn as_syntax_node(&self) -> SyntaxNode {
1941        match self {
1942            OptionTerminalColonColon::Empty(x) => x.as_syntax_node(),
1943            OptionTerminalColonColon::TerminalColonColon(x) => x.as_syntax_node(),
1944        }
1945    }
1946    fn stable_ptr(&self) -> Self::StablePtr {
1947        OptionTerminalColonColonPtr(self.as_syntax_node().0.stable_ptr)
1948    }
1949}
1950impl From<&OptionTerminalColonColon> for SyntaxStablePtrId {
1951    fn from(node: &OptionTerminalColonColon) -> Self {
1952        node.stable_ptr().untyped()
1953    }
1954}
1955impl OptionTerminalColonColon {
1956    /// Checks if a kind of a variant of [OptionTerminalColonColon].
1957    pub fn is_variant(kind: SyntaxKind) -> bool {
1958        matches!(kind, SyntaxKind::OptionTerminalColonColonEmpty | SyntaxKind::TerminalColonColon)
1959    }
1960}
1961#[derive(Clone, Debug, Eq, Hash, PartialEq)]
1962pub struct OptionTerminalColonColonEmpty {
1963    node: SyntaxNode,
1964    children: Arc<[SyntaxNode]>,
1965}
1966impl OptionTerminalColonColonEmpty {
1967    pub fn new_green(db: &dyn SyntaxGroup) -> OptionTerminalColonColonEmptyGreen {
1968        let children: Vec<GreenId> = vec![];
1969        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
1970        OptionTerminalColonColonEmptyGreen(
1971            Arc::new(GreenNode {
1972                kind: SyntaxKind::OptionTerminalColonColonEmpty,
1973                details: GreenNodeDetails::Node { children, width },
1974            })
1975            .intern(db),
1976        )
1977    }
1978}
1979impl OptionTerminalColonColonEmpty {}
1980#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
1981pub struct OptionTerminalColonColonEmptyPtr(pub SyntaxStablePtrId);
1982impl OptionTerminalColonColonEmptyPtr {}
1983impl TypedStablePtr for OptionTerminalColonColonEmptyPtr {
1984    type SyntaxNode = OptionTerminalColonColonEmpty;
1985    fn untyped(&self) -> SyntaxStablePtrId {
1986        self.0
1987    }
1988    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionTerminalColonColonEmpty {
1989        OptionTerminalColonColonEmpty::from_syntax_node(db, self.0.lookup(db))
1990    }
1991}
1992impl From<OptionTerminalColonColonEmptyPtr> for SyntaxStablePtrId {
1993    fn from(ptr: OptionTerminalColonColonEmptyPtr) -> Self {
1994        ptr.untyped()
1995    }
1996}
1997#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
1998pub struct OptionTerminalColonColonEmptyGreen(pub GreenId);
1999impl TypedSyntaxNode for OptionTerminalColonColonEmpty {
2000    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionTerminalColonColonEmpty);
2001    type StablePtr = OptionTerminalColonColonEmptyPtr;
2002    type Green = OptionTerminalColonColonEmptyGreen;
2003    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
2004        OptionTerminalColonColonEmptyGreen(
2005            Arc::new(GreenNode {
2006                kind: SyntaxKind::OptionTerminalColonColonEmpty,
2007                details: GreenNodeDetails::Node { children: vec![], width: TextWidth::default() },
2008            })
2009            .intern(db),
2010        )
2011    }
2012    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
2013        let kind = node.kind(db);
2014        assert_eq!(
2015            kind,
2016            SyntaxKind::OptionTerminalColonColonEmpty,
2017            "Unexpected SyntaxKind {:?}. Expected {:?}.",
2018            kind,
2019            SyntaxKind::OptionTerminalColonColonEmpty
2020        );
2021        let children = db.get_children(node.clone());
2022        Self { node, children }
2023    }
2024    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
2025        let kind = node.kind(db);
2026        if kind == SyntaxKind::OptionTerminalColonColonEmpty {
2027            Some(Self::from_syntax_node(db, node))
2028        } else {
2029            None
2030        }
2031    }
2032    fn as_syntax_node(&self) -> SyntaxNode {
2033        self.node.clone()
2034    }
2035    fn stable_ptr(&self) -> Self::StablePtr {
2036        OptionTerminalColonColonEmptyPtr(self.node.0.stable_ptr)
2037    }
2038}
2039impl From<&OptionTerminalColonColonEmpty> for SyntaxStablePtrId {
2040    fn from(node: &OptionTerminalColonColonEmpty) -> Self {
2041        node.stable_ptr().untyped()
2042    }
2043}
2044#[derive(Clone, Debug, Eq, Hash, PartialEq)]
2045pub struct PathSegmentWithGenericArgs {
2046    node: SyntaxNode,
2047    children: Arc<[SyntaxNode]>,
2048}
2049impl PathSegmentWithGenericArgs {
2050    pub const INDEX_IDENT: usize = 0;
2051    pub const INDEX_SEPARATOR: usize = 1;
2052    pub const INDEX_GENERIC_ARGS: usize = 2;
2053    pub fn new_green(
2054        db: &dyn SyntaxGroup,
2055        ident: TerminalIdentifierGreen,
2056        separator: OptionTerminalColonColonGreen,
2057        generic_args: GenericArgsGreen,
2058    ) -> PathSegmentWithGenericArgsGreen {
2059        let children: Vec<GreenId> = vec![ident.0, separator.0, generic_args.0];
2060        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
2061        PathSegmentWithGenericArgsGreen(
2062            Arc::new(GreenNode {
2063                kind: SyntaxKind::PathSegmentWithGenericArgs,
2064                details: GreenNodeDetails::Node { children, width },
2065            })
2066            .intern(db),
2067        )
2068    }
2069}
2070impl PathSegmentWithGenericArgs {
2071    pub fn ident(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier {
2072        TerminalIdentifier::from_syntax_node(db, self.children[0].clone())
2073    }
2074    pub fn separator(&self, db: &dyn SyntaxGroup) -> OptionTerminalColonColon {
2075        OptionTerminalColonColon::from_syntax_node(db, self.children[1].clone())
2076    }
2077    pub fn generic_args(&self, db: &dyn SyntaxGroup) -> GenericArgs {
2078        GenericArgs::from_syntax_node(db, self.children[2].clone())
2079    }
2080}
2081#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
2082pub struct PathSegmentWithGenericArgsPtr(pub SyntaxStablePtrId);
2083impl PathSegmentWithGenericArgsPtr {}
2084impl TypedStablePtr for PathSegmentWithGenericArgsPtr {
2085    type SyntaxNode = PathSegmentWithGenericArgs;
2086    fn untyped(&self) -> SyntaxStablePtrId {
2087        self.0
2088    }
2089    fn lookup(&self, db: &dyn SyntaxGroup) -> PathSegmentWithGenericArgs {
2090        PathSegmentWithGenericArgs::from_syntax_node(db, self.0.lookup(db))
2091    }
2092}
2093impl From<PathSegmentWithGenericArgsPtr> for SyntaxStablePtrId {
2094    fn from(ptr: PathSegmentWithGenericArgsPtr) -> Self {
2095        ptr.untyped()
2096    }
2097}
2098#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
2099pub struct PathSegmentWithGenericArgsGreen(pub GreenId);
2100impl TypedSyntaxNode for PathSegmentWithGenericArgs {
2101    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PathSegmentWithGenericArgs);
2102    type StablePtr = PathSegmentWithGenericArgsPtr;
2103    type Green = PathSegmentWithGenericArgsGreen;
2104    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
2105        PathSegmentWithGenericArgsGreen(
2106            Arc::new(GreenNode {
2107                kind: SyntaxKind::PathSegmentWithGenericArgs,
2108                details: GreenNodeDetails::Node {
2109                    children: vec![
2110                        TerminalIdentifier::missing(db).0,
2111                        OptionTerminalColonColon::missing(db).0,
2112                        GenericArgs::missing(db).0,
2113                    ],
2114                    width: TextWidth::default(),
2115                },
2116            })
2117            .intern(db),
2118        )
2119    }
2120    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
2121        let kind = node.kind(db);
2122        assert_eq!(
2123            kind,
2124            SyntaxKind::PathSegmentWithGenericArgs,
2125            "Unexpected SyntaxKind {:?}. Expected {:?}.",
2126            kind,
2127            SyntaxKind::PathSegmentWithGenericArgs
2128        );
2129        let children = db.get_children(node.clone());
2130        Self { node, children }
2131    }
2132    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
2133        let kind = node.kind(db);
2134        if kind == SyntaxKind::PathSegmentWithGenericArgs {
2135            Some(Self::from_syntax_node(db, node))
2136        } else {
2137            None
2138        }
2139    }
2140    fn as_syntax_node(&self) -> SyntaxNode {
2141        self.node.clone()
2142    }
2143    fn stable_ptr(&self) -> Self::StablePtr {
2144        PathSegmentWithGenericArgsPtr(self.node.0.stable_ptr)
2145    }
2146}
2147impl From<&PathSegmentWithGenericArgs> for SyntaxStablePtrId {
2148    fn from(node: &PathSegmentWithGenericArgs) -> Self {
2149        node.stable_ptr().untyped()
2150    }
2151}
2152#[derive(Clone, Debug, Eq, Hash, PartialEq)]
2153pub struct PathSegmentMissing {
2154    node: SyntaxNode,
2155    children: Arc<[SyntaxNode]>,
2156}
2157impl PathSegmentMissing {
2158    pub const INDEX_IDENT: usize = 0;
2159    pub fn new_green(
2160        db: &dyn SyntaxGroup,
2161        ident: TerminalIdentifierGreen,
2162    ) -> PathSegmentMissingGreen {
2163        let children: Vec<GreenId> = vec![ident.0];
2164        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
2165        PathSegmentMissingGreen(
2166            Arc::new(GreenNode {
2167                kind: SyntaxKind::PathSegmentMissing,
2168                details: GreenNodeDetails::Node { children, width },
2169            })
2170            .intern(db),
2171        )
2172    }
2173}
2174impl PathSegmentMissing {
2175    pub fn ident(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier {
2176        TerminalIdentifier::from_syntax_node(db, self.children[0].clone())
2177    }
2178}
2179#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
2180pub struct PathSegmentMissingPtr(pub SyntaxStablePtrId);
2181impl PathSegmentMissingPtr {}
2182impl TypedStablePtr for PathSegmentMissingPtr {
2183    type SyntaxNode = PathSegmentMissing;
2184    fn untyped(&self) -> SyntaxStablePtrId {
2185        self.0
2186    }
2187    fn lookup(&self, db: &dyn SyntaxGroup) -> PathSegmentMissing {
2188        PathSegmentMissing::from_syntax_node(db, self.0.lookup(db))
2189    }
2190}
2191impl From<PathSegmentMissingPtr> for SyntaxStablePtrId {
2192    fn from(ptr: PathSegmentMissingPtr) -> Self {
2193        ptr.untyped()
2194    }
2195}
2196#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
2197pub struct PathSegmentMissingGreen(pub GreenId);
2198impl TypedSyntaxNode for PathSegmentMissing {
2199    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PathSegmentMissing);
2200    type StablePtr = PathSegmentMissingPtr;
2201    type Green = PathSegmentMissingGreen;
2202    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
2203        PathSegmentMissingGreen(
2204            Arc::new(GreenNode {
2205                kind: SyntaxKind::PathSegmentMissing,
2206                details: GreenNodeDetails::Node {
2207                    children: vec![TerminalIdentifier::missing(db).0],
2208                    width: TextWidth::default(),
2209                },
2210            })
2211            .intern(db),
2212        )
2213    }
2214    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
2215        let kind = node.kind(db);
2216        assert_eq!(
2217            kind,
2218            SyntaxKind::PathSegmentMissing,
2219            "Unexpected SyntaxKind {:?}. Expected {:?}.",
2220            kind,
2221            SyntaxKind::PathSegmentMissing
2222        );
2223        let children = db.get_children(node.clone());
2224        Self { node, children }
2225    }
2226    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
2227        let kind = node.kind(db);
2228        if kind == SyntaxKind::PathSegmentMissing {
2229            Some(Self::from_syntax_node(db, node))
2230        } else {
2231            None
2232        }
2233    }
2234    fn as_syntax_node(&self) -> SyntaxNode {
2235        self.node.clone()
2236    }
2237    fn stable_ptr(&self) -> Self::StablePtr {
2238        PathSegmentMissingPtr(self.node.0.stable_ptr)
2239    }
2240}
2241impl From<&PathSegmentMissing> for SyntaxStablePtrId {
2242    fn from(node: &PathSegmentMissing) -> Self {
2243        node.stable_ptr().untyped()
2244    }
2245}
2246#[derive(Clone, Debug, Eq, Hash, PartialEq)]
2247pub struct ExprPath(ElementList<PathSegment, 2>);
2248impl Deref for ExprPath {
2249    type Target = ElementList<PathSegment, 2>;
2250    fn deref(&self) -> &Self::Target {
2251        &self.0
2252    }
2253}
2254impl ExprPath {
2255    pub fn new_green(
2256        db: &dyn SyntaxGroup,
2257        children: Vec<ExprPathElementOrSeparatorGreen>,
2258    ) -> ExprPathGreen {
2259        let width = children.iter().map(|id| id.id().lookup_intern(db).width()).sum();
2260        ExprPathGreen(
2261            Arc::new(GreenNode {
2262                kind: SyntaxKind::ExprPath,
2263                details: GreenNodeDetails::Node {
2264                    children: children.iter().map(|x| x.id()).collect(),
2265                    width,
2266                },
2267            })
2268            .intern(db),
2269        )
2270    }
2271}
2272#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
2273pub struct ExprPathPtr(pub SyntaxStablePtrId);
2274impl TypedStablePtr for ExprPathPtr {
2275    type SyntaxNode = ExprPath;
2276    fn untyped(&self) -> SyntaxStablePtrId {
2277        self.0
2278    }
2279    fn lookup(&self, db: &dyn SyntaxGroup) -> ExprPath {
2280        ExprPath::from_syntax_node(db, self.0.lookup(db))
2281    }
2282}
2283impl From<ExprPathPtr> for SyntaxStablePtrId {
2284    fn from(ptr: ExprPathPtr) -> Self {
2285        ptr.untyped()
2286    }
2287}
2288#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
2289pub enum ExprPathElementOrSeparatorGreen {
2290    Separator(TerminalColonColonGreen),
2291    Element(PathSegmentGreen),
2292}
2293impl From<TerminalColonColonGreen> for ExprPathElementOrSeparatorGreen {
2294    fn from(value: TerminalColonColonGreen) -> Self {
2295        ExprPathElementOrSeparatorGreen::Separator(value)
2296    }
2297}
2298impl From<PathSegmentGreen> for ExprPathElementOrSeparatorGreen {
2299    fn from(value: PathSegmentGreen) -> Self {
2300        ExprPathElementOrSeparatorGreen::Element(value)
2301    }
2302}
2303impl ExprPathElementOrSeparatorGreen {
2304    fn id(&self) -> GreenId {
2305        match self {
2306            ExprPathElementOrSeparatorGreen::Separator(green) => green.0,
2307            ExprPathElementOrSeparatorGreen::Element(green) => green.0,
2308        }
2309    }
2310}
2311#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
2312pub struct ExprPathGreen(pub GreenId);
2313impl TypedSyntaxNode for ExprPath {
2314    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprPath);
2315    type StablePtr = ExprPathPtr;
2316    type Green = ExprPathGreen;
2317    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
2318        ExprPathGreen(
2319            Arc::new(GreenNode {
2320                kind: SyntaxKind::ExprPath,
2321                details: GreenNodeDetails::Node { children: vec![], width: TextWidth::default() },
2322            })
2323            .intern(db),
2324        )
2325    }
2326    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
2327        Self(ElementList::new(node))
2328    }
2329    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
2330        if node.kind(db) == SyntaxKind::ExprPath {
2331            Some(Self(ElementList::new(node)))
2332        } else {
2333            None
2334        }
2335    }
2336    fn as_syntax_node(&self) -> SyntaxNode {
2337        self.node.clone()
2338    }
2339    fn stable_ptr(&self) -> Self::StablePtr {
2340        ExprPathPtr(self.node.0.stable_ptr)
2341    }
2342}
2343impl From<&ExprPath> for SyntaxStablePtrId {
2344    fn from(node: &ExprPath) -> Self {
2345        node.stable_ptr().untyped()
2346    }
2347}
2348#[derive(Clone, Debug, Eq, Hash, PartialEq)]
2349pub struct ExprParenthesized {
2350    node: SyntaxNode,
2351    children: Arc<[SyntaxNode]>,
2352}
2353impl ExprParenthesized {
2354    pub const INDEX_LPAREN: usize = 0;
2355    pub const INDEX_EXPR: usize = 1;
2356    pub const INDEX_RPAREN: usize = 2;
2357    pub fn new_green(
2358        db: &dyn SyntaxGroup,
2359        lparen: TerminalLParenGreen,
2360        expr: ExprGreen,
2361        rparen: TerminalRParenGreen,
2362    ) -> ExprParenthesizedGreen {
2363        let children: Vec<GreenId> = vec![lparen.0, expr.0, rparen.0];
2364        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
2365        ExprParenthesizedGreen(
2366            Arc::new(GreenNode {
2367                kind: SyntaxKind::ExprParenthesized,
2368                details: GreenNodeDetails::Node { children, width },
2369            })
2370            .intern(db),
2371        )
2372    }
2373}
2374impl ExprParenthesized {
2375    pub fn lparen(&self, db: &dyn SyntaxGroup) -> TerminalLParen {
2376        TerminalLParen::from_syntax_node(db, self.children[0].clone())
2377    }
2378    pub fn expr(&self, db: &dyn SyntaxGroup) -> Expr {
2379        Expr::from_syntax_node(db, self.children[1].clone())
2380    }
2381    pub fn rparen(&self, db: &dyn SyntaxGroup) -> TerminalRParen {
2382        TerminalRParen::from_syntax_node(db, self.children[2].clone())
2383    }
2384}
2385#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
2386pub struct ExprParenthesizedPtr(pub SyntaxStablePtrId);
2387impl ExprParenthesizedPtr {}
2388impl TypedStablePtr for ExprParenthesizedPtr {
2389    type SyntaxNode = ExprParenthesized;
2390    fn untyped(&self) -> SyntaxStablePtrId {
2391        self.0
2392    }
2393    fn lookup(&self, db: &dyn SyntaxGroup) -> ExprParenthesized {
2394        ExprParenthesized::from_syntax_node(db, self.0.lookup(db))
2395    }
2396}
2397impl From<ExprParenthesizedPtr> for SyntaxStablePtrId {
2398    fn from(ptr: ExprParenthesizedPtr) -> Self {
2399        ptr.untyped()
2400    }
2401}
2402#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
2403pub struct ExprParenthesizedGreen(pub GreenId);
2404impl TypedSyntaxNode for ExprParenthesized {
2405    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprParenthesized);
2406    type StablePtr = ExprParenthesizedPtr;
2407    type Green = ExprParenthesizedGreen;
2408    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
2409        ExprParenthesizedGreen(
2410            Arc::new(GreenNode {
2411                kind: SyntaxKind::ExprParenthesized,
2412                details: GreenNodeDetails::Node {
2413                    children: vec![
2414                        TerminalLParen::missing(db).0,
2415                        Expr::missing(db).0,
2416                        TerminalRParen::missing(db).0,
2417                    ],
2418                    width: TextWidth::default(),
2419                },
2420            })
2421            .intern(db),
2422        )
2423    }
2424    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
2425        let kind = node.kind(db);
2426        assert_eq!(
2427            kind,
2428            SyntaxKind::ExprParenthesized,
2429            "Unexpected SyntaxKind {:?}. Expected {:?}.",
2430            kind,
2431            SyntaxKind::ExprParenthesized
2432        );
2433        let children = db.get_children(node.clone());
2434        Self { node, children }
2435    }
2436    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
2437        let kind = node.kind(db);
2438        if kind == SyntaxKind::ExprParenthesized {
2439            Some(Self::from_syntax_node(db, node))
2440        } else {
2441            None
2442        }
2443    }
2444    fn as_syntax_node(&self) -> SyntaxNode {
2445        self.node.clone()
2446    }
2447    fn stable_ptr(&self) -> Self::StablePtr {
2448        ExprParenthesizedPtr(self.node.0.stable_ptr)
2449    }
2450}
2451impl From<&ExprParenthesized> for SyntaxStablePtrId {
2452    fn from(node: &ExprParenthesized) -> Self {
2453        node.stable_ptr().untyped()
2454    }
2455}
2456#[derive(Clone, Debug, Eq, Hash, PartialEq)]
2457pub struct ExprUnary {
2458    node: SyntaxNode,
2459    children: Arc<[SyntaxNode]>,
2460}
2461impl ExprUnary {
2462    pub const INDEX_OP: usize = 0;
2463    pub const INDEX_EXPR: usize = 1;
2464    pub fn new_green(
2465        db: &dyn SyntaxGroup,
2466        op: UnaryOperatorGreen,
2467        expr: ExprGreen,
2468    ) -> ExprUnaryGreen {
2469        let children: Vec<GreenId> = vec![op.0, expr.0];
2470        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
2471        ExprUnaryGreen(
2472            Arc::new(GreenNode {
2473                kind: SyntaxKind::ExprUnary,
2474                details: GreenNodeDetails::Node { children, width },
2475            })
2476            .intern(db),
2477        )
2478    }
2479}
2480impl ExprUnary {
2481    pub fn op(&self, db: &dyn SyntaxGroup) -> UnaryOperator {
2482        UnaryOperator::from_syntax_node(db, self.children[0].clone())
2483    }
2484    pub fn expr(&self, db: &dyn SyntaxGroup) -> Expr {
2485        Expr::from_syntax_node(db, self.children[1].clone())
2486    }
2487}
2488#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
2489pub struct ExprUnaryPtr(pub SyntaxStablePtrId);
2490impl ExprUnaryPtr {}
2491impl TypedStablePtr for ExprUnaryPtr {
2492    type SyntaxNode = ExprUnary;
2493    fn untyped(&self) -> SyntaxStablePtrId {
2494        self.0
2495    }
2496    fn lookup(&self, db: &dyn SyntaxGroup) -> ExprUnary {
2497        ExprUnary::from_syntax_node(db, self.0.lookup(db))
2498    }
2499}
2500impl From<ExprUnaryPtr> for SyntaxStablePtrId {
2501    fn from(ptr: ExprUnaryPtr) -> Self {
2502        ptr.untyped()
2503    }
2504}
2505#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
2506pub struct ExprUnaryGreen(pub GreenId);
2507impl TypedSyntaxNode for ExprUnary {
2508    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprUnary);
2509    type StablePtr = ExprUnaryPtr;
2510    type Green = ExprUnaryGreen;
2511    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
2512        ExprUnaryGreen(
2513            Arc::new(GreenNode {
2514                kind: SyntaxKind::ExprUnary,
2515                details: GreenNodeDetails::Node {
2516                    children: vec![UnaryOperator::missing(db).0, Expr::missing(db).0],
2517                    width: TextWidth::default(),
2518                },
2519            })
2520            .intern(db),
2521        )
2522    }
2523    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
2524        let kind = node.kind(db);
2525        assert_eq!(
2526            kind,
2527            SyntaxKind::ExprUnary,
2528            "Unexpected SyntaxKind {:?}. Expected {:?}.",
2529            kind,
2530            SyntaxKind::ExprUnary
2531        );
2532        let children = db.get_children(node.clone());
2533        Self { node, children }
2534    }
2535    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
2536        let kind = node.kind(db);
2537        if kind == SyntaxKind::ExprUnary { Some(Self::from_syntax_node(db, node)) } else { None }
2538    }
2539    fn as_syntax_node(&self) -> SyntaxNode {
2540        self.node.clone()
2541    }
2542    fn stable_ptr(&self) -> Self::StablePtr {
2543        ExprUnaryPtr(self.node.0.stable_ptr)
2544    }
2545}
2546impl From<&ExprUnary> for SyntaxStablePtrId {
2547    fn from(node: &ExprUnary) -> Self {
2548        node.stable_ptr().untyped()
2549    }
2550}
2551#[derive(Clone, Debug, Eq, Hash, PartialEq)]
2552pub enum UnaryOperator {
2553    Not(TerminalNot),
2554    BitNot(TerminalBitNot),
2555    Minus(TerminalMinus),
2556    At(TerminalAt),
2557    Desnap(TerminalMul),
2558}
2559#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
2560pub struct UnaryOperatorPtr(pub SyntaxStablePtrId);
2561impl TypedStablePtr for UnaryOperatorPtr {
2562    type SyntaxNode = UnaryOperator;
2563    fn untyped(&self) -> SyntaxStablePtrId {
2564        self.0
2565    }
2566    fn lookup(&self, db: &dyn SyntaxGroup) -> UnaryOperator {
2567        UnaryOperator::from_syntax_node(db, self.0.lookup(db))
2568    }
2569}
2570impl From<UnaryOperatorPtr> for SyntaxStablePtrId {
2571    fn from(ptr: UnaryOperatorPtr) -> Self {
2572        ptr.untyped()
2573    }
2574}
2575impl From<TerminalNotPtr> for UnaryOperatorPtr {
2576    fn from(value: TerminalNotPtr) -> Self {
2577        Self(value.0)
2578    }
2579}
2580impl From<TerminalBitNotPtr> for UnaryOperatorPtr {
2581    fn from(value: TerminalBitNotPtr) -> Self {
2582        Self(value.0)
2583    }
2584}
2585impl From<TerminalMinusPtr> for UnaryOperatorPtr {
2586    fn from(value: TerminalMinusPtr) -> Self {
2587        Self(value.0)
2588    }
2589}
2590impl From<TerminalAtPtr> for UnaryOperatorPtr {
2591    fn from(value: TerminalAtPtr) -> Self {
2592        Self(value.0)
2593    }
2594}
2595impl From<TerminalMulPtr> for UnaryOperatorPtr {
2596    fn from(value: TerminalMulPtr) -> Self {
2597        Self(value.0)
2598    }
2599}
2600impl From<TerminalNotGreen> for UnaryOperatorGreen {
2601    fn from(value: TerminalNotGreen) -> Self {
2602        Self(value.0)
2603    }
2604}
2605impl From<TerminalBitNotGreen> for UnaryOperatorGreen {
2606    fn from(value: TerminalBitNotGreen) -> Self {
2607        Self(value.0)
2608    }
2609}
2610impl From<TerminalMinusGreen> for UnaryOperatorGreen {
2611    fn from(value: TerminalMinusGreen) -> Self {
2612        Self(value.0)
2613    }
2614}
2615impl From<TerminalAtGreen> for UnaryOperatorGreen {
2616    fn from(value: TerminalAtGreen) -> Self {
2617        Self(value.0)
2618    }
2619}
2620impl From<TerminalMulGreen> for UnaryOperatorGreen {
2621    fn from(value: TerminalMulGreen) -> Self {
2622        Self(value.0)
2623    }
2624}
2625#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
2626pub struct UnaryOperatorGreen(pub GreenId);
2627impl TypedSyntaxNode for UnaryOperator {
2628    const OPTIONAL_KIND: Option<SyntaxKind> = None;
2629    type StablePtr = UnaryOperatorPtr;
2630    type Green = UnaryOperatorGreen;
2631    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
2632        panic!("No missing variant.");
2633    }
2634    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
2635        let kind = node.kind(db);
2636        match kind {
2637            SyntaxKind::TerminalNot => UnaryOperator::Not(TerminalNot::from_syntax_node(db, node)),
2638            SyntaxKind::TerminalBitNot => {
2639                UnaryOperator::BitNot(TerminalBitNot::from_syntax_node(db, node))
2640            }
2641            SyntaxKind::TerminalMinus => {
2642                UnaryOperator::Minus(TerminalMinus::from_syntax_node(db, node))
2643            }
2644            SyntaxKind::TerminalAt => UnaryOperator::At(TerminalAt::from_syntax_node(db, node)),
2645            SyntaxKind::TerminalMul => {
2646                UnaryOperator::Desnap(TerminalMul::from_syntax_node(db, node))
2647            }
2648            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "UnaryOperator"),
2649        }
2650    }
2651    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
2652        let kind = node.kind(db);
2653        match kind {
2654            SyntaxKind::TerminalNot => {
2655                Some(UnaryOperator::Not(TerminalNot::from_syntax_node(db, node)))
2656            }
2657            SyntaxKind::TerminalBitNot => {
2658                Some(UnaryOperator::BitNot(TerminalBitNot::from_syntax_node(db, node)))
2659            }
2660            SyntaxKind::TerminalMinus => {
2661                Some(UnaryOperator::Minus(TerminalMinus::from_syntax_node(db, node)))
2662            }
2663            SyntaxKind::TerminalAt => {
2664                Some(UnaryOperator::At(TerminalAt::from_syntax_node(db, node)))
2665            }
2666            SyntaxKind::TerminalMul => {
2667                Some(UnaryOperator::Desnap(TerminalMul::from_syntax_node(db, node)))
2668            }
2669            _ => None,
2670        }
2671    }
2672    fn as_syntax_node(&self) -> SyntaxNode {
2673        match self {
2674            UnaryOperator::Not(x) => x.as_syntax_node(),
2675            UnaryOperator::BitNot(x) => x.as_syntax_node(),
2676            UnaryOperator::Minus(x) => x.as_syntax_node(),
2677            UnaryOperator::At(x) => x.as_syntax_node(),
2678            UnaryOperator::Desnap(x) => x.as_syntax_node(),
2679        }
2680    }
2681    fn stable_ptr(&self) -> Self::StablePtr {
2682        UnaryOperatorPtr(self.as_syntax_node().0.stable_ptr)
2683    }
2684}
2685impl From<&UnaryOperator> for SyntaxStablePtrId {
2686    fn from(node: &UnaryOperator) -> Self {
2687        node.stable_ptr().untyped()
2688    }
2689}
2690impl UnaryOperator {
2691    /// Checks if a kind of a variant of [UnaryOperator].
2692    pub fn is_variant(kind: SyntaxKind) -> bool {
2693        matches!(
2694            kind,
2695            SyntaxKind::TerminalNot
2696                | SyntaxKind::TerminalBitNot
2697                | SyntaxKind::TerminalMinus
2698                | SyntaxKind::TerminalAt
2699                | SyntaxKind::TerminalMul
2700        )
2701    }
2702}
2703#[derive(Clone, Debug, Eq, Hash, PartialEq)]
2704pub struct ExprBinary {
2705    node: SyntaxNode,
2706    children: Arc<[SyntaxNode]>,
2707}
2708impl ExprBinary {
2709    pub const INDEX_LHS: usize = 0;
2710    pub const INDEX_OP: usize = 1;
2711    pub const INDEX_RHS: usize = 2;
2712    pub fn new_green(
2713        db: &dyn SyntaxGroup,
2714        lhs: ExprGreen,
2715        op: BinaryOperatorGreen,
2716        rhs: ExprGreen,
2717    ) -> ExprBinaryGreen {
2718        let children: Vec<GreenId> = vec![lhs.0, op.0, rhs.0];
2719        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
2720        ExprBinaryGreen(
2721            Arc::new(GreenNode {
2722                kind: SyntaxKind::ExprBinary,
2723                details: GreenNodeDetails::Node { children, width },
2724            })
2725            .intern(db),
2726        )
2727    }
2728}
2729impl ExprBinary {
2730    pub fn lhs(&self, db: &dyn SyntaxGroup) -> Expr {
2731        Expr::from_syntax_node(db, self.children[0].clone())
2732    }
2733    pub fn op(&self, db: &dyn SyntaxGroup) -> BinaryOperator {
2734        BinaryOperator::from_syntax_node(db, self.children[1].clone())
2735    }
2736    pub fn rhs(&self, db: &dyn SyntaxGroup) -> Expr {
2737        Expr::from_syntax_node(db, self.children[2].clone())
2738    }
2739}
2740#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
2741pub struct ExprBinaryPtr(pub SyntaxStablePtrId);
2742impl ExprBinaryPtr {}
2743impl TypedStablePtr for ExprBinaryPtr {
2744    type SyntaxNode = ExprBinary;
2745    fn untyped(&self) -> SyntaxStablePtrId {
2746        self.0
2747    }
2748    fn lookup(&self, db: &dyn SyntaxGroup) -> ExprBinary {
2749        ExprBinary::from_syntax_node(db, self.0.lookup(db))
2750    }
2751}
2752impl From<ExprBinaryPtr> for SyntaxStablePtrId {
2753    fn from(ptr: ExprBinaryPtr) -> Self {
2754        ptr.untyped()
2755    }
2756}
2757#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
2758pub struct ExprBinaryGreen(pub GreenId);
2759impl TypedSyntaxNode for ExprBinary {
2760    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprBinary);
2761    type StablePtr = ExprBinaryPtr;
2762    type Green = ExprBinaryGreen;
2763    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
2764        ExprBinaryGreen(
2765            Arc::new(GreenNode {
2766                kind: SyntaxKind::ExprBinary,
2767                details: GreenNodeDetails::Node {
2768                    children: vec![
2769                        Expr::missing(db).0,
2770                        BinaryOperator::missing(db).0,
2771                        Expr::missing(db).0,
2772                    ],
2773                    width: TextWidth::default(),
2774                },
2775            })
2776            .intern(db),
2777        )
2778    }
2779    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
2780        let kind = node.kind(db);
2781        assert_eq!(
2782            kind,
2783            SyntaxKind::ExprBinary,
2784            "Unexpected SyntaxKind {:?}. Expected {:?}.",
2785            kind,
2786            SyntaxKind::ExprBinary
2787        );
2788        let children = db.get_children(node.clone());
2789        Self { node, children }
2790    }
2791    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
2792        let kind = node.kind(db);
2793        if kind == SyntaxKind::ExprBinary { Some(Self::from_syntax_node(db, node)) } else { None }
2794    }
2795    fn as_syntax_node(&self) -> SyntaxNode {
2796        self.node.clone()
2797    }
2798    fn stable_ptr(&self) -> Self::StablePtr {
2799        ExprBinaryPtr(self.node.0.stable_ptr)
2800    }
2801}
2802impl From<&ExprBinary> for SyntaxStablePtrId {
2803    fn from(node: &ExprBinary) -> Self {
2804        node.stable_ptr().untyped()
2805    }
2806}
2807#[derive(Clone, Debug, Eq, Hash, PartialEq)]
2808pub enum BinaryOperator {
2809    Dot(TerminalDot),
2810    Not(TerminalNot),
2811    Mul(TerminalMul),
2812    MulEq(TerminalMulEq),
2813    Div(TerminalDiv),
2814    DivEq(TerminalDivEq),
2815    Mod(TerminalMod),
2816    ModEq(TerminalModEq),
2817    Plus(TerminalPlus),
2818    PlusEq(TerminalPlusEq),
2819    Minus(TerminalMinus),
2820    MinusEq(TerminalMinusEq),
2821    EqEq(TerminalEqEq),
2822    Neq(TerminalNeq),
2823    Eq(TerminalEq),
2824    And(TerminalAnd),
2825    AndAnd(TerminalAndAnd),
2826    Or(TerminalOr),
2827    OrOr(TerminalOrOr),
2828    Xor(TerminalXor),
2829    LE(TerminalLE),
2830    GE(TerminalGE),
2831    LT(TerminalLT),
2832    GT(TerminalGT),
2833    DotDot(TerminalDotDot),
2834    DotDotEq(TerminalDotDotEq),
2835}
2836#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
2837pub struct BinaryOperatorPtr(pub SyntaxStablePtrId);
2838impl TypedStablePtr for BinaryOperatorPtr {
2839    type SyntaxNode = BinaryOperator;
2840    fn untyped(&self) -> SyntaxStablePtrId {
2841        self.0
2842    }
2843    fn lookup(&self, db: &dyn SyntaxGroup) -> BinaryOperator {
2844        BinaryOperator::from_syntax_node(db, self.0.lookup(db))
2845    }
2846}
2847impl From<BinaryOperatorPtr> for SyntaxStablePtrId {
2848    fn from(ptr: BinaryOperatorPtr) -> Self {
2849        ptr.untyped()
2850    }
2851}
2852impl From<TerminalDotPtr> for BinaryOperatorPtr {
2853    fn from(value: TerminalDotPtr) -> Self {
2854        Self(value.0)
2855    }
2856}
2857impl From<TerminalNotPtr> for BinaryOperatorPtr {
2858    fn from(value: TerminalNotPtr) -> Self {
2859        Self(value.0)
2860    }
2861}
2862impl From<TerminalMulPtr> for BinaryOperatorPtr {
2863    fn from(value: TerminalMulPtr) -> Self {
2864        Self(value.0)
2865    }
2866}
2867impl From<TerminalMulEqPtr> for BinaryOperatorPtr {
2868    fn from(value: TerminalMulEqPtr) -> Self {
2869        Self(value.0)
2870    }
2871}
2872impl From<TerminalDivPtr> for BinaryOperatorPtr {
2873    fn from(value: TerminalDivPtr) -> Self {
2874        Self(value.0)
2875    }
2876}
2877impl From<TerminalDivEqPtr> for BinaryOperatorPtr {
2878    fn from(value: TerminalDivEqPtr) -> Self {
2879        Self(value.0)
2880    }
2881}
2882impl From<TerminalModPtr> for BinaryOperatorPtr {
2883    fn from(value: TerminalModPtr) -> Self {
2884        Self(value.0)
2885    }
2886}
2887impl From<TerminalModEqPtr> for BinaryOperatorPtr {
2888    fn from(value: TerminalModEqPtr) -> Self {
2889        Self(value.0)
2890    }
2891}
2892impl From<TerminalPlusPtr> for BinaryOperatorPtr {
2893    fn from(value: TerminalPlusPtr) -> Self {
2894        Self(value.0)
2895    }
2896}
2897impl From<TerminalPlusEqPtr> for BinaryOperatorPtr {
2898    fn from(value: TerminalPlusEqPtr) -> Self {
2899        Self(value.0)
2900    }
2901}
2902impl From<TerminalMinusPtr> for BinaryOperatorPtr {
2903    fn from(value: TerminalMinusPtr) -> Self {
2904        Self(value.0)
2905    }
2906}
2907impl From<TerminalMinusEqPtr> for BinaryOperatorPtr {
2908    fn from(value: TerminalMinusEqPtr) -> Self {
2909        Self(value.0)
2910    }
2911}
2912impl From<TerminalEqEqPtr> for BinaryOperatorPtr {
2913    fn from(value: TerminalEqEqPtr) -> Self {
2914        Self(value.0)
2915    }
2916}
2917impl From<TerminalNeqPtr> for BinaryOperatorPtr {
2918    fn from(value: TerminalNeqPtr) -> Self {
2919        Self(value.0)
2920    }
2921}
2922impl From<TerminalEqPtr> for BinaryOperatorPtr {
2923    fn from(value: TerminalEqPtr) -> Self {
2924        Self(value.0)
2925    }
2926}
2927impl From<TerminalAndPtr> for BinaryOperatorPtr {
2928    fn from(value: TerminalAndPtr) -> Self {
2929        Self(value.0)
2930    }
2931}
2932impl From<TerminalAndAndPtr> for BinaryOperatorPtr {
2933    fn from(value: TerminalAndAndPtr) -> Self {
2934        Self(value.0)
2935    }
2936}
2937impl From<TerminalOrPtr> for BinaryOperatorPtr {
2938    fn from(value: TerminalOrPtr) -> Self {
2939        Self(value.0)
2940    }
2941}
2942impl From<TerminalOrOrPtr> for BinaryOperatorPtr {
2943    fn from(value: TerminalOrOrPtr) -> Self {
2944        Self(value.0)
2945    }
2946}
2947impl From<TerminalXorPtr> for BinaryOperatorPtr {
2948    fn from(value: TerminalXorPtr) -> Self {
2949        Self(value.0)
2950    }
2951}
2952impl From<TerminalLEPtr> for BinaryOperatorPtr {
2953    fn from(value: TerminalLEPtr) -> Self {
2954        Self(value.0)
2955    }
2956}
2957impl From<TerminalGEPtr> for BinaryOperatorPtr {
2958    fn from(value: TerminalGEPtr) -> Self {
2959        Self(value.0)
2960    }
2961}
2962impl From<TerminalLTPtr> for BinaryOperatorPtr {
2963    fn from(value: TerminalLTPtr) -> Self {
2964        Self(value.0)
2965    }
2966}
2967impl From<TerminalGTPtr> for BinaryOperatorPtr {
2968    fn from(value: TerminalGTPtr) -> Self {
2969        Self(value.0)
2970    }
2971}
2972impl From<TerminalDotDotPtr> for BinaryOperatorPtr {
2973    fn from(value: TerminalDotDotPtr) -> Self {
2974        Self(value.0)
2975    }
2976}
2977impl From<TerminalDotDotEqPtr> for BinaryOperatorPtr {
2978    fn from(value: TerminalDotDotEqPtr) -> Self {
2979        Self(value.0)
2980    }
2981}
2982impl From<TerminalDotGreen> for BinaryOperatorGreen {
2983    fn from(value: TerminalDotGreen) -> Self {
2984        Self(value.0)
2985    }
2986}
2987impl From<TerminalNotGreen> for BinaryOperatorGreen {
2988    fn from(value: TerminalNotGreen) -> Self {
2989        Self(value.0)
2990    }
2991}
2992impl From<TerminalMulGreen> for BinaryOperatorGreen {
2993    fn from(value: TerminalMulGreen) -> Self {
2994        Self(value.0)
2995    }
2996}
2997impl From<TerminalMulEqGreen> for BinaryOperatorGreen {
2998    fn from(value: TerminalMulEqGreen) -> Self {
2999        Self(value.0)
3000    }
3001}
3002impl From<TerminalDivGreen> for BinaryOperatorGreen {
3003    fn from(value: TerminalDivGreen) -> Self {
3004        Self(value.0)
3005    }
3006}
3007impl From<TerminalDivEqGreen> for BinaryOperatorGreen {
3008    fn from(value: TerminalDivEqGreen) -> Self {
3009        Self(value.0)
3010    }
3011}
3012impl From<TerminalModGreen> for BinaryOperatorGreen {
3013    fn from(value: TerminalModGreen) -> Self {
3014        Self(value.0)
3015    }
3016}
3017impl From<TerminalModEqGreen> for BinaryOperatorGreen {
3018    fn from(value: TerminalModEqGreen) -> Self {
3019        Self(value.0)
3020    }
3021}
3022impl From<TerminalPlusGreen> for BinaryOperatorGreen {
3023    fn from(value: TerminalPlusGreen) -> Self {
3024        Self(value.0)
3025    }
3026}
3027impl From<TerminalPlusEqGreen> for BinaryOperatorGreen {
3028    fn from(value: TerminalPlusEqGreen) -> Self {
3029        Self(value.0)
3030    }
3031}
3032impl From<TerminalMinusGreen> for BinaryOperatorGreen {
3033    fn from(value: TerminalMinusGreen) -> Self {
3034        Self(value.0)
3035    }
3036}
3037impl From<TerminalMinusEqGreen> for BinaryOperatorGreen {
3038    fn from(value: TerminalMinusEqGreen) -> Self {
3039        Self(value.0)
3040    }
3041}
3042impl From<TerminalEqEqGreen> for BinaryOperatorGreen {
3043    fn from(value: TerminalEqEqGreen) -> Self {
3044        Self(value.0)
3045    }
3046}
3047impl From<TerminalNeqGreen> for BinaryOperatorGreen {
3048    fn from(value: TerminalNeqGreen) -> Self {
3049        Self(value.0)
3050    }
3051}
3052impl From<TerminalEqGreen> for BinaryOperatorGreen {
3053    fn from(value: TerminalEqGreen) -> Self {
3054        Self(value.0)
3055    }
3056}
3057impl From<TerminalAndGreen> for BinaryOperatorGreen {
3058    fn from(value: TerminalAndGreen) -> Self {
3059        Self(value.0)
3060    }
3061}
3062impl From<TerminalAndAndGreen> for BinaryOperatorGreen {
3063    fn from(value: TerminalAndAndGreen) -> Self {
3064        Self(value.0)
3065    }
3066}
3067impl From<TerminalOrGreen> for BinaryOperatorGreen {
3068    fn from(value: TerminalOrGreen) -> Self {
3069        Self(value.0)
3070    }
3071}
3072impl From<TerminalOrOrGreen> for BinaryOperatorGreen {
3073    fn from(value: TerminalOrOrGreen) -> Self {
3074        Self(value.0)
3075    }
3076}
3077impl From<TerminalXorGreen> for BinaryOperatorGreen {
3078    fn from(value: TerminalXorGreen) -> Self {
3079        Self(value.0)
3080    }
3081}
3082impl From<TerminalLEGreen> for BinaryOperatorGreen {
3083    fn from(value: TerminalLEGreen) -> Self {
3084        Self(value.0)
3085    }
3086}
3087impl From<TerminalGEGreen> for BinaryOperatorGreen {
3088    fn from(value: TerminalGEGreen) -> Self {
3089        Self(value.0)
3090    }
3091}
3092impl From<TerminalLTGreen> for BinaryOperatorGreen {
3093    fn from(value: TerminalLTGreen) -> Self {
3094        Self(value.0)
3095    }
3096}
3097impl From<TerminalGTGreen> for BinaryOperatorGreen {
3098    fn from(value: TerminalGTGreen) -> Self {
3099        Self(value.0)
3100    }
3101}
3102impl From<TerminalDotDotGreen> for BinaryOperatorGreen {
3103    fn from(value: TerminalDotDotGreen) -> Self {
3104        Self(value.0)
3105    }
3106}
3107impl From<TerminalDotDotEqGreen> for BinaryOperatorGreen {
3108    fn from(value: TerminalDotDotEqGreen) -> Self {
3109        Self(value.0)
3110    }
3111}
3112#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
3113pub struct BinaryOperatorGreen(pub GreenId);
3114impl TypedSyntaxNode for BinaryOperator {
3115    const OPTIONAL_KIND: Option<SyntaxKind> = None;
3116    type StablePtr = BinaryOperatorPtr;
3117    type Green = BinaryOperatorGreen;
3118    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
3119        panic!("No missing variant.");
3120    }
3121    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
3122        let kind = node.kind(db);
3123        match kind {
3124            SyntaxKind::TerminalDot => BinaryOperator::Dot(TerminalDot::from_syntax_node(db, node)),
3125            SyntaxKind::TerminalNot => BinaryOperator::Not(TerminalNot::from_syntax_node(db, node)),
3126            SyntaxKind::TerminalMul => BinaryOperator::Mul(TerminalMul::from_syntax_node(db, node)),
3127            SyntaxKind::TerminalMulEq => {
3128                BinaryOperator::MulEq(TerminalMulEq::from_syntax_node(db, node))
3129            }
3130            SyntaxKind::TerminalDiv => BinaryOperator::Div(TerminalDiv::from_syntax_node(db, node)),
3131            SyntaxKind::TerminalDivEq => {
3132                BinaryOperator::DivEq(TerminalDivEq::from_syntax_node(db, node))
3133            }
3134            SyntaxKind::TerminalMod => BinaryOperator::Mod(TerminalMod::from_syntax_node(db, node)),
3135            SyntaxKind::TerminalModEq => {
3136                BinaryOperator::ModEq(TerminalModEq::from_syntax_node(db, node))
3137            }
3138            SyntaxKind::TerminalPlus => {
3139                BinaryOperator::Plus(TerminalPlus::from_syntax_node(db, node))
3140            }
3141            SyntaxKind::TerminalPlusEq => {
3142                BinaryOperator::PlusEq(TerminalPlusEq::from_syntax_node(db, node))
3143            }
3144            SyntaxKind::TerminalMinus => {
3145                BinaryOperator::Minus(TerminalMinus::from_syntax_node(db, node))
3146            }
3147            SyntaxKind::TerminalMinusEq => {
3148                BinaryOperator::MinusEq(TerminalMinusEq::from_syntax_node(db, node))
3149            }
3150            SyntaxKind::TerminalEqEq => {
3151                BinaryOperator::EqEq(TerminalEqEq::from_syntax_node(db, node))
3152            }
3153            SyntaxKind::TerminalNeq => BinaryOperator::Neq(TerminalNeq::from_syntax_node(db, node)),
3154            SyntaxKind::TerminalEq => BinaryOperator::Eq(TerminalEq::from_syntax_node(db, node)),
3155            SyntaxKind::TerminalAnd => BinaryOperator::And(TerminalAnd::from_syntax_node(db, node)),
3156            SyntaxKind::TerminalAndAnd => {
3157                BinaryOperator::AndAnd(TerminalAndAnd::from_syntax_node(db, node))
3158            }
3159            SyntaxKind::TerminalOr => BinaryOperator::Or(TerminalOr::from_syntax_node(db, node)),
3160            SyntaxKind::TerminalOrOr => {
3161                BinaryOperator::OrOr(TerminalOrOr::from_syntax_node(db, node))
3162            }
3163            SyntaxKind::TerminalXor => BinaryOperator::Xor(TerminalXor::from_syntax_node(db, node)),
3164            SyntaxKind::TerminalLE => BinaryOperator::LE(TerminalLE::from_syntax_node(db, node)),
3165            SyntaxKind::TerminalGE => BinaryOperator::GE(TerminalGE::from_syntax_node(db, node)),
3166            SyntaxKind::TerminalLT => BinaryOperator::LT(TerminalLT::from_syntax_node(db, node)),
3167            SyntaxKind::TerminalGT => BinaryOperator::GT(TerminalGT::from_syntax_node(db, node)),
3168            SyntaxKind::TerminalDotDot => {
3169                BinaryOperator::DotDot(TerminalDotDot::from_syntax_node(db, node))
3170            }
3171            SyntaxKind::TerminalDotDotEq => {
3172                BinaryOperator::DotDotEq(TerminalDotDotEq::from_syntax_node(db, node))
3173            }
3174            _ => {
3175                panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "BinaryOperator")
3176            }
3177        }
3178    }
3179    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
3180        let kind = node.kind(db);
3181        match kind {
3182            SyntaxKind::TerminalDot => {
3183                Some(BinaryOperator::Dot(TerminalDot::from_syntax_node(db, node)))
3184            }
3185            SyntaxKind::TerminalNot => {
3186                Some(BinaryOperator::Not(TerminalNot::from_syntax_node(db, node)))
3187            }
3188            SyntaxKind::TerminalMul => {
3189                Some(BinaryOperator::Mul(TerminalMul::from_syntax_node(db, node)))
3190            }
3191            SyntaxKind::TerminalMulEq => {
3192                Some(BinaryOperator::MulEq(TerminalMulEq::from_syntax_node(db, node)))
3193            }
3194            SyntaxKind::TerminalDiv => {
3195                Some(BinaryOperator::Div(TerminalDiv::from_syntax_node(db, node)))
3196            }
3197            SyntaxKind::TerminalDivEq => {
3198                Some(BinaryOperator::DivEq(TerminalDivEq::from_syntax_node(db, node)))
3199            }
3200            SyntaxKind::TerminalMod => {
3201                Some(BinaryOperator::Mod(TerminalMod::from_syntax_node(db, node)))
3202            }
3203            SyntaxKind::TerminalModEq => {
3204                Some(BinaryOperator::ModEq(TerminalModEq::from_syntax_node(db, node)))
3205            }
3206            SyntaxKind::TerminalPlus => {
3207                Some(BinaryOperator::Plus(TerminalPlus::from_syntax_node(db, node)))
3208            }
3209            SyntaxKind::TerminalPlusEq => {
3210                Some(BinaryOperator::PlusEq(TerminalPlusEq::from_syntax_node(db, node)))
3211            }
3212            SyntaxKind::TerminalMinus => {
3213                Some(BinaryOperator::Minus(TerminalMinus::from_syntax_node(db, node)))
3214            }
3215            SyntaxKind::TerminalMinusEq => {
3216                Some(BinaryOperator::MinusEq(TerminalMinusEq::from_syntax_node(db, node)))
3217            }
3218            SyntaxKind::TerminalEqEq => {
3219                Some(BinaryOperator::EqEq(TerminalEqEq::from_syntax_node(db, node)))
3220            }
3221            SyntaxKind::TerminalNeq => {
3222                Some(BinaryOperator::Neq(TerminalNeq::from_syntax_node(db, node)))
3223            }
3224            SyntaxKind::TerminalEq => {
3225                Some(BinaryOperator::Eq(TerminalEq::from_syntax_node(db, node)))
3226            }
3227            SyntaxKind::TerminalAnd => {
3228                Some(BinaryOperator::And(TerminalAnd::from_syntax_node(db, node)))
3229            }
3230            SyntaxKind::TerminalAndAnd => {
3231                Some(BinaryOperator::AndAnd(TerminalAndAnd::from_syntax_node(db, node)))
3232            }
3233            SyntaxKind::TerminalOr => {
3234                Some(BinaryOperator::Or(TerminalOr::from_syntax_node(db, node)))
3235            }
3236            SyntaxKind::TerminalOrOr => {
3237                Some(BinaryOperator::OrOr(TerminalOrOr::from_syntax_node(db, node)))
3238            }
3239            SyntaxKind::TerminalXor => {
3240                Some(BinaryOperator::Xor(TerminalXor::from_syntax_node(db, node)))
3241            }
3242            SyntaxKind::TerminalLE => {
3243                Some(BinaryOperator::LE(TerminalLE::from_syntax_node(db, node)))
3244            }
3245            SyntaxKind::TerminalGE => {
3246                Some(BinaryOperator::GE(TerminalGE::from_syntax_node(db, node)))
3247            }
3248            SyntaxKind::TerminalLT => {
3249                Some(BinaryOperator::LT(TerminalLT::from_syntax_node(db, node)))
3250            }
3251            SyntaxKind::TerminalGT => {
3252                Some(BinaryOperator::GT(TerminalGT::from_syntax_node(db, node)))
3253            }
3254            SyntaxKind::TerminalDotDot => {
3255                Some(BinaryOperator::DotDot(TerminalDotDot::from_syntax_node(db, node)))
3256            }
3257            SyntaxKind::TerminalDotDotEq => {
3258                Some(BinaryOperator::DotDotEq(TerminalDotDotEq::from_syntax_node(db, node)))
3259            }
3260            _ => None,
3261        }
3262    }
3263    fn as_syntax_node(&self) -> SyntaxNode {
3264        match self {
3265            BinaryOperator::Dot(x) => x.as_syntax_node(),
3266            BinaryOperator::Not(x) => x.as_syntax_node(),
3267            BinaryOperator::Mul(x) => x.as_syntax_node(),
3268            BinaryOperator::MulEq(x) => x.as_syntax_node(),
3269            BinaryOperator::Div(x) => x.as_syntax_node(),
3270            BinaryOperator::DivEq(x) => x.as_syntax_node(),
3271            BinaryOperator::Mod(x) => x.as_syntax_node(),
3272            BinaryOperator::ModEq(x) => x.as_syntax_node(),
3273            BinaryOperator::Plus(x) => x.as_syntax_node(),
3274            BinaryOperator::PlusEq(x) => x.as_syntax_node(),
3275            BinaryOperator::Minus(x) => x.as_syntax_node(),
3276            BinaryOperator::MinusEq(x) => x.as_syntax_node(),
3277            BinaryOperator::EqEq(x) => x.as_syntax_node(),
3278            BinaryOperator::Neq(x) => x.as_syntax_node(),
3279            BinaryOperator::Eq(x) => x.as_syntax_node(),
3280            BinaryOperator::And(x) => x.as_syntax_node(),
3281            BinaryOperator::AndAnd(x) => x.as_syntax_node(),
3282            BinaryOperator::Or(x) => x.as_syntax_node(),
3283            BinaryOperator::OrOr(x) => x.as_syntax_node(),
3284            BinaryOperator::Xor(x) => x.as_syntax_node(),
3285            BinaryOperator::LE(x) => x.as_syntax_node(),
3286            BinaryOperator::GE(x) => x.as_syntax_node(),
3287            BinaryOperator::LT(x) => x.as_syntax_node(),
3288            BinaryOperator::GT(x) => x.as_syntax_node(),
3289            BinaryOperator::DotDot(x) => x.as_syntax_node(),
3290            BinaryOperator::DotDotEq(x) => x.as_syntax_node(),
3291        }
3292    }
3293    fn stable_ptr(&self) -> Self::StablePtr {
3294        BinaryOperatorPtr(self.as_syntax_node().0.stable_ptr)
3295    }
3296}
3297impl From<&BinaryOperator> for SyntaxStablePtrId {
3298    fn from(node: &BinaryOperator) -> Self {
3299        node.stable_ptr().untyped()
3300    }
3301}
3302impl BinaryOperator {
3303    /// Checks if a kind of a variant of [BinaryOperator].
3304    pub fn is_variant(kind: SyntaxKind) -> bool {
3305        matches!(
3306            kind,
3307            SyntaxKind::TerminalDot
3308                | SyntaxKind::TerminalNot
3309                | SyntaxKind::TerminalMul
3310                | SyntaxKind::TerminalMulEq
3311                | SyntaxKind::TerminalDiv
3312                | SyntaxKind::TerminalDivEq
3313                | SyntaxKind::TerminalMod
3314                | SyntaxKind::TerminalModEq
3315                | SyntaxKind::TerminalPlus
3316                | SyntaxKind::TerminalPlusEq
3317                | SyntaxKind::TerminalMinus
3318                | SyntaxKind::TerminalMinusEq
3319                | SyntaxKind::TerminalEqEq
3320                | SyntaxKind::TerminalNeq
3321                | SyntaxKind::TerminalEq
3322                | SyntaxKind::TerminalAnd
3323                | SyntaxKind::TerminalAndAnd
3324                | SyntaxKind::TerminalOr
3325                | SyntaxKind::TerminalOrOr
3326                | SyntaxKind::TerminalXor
3327                | SyntaxKind::TerminalLE
3328                | SyntaxKind::TerminalGE
3329                | SyntaxKind::TerminalLT
3330                | SyntaxKind::TerminalGT
3331                | SyntaxKind::TerminalDotDot
3332                | SyntaxKind::TerminalDotDotEq
3333        )
3334    }
3335}
3336#[derive(Clone, Debug, Eq, Hash, PartialEq)]
3337pub struct ExprListParenthesized {
3338    node: SyntaxNode,
3339    children: Arc<[SyntaxNode]>,
3340}
3341impl ExprListParenthesized {
3342    pub const INDEX_LPAREN: usize = 0;
3343    pub const INDEX_EXPRESSIONS: usize = 1;
3344    pub const INDEX_RPAREN: usize = 2;
3345    pub fn new_green(
3346        db: &dyn SyntaxGroup,
3347        lparen: TerminalLParenGreen,
3348        expressions: ExprListGreen,
3349        rparen: TerminalRParenGreen,
3350    ) -> ExprListParenthesizedGreen {
3351        let children: Vec<GreenId> = vec![lparen.0, expressions.0, rparen.0];
3352        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
3353        ExprListParenthesizedGreen(
3354            Arc::new(GreenNode {
3355                kind: SyntaxKind::ExprListParenthesized,
3356                details: GreenNodeDetails::Node { children, width },
3357            })
3358            .intern(db),
3359        )
3360    }
3361}
3362impl ExprListParenthesized {
3363    pub fn lparen(&self, db: &dyn SyntaxGroup) -> TerminalLParen {
3364        TerminalLParen::from_syntax_node(db, self.children[0].clone())
3365    }
3366    pub fn expressions(&self, db: &dyn SyntaxGroup) -> ExprList {
3367        ExprList::from_syntax_node(db, self.children[1].clone())
3368    }
3369    pub fn rparen(&self, db: &dyn SyntaxGroup) -> TerminalRParen {
3370        TerminalRParen::from_syntax_node(db, self.children[2].clone())
3371    }
3372}
3373#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
3374pub struct ExprListParenthesizedPtr(pub SyntaxStablePtrId);
3375impl ExprListParenthesizedPtr {}
3376impl TypedStablePtr for ExprListParenthesizedPtr {
3377    type SyntaxNode = ExprListParenthesized;
3378    fn untyped(&self) -> SyntaxStablePtrId {
3379        self.0
3380    }
3381    fn lookup(&self, db: &dyn SyntaxGroup) -> ExprListParenthesized {
3382        ExprListParenthesized::from_syntax_node(db, self.0.lookup(db))
3383    }
3384}
3385impl From<ExprListParenthesizedPtr> for SyntaxStablePtrId {
3386    fn from(ptr: ExprListParenthesizedPtr) -> Self {
3387        ptr.untyped()
3388    }
3389}
3390#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
3391pub struct ExprListParenthesizedGreen(pub GreenId);
3392impl TypedSyntaxNode for ExprListParenthesized {
3393    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprListParenthesized);
3394    type StablePtr = ExprListParenthesizedPtr;
3395    type Green = ExprListParenthesizedGreen;
3396    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
3397        ExprListParenthesizedGreen(
3398            Arc::new(GreenNode {
3399                kind: SyntaxKind::ExprListParenthesized,
3400                details: GreenNodeDetails::Node {
3401                    children: vec![
3402                        TerminalLParen::missing(db).0,
3403                        ExprList::missing(db).0,
3404                        TerminalRParen::missing(db).0,
3405                    ],
3406                    width: TextWidth::default(),
3407                },
3408            })
3409            .intern(db),
3410        )
3411    }
3412    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
3413        let kind = node.kind(db);
3414        assert_eq!(
3415            kind,
3416            SyntaxKind::ExprListParenthesized,
3417            "Unexpected SyntaxKind {:?}. Expected {:?}.",
3418            kind,
3419            SyntaxKind::ExprListParenthesized
3420        );
3421        let children = db.get_children(node.clone());
3422        Self { node, children }
3423    }
3424    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
3425        let kind = node.kind(db);
3426        if kind == SyntaxKind::ExprListParenthesized {
3427            Some(Self::from_syntax_node(db, node))
3428        } else {
3429            None
3430        }
3431    }
3432    fn as_syntax_node(&self) -> SyntaxNode {
3433        self.node.clone()
3434    }
3435    fn stable_ptr(&self) -> Self::StablePtr {
3436        ExprListParenthesizedPtr(self.node.0.stable_ptr)
3437    }
3438}
3439impl From<&ExprListParenthesized> for SyntaxStablePtrId {
3440    fn from(node: &ExprListParenthesized) -> Self {
3441        node.stable_ptr().untyped()
3442    }
3443}
3444#[derive(Clone, Debug, Eq, Hash, PartialEq)]
3445pub struct ExprFunctionCall {
3446    node: SyntaxNode,
3447    children: Arc<[SyntaxNode]>,
3448}
3449impl ExprFunctionCall {
3450    pub const INDEX_PATH: usize = 0;
3451    pub const INDEX_ARGUMENTS: usize = 1;
3452    pub fn new_green(
3453        db: &dyn SyntaxGroup,
3454        path: ExprPathGreen,
3455        arguments: ArgListParenthesizedGreen,
3456    ) -> ExprFunctionCallGreen {
3457        let children: Vec<GreenId> = vec![path.0, arguments.0];
3458        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
3459        ExprFunctionCallGreen(
3460            Arc::new(GreenNode {
3461                kind: SyntaxKind::ExprFunctionCall,
3462                details: GreenNodeDetails::Node { children, width },
3463            })
3464            .intern(db),
3465        )
3466    }
3467}
3468impl ExprFunctionCall {
3469    pub fn path(&self, db: &dyn SyntaxGroup) -> ExprPath {
3470        ExprPath::from_syntax_node(db, self.children[0].clone())
3471    }
3472    pub fn arguments(&self, db: &dyn SyntaxGroup) -> ArgListParenthesized {
3473        ArgListParenthesized::from_syntax_node(db, self.children[1].clone())
3474    }
3475}
3476#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
3477pub struct ExprFunctionCallPtr(pub SyntaxStablePtrId);
3478impl ExprFunctionCallPtr {}
3479impl TypedStablePtr for ExprFunctionCallPtr {
3480    type SyntaxNode = ExprFunctionCall;
3481    fn untyped(&self) -> SyntaxStablePtrId {
3482        self.0
3483    }
3484    fn lookup(&self, db: &dyn SyntaxGroup) -> ExprFunctionCall {
3485        ExprFunctionCall::from_syntax_node(db, self.0.lookup(db))
3486    }
3487}
3488impl From<ExprFunctionCallPtr> for SyntaxStablePtrId {
3489    fn from(ptr: ExprFunctionCallPtr) -> Self {
3490        ptr.untyped()
3491    }
3492}
3493#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
3494pub struct ExprFunctionCallGreen(pub GreenId);
3495impl TypedSyntaxNode for ExprFunctionCall {
3496    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprFunctionCall);
3497    type StablePtr = ExprFunctionCallPtr;
3498    type Green = ExprFunctionCallGreen;
3499    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
3500        ExprFunctionCallGreen(
3501            Arc::new(GreenNode {
3502                kind: SyntaxKind::ExprFunctionCall,
3503                details: GreenNodeDetails::Node {
3504                    children: vec![ExprPath::missing(db).0, ArgListParenthesized::missing(db).0],
3505                    width: TextWidth::default(),
3506                },
3507            })
3508            .intern(db),
3509        )
3510    }
3511    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
3512        let kind = node.kind(db);
3513        assert_eq!(
3514            kind,
3515            SyntaxKind::ExprFunctionCall,
3516            "Unexpected SyntaxKind {:?}. Expected {:?}.",
3517            kind,
3518            SyntaxKind::ExprFunctionCall
3519        );
3520        let children = db.get_children(node.clone());
3521        Self { node, children }
3522    }
3523    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
3524        let kind = node.kind(db);
3525        if kind == SyntaxKind::ExprFunctionCall {
3526            Some(Self::from_syntax_node(db, node))
3527        } else {
3528            None
3529        }
3530    }
3531    fn as_syntax_node(&self) -> SyntaxNode {
3532        self.node.clone()
3533    }
3534    fn stable_ptr(&self) -> Self::StablePtr {
3535        ExprFunctionCallPtr(self.node.0.stable_ptr)
3536    }
3537}
3538impl From<&ExprFunctionCall> for SyntaxStablePtrId {
3539    fn from(node: &ExprFunctionCall) -> Self {
3540        node.stable_ptr().untyped()
3541    }
3542}
3543#[derive(Clone, Debug, Eq, Hash, PartialEq)]
3544pub struct ArgListParenthesized {
3545    node: SyntaxNode,
3546    children: Arc<[SyntaxNode]>,
3547}
3548impl ArgListParenthesized {
3549    pub const INDEX_LPAREN: usize = 0;
3550    pub const INDEX_ARGUMENTS: usize = 1;
3551    pub const INDEX_RPAREN: usize = 2;
3552    pub fn new_green(
3553        db: &dyn SyntaxGroup,
3554        lparen: TerminalLParenGreen,
3555        arguments: ArgListGreen,
3556        rparen: TerminalRParenGreen,
3557    ) -> ArgListParenthesizedGreen {
3558        let children: Vec<GreenId> = vec![lparen.0, arguments.0, rparen.0];
3559        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
3560        ArgListParenthesizedGreen(
3561            Arc::new(GreenNode {
3562                kind: SyntaxKind::ArgListParenthesized,
3563                details: GreenNodeDetails::Node { children, width },
3564            })
3565            .intern(db),
3566        )
3567    }
3568}
3569impl ArgListParenthesized {
3570    pub fn lparen(&self, db: &dyn SyntaxGroup) -> TerminalLParen {
3571        TerminalLParen::from_syntax_node(db, self.children[0].clone())
3572    }
3573    pub fn arguments(&self, db: &dyn SyntaxGroup) -> ArgList {
3574        ArgList::from_syntax_node(db, self.children[1].clone())
3575    }
3576    pub fn rparen(&self, db: &dyn SyntaxGroup) -> TerminalRParen {
3577        TerminalRParen::from_syntax_node(db, self.children[2].clone())
3578    }
3579}
3580#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
3581pub struct ArgListParenthesizedPtr(pub SyntaxStablePtrId);
3582impl ArgListParenthesizedPtr {}
3583impl TypedStablePtr for ArgListParenthesizedPtr {
3584    type SyntaxNode = ArgListParenthesized;
3585    fn untyped(&self) -> SyntaxStablePtrId {
3586        self.0
3587    }
3588    fn lookup(&self, db: &dyn SyntaxGroup) -> ArgListParenthesized {
3589        ArgListParenthesized::from_syntax_node(db, self.0.lookup(db))
3590    }
3591}
3592impl From<ArgListParenthesizedPtr> for SyntaxStablePtrId {
3593    fn from(ptr: ArgListParenthesizedPtr) -> Self {
3594        ptr.untyped()
3595    }
3596}
3597#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
3598pub struct ArgListParenthesizedGreen(pub GreenId);
3599impl TypedSyntaxNode for ArgListParenthesized {
3600    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ArgListParenthesized);
3601    type StablePtr = ArgListParenthesizedPtr;
3602    type Green = ArgListParenthesizedGreen;
3603    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
3604        ArgListParenthesizedGreen(
3605            Arc::new(GreenNode {
3606                kind: SyntaxKind::ArgListParenthesized,
3607                details: GreenNodeDetails::Node {
3608                    children: vec![
3609                        TerminalLParen::missing(db).0,
3610                        ArgList::missing(db).0,
3611                        TerminalRParen::missing(db).0,
3612                    ],
3613                    width: TextWidth::default(),
3614                },
3615            })
3616            .intern(db),
3617        )
3618    }
3619    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
3620        let kind = node.kind(db);
3621        assert_eq!(
3622            kind,
3623            SyntaxKind::ArgListParenthesized,
3624            "Unexpected SyntaxKind {:?}. Expected {:?}.",
3625            kind,
3626            SyntaxKind::ArgListParenthesized
3627        );
3628        let children = db.get_children(node.clone());
3629        Self { node, children }
3630    }
3631    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
3632        let kind = node.kind(db);
3633        if kind == SyntaxKind::ArgListParenthesized {
3634            Some(Self::from_syntax_node(db, node))
3635        } else {
3636            None
3637        }
3638    }
3639    fn as_syntax_node(&self) -> SyntaxNode {
3640        self.node.clone()
3641    }
3642    fn stable_ptr(&self) -> Self::StablePtr {
3643        ArgListParenthesizedPtr(self.node.0.stable_ptr)
3644    }
3645}
3646impl From<&ArgListParenthesized> for SyntaxStablePtrId {
3647    fn from(node: &ArgListParenthesized) -> Self {
3648        node.stable_ptr().untyped()
3649    }
3650}
3651#[derive(Clone, Debug, Eq, Hash, PartialEq)]
3652pub enum OptionArgListParenthesized {
3653    Empty(OptionArgListParenthesizedEmpty),
3654    ArgListParenthesized(ArgListParenthesized),
3655}
3656#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
3657pub struct OptionArgListParenthesizedPtr(pub SyntaxStablePtrId);
3658impl TypedStablePtr for OptionArgListParenthesizedPtr {
3659    type SyntaxNode = OptionArgListParenthesized;
3660    fn untyped(&self) -> SyntaxStablePtrId {
3661        self.0
3662    }
3663    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionArgListParenthesized {
3664        OptionArgListParenthesized::from_syntax_node(db, self.0.lookup(db))
3665    }
3666}
3667impl From<OptionArgListParenthesizedPtr> for SyntaxStablePtrId {
3668    fn from(ptr: OptionArgListParenthesizedPtr) -> Self {
3669        ptr.untyped()
3670    }
3671}
3672impl From<OptionArgListParenthesizedEmptyPtr> for OptionArgListParenthesizedPtr {
3673    fn from(value: OptionArgListParenthesizedEmptyPtr) -> Self {
3674        Self(value.0)
3675    }
3676}
3677impl From<ArgListParenthesizedPtr> for OptionArgListParenthesizedPtr {
3678    fn from(value: ArgListParenthesizedPtr) -> Self {
3679        Self(value.0)
3680    }
3681}
3682impl From<OptionArgListParenthesizedEmptyGreen> for OptionArgListParenthesizedGreen {
3683    fn from(value: OptionArgListParenthesizedEmptyGreen) -> Self {
3684        Self(value.0)
3685    }
3686}
3687impl From<ArgListParenthesizedGreen> for OptionArgListParenthesizedGreen {
3688    fn from(value: ArgListParenthesizedGreen) -> Self {
3689        Self(value.0)
3690    }
3691}
3692#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
3693pub struct OptionArgListParenthesizedGreen(pub GreenId);
3694impl TypedSyntaxNode for OptionArgListParenthesized {
3695    const OPTIONAL_KIND: Option<SyntaxKind> = None;
3696    type StablePtr = OptionArgListParenthesizedPtr;
3697    type Green = OptionArgListParenthesizedGreen;
3698    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
3699        panic!("No missing variant.");
3700    }
3701    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
3702        let kind = node.kind(db);
3703        match kind {
3704            SyntaxKind::OptionArgListParenthesizedEmpty => OptionArgListParenthesized::Empty(
3705                OptionArgListParenthesizedEmpty::from_syntax_node(db, node),
3706            ),
3707            SyntaxKind::ArgListParenthesized => OptionArgListParenthesized::ArgListParenthesized(
3708                ArgListParenthesized::from_syntax_node(db, node),
3709            ),
3710            _ => panic!(
3711                "Unexpected syntax kind {:?} when constructing {}.",
3712                kind, "OptionArgListParenthesized"
3713            ),
3714        }
3715    }
3716    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
3717        let kind = node.kind(db);
3718        match kind {
3719            SyntaxKind::OptionArgListParenthesizedEmpty => Some(OptionArgListParenthesized::Empty(
3720                OptionArgListParenthesizedEmpty::from_syntax_node(db, node),
3721            )),
3722            SyntaxKind::ArgListParenthesized => {
3723                Some(OptionArgListParenthesized::ArgListParenthesized(
3724                    ArgListParenthesized::from_syntax_node(db, node),
3725                ))
3726            }
3727            _ => None,
3728        }
3729    }
3730    fn as_syntax_node(&self) -> SyntaxNode {
3731        match self {
3732            OptionArgListParenthesized::Empty(x) => x.as_syntax_node(),
3733            OptionArgListParenthesized::ArgListParenthesized(x) => x.as_syntax_node(),
3734        }
3735    }
3736    fn stable_ptr(&self) -> Self::StablePtr {
3737        OptionArgListParenthesizedPtr(self.as_syntax_node().0.stable_ptr)
3738    }
3739}
3740impl From<&OptionArgListParenthesized> for SyntaxStablePtrId {
3741    fn from(node: &OptionArgListParenthesized) -> Self {
3742        node.stable_ptr().untyped()
3743    }
3744}
3745impl OptionArgListParenthesized {
3746    /// Checks if a kind of a variant of [OptionArgListParenthesized].
3747    pub fn is_variant(kind: SyntaxKind) -> bool {
3748        matches!(
3749            kind,
3750            SyntaxKind::OptionArgListParenthesizedEmpty | SyntaxKind::ArgListParenthesized
3751        )
3752    }
3753}
3754#[derive(Clone, Debug, Eq, Hash, PartialEq)]
3755pub struct OptionArgListParenthesizedEmpty {
3756    node: SyntaxNode,
3757    children: Arc<[SyntaxNode]>,
3758}
3759impl OptionArgListParenthesizedEmpty {
3760    pub fn new_green(db: &dyn SyntaxGroup) -> OptionArgListParenthesizedEmptyGreen {
3761        let children: Vec<GreenId> = vec![];
3762        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
3763        OptionArgListParenthesizedEmptyGreen(
3764            Arc::new(GreenNode {
3765                kind: SyntaxKind::OptionArgListParenthesizedEmpty,
3766                details: GreenNodeDetails::Node { children, width },
3767            })
3768            .intern(db),
3769        )
3770    }
3771}
3772impl OptionArgListParenthesizedEmpty {}
3773#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
3774pub struct OptionArgListParenthesizedEmptyPtr(pub SyntaxStablePtrId);
3775impl OptionArgListParenthesizedEmptyPtr {}
3776impl TypedStablePtr for OptionArgListParenthesizedEmptyPtr {
3777    type SyntaxNode = OptionArgListParenthesizedEmpty;
3778    fn untyped(&self) -> SyntaxStablePtrId {
3779        self.0
3780    }
3781    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionArgListParenthesizedEmpty {
3782        OptionArgListParenthesizedEmpty::from_syntax_node(db, self.0.lookup(db))
3783    }
3784}
3785impl From<OptionArgListParenthesizedEmptyPtr> for SyntaxStablePtrId {
3786    fn from(ptr: OptionArgListParenthesizedEmptyPtr) -> Self {
3787        ptr.untyped()
3788    }
3789}
3790#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
3791pub struct OptionArgListParenthesizedEmptyGreen(pub GreenId);
3792impl TypedSyntaxNode for OptionArgListParenthesizedEmpty {
3793    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionArgListParenthesizedEmpty);
3794    type StablePtr = OptionArgListParenthesizedEmptyPtr;
3795    type Green = OptionArgListParenthesizedEmptyGreen;
3796    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
3797        OptionArgListParenthesizedEmptyGreen(
3798            Arc::new(GreenNode {
3799                kind: SyntaxKind::OptionArgListParenthesizedEmpty,
3800                details: GreenNodeDetails::Node { children: vec![], width: TextWidth::default() },
3801            })
3802            .intern(db),
3803        )
3804    }
3805    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
3806        let kind = node.kind(db);
3807        assert_eq!(
3808            kind,
3809            SyntaxKind::OptionArgListParenthesizedEmpty,
3810            "Unexpected SyntaxKind {:?}. Expected {:?}.",
3811            kind,
3812            SyntaxKind::OptionArgListParenthesizedEmpty
3813        );
3814        let children = db.get_children(node.clone());
3815        Self { node, children }
3816    }
3817    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
3818        let kind = node.kind(db);
3819        if kind == SyntaxKind::OptionArgListParenthesizedEmpty {
3820            Some(Self::from_syntax_node(db, node))
3821        } else {
3822            None
3823        }
3824    }
3825    fn as_syntax_node(&self) -> SyntaxNode {
3826        self.node.clone()
3827    }
3828    fn stable_ptr(&self) -> Self::StablePtr {
3829        OptionArgListParenthesizedEmptyPtr(self.node.0.stable_ptr)
3830    }
3831}
3832impl From<&OptionArgListParenthesizedEmpty> for SyntaxStablePtrId {
3833    fn from(node: &OptionArgListParenthesizedEmpty) -> Self {
3834        node.stable_ptr().untyped()
3835    }
3836}
3837#[derive(Clone, Debug, Eq, Hash, PartialEq)]
3838pub struct ExprStructCtorCall {
3839    node: SyntaxNode,
3840    children: Arc<[SyntaxNode]>,
3841}
3842impl ExprStructCtorCall {
3843    pub const INDEX_PATH: usize = 0;
3844    pub const INDEX_ARGUMENTS: usize = 1;
3845    pub fn new_green(
3846        db: &dyn SyntaxGroup,
3847        path: ExprPathGreen,
3848        arguments: StructArgListBracedGreen,
3849    ) -> ExprStructCtorCallGreen {
3850        let children: Vec<GreenId> = vec![path.0, arguments.0];
3851        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
3852        ExprStructCtorCallGreen(
3853            Arc::new(GreenNode {
3854                kind: SyntaxKind::ExprStructCtorCall,
3855                details: GreenNodeDetails::Node { children, width },
3856            })
3857            .intern(db),
3858        )
3859    }
3860}
3861impl ExprStructCtorCall {
3862    pub fn path(&self, db: &dyn SyntaxGroup) -> ExprPath {
3863        ExprPath::from_syntax_node(db, self.children[0].clone())
3864    }
3865    pub fn arguments(&self, db: &dyn SyntaxGroup) -> StructArgListBraced {
3866        StructArgListBraced::from_syntax_node(db, self.children[1].clone())
3867    }
3868}
3869#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
3870pub struct ExprStructCtorCallPtr(pub SyntaxStablePtrId);
3871impl ExprStructCtorCallPtr {}
3872impl TypedStablePtr for ExprStructCtorCallPtr {
3873    type SyntaxNode = ExprStructCtorCall;
3874    fn untyped(&self) -> SyntaxStablePtrId {
3875        self.0
3876    }
3877    fn lookup(&self, db: &dyn SyntaxGroup) -> ExprStructCtorCall {
3878        ExprStructCtorCall::from_syntax_node(db, self.0.lookup(db))
3879    }
3880}
3881impl From<ExprStructCtorCallPtr> for SyntaxStablePtrId {
3882    fn from(ptr: ExprStructCtorCallPtr) -> Self {
3883        ptr.untyped()
3884    }
3885}
3886#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
3887pub struct ExprStructCtorCallGreen(pub GreenId);
3888impl TypedSyntaxNode for ExprStructCtorCall {
3889    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprStructCtorCall);
3890    type StablePtr = ExprStructCtorCallPtr;
3891    type Green = ExprStructCtorCallGreen;
3892    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
3893        ExprStructCtorCallGreen(
3894            Arc::new(GreenNode {
3895                kind: SyntaxKind::ExprStructCtorCall,
3896                details: GreenNodeDetails::Node {
3897                    children: vec![ExprPath::missing(db).0, StructArgListBraced::missing(db).0],
3898                    width: TextWidth::default(),
3899                },
3900            })
3901            .intern(db),
3902        )
3903    }
3904    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
3905        let kind = node.kind(db);
3906        assert_eq!(
3907            kind,
3908            SyntaxKind::ExprStructCtorCall,
3909            "Unexpected SyntaxKind {:?}. Expected {:?}.",
3910            kind,
3911            SyntaxKind::ExprStructCtorCall
3912        );
3913        let children = db.get_children(node.clone());
3914        Self { node, children }
3915    }
3916    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
3917        let kind = node.kind(db);
3918        if kind == SyntaxKind::ExprStructCtorCall {
3919            Some(Self::from_syntax_node(db, node))
3920        } else {
3921            None
3922        }
3923    }
3924    fn as_syntax_node(&self) -> SyntaxNode {
3925        self.node.clone()
3926    }
3927    fn stable_ptr(&self) -> Self::StablePtr {
3928        ExprStructCtorCallPtr(self.node.0.stable_ptr)
3929    }
3930}
3931impl From<&ExprStructCtorCall> for SyntaxStablePtrId {
3932    fn from(node: &ExprStructCtorCall) -> Self {
3933        node.stable_ptr().untyped()
3934    }
3935}
3936#[derive(Clone, Debug, Eq, Hash, PartialEq)]
3937pub struct StructArgListBraced {
3938    node: SyntaxNode,
3939    children: Arc<[SyntaxNode]>,
3940}
3941impl StructArgListBraced {
3942    pub const INDEX_LBRACE: usize = 0;
3943    pub const INDEX_ARGUMENTS: usize = 1;
3944    pub const INDEX_RBRACE: usize = 2;
3945    pub fn new_green(
3946        db: &dyn SyntaxGroup,
3947        lbrace: TerminalLBraceGreen,
3948        arguments: StructArgListGreen,
3949        rbrace: TerminalRBraceGreen,
3950    ) -> StructArgListBracedGreen {
3951        let children: Vec<GreenId> = vec![lbrace.0, arguments.0, rbrace.0];
3952        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
3953        StructArgListBracedGreen(
3954            Arc::new(GreenNode {
3955                kind: SyntaxKind::StructArgListBraced,
3956                details: GreenNodeDetails::Node { children, width },
3957            })
3958            .intern(db),
3959        )
3960    }
3961}
3962impl StructArgListBraced {
3963    pub fn lbrace(&self, db: &dyn SyntaxGroup) -> TerminalLBrace {
3964        TerminalLBrace::from_syntax_node(db, self.children[0].clone())
3965    }
3966    pub fn arguments(&self, db: &dyn SyntaxGroup) -> StructArgList {
3967        StructArgList::from_syntax_node(db, self.children[1].clone())
3968    }
3969    pub fn rbrace(&self, db: &dyn SyntaxGroup) -> TerminalRBrace {
3970        TerminalRBrace::from_syntax_node(db, self.children[2].clone())
3971    }
3972}
3973#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
3974pub struct StructArgListBracedPtr(pub SyntaxStablePtrId);
3975impl StructArgListBracedPtr {}
3976impl TypedStablePtr for StructArgListBracedPtr {
3977    type SyntaxNode = StructArgListBraced;
3978    fn untyped(&self) -> SyntaxStablePtrId {
3979        self.0
3980    }
3981    fn lookup(&self, db: &dyn SyntaxGroup) -> StructArgListBraced {
3982        StructArgListBraced::from_syntax_node(db, self.0.lookup(db))
3983    }
3984}
3985impl From<StructArgListBracedPtr> for SyntaxStablePtrId {
3986    fn from(ptr: StructArgListBracedPtr) -> Self {
3987        ptr.untyped()
3988    }
3989}
3990#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
3991pub struct StructArgListBracedGreen(pub GreenId);
3992impl TypedSyntaxNode for StructArgListBraced {
3993    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StructArgListBraced);
3994    type StablePtr = StructArgListBracedPtr;
3995    type Green = StructArgListBracedGreen;
3996    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
3997        StructArgListBracedGreen(
3998            Arc::new(GreenNode {
3999                kind: SyntaxKind::StructArgListBraced,
4000                details: GreenNodeDetails::Node {
4001                    children: vec![
4002                        TerminalLBrace::missing(db).0,
4003                        StructArgList::missing(db).0,
4004                        TerminalRBrace::missing(db).0,
4005                    ],
4006                    width: TextWidth::default(),
4007                },
4008            })
4009            .intern(db),
4010        )
4011    }
4012    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
4013        let kind = node.kind(db);
4014        assert_eq!(
4015            kind,
4016            SyntaxKind::StructArgListBraced,
4017            "Unexpected SyntaxKind {:?}. Expected {:?}.",
4018            kind,
4019            SyntaxKind::StructArgListBraced
4020        );
4021        let children = db.get_children(node.clone());
4022        Self { node, children }
4023    }
4024    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
4025        let kind = node.kind(db);
4026        if kind == SyntaxKind::StructArgListBraced {
4027            Some(Self::from_syntax_node(db, node))
4028        } else {
4029            None
4030        }
4031    }
4032    fn as_syntax_node(&self) -> SyntaxNode {
4033        self.node.clone()
4034    }
4035    fn stable_ptr(&self) -> Self::StablePtr {
4036        StructArgListBracedPtr(self.node.0.stable_ptr)
4037    }
4038}
4039impl From<&StructArgListBraced> for SyntaxStablePtrId {
4040    fn from(node: &StructArgListBraced) -> Self {
4041        node.stable_ptr().untyped()
4042    }
4043}
4044#[derive(Clone, Debug, Eq, Hash, PartialEq)]
4045pub struct ExprBlock {
4046    node: SyntaxNode,
4047    children: Arc<[SyntaxNode]>,
4048}
4049impl ExprBlock {
4050    pub const INDEX_LBRACE: usize = 0;
4051    pub const INDEX_STATEMENTS: usize = 1;
4052    pub const INDEX_RBRACE: usize = 2;
4053    pub fn new_green(
4054        db: &dyn SyntaxGroup,
4055        lbrace: TerminalLBraceGreen,
4056        statements: StatementListGreen,
4057        rbrace: TerminalRBraceGreen,
4058    ) -> ExprBlockGreen {
4059        let children: Vec<GreenId> = vec![lbrace.0, statements.0, rbrace.0];
4060        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
4061        ExprBlockGreen(
4062            Arc::new(GreenNode {
4063                kind: SyntaxKind::ExprBlock,
4064                details: GreenNodeDetails::Node { children, width },
4065            })
4066            .intern(db),
4067        )
4068    }
4069}
4070impl ExprBlock {
4071    pub fn lbrace(&self, db: &dyn SyntaxGroup) -> TerminalLBrace {
4072        TerminalLBrace::from_syntax_node(db, self.children[0].clone())
4073    }
4074    pub fn statements(&self, db: &dyn SyntaxGroup) -> StatementList {
4075        StatementList::from_syntax_node(db, self.children[1].clone())
4076    }
4077    pub fn rbrace(&self, db: &dyn SyntaxGroup) -> TerminalRBrace {
4078        TerminalRBrace::from_syntax_node(db, self.children[2].clone())
4079    }
4080}
4081#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
4082pub struct ExprBlockPtr(pub SyntaxStablePtrId);
4083impl ExprBlockPtr {}
4084impl TypedStablePtr for ExprBlockPtr {
4085    type SyntaxNode = ExprBlock;
4086    fn untyped(&self) -> SyntaxStablePtrId {
4087        self.0
4088    }
4089    fn lookup(&self, db: &dyn SyntaxGroup) -> ExprBlock {
4090        ExprBlock::from_syntax_node(db, self.0.lookup(db))
4091    }
4092}
4093impl From<ExprBlockPtr> for SyntaxStablePtrId {
4094    fn from(ptr: ExprBlockPtr) -> Self {
4095        ptr.untyped()
4096    }
4097}
4098#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
4099pub struct ExprBlockGreen(pub GreenId);
4100impl TypedSyntaxNode for ExprBlock {
4101    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprBlock);
4102    type StablePtr = ExprBlockPtr;
4103    type Green = ExprBlockGreen;
4104    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
4105        ExprBlockGreen(
4106            Arc::new(GreenNode {
4107                kind: SyntaxKind::ExprBlock,
4108                details: GreenNodeDetails::Node {
4109                    children: vec![
4110                        TerminalLBrace::missing(db).0,
4111                        StatementList::missing(db).0,
4112                        TerminalRBrace::missing(db).0,
4113                    ],
4114                    width: TextWidth::default(),
4115                },
4116            })
4117            .intern(db),
4118        )
4119    }
4120    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
4121        let kind = node.kind(db);
4122        assert_eq!(
4123            kind,
4124            SyntaxKind::ExprBlock,
4125            "Unexpected SyntaxKind {:?}. Expected {:?}.",
4126            kind,
4127            SyntaxKind::ExprBlock
4128        );
4129        let children = db.get_children(node.clone());
4130        Self { node, children }
4131    }
4132    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
4133        let kind = node.kind(db);
4134        if kind == SyntaxKind::ExprBlock { Some(Self::from_syntax_node(db, node)) } else { None }
4135    }
4136    fn as_syntax_node(&self) -> SyntaxNode {
4137        self.node.clone()
4138    }
4139    fn stable_ptr(&self) -> Self::StablePtr {
4140        ExprBlockPtr(self.node.0.stable_ptr)
4141    }
4142}
4143impl From<&ExprBlock> for SyntaxStablePtrId {
4144    fn from(node: &ExprBlock) -> Self {
4145        node.stable_ptr().untyped()
4146    }
4147}
4148#[derive(Clone, Debug, Eq, Hash, PartialEq)]
4149pub struct ExprMatch {
4150    node: SyntaxNode,
4151    children: Arc<[SyntaxNode]>,
4152}
4153impl ExprMatch {
4154    pub const INDEX_MATCH_KW: usize = 0;
4155    pub const INDEX_EXPR: usize = 1;
4156    pub const INDEX_LBRACE: usize = 2;
4157    pub const INDEX_ARMS: usize = 3;
4158    pub const INDEX_RBRACE: usize = 4;
4159    pub fn new_green(
4160        db: &dyn SyntaxGroup,
4161        match_kw: TerminalMatchGreen,
4162        expr: ExprGreen,
4163        lbrace: TerminalLBraceGreen,
4164        arms: MatchArmsGreen,
4165        rbrace: TerminalRBraceGreen,
4166    ) -> ExprMatchGreen {
4167        let children: Vec<GreenId> = vec![match_kw.0, expr.0, lbrace.0, arms.0, rbrace.0];
4168        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
4169        ExprMatchGreen(
4170            Arc::new(GreenNode {
4171                kind: SyntaxKind::ExprMatch,
4172                details: GreenNodeDetails::Node { children, width },
4173            })
4174            .intern(db),
4175        )
4176    }
4177}
4178impl ExprMatch {
4179    pub fn match_kw(&self, db: &dyn SyntaxGroup) -> TerminalMatch {
4180        TerminalMatch::from_syntax_node(db, self.children[0].clone())
4181    }
4182    pub fn expr(&self, db: &dyn SyntaxGroup) -> Expr {
4183        Expr::from_syntax_node(db, self.children[1].clone())
4184    }
4185    pub fn lbrace(&self, db: &dyn SyntaxGroup) -> TerminalLBrace {
4186        TerminalLBrace::from_syntax_node(db, self.children[2].clone())
4187    }
4188    pub fn arms(&self, db: &dyn SyntaxGroup) -> MatchArms {
4189        MatchArms::from_syntax_node(db, self.children[3].clone())
4190    }
4191    pub fn rbrace(&self, db: &dyn SyntaxGroup) -> TerminalRBrace {
4192        TerminalRBrace::from_syntax_node(db, self.children[4].clone())
4193    }
4194}
4195#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
4196pub struct ExprMatchPtr(pub SyntaxStablePtrId);
4197impl ExprMatchPtr {}
4198impl TypedStablePtr for ExprMatchPtr {
4199    type SyntaxNode = ExprMatch;
4200    fn untyped(&self) -> SyntaxStablePtrId {
4201        self.0
4202    }
4203    fn lookup(&self, db: &dyn SyntaxGroup) -> ExprMatch {
4204        ExprMatch::from_syntax_node(db, self.0.lookup(db))
4205    }
4206}
4207impl From<ExprMatchPtr> for SyntaxStablePtrId {
4208    fn from(ptr: ExprMatchPtr) -> Self {
4209        ptr.untyped()
4210    }
4211}
4212#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
4213pub struct ExprMatchGreen(pub GreenId);
4214impl TypedSyntaxNode for ExprMatch {
4215    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprMatch);
4216    type StablePtr = ExprMatchPtr;
4217    type Green = ExprMatchGreen;
4218    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
4219        ExprMatchGreen(
4220            Arc::new(GreenNode {
4221                kind: SyntaxKind::ExprMatch,
4222                details: GreenNodeDetails::Node {
4223                    children: vec![
4224                        TerminalMatch::missing(db).0,
4225                        Expr::missing(db).0,
4226                        TerminalLBrace::missing(db).0,
4227                        MatchArms::missing(db).0,
4228                        TerminalRBrace::missing(db).0,
4229                    ],
4230                    width: TextWidth::default(),
4231                },
4232            })
4233            .intern(db),
4234        )
4235    }
4236    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
4237        let kind = node.kind(db);
4238        assert_eq!(
4239            kind,
4240            SyntaxKind::ExprMatch,
4241            "Unexpected SyntaxKind {:?}. Expected {:?}.",
4242            kind,
4243            SyntaxKind::ExprMatch
4244        );
4245        let children = db.get_children(node.clone());
4246        Self { node, children }
4247    }
4248    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
4249        let kind = node.kind(db);
4250        if kind == SyntaxKind::ExprMatch { Some(Self::from_syntax_node(db, node)) } else { None }
4251    }
4252    fn as_syntax_node(&self) -> SyntaxNode {
4253        self.node.clone()
4254    }
4255    fn stable_ptr(&self) -> Self::StablePtr {
4256        ExprMatchPtr(self.node.0.stable_ptr)
4257    }
4258}
4259impl From<&ExprMatch> for SyntaxStablePtrId {
4260    fn from(node: &ExprMatch) -> Self {
4261        node.stable_ptr().untyped()
4262    }
4263}
4264#[derive(Clone, Debug, Eq, Hash, PartialEq)]
4265pub struct MatchArms(ElementList<MatchArm, 2>);
4266impl Deref for MatchArms {
4267    type Target = ElementList<MatchArm, 2>;
4268    fn deref(&self) -> &Self::Target {
4269        &self.0
4270    }
4271}
4272impl MatchArms {
4273    pub fn new_green(
4274        db: &dyn SyntaxGroup,
4275        children: Vec<MatchArmsElementOrSeparatorGreen>,
4276    ) -> MatchArmsGreen {
4277        let width = children.iter().map(|id| id.id().lookup_intern(db).width()).sum();
4278        MatchArmsGreen(
4279            Arc::new(GreenNode {
4280                kind: SyntaxKind::MatchArms,
4281                details: GreenNodeDetails::Node {
4282                    children: children.iter().map(|x| x.id()).collect(),
4283                    width,
4284                },
4285            })
4286            .intern(db),
4287        )
4288    }
4289}
4290#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
4291pub struct MatchArmsPtr(pub SyntaxStablePtrId);
4292impl TypedStablePtr for MatchArmsPtr {
4293    type SyntaxNode = MatchArms;
4294    fn untyped(&self) -> SyntaxStablePtrId {
4295        self.0
4296    }
4297    fn lookup(&self, db: &dyn SyntaxGroup) -> MatchArms {
4298        MatchArms::from_syntax_node(db, self.0.lookup(db))
4299    }
4300}
4301impl From<MatchArmsPtr> for SyntaxStablePtrId {
4302    fn from(ptr: MatchArmsPtr) -> Self {
4303        ptr.untyped()
4304    }
4305}
4306#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
4307pub enum MatchArmsElementOrSeparatorGreen {
4308    Separator(TerminalCommaGreen),
4309    Element(MatchArmGreen),
4310}
4311impl From<TerminalCommaGreen> for MatchArmsElementOrSeparatorGreen {
4312    fn from(value: TerminalCommaGreen) -> Self {
4313        MatchArmsElementOrSeparatorGreen::Separator(value)
4314    }
4315}
4316impl From<MatchArmGreen> for MatchArmsElementOrSeparatorGreen {
4317    fn from(value: MatchArmGreen) -> Self {
4318        MatchArmsElementOrSeparatorGreen::Element(value)
4319    }
4320}
4321impl MatchArmsElementOrSeparatorGreen {
4322    fn id(&self) -> GreenId {
4323        match self {
4324            MatchArmsElementOrSeparatorGreen::Separator(green) => green.0,
4325            MatchArmsElementOrSeparatorGreen::Element(green) => green.0,
4326        }
4327    }
4328}
4329#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
4330pub struct MatchArmsGreen(pub GreenId);
4331impl TypedSyntaxNode for MatchArms {
4332    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::MatchArms);
4333    type StablePtr = MatchArmsPtr;
4334    type Green = MatchArmsGreen;
4335    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
4336        MatchArmsGreen(
4337            Arc::new(GreenNode {
4338                kind: SyntaxKind::MatchArms,
4339                details: GreenNodeDetails::Node { children: vec![], width: TextWidth::default() },
4340            })
4341            .intern(db),
4342        )
4343    }
4344    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
4345        Self(ElementList::new(node))
4346    }
4347    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
4348        if node.kind(db) == SyntaxKind::MatchArms {
4349            Some(Self(ElementList::new(node)))
4350        } else {
4351            None
4352        }
4353    }
4354    fn as_syntax_node(&self) -> SyntaxNode {
4355        self.node.clone()
4356    }
4357    fn stable_ptr(&self) -> Self::StablePtr {
4358        MatchArmsPtr(self.node.0.stable_ptr)
4359    }
4360}
4361impl From<&MatchArms> for SyntaxStablePtrId {
4362    fn from(node: &MatchArms) -> Self {
4363        node.stable_ptr().untyped()
4364    }
4365}
4366#[derive(Clone, Debug, Eq, Hash, PartialEq)]
4367pub struct MatchArm {
4368    node: SyntaxNode,
4369    children: Arc<[SyntaxNode]>,
4370}
4371impl MatchArm {
4372    pub const INDEX_PATTERNS: usize = 0;
4373    pub const INDEX_ARROW: usize = 1;
4374    pub const INDEX_EXPRESSION: usize = 2;
4375    pub fn new_green(
4376        db: &dyn SyntaxGroup,
4377        patterns: PatternListOrGreen,
4378        arrow: TerminalMatchArrowGreen,
4379        expression: ExprGreen,
4380    ) -> MatchArmGreen {
4381        let children: Vec<GreenId> = vec![patterns.0, arrow.0, expression.0];
4382        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
4383        MatchArmGreen(
4384            Arc::new(GreenNode {
4385                kind: SyntaxKind::MatchArm,
4386                details: GreenNodeDetails::Node { children, width },
4387            })
4388            .intern(db),
4389        )
4390    }
4391}
4392impl MatchArm {
4393    pub fn patterns(&self, db: &dyn SyntaxGroup) -> PatternListOr {
4394        PatternListOr::from_syntax_node(db, self.children[0].clone())
4395    }
4396    pub fn arrow(&self, db: &dyn SyntaxGroup) -> TerminalMatchArrow {
4397        TerminalMatchArrow::from_syntax_node(db, self.children[1].clone())
4398    }
4399    pub fn expression(&self, db: &dyn SyntaxGroup) -> Expr {
4400        Expr::from_syntax_node(db, self.children[2].clone())
4401    }
4402}
4403#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
4404pub struct MatchArmPtr(pub SyntaxStablePtrId);
4405impl MatchArmPtr {}
4406impl TypedStablePtr for MatchArmPtr {
4407    type SyntaxNode = MatchArm;
4408    fn untyped(&self) -> SyntaxStablePtrId {
4409        self.0
4410    }
4411    fn lookup(&self, db: &dyn SyntaxGroup) -> MatchArm {
4412        MatchArm::from_syntax_node(db, self.0.lookup(db))
4413    }
4414}
4415impl From<MatchArmPtr> for SyntaxStablePtrId {
4416    fn from(ptr: MatchArmPtr) -> Self {
4417        ptr.untyped()
4418    }
4419}
4420#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
4421pub struct MatchArmGreen(pub GreenId);
4422impl TypedSyntaxNode for MatchArm {
4423    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::MatchArm);
4424    type StablePtr = MatchArmPtr;
4425    type Green = MatchArmGreen;
4426    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
4427        MatchArmGreen(
4428            Arc::new(GreenNode {
4429                kind: SyntaxKind::MatchArm,
4430                details: GreenNodeDetails::Node {
4431                    children: vec![
4432                        PatternListOr::missing(db).0,
4433                        TerminalMatchArrow::missing(db).0,
4434                        Expr::missing(db).0,
4435                    ],
4436                    width: TextWidth::default(),
4437                },
4438            })
4439            .intern(db),
4440        )
4441    }
4442    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
4443        let kind = node.kind(db);
4444        assert_eq!(
4445            kind,
4446            SyntaxKind::MatchArm,
4447            "Unexpected SyntaxKind {:?}. Expected {:?}.",
4448            kind,
4449            SyntaxKind::MatchArm
4450        );
4451        let children = db.get_children(node.clone());
4452        Self { node, children }
4453    }
4454    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
4455        let kind = node.kind(db);
4456        if kind == SyntaxKind::MatchArm { Some(Self::from_syntax_node(db, node)) } else { None }
4457    }
4458    fn as_syntax_node(&self) -> SyntaxNode {
4459        self.node.clone()
4460    }
4461    fn stable_ptr(&self) -> Self::StablePtr {
4462        MatchArmPtr(self.node.0.stable_ptr)
4463    }
4464}
4465impl From<&MatchArm> for SyntaxStablePtrId {
4466    fn from(node: &MatchArm) -> Self {
4467        node.stable_ptr().untyped()
4468    }
4469}
4470#[derive(Clone, Debug, Eq, Hash, PartialEq)]
4471pub struct ExprIf {
4472    node: SyntaxNode,
4473    children: Arc<[SyntaxNode]>,
4474}
4475impl ExprIf {
4476    pub const INDEX_IF_KW: usize = 0;
4477    pub const INDEX_CONDITION: usize = 1;
4478    pub const INDEX_IF_BLOCK: usize = 2;
4479    pub const INDEX_ELSE_CLAUSE: usize = 3;
4480    pub fn new_green(
4481        db: &dyn SyntaxGroup,
4482        if_kw: TerminalIfGreen,
4483        condition: ConditionGreen,
4484        if_block: ExprBlockGreen,
4485        else_clause: OptionElseClauseGreen,
4486    ) -> ExprIfGreen {
4487        let children: Vec<GreenId> = vec![if_kw.0, condition.0, if_block.0, else_clause.0];
4488        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
4489        ExprIfGreen(
4490            Arc::new(GreenNode {
4491                kind: SyntaxKind::ExprIf,
4492                details: GreenNodeDetails::Node { children, width },
4493            })
4494            .intern(db),
4495        )
4496    }
4497}
4498impl ExprIf {
4499    pub fn if_kw(&self, db: &dyn SyntaxGroup) -> TerminalIf {
4500        TerminalIf::from_syntax_node(db, self.children[0].clone())
4501    }
4502    pub fn condition(&self, db: &dyn SyntaxGroup) -> Condition {
4503        Condition::from_syntax_node(db, self.children[1].clone())
4504    }
4505    pub fn if_block(&self, db: &dyn SyntaxGroup) -> ExprBlock {
4506        ExprBlock::from_syntax_node(db, self.children[2].clone())
4507    }
4508    pub fn else_clause(&self, db: &dyn SyntaxGroup) -> OptionElseClause {
4509        OptionElseClause::from_syntax_node(db, self.children[3].clone())
4510    }
4511}
4512#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
4513pub struct ExprIfPtr(pub SyntaxStablePtrId);
4514impl ExprIfPtr {}
4515impl TypedStablePtr for ExprIfPtr {
4516    type SyntaxNode = ExprIf;
4517    fn untyped(&self) -> SyntaxStablePtrId {
4518        self.0
4519    }
4520    fn lookup(&self, db: &dyn SyntaxGroup) -> ExprIf {
4521        ExprIf::from_syntax_node(db, self.0.lookup(db))
4522    }
4523}
4524impl From<ExprIfPtr> for SyntaxStablePtrId {
4525    fn from(ptr: ExprIfPtr) -> Self {
4526        ptr.untyped()
4527    }
4528}
4529#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
4530pub struct ExprIfGreen(pub GreenId);
4531impl TypedSyntaxNode for ExprIf {
4532    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprIf);
4533    type StablePtr = ExprIfPtr;
4534    type Green = ExprIfGreen;
4535    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
4536        ExprIfGreen(
4537            Arc::new(GreenNode {
4538                kind: SyntaxKind::ExprIf,
4539                details: GreenNodeDetails::Node {
4540                    children: vec![
4541                        TerminalIf::missing(db).0,
4542                        Condition::missing(db).0,
4543                        ExprBlock::missing(db).0,
4544                        OptionElseClause::missing(db).0,
4545                    ],
4546                    width: TextWidth::default(),
4547                },
4548            })
4549            .intern(db),
4550        )
4551    }
4552    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
4553        let kind = node.kind(db);
4554        assert_eq!(
4555            kind,
4556            SyntaxKind::ExprIf,
4557            "Unexpected SyntaxKind {:?}. Expected {:?}.",
4558            kind,
4559            SyntaxKind::ExprIf
4560        );
4561        let children = db.get_children(node.clone());
4562        Self { node, children }
4563    }
4564    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
4565        let kind = node.kind(db);
4566        if kind == SyntaxKind::ExprIf { Some(Self::from_syntax_node(db, node)) } else { None }
4567    }
4568    fn as_syntax_node(&self) -> SyntaxNode {
4569        self.node.clone()
4570    }
4571    fn stable_ptr(&self) -> Self::StablePtr {
4572        ExprIfPtr(self.node.0.stable_ptr)
4573    }
4574}
4575impl From<&ExprIf> for SyntaxStablePtrId {
4576    fn from(node: &ExprIf) -> Self {
4577        node.stable_ptr().untyped()
4578    }
4579}
4580#[derive(Clone, Debug, Eq, Hash, PartialEq)]
4581pub enum Condition {
4582    Let(ConditionLet),
4583    Expr(ConditionExpr),
4584}
4585#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
4586pub struct ConditionPtr(pub SyntaxStablePtrId);
4587impl TypedStablePtr for ConditionPtr {
4588    type SyntaxNode = Condition;
4589    fn untyped(&self) -> SyntaxStablePtrId {
4590        self.0
4591    }
4592    fn lookup(&self, db: &dyn SyntaxGroup) -> Condition {
4593        Condition::from_syntax_node(db, self.0.lookup(db))
4594    }
4595}
4596impl From<ConditionPtr> for SyntaxStablePtrId {
4597    fn from(ptr: ConditionPtr) -> Self {
4598        ptr.untyped()
4599    }
4600}
4601impl From<ConditionLetPtr> for ConditionPtr {
4602    fn from(value: ConditionLetPtr) -> Self {
4603        Self(value.0)
4604    }
4605}
4606impl From<ConditionExprPtr> for ConditionPtr {
4607    fn from(value: ConditionExprPtr) -> Self {
4608        Self(value.0)
4609    }
4610}
4611impl From<ConditionLetGreen> for ConditionGreen {
4612    fn from(value: ConditionLetGreen) -> Self {
4613        Self(value.0)
4614    }
4615}
4616impl From<ConditionExprGreen> for ConditionGreen {
4617    fn from(value: ConditionExprGreen) -> Self {
4618        Self(value.0)
4619    }
4620}
4621#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
4622pub struct ConditionGreen(pub GreenId);
4623impl TypedSyntaxNode for Condition {
4624    const OPTIONAL_KIND: Option<SyntaxKind> = None;
4625    type StablePtr = ConditionPtr;
4626    type Green = ConditionGreen;
4627    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
4628        panic!("No missing variant.");
4629    }
4630    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
4631        let kind = node.kind(db);
4632        match kind {
4633            SyntaxKind::ConditionLet => Condition::Let(ConditionLet::from_syntax_node(db, node)),
4634            SyntaxKind::ConditionExpr => Condition::Expr(ConditionExpr::from_syntax_node(db, node)),
4635            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "Condition"),
4636        }
4637    }
4638    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
4639        let kind = node.kind(db);
4640        match kind {
4641            SyntaxKind::ConditionLet => {
4642                Some(Condition::Let(ConditionLet::from_syntax_node(db, node)))
4643            }
4644            SyntaxKind::ConditionExpr => {
4645                Some(Condition::Expr(ConditionExpr::from_syntax_node(db, node)))
4646            }
4647            _ => None,
4648        }
4649    }
4650    fn as_syntax_node(&self) -> SyntaxNode {
4651        match self {
4652            Condition::Let(x) => x.as_syntax_node(),
4653            Condition::Expr(x) => x.as_syntax_node(),
4654        }
4655    }
4656    fn stable_ptr(&self) -> Self::StablePtr {
4657        ConditionPtr(self.as_syntax_node().0.stable_ptr)
4658    }
4659}
4660impl From<&Condition> for SyntaxStablePtrId {
4661    fn from(node: &Condition) -> Self {
4662        node.stable_ptr().untyped()
4663    }
4664}
4665impl Condition {
4666    /// Checks if a kind of a variant of [Condition].
4667    pub fn is_variant(kind: SyntaxKind) -> bool {
4668        matches!(kind, SyntaxKind::ConditionLet | SyntaxKind::ConditionExpr)
4669    }
4670}
4671#[derive(Clone, Debug, Eq, Hash, PartialEq)]
4672pub struct ConditionLet {
4673    node: SyntaxNode,
4674    children: Arc<[SyntaxNode]>,
4675}
4676impl ConditionLet {
4677    pub const INDEX_LET_KW: usize = 0;
4678    pub const INDEX_PATTERNS: usize = 1;
4679    pub const INDEX_EQ: usize = 2;
4680    pub const INDEX_EXPR: usize = 3;
4681    pub fn new_green(
4682        db: &dyn SyntaxGroup,
4683        let_kw: TerminalLetGreen,
4684        patterns: PatternListOrGreen,
4685        eq: TerminalEqGreen,
4686        expr: ExprGreen,
4687    ) -> ConditionLetGreen {
4688        let children: Vec<GreenId> = vec![let_kw.0, patterns.0, eq.0, expr.0];
4689        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
4690        ConditionLetGreen(
4691            Arc::new(GreenNode {
4692                kind: SyntaxKind::ConditionLet,
4693                details: GreenNodeDetails::Node { children, width },
4694            })
4695            .intern(db),
4696        )
4697    }
4698}
4699impl ConditionLet {
4700    pub fn let_kw(&self, db: &dyn SyntaxGroup) -> TerminalLet {
4701        TerminalLet::from_syntax_node(db, self.children[0].clone())
4702    }
4703    pub fn patterns(&self, db: &dyn SyntaxGroup) -> PatternListOr {
4704        PatternListOr::from_syntax_node(db, self.children[1].clone())
4705    }
4706    pub fn eq(&self, db: &dyn SyntaxGroup) -> TerminalEq {
4707        TerminalEq::from_syntax_node(db, self.children[2].clone())
4708    }
4709    pub fn expr(&self, db: &dyn SyntaxGroup) -> Expr {
4710        Expr::from_syntax_node(db, self.children[3].clone())
4711    }
4712}
4713#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
4714pub struct ConditionLetPtr(pub SyntaxStablePtrId);
4715impl ConditionLetPtr {}
4716impl TypedStablePtr for ConditionLetPtr {
4717    type SyntaxNode = ConditionLet;
4718    fn untyped(&self) -> SyntaxStablePtrId {
4719        self.0
4720    }
4721    fn lookup(&self, db: &dyn SyntaxGroup) -> ConditionLet {
4722        ConditionLet::from_syntax_node(db, self.0.lookup(db))
4723    }
4724}
4725impl From<ConditionLetPtr> for SyntaxStablePtrId {
4726    fn from(ptr: ConditionLetPtr) -> Self {
4727        ptr.untyped()
4728    }
4729}
4730#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
4731pub struct ConditionLetGreen(pub GreenId);
4732impl TypedSyntaxNode for ConditionLet {
4733    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ConditionLet);
4734    type StablePtr = ConditionLetPtr;
4735    type Green = ConditionLetGreen;
4736    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
4737        ConditionLetGreen(
4738            Arc::new(GreenNode {
4739                kind: SyntaxKind::ConditionLet,
4740                details: GreenNodeDetails::Node {
4741                    children: vec![
4742                        TerminalLet::missing(db).0,
4743                        PatternListOr::missing(db).0,
4744                        TerminalEq::missing(db).0,
4745                        Expr::missing(db).0,
4746                    ],
4747                    width: TextWidth::default(),
4748                },
4749            })
4750            .intern(db),
4751        )
4752    }
4753    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
4754        let kind = node.kind(db);
4755        assert_eq!(
4756            kind,
4757            SyntaxKind::ConditionLet,
4758            "Unexpected SyntaxKind {:?}. Expected {:?}.",
4759            kind,
4760            SyntaxKind::ConditionLet
4761        );
4762        let children = db.get_children(node.clone());
4763        Self { node, children }
4764    }
4765    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
4766        let kind = node.kind(db);
4767        if kind == SyntaxKind::ConditionLet { Some(Self::from_syntax_node(db, node)) } else { None }
4768    }
4769    fn as_syntax_node(&self) -> SyntaxNode {
4770        self.node.clone()
4771    }
4772    fn stable_ptr(&self) -> Self::StablePtr {
4773        ConditionLetPtr(self.node.0.stable_ptr)
4774    }
4775}
4776impl From<&ConditionLet> for SyntaxStablePtrId {
4777    fn from(node: &ConditionLet) -> Self {
4778        node.stable_ptr().untyped()
4779    }
4780}
4781#[derive(Clone, Debug, Eq, Hash, PartialEq)]
4782pub struct ConditionExpr {
4783    node: SyntaxNode,
4784    children: Arc<[SyntaxNode]>,
4785}
4786impl ConditionExpr {
4787    pub const INDEX_EXPR: usize = 0;
4788    pub fn new_green(db: &dyn SyntaxGroup, expr: ExprGreen) -> ConditionExprGreen {
4789        let children: Vec<GreenId> = vec![expr.0];
4790        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
4791        ConditionExprGreen(
4792            Arc::new(GreenNode {
4793                kind: SyntaxKind::ConditionExpr,
4794                details: GreenNodeDetails::Node { children, width },
4795            })
4796            .intern(db),
4797        )
4798    }
4799}
4800impl ConditionExpr {
4801    pub fn expr(&self, db: &dyn SyntaxGroup) -> Expr {
4802        Expr::from_syntax_node(db, self.children[0].clone())
4803    }
4804}
4805#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
4806pub struct ConditionExprPtr(pub SyntaxStablePtrId);
4807impl ConditionExprPtr {}
4808impl TypedStablePtr for ConditionExprPtr {
4809    type SyntaxNode = ConditionExpr;
4810    fn untyped(&self) -> SyntaxStablePtrId {
4811        self.0
4812    }
4813    fn lookup(&self, db: &dyn SyntaxGroup) -> ConditionExpr {
4814        ConditionExpr::from_syntax_node(db, self.0.lookup(db))
4815    }
4816}
4817impl From<ConditionExprPtr> for SyntaxStablePtrId {
4818    fn from(ptr: ConditionExprPtr) -> Self {
4819        ptr.untyped()
4820    }
4821}
4822#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
4823pub struct ConditionExprGreen(pub GreenId);
4824impl TypedSyntaxNode for ConditionExpr {
4825    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ConditionExpr);
4826    type StablePtr = ConditionExprPtr;
4827    type Green = ConditionExprGreen;
4828    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
4829        ConditionExprGreen(
4830            Arc::new(GreenNode {
4831                kind: SyntaxKind::ConditionExpr,
4832                details: GreenNodeDetails::Node {
4833                    children: vec![Expr::missing(db).0],
4834                    width: TextWidth::default(),
4835                },
4836            })
4837            .intern(db),
4838        )
4839    }
4840    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
4841        let kind = node.kind(db);
4842        assert_eq!(
4843            kind,
4844            SyntaxKind::ConditionExpr,
4845            "Unexpected SyntaxKind {:?}. Expected {:?}.",
4846            kind,
4847            SyntaxKind::ConditionExpr
4848        );
4849        let children = db.get_children(node.clone());
4850        Self { node, children }
4851    }
4852    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
4853        let kind = node.kind(db);
4854        if kind == SyntaxKind::ConditionExpr {
4855            Some(Self::from_syntax_node(db, node))
4856        } else {
4857            None
4858        }
4859    }
4860    fn as_syntax_node(&self) -> SyntaxNode {
4861        self.node.clone()
4862    }
4863    fn stable_ptr(&self) -> Self::StablePtr {
4864        ConditionExprPtr(self.node.0.stable_ptr)
4865    }
4866}
4867impl From<&ConditionExpr> for SyntaxStablePtrId {
4868    fn from(node: &ConditionExpr) -> Self {
4869        node.stable_ptr().untyped()
4870    }
4871}
4872#[derive(Clone, Debug, Eq, Hash, PartialEq)]
4873pub enum BlockOrIf {
4874    Block(ExprBlock),
4875    If(ExprIf),
4876}
4877#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
4878pub struct BlockOrIfPtr(pub SyntaxStablePtrId);
4879impl TypedStablePtr for BlockOrIfPtr {
4880    type SyntaxNode = BlockOrIf;
4881    fn untyped(&self) -> SyntaxStablePtrId {
4882        self.0
4883    }
4884    fn lookup(&self, db: &dyn SyntaxGroup) -> BlockOrIf {
4885        BlockOrIf::from_syntax_node(db, self.0.lookup(db))
4886    }
4887}
4888impl From<BlockOrIfPtr> for SyntaxStablePtrId {
4889    fn from(ptr: BlockOrIfPtr) -> Self {
4890        ptr.untyped()
4891    }
4892}
4893impl From<ExprBlockPtr> for BlockOrIfPtr {
4894    fn from(value: ExprBlockPtr) -> Self {
4895        Self(value.0)
4896    }
4897}
4898impl From<ExprIfPtr> for BlockOrIfPtr {
4899    fn from(value: ExprIfPtr) -> Self {
4900        Self(value.0)
4901    }
4902}
4903impl From<ExprBlockGreen> for BlockOrIfGreen {
4904    fn from(value: ExprBlockGreen) -> Self {
4905        Self(value.0)
4906    }
4907}
4908impl From<ExprIfGreen> for BlockOrIfGreen {
4909    fn from(value: ExprIfGreen) -> Self {
4910        Self(value.0)
4911    }
4912}
4913#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
4914pub struct BlockOrIfGreen(pub GreenId);
4915impl TypedSyntaxNode for BlockOrIf {
4916    const OPTIONAL_KIND: Option<SyntaxKind> = None;
4917    type StablePtr = BlockOrIfPtr;
4918    type Green = BlockOrIfGreen;
4919    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
4920        panic!("No missing variant.");
4921    }
4922    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
4923        let kind = node.kind(db);
4924        match kind {
4925            SyntaxKind::ExprBlock => BlockOrIf::Block(ExprBlock::from_syntax_node(db, node)),
4926            SyntaxKind::ExprIf => BlockOrIf::If(ExprIf::from_syntax_node(db, node)),
4927            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "BlockOrIf"),
4928        }
4929    }
4930    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
4931        let kind = node.kind(db);
4932        match kind {
4933            SyntaxKind::ExprBlock => Some(BlockOrIf::Block(ExprBlock::from_syntax_node(db, node))),
4934            SyntaxKind::ExprIf => Some(BlockOrIf::If(ExprIf::from_syntax_node(db, node))),
4935            _ => None,
4936        }
4937    }
4938    fn as_syntax_node(&self) -> SyntaxNode {
4939        match self {
4940            BlockOrIf::Block(x) => x.as_syntax_node(),
4941            BlockOrIf::If(x) => x.as_syntax_node(),
4942        }
4943    }
4944    fn stable_ptr(&self) -> Self::StablePtr {
4945        BlockOrIfPtr(self.as_syntax_node().0.stable_ptr)
4946    }
4947}
4948impl From<&BlockOrIf> for SyntaxStablePtrId {
4949    fn from(node: &BlockOrIf) -> Self {
4950        node.stable_ptr().untyped()
4951    }
4952}
4953impl BlockOrIf {
4954    /// Checks if a kind of a variant of [BlockOrIf].
4955    pub fn is_variant(kind: SyntaxKind) -> bool {
4956        matches!(kind, SyntaxKind::ExprBlock | SyntaxKind::ExprIf)
4957    }
4958}
4959#[derive(Clone, Debug, Eq, Hash, PartialEq)]
4960pub struct ExprLoop {
4961    node: SyntaxNode,
4962    children: Arc<[SyntaxNode]>,
4963}
4964impl ExprLoop {
4965    pub const INDEX_LOOP_KW: usize = 0;
4966    pub const INDEX_BODY: usize = 1;
4967    pub fn new_green(
4968        db: &dyn SyntaxGroup,
4969        loop_kw: TerminalLoopGreen,
4970        body: ExprBlockGreen,
4971    ) -> ExprLoopGreen {
4972        let children: Vec<GreenId> = vec![loop_kw.0, body.0];
4973        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
4974        ExprLoopGreen(
4975            Arc::new(GreenNode {
4976                kind: SyntaxKind::ExprLoop,
4977                details: GreenNodeDetails::Node { children, width },
4978            })
4979            .intern(db),
4980        )
4981    }
4982}
4983impl ExprLoop {
4984    pub fn loop_kw(&self, db: &dyn SyntaxGroup) -> TerminalLoop {
4985        TerminalLoop::from_syntax_node(db, self.children[0].clone())
4986    }
4987    pub fn body(&self, db: &dyn SyntaxGroup) -> ExprBlock {
4988        ExprBlock::from_syntax_node(db, self.children[1].clone())
4989    }
4990}
4991#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
4992pub struct ExprLoopPtr(pub SyntaxStablePtrId);
4993impl ExprLoopPtr {}
4994impl TypedStablePtr for ExprLoopPtr {
4995    type SyntaxNode = ExprLoop;
4996    fn untyped(&self) -> SyntaxStablePtrId {
4997        self.0
4998    }
4999    fn lookup(&self, db: &dyn SyntaxGroup) -> ExprLoop {
5000        ExprLoop::from_syntax_node(db, self.0.lookup(db))
5001    }
5002}
5003impl From<ExprLoopPtr> for SyntaxStablePtrId {
5004    fn from(ptr: ExprLoopPtr) -> Self {
5005        ptr.untyped()
5006    }
5007}
5008#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
5009pub struct ExprLoopGreen(pub GreenId);
5010impl TypedSyntaxNode for ExprLoop {
5011    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprLoop);
5012    type StablePtr = ExprLoopPtr;
5013    type Green = ExprLoopGreen;
5014    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
5015        ExprLoopGreen(
5016            Arc::new(GreenNode {
5017                kind: SyntaxKind::ExprLoop,
5018                details: GreenNodeDetails::Node {
5019                    children: vec![TerminalLoop::missing(db).0, ExprBlock::missing(db).0],
5020                    width: TextWidth::default(),
5021                },
5022            })
5023            .intern(db),
5024        )
5025    }
5026    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
5027        let kind = node.kind(db);
5028        assert_eq!(
5029            kind,
5030            SyntaxKind::ExprLoop,
5031            "Unexpected SyntaxKind {:?}. Expected {:?}.",
5032            kind,
5033            SyntaxKind::ExprLoop
5034        );
5035        let children = db.get_children(node.clone());
5036        Self { node, children }
5037    }
5038    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
5039        let kind = node.kind(db);
5040        if kind == SyntaxKind::ExprLoop { Some(Self::from_syntax_node(db, node)) } else { None }
5041    }
5042    fn as_syntax_node(&self) -> SyntaxNode {
5043        self.node.clone()
5044    }
5045    fn stable_ptr(&self) -> Self::StablePtr {
5046        ExprLoopPtr(self.node.0.stable_ptr)
5047    }
5048}
5049impl From<&ExprLoop> for SyntaxStablePtrId {
5050    fn from(node: &ExprLoop) -> Self {
5051        node.stable_ptr().untyped()
5052    }
5053}
5054#[derive(Clone, Debug, Eq, Hash, PartialEq)]
5055pub struct ExprWhile {
5056    node: SyntaxNode,
5057    children: Arc<[SyntaxNode]>,
5058}
5059impl ExprWhile {
5060    pub const INDEX_WHILE_KW: usize = 0;
5061    pub const INDEX_CONDITION: usize = 1;
5062    pub const INDEX_BODY: usize = 2;
5063    pub fn new_green(
5064        db: &dyn SyntaxGroup,
5065        while_kw: TerminalWhileGreen,
5066        condition: ConditionGreen,
5067        body: ExprBlockGreen,
5068    ) -> ExprWhileGreen {
5069        let children: Vec<GreenId> = vec![while_kw.0, condition.0, body.0];
5070        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
5071        ExprWhileGreen(
5072            Arc::new(GreenNode {
5073                kind: SyntaxKind::ExprWhile,
5074                details: GreenNodeDetails::Node { children, width },
5075            })
5076            .intern(db),
5077        )
5078    }
5079}
5080impl ExprWhile {
5081    pub fn while_kw(&self, db: &dyn SyntaxGroup) -> TerminalWhile {
5082        TerminalWhile::from_syntax_node(db, self.children[0].clone())
5083    }
5084    pub fn condition(&self, db: &dyn SyntaxGroup) -> Condition {
5085        Condition::from_syntax_node(db, self.children[1].clone())
5086    }
5087    pub fn body(&self, db: &dyn SyntaxGroup) -> ExprBlock {
5088        ExprBlock::from_syntax_node(db, self.children[2].clone())
5089    }
5090}
5091#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
5092pub struct ExprWhilePtr(pub SyntaxStablePtrId);
5093impl ExprWhilePtr {}
5094impl TypedStablePtr for ExprWhilePtr {
5095    type SyntaxNode = ExprWhile;
5096    fn untyped(&self) -> SyntaxStablePtrId {
5097        self.0
5098    }
5099    fn lookup(&self, db: &dyn SyntaxGroup) -> ExprWhile {
5100        ExprWhile::from_syntax_node(db, self.0.lookup(db))
5101    }
5102}
5103impl From<ExprWhilePtr> for SyntaxStablePtrId {
5104    fn from(ptr: ExprWhilePtr) -> Self {
5105        ptr.untyped()
5106    }
5107}
5108#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
5109pub struct ExprWhileGreen(pub GreenId);
5110impl TypedSyntaxNode for ExprWhile {
5111    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprWhile);
5112    type StablePtr = ExprWhilePtr;
5113    type Green = ExprWhileGreen;
5114    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
5115        ExprWhileGreen(
5116            Arc::new(GreenNode {
5117                kind: SyntaxKind::ExprWhile,
5118                details: GreenNodeDetails::Node {
5119                    children: vec![
5120                        TerminalWhile::missing(db).0,
5121                        Condition::missing(db).0,
5122                        ExprBlock::missing(db).0,
5123                    ],
5124                    width: TextWidth::default(),
5125                },
5126            })
5127            .intern(db),
5128        )
5129    }
5130    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
5131        let kind = node.kind(db);
5132        assert_eq!(
5133            kind,
5134            SyntaxKind::ExprWhile,
5135            "Unexpected SyntaxKind {:?}. Expected {:?}.",
5136            kind,
5137            SyntaxKind::ExprWhile
5138        );
5139        let children = db.get_children(node.clone());
5140        Self { node, children }
5141    }
5142    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
5143        let kind = node.kind(db);
5144        if kind == SyntaxKind::ExprWhile { Some(Self::from_syntax_node(db, node)) } else { None }
5145    }
5146    fn as_syntax_node(&self) -> SyntaxNode {
5147        self.node.clone()
5148    }
5149    fn stable_ptr(&self) -> Self::StablePtr {
5150        ExprWhilePtr(self.node.0.stable_ptr)
5151    }
5152}
5153impl From<&ExprWhile> for SyntaxStablePtrId {
5154    fn from(node: &ExprWhile) -> Self {
5155        node.stable_ptr().untyped()
5156    }
5157}
5158#[derive(Clone, Debug, Eq, Hash, PartialEq)]
5159pub struct ExprFor {
5160    node: SyntaxNode,
5161    children: Arc<[SyntaxNode]>,
5162}
5163impl ExprFor {
5164    pub const INDEX_FOR_KW: usize = 0;
5165    pub const INDEX_PATTERN: usize = 1;
5166    pub const INDEX_IDENTIFIER: usize = 2;
5167    pub const INDEX_EXPR: usize = 3;
5168    pub const INDEX_BODY: usize = 4;
5169    pub fn new_green(
5170        db: &dyn SyntaxGroup,
5171        for_kw: TerminalForGreen,
5172        pattern: PatternGreen,
5173        identifier: TerminalIdentifierGreen,
5174        expr: ExprGreen,
5175        body: ExprBlockGreen,
5176    ) -> ExprForGreen {
5177        let children: Vec<GreenId> = vec![for_kw.0, pattern.0, identifier.0, expr.0, body.0];
5178        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
5179        ExprForGreen(
5180            Arc::new(GreenNode {
5181                kind: SyntaxKind::ExprFor,
5182                details: GreenNodeDetails::Node { children, width },
5183            })
5184            .intern(db),
5185        )
5186    }
5187}
5188impl ExprFor {
5189    pub fn for_kw(&self, db: &dyn SyntaxGroup) -> TerminalFor {
5190        TerminalFor::from_syntax_node(db, self.children[0].clone())
5191    }
5192    pub fn pattern(&self, db: &dyn SyntaxGroup) -> Pattern {
5193        Pattern::from_syntax_node(db, self.children[1].clone())
5194    }
5195    pub fn identifier(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier {
5196        TerminalIdentifier::from_syntax_node(db, self.children[2].clone())
5197    }
5198    pub fn expr(&self, db: &dyn SyntaxGroup) -> Expr {
5199        Expr::from_syntax_node(db, self.children[3].clone())
5200    }
5201    pub fn body(&self, db: &dyn SyntaxGroup) -> ExprBlock {
5202        ExprBlock::from_syntax_node(db, self.children[4].clone())
5203    }
5204}
5205#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
5206pub struct ExprForPtr(pub SyntaxStablePtrId);
5207impl ExprForPtr {
5208    pub fn pattern_green(self, db: &dyn SyntaxGroup) -> PatternGreen {
5209        let ptr = self.0.lookup_intern(db);
5210        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
5211            PatternGreen(key_fields[0])
5212        } else {
5213            panic!("Unexpected key field query on root.");
5214        }
5215    }
5216    pub fn identifier_green(self, db: &dyn SyntaxGroup) -> TerminalIdentifierGreen {
5217        let ptr = self.0.lookup_intern(db);
5218        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
5219            TerminalIdentifierGreen(key_fields[1])
5220        } else {
5221            panic!("Unexpected key field query on root.");
5222        }
5223    }
5224}
5225impl TypedStablePtr for ExprForPtr {
5226    type SyntaxNode = ExprFor;
5227    fn untyped(&self) -> SyntaxStablePtrId {
5228        self.0
5229    }
5230    fn lookup(&self, db: &dyn SyntaxGroup) -> ExprFor {
5231        ExprFor::from_syntax_node(db, self.0.lookup(db))
5232    }
5233}
5234impl From<ExprForPtr> for SyntaxStablePtrId {
5235    fn from(ptr: ExprForPtr) -> Self {
5236        ptr.untyped()
5237    }
5238}
5239#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
5240pub struct ExprForGreen(pub GreenId);
5241impl TypedSyntaxNode for ExprFor {
5242    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprFor);
5243    type StablePtr = ExprForPtr;
5244    type Green = ExprForGreen;
5245    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
5246        ExprForGreen(
5247            Arc::new(GreenNode {
5248                kind: SyntaxKind::ExprFor,
5249                details: GreenNodeDetails::Node {
5250                    children: vec![
5251                        TerminalFor::missing(db).0,
5252                        Pattern::missing(db).0,
5253                        TerminalIdentifier::missing(db).0,
5254                        Expr::missing(db).0,
5255                        ExprBlock::missing(db).0,
5256                    ],
5257                    width: TextWidth::default(),
5258                },
5259            })
5260            .intern(db),
5261        )
5262    }
5263    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
5264        let kind = node.kind(db);
5265        assert_eq!(
5266            kind,
5267            SyntaxKind::ExprFor,
5268            "Unexpected SyntaxKind {:?}. Expected {:?}.",
5269            kind,
5270            SyntaxKind::ExprFor
5271        );
5272        let children = db.get_children(node.clone());
5273        Self { node, children }
5274    }
5275    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
5276        let kind = node.kind(db);
5277        if kind == SyntaxKind::ExprFor { Some(Self::from_syntax_node(db, node)) } else { None }
5278    }
5279    fn as_syntax_node(&self) -> SyntaxNode {
5280        self.node.clone()
5281    }
5282    fn stable_ptr(&self) -> Self::StablePtr {
5283        ExprForPtr(self.node.0.stable_ptr)
5284    }
5285}
5286impl From<&ExprFor> for SyntaxStablePtrId {
5287    fn from(node: &ExprFor) -> Self {
5288        node.stable_ptr().untyped()
5289    }
5290}
5291#[derive(Clone, Debug, Eq, Hash, PartialEq)]
5292pub struct ElseClause {
5293    node: SyntaxNode,
5294    children: Arc<[SyntaxNode]>,
5295}
5296impl ElseClause {
5297    pub const INDEX_ELSE_KW: usize = 0;
5298    pub const INDEX_ELSE_BLOCK_OR_IF: usize = 1;
5299    pub fn new_green(
5300        db: &dyn SyntaxGroup,
5301        else_kw: TerminalElseGreen,
5302        else_block_or_if: BlockOrIfGreen,
5303    ) -> ElseClauseGreen {
5304        let children: Vec<GreenId> = vec![else_kw.0, else_block_or_if.0];
5305        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
5306        ElseClauseGreen(
5307            Arc::new(GreenNode {
5308                kind: SyntaxKind::ElseClause,
5309                details: GreenNodeDetails::Node { children, width },
5310            })
5311            .intern(db),
5312        )
5313    }
5314}
5315impl ElseClause {
5316    pub fn else_kw(&self, db: &dyn SyntaxGroup) -> TerminalElse {
5317        TerminalElse::from_syntax_node(db, self.children[0].clone())
5318    }
5319    pub fn else_block_or_if(&self, db: &dyn SyntaxGroup) -> BlockOrIf {
5320        BlockOrIf::from_syntax_node(db, self.children[1].clone())
5321    }
5322}
5323#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
5324pub struct ElseClausePtr(pub SyntaxStablePtrId);
5325impl ElseClausePtr {}
5326impl TypedStablePtr for ElseClausePtr {
5327    type SyntaxNode = ElseClause;
5328    fn untyped(&self) -> SyntaxStablePtrId {
5329        self.0
5330    }
5331    fn lookup(&self, db: &dyn SyntaxGroup) -> ElseClause {
5332        ElseClause::from_syntax_node(db, self.0.lookup(db))
5333    }
5334}
5335impl From<ElseClausePtr> for SyntaxStablePtrId {
5336    fn from(ptr: ElseClausePtr) -> Self {
5337        ptr.untyped()
5338    }
5339}
5340#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
5341pub struct ElseClauseGreen(pub GreenId);
5342impl TypedSyntaxNode for ElseClause {
5343    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ElseClause);
5344    type StablePtr = ElseClausePtr;
5345    type Green = ElseClauseGreen;
5346    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
5347        ElseClauseGreen(
5348            Arc::new(GreenNode {
5349                kind: SyntaxKind::ElseClause,
5350                details: GreenNodeDetails::Node {
5351                    children: vec![TerminalElse::missing(db).0, BlockOrIf::missing(db).0],
5352                    width: TextWidth::default(),
5353                },
5354            })
5355            .intern(db),
5356        )
5357    }
5358    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
5359        let kind = node.kind(db);
5360        assert_eq!(
5361            kind,
5362            SyntaxKind::ElseClause,
5363            "Unexpected SyntaxKind {:?}. Expected {:?}.",
5364            kind,
5365            SyntaxKind::ElseClause
5366        );
5367        let children = db.get_children(node.clone());
5368        Self { node, children }
5369    }
5370    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
5371        let kind = node.kind(db);
5372        if kind == SyntaxKind::ElseClause { Some(Self::from_syntax_node(db, node)) } else { None }
5373    }
5374    fn as_syntax_node(&self) -> SyntaxNode {
5375        self.node.clone()
5376    }
5377    fn stable_ptr(&self) -> Self::StablePtr {
5378        ElseClausePtr(self.node.0.stable_ptr)
5379    }
5380}
5381impl From<&ElseClause> for SyntaxStablePtrId {
5382    fn from(node: &ElseClause) -> Self {
5383        node.stable_ptr().untyped()
5384    }
5385}
5386#[derive(Clone, Debug, Eq, Hash, PartialEq)]
5387pub enum OptionElseClause {
5388    Empty(OptionElseClauseEmpty),
5389    ElseClause(ElseClause),
5390}
5391#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
5392pub struct OptionElseClausePtr(pub SyntaxStablePtrId);
5393impl TypedStablePtr for OptionElseClausePtr {
5394    type SyntaxNode = OptionElseClause;
5395    fn untyped(&self) -> SyntaxStablePtrId {
5396        self.0
5397    }
5398    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionElseClause {
5399        OptionElseClause::from_syntax_node(db, self.0.lookup(db))
5400    }
5401}
5402impl From<OptionElseClausePtr> for SyntaxStablePtrId {
5403    fn from(ptr: OptionElseClausePtr) -> Self {
5404        ptr.untyped()
5405    }
5406}
5407impl From<OptionElseClauseEmptyPtr> for OptionElseClausePtr {
5408    fn from(value: OptionElseClauseEmptyPtr) -> Self {
5409        Self(value.0)
5410    }
5411}
5412impl From<ElseClausePtr> for OptionElseClausePtr {
5413    fn from(value: ElseClausePtr) -> Self {
5414        Self(value.0)
5415    }
5416}
5417impl From<OptionElseClauseEmptyGreen> for OptionElseClauseGreen {
5418    fn from(value: OptionElseClauseEmptyGreen) -> Self {
5419        Self(value.0)
5420    }
5421}
5422impl From<ElseClauseGreen> for OptionElseClauseGreen {
5423    fn from(value: ElseClauseGreen) -> Self {
5424        Self(value.0)
5425    }
5426}
5427#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
5428pub struct OptionElseClauseGreen(pub GreenId);
5429impl TypedSyntaxNode for OptionElseClause {
5430    const OPTIONAL_KIND: Option<SyntaxKind> = None;
5431    type StablePtr = OptionElseClausePtr;
5432    type Green = OptionElseClauseGreen;
5433    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
5434        panic!("No missing variant.");
5435    }
5436    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
5437        let kind = node.kind(db);
5438        match kind {
5439            SyntaxKind::OptionElseClauseEmpty => {
5440                OptionElseClause::Empty(OptionElseClauseEmpty::from_syntax_node(db, node))
5441            }
5442            SyntaxKind::ElseClause => {
5443                OptionElseClause::ElseClause(ElseClause::from_syntax_node(db, node))
5444            }
5445            _ => panic!(
5446                "Unexpected syntax kind {:?} when constructing {}.",
5447                kind, "OptionElseClause"
5448            ),
5449        }
5450    }
5451    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
5452        let kind = node.kind(db);
5453        match kind {
5454            SyntaxKind::OptionElseClauseEmpty => {
5455                Some(OptionElseClause::Empty(OptionElseClauseEmpty::from_syntax_node(db, node)))
5456            }
5457            SyntaxKind::ElseClause => {
5458                Some(OptionElseClause::ElseClause(ElseClause::from_syntax_node(db, node)))
5459            }
5460            _ => None,
5461        }
5462    }
5463    fn as_syntax_node(&self) -> SyntaxNode {
5464        match self {
5465            OptionElseClause::Empty(x) => x.as_syntax_node(),
5466            OptionElseClause::ElseClause(x) => x.as_syntax_node(),
5467        }
5468    }
5469    fn stable_ptr(&self) -> Self::StablePtr {
5470        OptionElseClausePtr(self.as_syntax_node().0.stable_ptr)
5471    }
5472}
5473impl From<&OptionElseClause> for SyntaxStablePtrId {
5474    fn from(node: &OptionElseClause) -> Self {
5475        node.stable_ptr().untyped()
5476    }
5477}
5478impl OptionElseClause {
5479    /// Checks if a kind of a variant of [OptionElseClause].
5480    pub fn is_variant(kind: SyntaxKind) -> bool {
5481        matches!(kind, SyntaxKind::OptionElseClauseEmpty | SyntaxKind::ElseClause)
5482    }
5483}
5484#[derive(Clone, Debug, Eq, Hash, PartialEq)]
5485pub struct OptionElseClauseEmpty {
5486    node: SyntaxNode,
5487    children: Arc<[SyntaxNode]>,
5488}
5489impl OptionElseClauseEmpty {
5490    pub fn new_green(db: &dyn SyntaxGroup) -> OptionElseClauseEmptyGreen {
5491        let children: Vec<GreenId> = vec![];
5492        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
5493        OptionElseClauseEmptyGreen(
5494            Arc::new(GreenNode {
5495                kind: SyntaxKind::OptionElseClauseEmpty,
5496                details: GreenNodeDetails::Node { children, width },
5497            })
5498            .intern(db),
5499        )
5500    }
5501}
5502impl OptionElseClauseEmpty {}
5503#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
5504pub struct OptionElseClauseEmptyPtr(pub SyntaxStablePtrId);
5505impl OptionElseClauseEmptyPtr {}
5506impl TypedStablePtr for OptionElseClauseEmptyPtr {
5507    type SyntaxNode = OptionElseClauseEmpty;
5508    fn untyped(&self) -> SyntaxStablePtrId {
5509        self.0
5510    }
5511    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionElseClauseEmpty {
5512        OptionElseClauseEmpty::from_syntax_node(db, self.0.lookup(db))
5513    }
5514}
5515impl From<OptionElseClauseEmptyPtr> for SyntaxStablePtrId {
5516    fn from(ptr: OptionElseClauseEmptyPtr) -> Self {
5517        ptr.untyped()
5518    }
5519}
5520#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
5521pub struct OptionElseClauseEmptyGreen(pub GreenId);
5522impl TypedSyntaxNode for OptionElseClauseEmpty {
5523    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionElseClauseEmpty);
5524    type StablePtr = OptionElseClauseEmptyPtr;
5525    type Green = OptionElseClauseEmptyGreen;
5526    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
5527        OptionElseClauseEmptyGreen(
5528            Arc::new(GreenNode {
5529                kind: SyntaxKind::OptionElseClauseEmpty,
5530                details: GreenNodeDetails::Node { children: vec![], width: TextWidth::default() },
5531            })
5532            .intern(db),
5533        )
5534    }
5535    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
5536        let kind = node.kind(db);
5537        assert_eq!(
5538            kind,
5539            SyntaxKind::OptionElseClauseEmpty,
5540            "Unexpected SyntaxKind {:?}. Expected {:?}.",
5541            kind,
5542            SyntaxKind::OptionElseClauseEmpty
5543        );
5544        let children = db.get_children(node.clone());
5545        Self { node, children }
5546    }
5547    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
5548        let kind = node.kind(db);
5549        if kind == SyntaxKind::OptionElseClauseEmpty {
5550            Some(Self::from_syntax_node(db, node))
5551        } else {
5552            None
5553        }
5554    }
5555    fn as_syntax_node(&self) -> SyntaxNode {
5556        self.node.clone()
5557    }
5558    fn stable_ptr(&self) -> Self::StablePtr {
5559        OptionElseClauseEmptyPtr(self.node.0.stable_ptr)
5560    }
5561}
5562impl From<&OptionElseClauseEmpty> for SyntaxStablePtrId {
5563    fn from(node: &OptionElseClauseEmpty) -> Self {
5564        node.stable_ptr().untyped()
5565    }
5566}
5567#[derive(Clone, Debug, Eq, Hash, PartialEq)]
5568pub struct ExprErrorPropagate {
5569    node: SyntaxNode,
5570    children: Arc<[SyntaxNode]>,
5571}
5572impl ExprErrorPropagate {
5573    pub const INDEX_EXPR: usize = 0;
5574    pub const INDEX_OP: usize = 1;
5575    pub fn new_green(
5576        db: &dyn SyntaxGroup,
5577        expr: ExprGreen,
5578        op: TerminalQuestionMarkGreen,
5579    ) -> ExprErrorPropagateGreen {
5580        let children: Vec<GreenId> = vec![expr.0, op.0];
5581        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
5582        ExprErrorPropagateGreen(
5583            Arc::new(GreenNode {
5584                kind: SyntaxKind::ExprErrorPropagate,
5585                details: GreenNodeDetails::Node { children, width },
5586            })
5587            .intern(db),
5588        )
5589    }
5590}
5591impl ExprErrorPropagate {
5592    pub fn expr(&self, db: &dyn SyntaxGroup) -> Expr {
5593        Expr::from_syntax_node(db, self.children[0].clone())
5594    }
5595    pub fn op(&self, db: &dyn SyntaxGroup) -> TerminalQuestionMark {
5596        TerminalQuestionMark::from_syntax_node(db, self.children[1].clone())
5597    }
5598}
5599#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
5600pub struct ExprErrorPropagatePtr(pub SyntaxStablePtrId);
5601impl ExprErrorPropagatePtr {}
5602impl TypedStablePtr for ExprErrorPropagatePtr {
5603    type SyntaxNode = ExprErrorPropagate;
5604    fn untyped(&self) -> SyntaxStablePtrId {
5605        self.0
5606    }
5607    fn lookup(&self, db: &dyn SyntaxGroup) -> ExprErrorPropagate {
5608        ExprErrorPropagate::from_syntax_node(db, self.0.lookup(db))
5609    }
5610}
5611impl From<ExprErrorPropagatePtr> for SyntaxStablePtrId {
5612    fn from(ptr: ExprErrorPropagatePtr) -> Self {
5613        ptr.untyped()
5614    }
5615}
5616#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
5617pub struct ExprErrorPropagateGreen(pub GreenId);
5618impl TypedSyntaxNode for ExprErrorPropagate {
5619    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprErrorPropagate);
5620    type StablePtr = ExprErrorPropagatePtr;
5621    type Green = ExprErrorPropagateGreen;
5622    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
5623        ExprErrorPropagateGreen(
5624            Arc::new(GreenNode {
5625                kind: SyntaxKind::ExprErrorPropagate,
5626                details: GreenNodeDetails::Node {
5627                    children: vec![Expr::missing(db).0, TerminalQuestionMark::missing(db).0],
5628                    width: TextWidth::default(),
5629                },
5630            })
5631            .intern(db),
5632        )
5633    }
5634    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
5635        let kind = node.kind(db);
5636        assert_eq!(
5637            kind,
5638            SyntaxKind::ExprErrorPropagate,
5639            "Unexpected SyntaxKind {:?}. Expected {:?}.",
5640            kind,
5641            SyntaxKind::ExprErrorPropagate
5642        );
5643        let children = db.get_children(node.clone());
5644        Self { node, children }
5645    }
5646    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
5647        let kind = node.kind(db);
5648        if kind == SyntaxKind::ExprErrorPropagate {
5649            Some(Self::from_syntax_node(db, node))
5650        } else {
5651            None
5652        }
5653    }
5654    fn as_syntax_node(&self) -> SyntaxNode {
5655        self.node.clone()
5656    }
5657    fn stable_ptr(&self) -> Self::StablePtr {
5658        ExprErrorPropagatePtr(self.node.0.stable_ptr)
5659    }
5660}
5661impl From<&ExprErrorPropagate> for SyntaxStablePtrId {
5662    fn from(node: &ExprErrorPropagate) -> Self {
5663        node.stable_ptr().untyped()
5664    }
5665}
5666#[derive(Clone, Debug, Eq, Hash, PartialEq)]
5667pub struct ExprIndexed {
5668    node: SyntaxNode,
5669    children: Arc<[SyntaxNode]>,
5670}
5671impl ExprIndexed {
5672    pub const INDEX_EXPR: usize = 0;
5673    pub const INDEX_LBRACK: usize = 1;
5674    pub const INDEX_INDEX_EXPR: usize = 2;
5675    pub const INDEX_RBRACK: usize = 3;
5676    pub fn new_green(
5677        db: &dyn SyntaxGroup,
5678        expr: ExprGreen,
5679        lbrack: TerminalLBrackGreen,
5680        index_expr: ExprGreen,
5681        rbrack: TerminalRBrackGreen,
5682    ) -> ExprIndexedGreen {
5683        let children: Vec<GreenId> = vec![expr.0, lbrack.0, index_expr.0, rbrack.0];
5684        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
5685        ExprIndexedGreen(
5686            Arc::new(GreenNode {
5687                kind: SyntaxKind::ExprIndexed,
5688                details: GreenNodeDetails::Node { children, width },
5689            })
5690            .intern(db),
5691        )
5692    }
5693}
5694impl ExprIndexed {
5695    pub fn expr(&self, db: &dyn SyntaxGroup) -> Expr {
5696        Expr::from_syntax_node(db, self.children[0].clone())
5697    }
5698    pub fn lbrack(&self, db: &dyn SyntaxGroup) -> TerminalLBrack {
5699        TerminalLBrack::from_syntax_node(db, self.children[1].clone())
5700    }
5701    pub fn index_expr(&self, db: &dyn SyntaxGroup) -> Expr {
5702        Expr::from_syntax_node(db, self.children[2].clone())
5703    }
5704    pub fn rbrack(&self, db: &dyn SyntaxGroup) -> TerminalRBrack {
5705        TerminalRBrack::from_syntax_node(db, self.children[3].clone())
5706    }
5707}
5708#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
5709pub struct ExprIndexedPtr(pub SyntaxStablePtrId);
5710impl ExprIndexedPtr {}
5711impl TypedStablePtr for ExprIndexedPtr {
5712    type SyntaxNode = ExprIndexed;
5713    fn untyped(&self) -> SyntaxStablePtrId {
5714        self.0
5715    }
5716    fn lookup(&self, db: &dyn SyntaxGroup) -> ExprIndexed {
5717        ExprIndexed::from_syntax_node(db, self.0.lookup(db))
5718    }
5719}
5720impl From<ExprIndexedPtr> for SyntaxStablePtrId {
5721    fn from(ptr: ExprIndexedPtr) -> Self {
5722        ptr.untyped()
5723    }
5724}
5725#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
5726pub struct ExprIndexedGreen(pub GreenId);
5727impl TypedSyntaxNode for ExprIndexed {
5728    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprIndexed);
5729    type StablePtr = ExprIndexedPtr;
5730    type Green = ExprIndexedGreen;
5731    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
5732        ExprIndexedGreen(
5733            Arc::new(GreenNode {
5734                kind: SyntaxKind::ExprIndexed,
5735                details: GreenNodeDetails::Node {
5736                    children: vec![
5737                        Expr::missing(db).0,
5738                        TerminalLBrack::missing(db).0,
5739                        Expr::missing(db).0,
5740                        TerminalRBrack::missing(db).0,
5741                    ],
5742                    width: TextWidth::default(),
5743                },
5744            })
5745            .intern(db),
5746        )
5747    }
5748    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
5749        let kind = node.kind(db);
5750        assert_eq!(
5751            kind,
5752            SyntaxKind::ExprIndexed,
5753            "Unexpected SyntaxKind {:?}. Expected {:?}.",
5754            kind,
5755            SyntaxKind::ExprIndexed
5756        );
5757        let children = db.get_children(node.clone());
5758        Self { node, children }
5759    }
5760    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
5761        let kind = node.kind(db);
5762        if kind == SyntaxKind::ExprIndexed { Some(Self::from_syntax_node(db, node)) } else { None }
5763    }
5764    fn as_syntax_node(&self) -> SyntaxNode {
5765        self.node.clone()
5766    }
5767    fn stable_ptr(&self) -> Self::StablePtr {
5768        ExprIndexedPtr(self.node.0.stable_ptr)
5769    }
5770}
5771impl From<&ExprIndexed> for SyntaxStablePtrId {
5772    fn from(node: &ExprIndexed) -> Self {
5773        node.stable_ptr().untyped()
5774    }
5775}
5776#[derive(Clone, Debug, Eq, Hash, PartialEq)]
5777pub struct ExprInlineMacro {
5778    node: SyntaxNode,
5779    children: Arc<[SyntaxNode]>,
5780}
5781impl ExprInlineMacro {
5782    pub const INDEX_PATH: usize = 0;
5783    pub const INDEX_BANG: usize = 1;
5784    pub const INDEX_ARGUMENTS: usize = 2;
5785    pub fn new_green(
5786        db: &dyn SyntaxGroup,
5787        path: ExprPathGreen,
5788        bang: TerminalNotGreen,
5789        arguments: WrappedArgListGreen,
5790    ) -> ExprInlineMacroGreen {
5791        let children: Vec<GreenId> = vec![path.0, bang.0, arguments.0];
5792        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
5793        ExprInlineMacroGreen(
5794            Arc::new(GreenNode {
5795                kind: SyntaxKind::ExprInlineMacro,
5796                details: GreenNodeDetails::Node { children, width },
5797            })
5798            .intern(db),
5799        )
5800    }
5801}
5802impl ExprInlineMacro {
5803    pub fn path(&self, db: &dyn SyntaxGroup) -> ExprPath {
5804        ExprPath::from_syntax_node(db, self.children[0].clone())
5805    }
5806    pub fn bang(&self, db: &dyn SyntaxGroup) -> TerminalNot {
5807        TerminalNot::from_syntax_node(db, self.children[1].clone())
5808    }
5809    pub fn arguments(&self, db: &dyn SyntaxGroup) -> WrappedArgList {
5810        WrappedArgList::from_syntax_node(db, self.children[2].clone())
5811    }
5812}
5813#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
5814pub struct ExprInlineMacroPtr(pub SyntaxStablePtrId);
5815impl ExprInlineMacroPtr {}
5816impl TypedStablePtr for ExprInlineMacroPtr {
5817    type SyntaxNode = ExprInlineMacro;
5818    fn untyped(&self) -> SyntaxStablePtrId {
5819        self.0
5820    }
5821    fn lookup(&self, db: &dyn SyntaxGroup) -> ExprInlineMacro {
5822        ExprInlineMacro::from_syntax_node(db, self.0.lookup(db))
5823    }
5824}
5825impl From<ExprInlineMacroPtr> for SyntaxStablePtrId {
5826    fn from(ptr: ExprInlineMacroPtr) -> Self {
5827        ptr.untyped()
5828    }
5829}
5830#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
5831pub struct ExprInlineMacroGreen(pub GreenId);
5832impl TypedSyntaxNode for ExprInlineMacro {
5833    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprInlineMacro);
5834    type StablePtr = ExprInlineMacroPtr;
5835    type Green = ExprInlineMacroGreen;
5836    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
5837        ExprInlineMacroGreen(
5838            Arc::new(GreenNode {
5839                kind: SyntaxKind::ExprInlineMacro,
5840                details: GreenNodeDetails::Node {
5841                    children: vec![
5842                        ExprPath::missing(db).0,
5843                        TerminalNot::missing(db).0,
5844                        WrappedArgList::missing(db).0,
5845                    ],
5846                    width: TextWidth::default(),
5847                },
5848            })
5849            .intern(db),
5850        )
5851    }
5852    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
5853        let kind = node.kind(db);
5854        assert_eq!(
5855            kind,
5856            SyntaxKind::ExprInlineMacro,
5857            "Unexpected SyntaxKind {:?}. Expected {:?}.",
5858            kind,
5859            SyntaxKind::ExprInlineMacro
5860        );
5861        let children = db.get_children(node.clone());
5862        Self { node, children }
5863    }
5864    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
5865        let kind = node.kind(db);
5866        if kind == SyntaxKind::ExprInlineMacro {
5867            Some(Self::from_syntax_node(db, node))
5868        } else {
5869            None
5870        }
5871    }
5872    fn as_syntax_node(&self) -> SyntaxNode {
5873        self.node.clone()
5874    }
5875    fn stable_ptr(&self) -> Self::StablePtr {
5876        ExprInlineMacroPtr(self.node.0.stable_ptr)
5877    }
5878}
5879impl From<&ExprInlineMacro> for SyntaxStablePtrId {
5880    fn from(node: &ExprInlineMacro) -> Self {
5881        node.stable_ptr().untyped()
5882    }
5883}
5884#[derive(Clone, Debug, Eq, Hash, PartialEq)]
5885pub struct ExprFixedSizeArray {
5886    node: SyntaxNode,
5887    children: Arc<[SyntaxNode]>,
5888}
5889impl ExprFixedSizeArray {
5890    pub const INDEX_LBRACK: usize = 0;
5891    pub const INDEX_EXPRS: usize = 1;
5892    pub const INDEX_SIZE: usize = 2;
5893    pub const INDEX_RBRACK: usize = 3;
5894    pub fn new_green(
5895        db: &dyn SyntaxGroup,
5896        lbrack: TerminalLBrackGreen,
5897        exprs: ExprListGreen,
5898        size: OptionFixedSizeArraySizeGreen,
5899        rbrack: TerminalRBrackGreen,
5900    ) -> ExprFixedSizeArrayGreen {
5901        let children: Vec<GreenId> = vec![lbrack.0, exprs.0, size.0, rbrack.0];
5902        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
5903        ExprFixedSizeArrayGreen(
5904            Arc::new(GreenNode {
5905                kind: SyntaxKind::ExprFixedSizeArray,
5906                details: GreenNodeDetails::Node { children, width },
5907            })
5908            .intern(db),
5909        )
5910    }
5911}
5912impl ExprFixedSizeArray {
5913    pub fn lbrack(&self, db: &dyn SyntaxGroup) -> TerminalLBrack {
5914        TerminalLBrack::from_syntax_node(db, self.children[0].clone())
5915    }
5916    pub fn exprs(&self, db: &dyn SyntaxGroup) -> ExprList {
5917        ExprList::from_syntax_node(db, self.children[1].clone())
5918    }
5919    pub fn size(&self, db: &dyn SyntaxGroup) -> OptionFixedSizeArraySize {
5920        OptionFixedSizeArraySize::from_syntax_node(db, self.children[2].clone())
5921    }
5922    pub fn rbrack(&self, db: &dyn SyntaxGroup) -> TerminalRBrack {
5923        TerminalRBrack::from_syntax_node(db, self.children[3].clone())
5924    }
5925}
5926#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
5927pub struct ExprFixedSizeArrayPtr(pub SyntaxStablePtrId);
5928impl ExprFixedSizeArrayPtr {}
5929impl TypedStablePtr for ExprFixedSizeArrayPtr {
5930    type SyntaxNode = ExprFixedSizeArray;
5931    fn untyped(&self) -> SyntaxStablePtrId {
5932        self.0
5933    }
5934    fn lookup(&self, db: &dyn SyntaxGroup) -> ExprFixedSizeArray {
5935        ExprFixedSizeArray::from_syntax_node(db, self.0.lookup(db))
5936    }
5937}
5938impl From<ExprFixedSizeArrayPtr> for SyntaxStablePtrId {
5939    fn from(ptr: ExprFixedSizeArrayPtr) -> Self {
5940        ptr.untyped()
5941    }
5942}
5943#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
5944pub struct ExprFixedSizeArrayGreen(pub GreenId);
5945impl TypedSyntaxNode for ExprFixedSizeArray {
5946    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprFixedSizeArray);
5947    type StablePtr = ExprFixedSizeArrayPtr;
5948    type Green = ExprFixedSizeArrayGreen;
5949    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
5950        ExprFixedSizeArrayGreen(
5951            Arc::new(GreenNode {
5952                kind: SyntaxKind::ExprFixedSizeArray,
5953                details: GreenNodeDetails::Node {
5954                    children: vec![
5955                        TerminalLBrack::missing(db).0,
5956                        ExprList::missing(db).0,
5957                        OptionFixedSizeArraySize::missing(db).0,
5958                        TerminalRBrack::missing(db).0,
5959                    ],
5960                    width: TextWidth::default(),
5961                },
5962            })
5963            .intern(db),
5964        )
5965    }
5966    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
5967        let kind = node.kind(db);
5968        assert_eq!(
5969            kind,
5970            SyntaxKind::ExprFixedSizeArray,
5971            "Unexpected SyntaxKind {:?}. Expected {:?}.",
5972            kind,
5973            SyntaxKind::ExprFixedSizeArray
5974        );
5975        let children = db.get_children(node.clone());
5976        Self { node, children }
5977    }
5978    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
5979        let kind = node.kind(db);
5980        if kind == SyntaxKind::ExprFixedSizeArray {
5981            Some(Self::from_syntax_node(db, node))
5982        } else {
5983            None
5984        }
5985    }
5986    fn as_syntax_node(&self) -> SyntaxNode {
5987        self.node.clone()
5988    }
5989    fn stable_ptr(&self) -> Self::StablePtr {
5990        ExprFixedSizeArrayPtr(self.node.0.stable_ptr)
5991    }
5992}
5993impl From<&ExprFixedSizeArray> for SyntaxStablePtrId {
5994    fn from(node: &ExprFixedSizeArray) -> Self {
5995        node.stable_ptr().untyped()
5996    }
5997}
5998#[derive(Clone, Debug, Eq, Hash, PartialEq)]
5999pub struct FixedSizeArraySize {
6000    node: SyntaxNode,
6001    children: Arc<[SyntaxNode]>,
6002}
6003impl FixedSizeArraySize {
6004    pub const INDEX_SEMICOLON: usize = 0;
6005    pub const INDEX_SIZE: usize = 1;
6006    pub fn new_green(
6007        db: &dyn SyntaxGroup,
6008        semicolon: TerminalSemicolonGreen,
6009        size: ExprGreen,
6010    ) -> FixedSizeArraySizeGreen {
6011        let children: Vec<GreenId> = vec![semicolon.0, size.0];
6012        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
6013        FixedSizeArraySizeGreen(
6014            Arc::new(GreenNode {
6015                kind: SyntaxKind::FixedSizeArraySize,
6016                details: GreenNodeDetails::Node { children, width },
6017            })
6018            .intern(db),
6019        )
6020    }
6021}
6022impl FixedSizeArraySize {
6023    pub fn semicolon(&self, db: &dyn SyntaxGroup) -> TerminalSemicolon {
6024        TerminalSemicolon::from_syntax_node(db, self.children[0].clone())
6025    }
6026    pub fn size(&self, db: &dyn SyntaxGroup) -> Expr {
6027        Expr::from_syntax_node(db, self.children[1].clone())
6028    }
6029}
6030#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
6031pub struct FixedSizeArraySizePtr(pub SyntaxStablePtrId);
6032impl FixedSizeArraySizePtr {}
6033impl TypedStablePtr for FixedSizeArraySizePtr {
6034    type SyntaxNode = FixedSizeArraySize;
6035    fn untyped(&self) -> SyntaxStablePtrId {
6036        self.0
6037    }
6038    fn lookup(&self, db: &dyn SyntaxGroup) -> FixedSizeArraySize {
6039        FixedSizeArraySize::from_syntax_node(db, self.0.lookup(db))
6040    }
6041}
6042impl From<FixedSizeArraySizePtr> for SyntaxStablePtrId {
6043    fn from(ptr: FixedSizeArraySizePtr) -> Self {
6044        ptr.untyped()
6045    }
6046}
6047#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
6048pub struct FixedSizeArraySizeGreen(pub GreenId);
6049impl TypedSyntaxNode for FixedSizeArraySize {
6050    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::FixedSizeArraySize);
6051    type StablePtr = FixedSizeArraySizePtr;
6052    type Green = FixedSizeArraySizeGreen;
6053    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
6054        FixedSizeArraySizeGreen(
6055            Arc::new(GreenNode {
6056                kind: SyntaxKind::FixedSizeArraySize,
6057                details: GreenNodeDetails::Node {
6058                    children: vec![TerminalSemicolon::missing(db).0, Expr::missing(db).0],
6059                    width: TextWidth::default(),
6060                },
6061            })
6062            .intern(db),
6063        )
6064    }
6065    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
6066        let kind = node.kind(db);
6067        assert_eq!(
6068            kind,
6069            SyntaxKind::FixedSizeArraySize,
6070            "Unexpected SyntaxKind {:?}. Expected {:?}.",
6071            kind,
6072            SyntaxKind::FixedSizeArraySize
6073        );
6074        let children = db.get_children(node.clone());
6075        Self { node, children }
6076    }
6077    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
6078        let kind = node.kind(db);
6079        if kind == SyntaxKind::FixedSizeArraySize {
6080            Some(Self::from_syntax_node(db, node))
6081        } else {
6082            None
6083        }
6084    }
6085    fn as_syntax_node(&self) -> SyntaxNode {
6086        self.node.clone()
6087    }
6088    fn stable_ptr(&self) -> Self::StablePtr {
6089        FixedSizeArraySizePtr(self.node.0.stable_ptr)
6090    }
6091}
6092impl From<&FixedSizeArraySize> for SyntaxStablePtrId {
6093    fn from(node: &FixedSizeArraySize) -> Self {
6094        node.stable_ptr().untyped()
6095    }
6096}
6097#[derive(Clone, Debug, Eq, Hash, PartialEq)]
6098pub enum OptionFixedSizeArraySize {
6099    Empty(OptionFixedSizeArraySizeEmpty),
6100    FixedSizeArraySize(FixedSizeArraySize),
6101}
6102#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
6103pub struct OptionFixedSizeArraySizePtr(pub SyntaxStablePtrId);
6104impl TypedStablePtr for OptionFixedSizeArraySizePtr {
6105    type SyntaxNode = OptionFixedSizeArraySize;
6106    fn untyped(&self) -> SyntaxStablePtrId {
6107        self.0
6108    }
6109    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionFixedSizeArraySize {
6110        OptionFixedSizeArraySize::from_syntax_node(db, self.0.lookup(db))
6111    }
6112}
6113impl From<OptionFixedSizeArraySizePtr> for SyntaxStablePtrId {
6114    fn from(ptr: OptionFixedSizeArraySizePtr) -> Self {
6115        ptr.untyped()
6116    }
6117}
6118impl From<OptionFixedSizeArraySizeEmptyPtr> for OptionFixedSizeArraySizePtr {
6119    fn from(value: OptionFixedSizeArraySizeEmptyPtr) -> Self {
6120        Self(value.0)
6121    }
6122}
6123impl From<FixedSizeArraySizePtr> for OptionFixedSizeArraySizePtr {
6124    fn from(value: FixedSizeArraySizePtr) -> Self {
6125        Self(value.0)
6126    }
6127}
6128impl From<OptionFixedSizeArraySizeEmptyGreen> for OptionFixedSizeArraySizeGreen {
6129    fn from(value: OptionFixedSizeArraySizeEmptyGreen) -> Self {
6130        Self(value.0)
6131    }
6132}
6133impl From<FixedSizeArraySizeGreen> for OptionFixedSizeArraySizeGreen {
6134    fn from(value: FixedSizeArraySizeGreen) -> Self {
6135        Self(value.0)
6136    }
6137}
6138#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
6139pub struct OptionFixedSizeArraySizeGreen(pub GreenId);
6140impl TypedSyntaxNode for OptionFixedSizeArraySize {
6141    const OPTIONAL_KIND: Option<SyntaxKind> = None;
6142    type StablePtr = OptionFixedSizeArraySizePtr;
6143    type Green = OptionFixedSizeArraySizeGreen;
6144    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
6145        panic!("No missing variant.");
6146    }
6147    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
6148        let kind = node.kind(db);
6149        match kind {
6150            SyntaxKind::OptionFixedSizeArraySizeEmpty => OptionFixedSizeArraySize::Empty(
6151                OptionFixedSizeArraySizeEmpty::from_syntax_node(db, node),
6152            ),
6153            SyntaxKind::FixedSizeArraySize => OptionFixedSizeArraySize::FixedSizeArraySize(
6154                FixedSizeArraySize::from_syntax_node(db, node),
6155            ),
6156            _ => panic!(
6157                "Unexpected syntax kind {:?} when constructing {}.",
6158                kind, "OptionFixedSizeArraySize"
6159            ),
6160        }
6161    }
6162    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
6163        let kind = node.kind(db);
6164        match kind {
6165            SyntaxKind::OptionFixedSizeArraySizeEmpty => Some(OptionFixedSizeArraySize::Empty(
6166                OptionFixedSizeArraySizeEmpty::from_syntax_node(db, node),
6167            )),
6168            SyntaxKind::FixedSizeArraySize => Some(OptionFixedSizeArraySize::FixedSizeArraySize(
6169                FixedSizeArraySize::from_syntax_node(db, node),
6170            )),
6171            _ => None,
6172        }
6173    }
6174    fn as_syntax_node(&self) -> SyntaxNode {
6175        match self {
6176            OptionFixedSizeArraySize::Empty(x) => x.as_syntax_node(),
6177            OptionFixedSizeArraySize::FixedSizeArraySize(x) => x.as_syntax_node(),
6178        }
6179    }
6180    fn stable_ptr(&self) -> Self::StablePtr {
6181        OptionFixedSizeArraySizePtr(self.as_syntax_node().0.stable_ptr)
6182    }
6183}
6184impl From<&OptionFixedSizeArraySize> for SyntaxStablePtrId {
6185    fn from(node: &OptionFixedSizeArraySize) -> Self {
6186        node.stable_ptr().untyped()
6187    }
6188}
6189impl OptionFixedSizeArraySize {
6190    /// Checks if a kind of a variant of [OptionFixedSizeArraySize].
6191    pub fn is_variant(kind: SyntaxKind) -> bool {
6192        matches!(kind, SyntaxKind::OptionFixedSizeArraySizeEmpty | SyntaxKind::FixedSizeArraySize)
6193    }
6194}
6195#[derive(Clone, Debug, Eq, Hash, PartialEq)]
6196pub struct OptionFixedSizeArraySizeEmpty {
6197    node: SyntaxNode,
6198    children: Arc<[SyntaxNode]>,
6199}
6200impl OptionFixedSizeArraySizeEmpty {
6201    pub fn new_green(db: &dyn SyntaxGroup) -> OptionFixedSizeArraySizeEmptyGreen {
6202        let children: Vec<GreenId> = vec![];
6203        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
6204        OptionFixedSizeArraySizeEmptyGreen(
6205            Arc::new(GreenNode {
6206                kind: SyntaxKind::OptionFixedSizeArraySizeEmpty,
6207                details: GreenNodeDetails::Node { children, width },
6208            })
6209            .intern(db),
6210        )
6211    }
6212}
6213impl OptionFixedSizeArraySizeEmpty {}
6214#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
6215pub struct OptionFixedSizeArraySizeEmptyPtr(pub SyntaxStablePtrId);
6216impl OptionFixedSizeArraySizeEmptyPtr {}
6217impl TypedStablePtr for OptionFixedSizeArraySizeEmptyPtr {
6218    type SyntaxNode = OptionFixedSizeArraySizeEmpty;
6219    fn untyped(&self) -> SyntaxStablePtrId {
6220        self.0
6221    }
6222    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionFixedSizeArraySizeEmpty {
6223        OptionFixedSizeArraySizeEmpty::from_syntax_node(db, self.0.lookup(db))
6224    }
6225}
6226impl From<OptionFixedSizeArraySizeEmptyPtr> for SyntaxStablePtrId {
6227    fn from(ptr: OptionFixedSizeArraySizeEmptyPtr) -> Self {
6228        ptr.untyped()
6229    }
6230}
6231#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
6232pub struct OptionFixedSizeArraySizeEmptyGreen(pub GreenId);
6233impl TypedSyntaxNode for OptionFixedSizeArraySizeEmpty {
6234    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionFixedSizeArraySizeEmpty);
6235    type StablePtr = OptionFixedSizeArraySizeEmptyPtr;
6236    type Green = OptionFixedSizeArraySizeEmptyGreen;
6237    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
6238        OptionFixedSizeArraySizeEmptyGreen(
6239            Arc::new(GreenNode {
6240                kind: SyntaxKind::OptionFixedSizeArraySizeEmpty,
6241                details: GreenNodeDetails::Node { children: vec![], width: TextWidth::default() },
6242            })
6243            .intern(db),
6244        )
6245    }
6246    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
6247        let kind = node.kind(db);
6248        assert_eq!(
6249            kind,
6250            SyntaxKind::OptionFixedSizeArraySizeEmpty,
6251            "Unexpected SyntaxKind {:?}. Expected {:?}.",
6252            kind,
6253            SyntaxKind::OptionFixedSizeArraySizeEmpty
6254        );
6255        let children = db.get_children(node.clone());
6256        Self { node, children }
6257    }
6258    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
6259        let kind = node.kind(db);
6260        if kind == SyntaxKind::OptionFixedSizeArraySizeEmpty {
6261            Some(Self::from_syntax_node(db, node))
6262        } else {
6263            None
6264        }
6265    }
6266    fn as_syntax_node(&self) -> SyntaxNode {
6267        self.node.clone()
6268    }
6269    fn stable_ptr(&self) -> Self::StablePtr {
6270        OptionFixedSizeArraySizeEmptyPtr(self.node.0.stable_ptr)
6271    }
6272}
6273impl From<&OptionFixedSizeArraySizeEmpty> for SyntaxStablePtrId {
6274    fn from(node: &OptionFixedSizeArraySizeEmpty) -> Self {
6275        node.stable_ptr().untyped()
6276    }
6277}
6278#[derive(Clone, Debug, Eq, Hash, PartialEq)]
6279pub struct ExprClosure {
6280    node: SyntaxNode,
6281    children: Arc<[SyntaxNode]>,
6282}
6283impl ExprClosure {
6284    pub const INDEX_WRAPPER: usize = 0;
6285    pub const INDEX_RET_TY: usize = 1;
6286    pub const INDEX_OPTIONAL_NO_PANIC: usize = 2;
6287    pub const INDEX_EXPR: usize = 3;
6288    pub fn new_green(
6289        db: &dyn SyntaxGroup,
6290        wrapper: ClosureParamWrapperGreen,
6291        ret_ty: OptionReturnTypeClauseGreen,
6292        optional_no_panic: OptionTerminalNoPanicGreen,
6293        expr: ExprGreen,
6294    ) -> ExprClosureGreen {
6295        let children: Vec<GreenId> = vec![wrapper.0, ret_ty.0, optional_no_panic.0, expr.0];
6296        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
6297        ExprClosureGreen(
6298            Arc::new(GreenNode {
6299                kind: SyntaxKind::ExprClosure,
6300                details: GreenNodeDetails::Node { children, width },
6301            })
6302            .intern(db),
6303        )
6304    }
6305}
6306impl ExprClosure {
6307    pub fn wrapper(&self, db: &dyn SyntaxGroup) -> ClosureParamWrapper {
6308        ClosureParamWrapper::from_syntax_node(db, self.children[0].clone())
6309    }
6310    pub fn ret_ty(&self, db: &dyn SyntaxGroup) -> OptionReturnTypeClause {
6311        OptionReturnTypeClause::from_syntax_node(db, self.children[1].clone())
6312    }
6313    pub fn optional_no_panic(&self, db: &dyn SyntaxGroup) -> OptionTerminalNoPanic {
6314        OptionTerminalNoPanic::from_syntax_node(db, self.children[2].clone())
6315    }
6316    pub fn expr(&self, db: &dyn SyntaxGroup) -> Expr {
6317        Expr::from_syntax_node(db, self.children[3].clone())
6318    }
6319}
6320#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
6321pub struct ExprClosurePtr(pub SyntaxStablePtrId);
6322impl ExprClosurePtr {}
6323impl TypedStablePtr for ExprClosurePtr {
6324    type SyntaxNode = ExprClosure;
6325    fn untyped(&self) -> SyntaxStablePtrId {
6326        self.0
6327    }
6328    fn lookup(&self, db: &dyn SyntaxGroup) -> ExprClosure {
6329        ExprClosure::from_syntax_node(db, self.0.lookup(db))
6330    }
6331}
6332impl From<ExprClosurePtr> for SyntaxStablePtrId {
6333    fn from(ptr: ExprClosurePtr) -> Self {
6334        ptr.untyped()
6335    }
6336}
6337#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
6338pub struct ExprClosureGreen(pub GreenId);
6339impl TypedSyntaxNode for ExprClosure {
6340    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprClosure);
6341    type StablePtr = ExprClosurePtr;
6342    type Green = ExprClosureGreen;
6343    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
6344        ExprClosureGreen(
6345            Arc::new(GreenNode {
6346                kind: SyntaxKind::ExprClosure,
6347                details: GreenNodeDetails::Node {
6348                    children: vec![
6349                        ClosureParamWrapper::missing(db).0,
6350                        OptionReturnTypeClause::missing(db).0,
6351                        OptionTerminalNoPanic::missing(db).0,
6352                        Expr::missing(db).0,
6353                    ],
6354                    width: TextWidth::default(),
6355                },
6356            })
6357            .intern(db),
6358        )
6359    }
6360    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
6361        let kind = node.kind(db);
6362        assert_eq!(
6363            kind,
6364            SyntaxKind::ExprClosure,
6365            "Unexpected SyntaxKind {:?}. Expected {:?}.",
6366            kind,
6367            SyntaxKind::ExprClosure
6368        );
6369        let children = db.get_children(node.clone());
6370        Self { node, children }
6371    }
6372    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
6373        let kind = node.kind(db);
6374        if kind == SyntaxKind::ExprClosure { Some(Self::from_syntax_node(db, node)) } else { None }
6375    }
6376    fn as_syntax_node(&self) -> SyntaxNode {
6377        self.node.clone()
6378    }
6379    fn stable_ptr(&self) -> Self::StablePtr {
6380        ExprClosurePtr(self.node.0.stable_ptr)
6381    }
6382}
6383impl From<&ExprClosure> for SyntaxStablePtrId {
6384    fn from(node: &ExprClosure) -> Self {
6385        node.stable_ptr().untyped()
6386    }
6387}
6388#[derive(Clone, Debug, Eq, Hash, PartialEq)]
6389pub enum ClosureParamWrapper {
6390    Nullary(TerminalOrOr),
6391    NAry(ClosureParamWrapperNAry),
6392}
6393#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
6394pub struct ClosureParamWrapperPtr(pub SyntaxStablePtrId);
6395impl TypedStablePtr for ClosureParamWrapperPtr {
6396    type SyntaxNode = ClosureParamWrapper;
6397    fn untyped(&self) -> SyntaxStablePtrId {
6398        self.0
6399    }
6400    fn lookup(&self, db: &dyn SyntaxGroup) -> ClosureParamWrapper {
6401        ClosureParamWrapper::from_syntax_node(db, self.0.lookup(db))
6402    }
6403}
6404impl From<ClosureParamWrapperPtr> for SyntaxStablePtrId {
6405    fn from(ptr: ClosureParamWrapperPtr) -> Self {
6406        ptr.untyped()
6407    }
6408}
6409impl From<TerminalOrOrPtr> for ClosureParamWrapperPtr {
6410    fn from(value: TerminalOrOrPtr) -> Self {
6411        Self(value.0)
6412    }
6413}
6414impl From<ClosureParamWrapperNAryPtr> for ClosureParamWrapperPtr {
6415    fn from(value: ClosureParamWrapperNAryPtr) -> Self {
6416        Self(value.0)
6417    }
6418}
6419impl From<TerminalOrOrGreen> for ClosureParamWrapperGreen {
6420    fn from(value: TerminalOrOrGreen) -> Self {
6421        Self(value.0)
6422    }
6423}
6424impl From<ClosureParamWrapperNAryGreen> for ClosureParamWrapperGreen {
6425    fn from(value: ClosureParamWrapperNAryGreen) -> Self {
6426        Self(value.0)
6427    }
6428}
6429#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
6430pub struct ClosureParamWrapperGreen(pub GreenId);
6431impl TypedSyntaxNode for ClosureParamWrapper {
6432    const OPTIONAL_KIND: Option<SyntaxKind> = None;
6433    type StablePtr = ClosureParamWrapperPtr;
6434    type Green = ClosureParamWrapperGreen;
6435    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
6436        panic!("No missing variant.");
6437    }
6438    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
6439        let kind = node.kind(db);
6440        match kind {
6441            SyntaxKind::TerminalOrOr => {
6442                ClosureParamWrapper::Nullary(TerminalOrOr::from_syntax_node(db, node))
6443            }
6444            SyntaxKind::ClosureParamWrapperNAry => {
6445                ClosureParamWrapper::NAry(ClosureParamWrapperNAry::from_syntax_node(db, node))
6446            }
6447            _ => panic!(
6448                "Unexpected syntax kind {:?} when constructing {}.",
6449                kind, "ClosureParamWrapper"
6450            ),
6451        }
6452    }
6453    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
6454        let kind = node.kind(db);
6455        match kind {
6456            SyntaxKind::TerminalOrOr => {
6457                Some(ClosureParamWrapper::Nullary(TerminalOrOr::from_syntax_node(db, node)))
6458            }
6459            SyntaxKind::ClosureParamWrapperNAry => {
6460                Some(ClosureParamWrapper::NAry(ClosureParamWrapperNAry::from_syntax_node(db, node)))
6461            }
6462            _ => None,
6463        }
6464    }
6465    fn as_syntax_node(&self) -> SyntaxNode {
6466        match self {
6467            ClosureParamWrapper::Nullary(x) => x.as_syntax_node(),
6468            ClosureParamWrapper::NAry(x) => x.as_syntax_node(),
6469        }
6470    }
6471    fn stable_ptr(&self) -> Self::StablePtr {
6472        ClosureParamWrapperPtr(self.as_syntax_node().0.stable_ptr)
6473    }
6474}
6475impl From<&ClosureParamWrapper> for SyntaxStablePtrId {
6476    fn from(node: &ClosureParamWrapper) -> Self {
6477        node.stable_ptr().untyped()
6478    }
6479}
6480impl ClosureParamWrapper {
6481    /// Checks if a kind of a variant of [ClosureParamWrapper].
6482    pub fn is_variant(kind: SyntaxKind) -> bool {
6483        matches!(kind, SyntaxKind::TerminalOrOr | SyntaxKind::ClosureParamWrapperNAry)
6484    }
6485}
6486#[derive(Clone, Debug, Eq, Hash, PartialEq)]
6487pub struct ClosureParamWrapperNAry {
6488    node: SyntaxNode,
6489    children: Arc<[SyntaxNode]>,
6490}
6491impl ClosureParamWrapperNAry {
6492    pub const INDEX_LEFTOR: usize = 0;
6493    pub const INDEX_PARAMS: usize = 1;
6494    pub const INDEX_RIGHTOR: usize = 2;
6495    pub fn new_green(
6496        db: &dyn SyntaxGroup,
6497        leftor: TerminalOrGreen,
6498        params: ParamListGreen,
6499        rightor: TerminalOrGreen,
6500    ) -> ClosureParamWrapperNAryGreen {
6501        let children: Vec<GreenId> = vec![leftor.0, params.0, rightor.0];
6502        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
6503        ClosureParamWrapperNAryGreen(
6504            Arc::new(GreenNode {
6505                kind: SyntaxKind::ClosureParamWrapperNAry,
6506                details: GreenNodeDetails::Node { children, width },
6507            })
6508            .intern(db),
6509        )
6510    }
6511}
6512impl ClosureParamWrapperNAry {
6513    pub fn leftor(&self, db: &dyn SyntaxGroup) -> TerminalOr {
6514        TerminalOr::from_syntax_node(db, self.children[0].clone())
6515    }
6516    pub fn params(&self, db: &dyn SyntaxGroup) -> ParamList {
6517        ParamList::from_syntax_node(db, self.children[1].clone())
6518    }
6519    pub fn rightor(&self, db: &dyn SyntaxGroup) -> TerminalOr {
6520        TerminalOr::from_syntax_node(db, self.children[2].clone())
6521    }
6522}
6523#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
6524pub struct ClosureParamWrapperNAryPtr(pub SyntaxStablePtrId);
6525impl ClosureParamWrapperNAryPtr {}
6526impl TypedStablePtr for ClosureParamWrapperNAryPtr {
6527    type SyntaxNode = ClosureParamWrapperNAry;
6528    fn untyped(&self) -> SyntaxStablePtrId {
6529        self.0
6530    }
6531    fn lookup(&self, db: &dyn SyntaxGroup) -> ClosureParamWrapperNAry {
6532        ClosureParamWrapperNAry::from_syntax_node(db, self.0.lookup(db))
6533    }
6534}
6535impl From<ClosureParamWrapperNAryPtr> for SyntaxStablePtrId {
6536    fn from(ptr: ClosureParamWrapperNAryPtr) -> Self {
6537        ptr.untyped()
6538    }
6539}
6540#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
6541pub struct ClosureParamWrapperNAryGreen(pub GreenId);
6542impl TypedSyntaxNode for ClosureParamWrapperNAry {
6543    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ClosureParamWrapperNAry);
6544    type StablePtr = ClosureParamWrapperNAryPtr;
6545    type Green = ClosureParamWrapperNAryGreen;
6546    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
6547        ClosureParamWrapperNAryGreen(
6548            Arc::new(GreenNode {
6549                kind: SyntaxKind::ClosureParamWrapperNAry,
6550                details: GreenNodeDetails::Node {
6551                    children: vec![
6552                        TerminalOr::missing(db).0,
6553                        ParamList::missing(db).0,
6554                        TerminalOr::missing(db).0,
6555                    ],
6556                    width: TextWidth::default(),
6557                },
6558            })
6559            .intern(db),
6560        )
6561    }
6562    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
6563        let kind = node.kind(db);
6564        assert_eq!(
6565            kind,
6566            SyntaxKind::ClosureParamWrapperNAry,
6567            "Unexpected SyntaxKind {:?}. Expected {:?}.",
6568            kind,
6569            SyntaxKind::ClosureParamWrapperNAry
6570        );
6571        let children = db.get_children(node.clone());
6572        Self { node, children }
6573    }
6574    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
6575        let kind = node.kind(db);
6576        if kind == SyntaxKind::ClosureParamWrapperNAry {
6577            Some(Self::from_syntax_node(db, node))
6578        } else {
6579            None
6580        }
6581    }
6582    fn as_syntax_node(&self) -> SyntaxNode {
6583        self.node.clone()
6584    }
6585    fn stable_ptr(&self) -> Self::StablePtr {
6586        ClosureParamWrapperNAryPtr(self.node.0.stable_ptr)
6587    }
6588}
6589impl From<&ClosureParamWrapperNAry> for SyntaxStablePtrId {
6590    fn from(node: &ClosureParamWrapperNAry) -> Self {
6591        node.stable_ptr().untyped()
6592    }
6593}
6594#[derive(Clone, Debug, Eq, Hash, PartialEq)]
6595pub struct StructArgExpr {
6596    node: SyntaxNode,
6597    children: Arc<[SyntaxNode]>,
6598}
6599impl StructArgExpr {
6600    pub const INDEX_COLON: usize = 0;
6601    pub const INDEX_EXPR: usize = 1;
6602    pub fn new_green(
6603        db: &dyn SyntaxGroup,
6604        colon: TerminalColonGreen,
6605        expr: ExprGreen,
6606    ) -> StructArgExprGreen {
6607        let children: Vec<GreenId> = vec![colon.0, expr.0];
6608        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
6609        StructArgExprGreen(
6610            Arc::new(GreenNode {
6611                kind: SyntaxKind::StructArgExpr,
6612                details: GreenNodeDetails::Node { children, width },
6613            })
6614            .intern(db),
6615        )
6616    }
6617}
6618impl StructArgExpr {
6619    pub fn colon(&self, db: &dyn SyntaxGroup) -> TerminalColon {
6620        TerminalColon::from_syntax_node(db, self.children[0].clone())
6621    }
6622    pub fn expr(&self, db: &dyn SyntaxGroup) -> Expr {
6623        Expr::from_syntax_node(db, self.children[1].clone())
6624    }
6625}
6626#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
6627pub struct StructArgExprPtr(pub SyntaxStablePtrId);
6628impl StructArgExprPtr {}
6629impl TypedStablePtr for StructArgExprPtr {
6630    type SyntaxNode = StructArgExpr;
6631    fn untyped(&self) -> SyntaxStablePtrId {
6632        self.0
6633    }
6634    fn lookup(&self, db: &dyn SyntaxGroup) -> StructArgExpr {
6635        StructArgExpr::from_syntax_node(db, self.0.lookup(db))
6636    }
6637}
6638impl From<StructArgExprPtr> for SyntaxStablePtrId {
6639    fn from(ptr: StructArgExprPtr) -> Self {
6640        ptr.untyped()
6641    }
6642}
6643#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
6644pub struct StructArgExprGreen(pub GreenId);
6645impl TypedSyntaxNode for StructArgExpr {
6646    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StructArgExpr);
6647    type StablePtr = StructArgExprPtr;
6648    type Green = StructArgExprGreen;
6649    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
6650        StructArgExprGreen(
6651            Arc::new(GreenNode {
6652                kind: SyntaxKind::StructArgExpr,
6653                details: GreenNodeDetails::Node {
6654                    children: vec![TerminalColon::missing(db).0, Expr::missing(db).0],
6655                    width: TextWidth::default(),
6656                },
6657            })
6658            .intern(db),
6659        )
6660    }
6661    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
6662        let kind = node.kind(db);
6663        assert_eq!(
6664            kind,
6665            SyntaxKind::StructArgExpr,
6666            "Unexpected SyntaxKind {:?}. Expected {:?}.",
6667            kind,
6668            SyntaxKind::StructArgExpr
6669        );
6670        let children = db.get_children(node.clone());
6671        Self { node, children }
6672    }
6673    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
6674        let kind = node.kind(db);
6675        if kind == SyntaxKind::StructArgExpr {
6676            Some(Self::from_syntax_node(db, node))
6677        } else {
6678            None
6679        }
6680    }
6681    fn as_syntax_node(&self) -> SyntaxNode {
6682        self.node.clone()
6683    }
6684    fn stable_ptr(&self) -> Self::StablePtr {
6685        StructArgExprPtr(self.node.0.stable_ptr)
6686    }
6687}
6688impl From<&StructArgExpr> for SyntaxStablePtrId {
6689    fn from(node: &StructArgExpr) -> Self {
6690        node.stable_ptr().untyped()
6691    }
6692}
6693#[derive(Clone, Debug, Eq, Hash, PartialEq)]
6694pub enum OptionStructArgExpr {
6695    Empty(OptionStructArgExprEmpty),
6696    StructArgExpr(StructArgExpr),
6697}
6698#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
6699pub struct OptionStructArgExprPtr(pub SyntaxStablePtrId);
6700impl TypedStablePtr for OptionStructArgExprPtr {
6701    type SyntaxNode = OptionStructArgExpr;
6702    fn untyped(&self) -> SyntaxStablePtrId {
6703        self.0
6704    }
6705    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionStructArgExpr {
6706        OptionStructArgExpr::from_syntax_node(db, self.0.lookup(db))
6707    }
6708}
6709impl From<OptionStructArgExprPtr> for SyntaxStablePtrId {
6710    fn from(ptr: OptionStructArgExprPtr) -> Self {
6711        ptr.untyped()
6712    }
6713}
6714impl From<OptionStructArgExprEmptyPtr> for OptionStructArgExprPtr {
6715    fn from(value: OptionStructArgExprEmptyPtr) -> Self {
6716        Self(value.0)
6717    }
6718}
6719impl From<StructArgExprPtr> for OptionStructArgExprPtr {
6720    fn from(value: StructArgExprPtr) -> Self {
6721        Self(value.0)
6722    }
6723}
6724impl From<OptionStructArgExprEmptyGreen> for OptionStructArgExprGreen {
6725    fn from(value: OptionStructArgExprEmptyGreen) -> Self {
6726        Self(value.0)
6727    }
6728}
6729impl From<StructArgExprGreen> for OptionStructArgExprGreen {
6730    fn from(value: StructArgExprGreen) -> Self {
6731        Self(value.0)
6732    }
6733}
6734#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
6735pub struct OptionStructArgExprGreen(pub GreenId);
6736impl TypedSyntaxNode for OptionStructArgExpr {
6737    const OPTIONAL_KIND: Option<SyntaxKind> = None;
6738    type StablePtr = OptionStructArgExprPtr;
6739    type Green = OptionStructArgExprGreen;
6740    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
6741        panic!("No missing variant.");
6742    }
6743    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
6744        let kind = node.kind(db);
6745        match kind {
6746            SyntaxKind::OptionStructArgExprEmpty => {
6747                OptionStructArgExpr::Empty(OptionStructArgExprEmpty::from_syntax_node(db, node))
6748            }
6749            SyntaxKind::StructArgExpr => {
6750                OptionStructArgExpr::StructArgExpr(StructArgExpr::from_syntax_node(db, node))
6751            }
6752            _ => panic!(
6753                "Unexpected syntax kind {:?} when constructing {}.",
6754                kind, "OptionStructArgExpr"
6755            ),
6756        }
6757    }
6758    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
6759        let kind = node.kind(db);
6760        match kind {
6761            SyntaxKind::OptionStructArgExprEmpty => Some(OptionStructArgExpr::Empty(
6762                OptionStructArgExprEmpty::from_syntax_node(db, node),
6763            )),
6764            SyntaxKind::StructArgExpr => {
6765                Some(OptionStructArgExpr::StructArgExpr(StructArgExpr::from_syntax_node(db, node)))
6766            }
6767            _ => None,
6768        }
6769    }
6770    fn as_syntax_node(&self) -> SyntaxNode {
6771        match self {
6772            OptionStructArgExpr::Empty(x) => x.as_syntax_node(),
6773            OptionStructArgExpr::StructArgExpr(x) => x.as_syntax_node(),
6774        }
6775    }
6776    fn stable_ptr(&self) -> Self::StablePtr {
6777        OptionStructArgExprPtr(self.as_syntax_node().0.stable_ptr)
6778    }
6779}
6780impl From<&OptionStructArgExpr> for SyntaxStablePtrId {
6781    fn from(node: &OptionStructArgExpr) -> Self {
6782        node.stable_ptr().untyped()
6783    }
6784}
6785impl OptionStructArgExpr {
6786    /// Checks if a kind of a variant of [OptionStructArgExpr].
6787    pub fn is_variant(kind: SyntaxKind) -> bool {
6788        matches!(kind, SyntaxKind::OptionStructArgExprEmpty | SyntaxKind::StructArgExpr)
6789    }
6790}
6791#[derive(Clone, Debug, Eq, Hash, PartialEq)]
6792pub struct OptionStructArgExprEmpty {
6793    node: SyntaxNode,
6794    children: Arc<[SyntaxNode]>,
6795}
6796impl OptionStructArgExprEmpty {
6797    pub fn new_green(db: &dyn SyntaxGroup) -> OptionStructArgExprEmptyGreen {
6798        let children: Vec<GreenId> = vec![];
6799        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
6800        OptionStructArgExprEmptyGreen(
6801            Arc::new(GreenNode {
6802                kind: SyntaxKind::OptionStructArgExprEmpty,
6803                details: GreenNodeDetails::Node { children, width },
6804            })
6805            .intern(db),
6806        )
6807    }
6808}
6809impl OptionStructArgExprEmpty {}
6810#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
6811pub struct OptionStructArgExprEmptyPtr(pub SyntaxStablePtrId);
6812impl OptionStructArgExprEmptyPtr {}
6813impl TypedStablePtr for OptionStructArgExprEmptyPtr {
6814    type SyntaxNode = OptionStructArgExprEmpty;
6815    fn untyped(&self) -> SyntaxStablePtrId {
6816        self.0
6817    }
6818    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionStructArgExprEmpty {
6819        OptionStructArgExprEmpty::from_syntax_node(db, self.0.lookup(db))
6820    }
6821}
6822impl From<OptionStructArgExprEmptyPtr> for SyntaxStablePtrId {
6823    fn from(ptr: OptionStructArgExprEmptyPtr) -> Self {
6824        ptr.untyped()
6825    }
6826}
6827#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
6828pub struct OptionStructArgExprEmptyGreen(pub GreenId);
6829impl TypedSyntaxNode for OptionStructArgExprEmpty {
6830    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionStructArgExprEmpty);
6831    type StablePtr = OptionStructArgExprEmptyPtr;
6832    type Green = OptionStructArgExprEmptyGreen;
6833    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
6834        OptionStructArgExprEmptyGreen(
6835            Arc::new(GreenNode {
6836                kind: SyntaxKind::OptionStructArgExprEmpty,
6837                details: GreenNodeDetails::Node { children: vec![], width: TextWidth::default() },
6838            })
6839            .intern(db),
6840        )
6841    }
6842    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
6843        let kind = node.kind(db);
6844        assert_eq!(
6845            kind,
6846            SyntaxKind::OptionStructArgExprEmpty,
6847            "Unexpected SyntaxKind {:?}. Expected {:?}.",
6848            kind,
6849            SyntaxKind::OptionStructArgExprEmpty
6850        );
6851        let children = db.get_children(node.clone());
6852        Self { node, children }
6853    }
6854    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
6855        let kind = node.kind(db);
6856        if kind == SyntaxKind::OptionStructArgExprEmpty {
6857            Some(Self::from_syntax_node(db, node))
6858        } else {
6859            None
6860        }
6861    }
6862    fn as_syntax_node(&self) -> SyntaxNode {
6863        self.node.clone()
6864    }
6865    fn stable_ptr(&self) -> Self::StablePtr {
6866        OptionStructArgExprEmptyPtr(self.node.0.stable_ptr)
6867    }
6868}
6869impl From<&OptionStructArgExprEmpty> for SyntaxStablePtrId {
6870    fn from(node: &OptionStructArgExprEmpty) -> Self {
6871        node.stable_ptr().untyped()
6872    }
6873}
6874#[derive(Clone, Debug, Eq, Hash, PartialEq)]
6875pub struct StructArgSingle {
6876    node: SyntaxNode,
6877    children: Arc<[SyntaxNode]>,
6878}
6879impl StructArgSingle {
6880    pub const INDEX_IDENTIFIER: usize = 0;
6881    pub const INDEX_ARG_EXPR: usize = 1;
6882    pub fn new_green(
6883        db: &dyn SyntaxGroup,
6884        identifier: TerminalIdentifierGreen,
6885        arg_expr: OptionStructArgExprGreen,
6886    ) -> StructArgSingleGreen {
6887        let children: Vec<GreenId> = vec![identifier.0, arg_expr.0];
6888        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
6889        StructArgSingleGreen(
6890            Arc::new(GreenNode {
6891                kind: SyntaxKind::StructArgSingle,
6892                details: GreenNodeDetails::Node { children, width },
6893            })
6894            .intern(db),
6895        )
6896    }
6897}
6898impl StructArgSingle {
6899    pub fn identifier(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier {
6900        TerminalIdentifier::from_syntax_node(db, self.children[0].clone())
6901    }
6902    pub fn arg_expr(&self, db: &dyn SyntaxGroup) -> OptionStructArgExpr {
6903        OptionStructArgExpr::from_syntax_node(db, self.children[1].clone())
6904    }
6905}
6906#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
6907pub struct StructArgSinglePtr(pub SyntaxStablePtrId);
6908impl StructArgSinglePtr {
6909    pub fn identifier_green(self, db: &dyn SyntaxGroup) -> TerminalIdentifierGreen {
6910        let ptr = self.0.lookup_intern(db);
6911        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
6912            TerminalIdentifierGreen(key_fields[0])
6913        } else {
6914            panic!("Unexpected key field query on root.");
6915        }
6916    }
6917}
6918impl TypedStablePtr for StructArgSinglePtr {
6919    type SyntaxNode = StructArgSingle;
6920    fn untyped(&self) -> SyntaxStablePtrId {
6921        self.0
6922    }
6923    fn lookup(&self, db: &dyn SyntaxGroup) -> StructArgSingle {
6924        StructArgSingle::from_syntax_node(db, self.0.lookup(db))
6925    }
6926}
6927impl From<StructArgSinglePtr> for SyntaxStablePtrId {
6928    fn from(ptr: StructArgSinglePtr) -> Self {
6929        ptr.untyped()
6930    }
6931}
6932#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
6933pub struct StructArgSingleGreen(pub GreenId);
6934impl TypedSyntaxNode for StructArgSingle {
6935    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StructArgSingle);
6936    type StablePtr = StructArgSinglePtr;
6937    type Green = StructArgSingleGreen;
6938    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
6939        StructArgSingleGreen(
6940            Arc::new(GreenNode {
6941                kind: SyntaxKind::StructArgSingle,
6942                details: GreenNodeDetails::Node {
6943                    children: vec![
6944                        TerminalIdentifier::missing(db).0,
6945                        OptionStructArgExpr::missing(db).0,
6946                    ],
6947                    width: TextWidth::default(),
6948                },
6949            })
6950            .intern(db),
6951        )
6952    }
6953    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
6954        let kind = node.kind(db);
6955        assert_eq!(
6956            kind,
6957            SyntaxKind::StructArgSingle,
6958            "Unexpected SyntaxKind {:?}. Expected {:?}.",
6959            kind,
6960            SyntaxKind::StructArgSingle
6961        );
6962        let children = db.get_children(node.clone());
6963        Self { node, children }
6964    }
6965    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
6966        let kind = node.kind(db);
6967        if kind == SyntaxKind::StructArgSingle {
6968            Some(Self::from_syntax_node(db, node))
6969        } else {
6970            None
6971        }
6972    }
6973    fn as_syntax_node(&self) -> SyntaxNode {
6974        self.node.clone()
6975    }
6976    fn stable_ptr(&self) -> Self::StablePtr {
6977        StructArgSinglePtr(self.node.0.stable_ptr)
6978    }
6979}
6980impl From<&StructArgSingle> for SyntaxStablePtrId {
6981    fn from(node: &StructArgSingle) -> Self {
6982        node.stable_ptr().untyped()
6983    }
6984}
6985#[derive(Clone, Debug, Eq, Hash, PartialEq)]
6986pub struct StructArgTail {
6987    node: SyntaxNode,
6988    children: Arc<[SyntaxNode]>,
6989}
6990impl StructArgTail {
6991    pub const INDEX_DOTDOT: usize = 0;
6992    pub const INDEX_EXPRESSION: usize = 1;
6993    pub fn new_green(
6994        db: &dyn SyntaxGroup,
6995        dotdot: TerminalDotDotGreen,
6996        expression: ExprGreen,
6997    ) -> StructArgTailGreen {
6998        let children: Vec<GreenId> = vec![dotdot.0, expression.0];
6999        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
7000        StructArgTailGreen(
7001            Arc::new(GreenNode {
7002                kind: SyntaxKind::StructArgTail,
7003                details: GreenNodeDetails::Node { children, width },
7004            })
7005            .intern(db),
7006        )
7007    }
7008}
7009impl StructArgTail {
7010    pub fn dotdot(&self, db: &dyn SyntaxGroup) -> TerminalDotDot {
7011        TerminalDotDot::from_syntax_node(db, self.children[0].clone())
7012    }
7013    pub fn expression(&self, db: &dyn SyntaxGroup) -> Expr {
7014        Expr::from_syntax_node(db, self.children[1].clone())
7015    }
7016}
7017#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
7018pub struct StructArgTailPtr(pub SyntaxStablePtrId);
7019impl StructArgTailPtr {}
7020impl TypedStablePtr for StructArgTailPtr {
7021    type SyntaxNode = StructArgTail;
7022    fn untyped(&self) -> SyntaxStablePtrId {
7023        self.0
7024    }
7025    fn lookup(&self, db: &dyn SyntaxGroup) -> StructArgTail {
7026        StructArgTail::from_syntax_node(db, self.0.lookup(db))
7027    }
7028}
7029impl From<StructArgTailPtr> for SyntaxStablePtrId {
7030    fn from(ptr: StructArgTailPtr) -> Self {
7031        ptr.untyped()
7032    }
7033}
7034#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
7035pub struct StructArgTailGreen(pub GreenId);
7036impl TypedSyntaxNode for StructArgTail {
7037    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StructArgTail);
7038    type StablePtr = StructArgTailPtr;
7039    type Green = StructArgTailGreen;
7040    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
7041        StructArgTailGreen(
7042            Arc::new(GreenNode {
7043                kind: SyntaxKind::StructArgTail,
7044                details: GreenNodeDetails::Node {
7045                    children: vec![TerminalDotDot::missing(db).0, Expr::missing(db).0],
7046                    width: TextWidth::default(),
7047                },
7048            })
7049            .intern(db),
7050        )
7051    }
7052    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
7053        let kind = node.kind(db);
7054        assert_eq!(
7055            kind,
7056            SyntaxKind::StructArgTail,
7057            "Unexpected SyntaxKind {:?}. Expected {:?}.",
7058            kind,
7059            SyntaxKind::StructArgTail
7060        );
7061        let children = db.get_children(node.clone());
7062        Self { node, children }
7063    }
7064    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
7065        let kind = node.kind(db);
7066        if kind == SyntaxKind::StructArgTail {
7067            Some(Self::from_syntax_node(db, node))
7068        } else {
7069            None
7070        }
7071    }
7072    fn as_syntax_node(&self) -> SyntaxNode {
7073        self.node.clone()
7074    }
7075    fn stable_ptr(&self) -> Self::StablePtr {
7076        StructArgTailPtr(self.node.0.stable_ptr)
7077    }
7078}
7079impl From<&StructArgTail> for SyntaxStablePtrId {
7080    fn from(node: &StructArgTail) -> Self {
7081        node.stable_ptr().untyped()
7082    }
7083}
7084#[derive(Clone, Debug, Eq, Hash, PartialEq)]
7085pub enum StructArg {
7086    StructArgSingle(StructArgSingle),
7087    StructArgTail(StructArgTail),
7088}
7089#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
7090pub struct StructArgPtr(pub SyntaxStablePtrId);
7091impl TypedStablePtr for StructArgPtr {
7092    type SyntaxNode = StructArg;
7093    fn untyped(&self) -> SyntaxStablePtrId {
7094        self.0
7095    }
7096    fn lookup(&self, db: &dyn SyntaxGroup) -> StructArg {
7097        StructArg::from_syntax_node(db, self.0.lookup(db))
7098    }
7099}
7100impl From<StructArgPtr> for SyntaxStablePtrId {
7101    fn from(ptr: StructArgPtr) -> Self {
7102        ptr.untyped()
7103    }
7104}
7105impl From<StructArgSinglePtr> for StructArgPtr {
7106    fn from(value: StructArgSinglePtr) -> Self {
7107        Self(value.0)
7108    }
7109}
7110impl From<StructArgTailPtr> for StructArgPtr {
7111    fn from(value: StructArgTailPtr) -> Self {
7112        Self(value.0)
7113    }
7114}
7115impl From<StructArgSingleGreen> for StructArgGreen {
7116    fn from(value: StructArgSingleGreen) -> Self {
7117        Self(value.0)
7118    }
7119}
7120impl From<StructArgTailGreen> for StructArgGreen {
7121    fn from(value: StructArgTailGreen) -> Self {
7122        Self(value.0)
7123    }
7124}
7125#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
7126pub struct StructArgGreen(pub GreenId);
7127impl TypedSyntaxNode for StructArg {
7128    const OPTIONAL_KIND: Option<SyntaxKind> = None;
7129    type StablePtr = StructArgPtr;
7130    type Green = StructArgGreen;
7131    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
7132        panic!("No missing variant.");
7133    }
7134    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
7135        let kind = node.kind(db);
7136        match kind {
7137            SyntaxKind::StructArgSingle => {
7138                StructArg::StructArgSingle(StructArgSingle::from_syntax_node(db, node))
7139            }
7140            SyntaxKind::StructArgTail => {
7141                StructArg::StructArgTail(StructArgTail::from_syntax_node(db, node))
7142            }
7143            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "StructArg"),
7144        }
7145    }
7146    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
7147        let kind = node.kind(db);
7148        match kind {
7149            SyntaxKind::StructArgSingle => {
7150                Some(StructArg::StructArgSingle(StructArgSingle::from_syntax_node(db, node)))
7151            }
7152            SyntaxKind::StructArgTail => {
7153                Some(StructArg::StructArgTail(StructArgTail::from_syntax_node(db, node)))
7154            }
7155            _ => None,
7156        }
7157    }
7158    fn as_syntax_node(&self) -> SyntaxNode {
7159        match self {
7160            StructArg::StructArgSingle(x) => x.as_syntax_node(),
7161            StructArg::StructArgTail(x) => x.as_syntax_node(),
7162        }
7163    }
7164    fn stable_ptr(&self) -> Self::StablePtr {
7165        StructArgPtr(self.as_syntax_node().0.stable_ptr)
7166    }
7167}
7168impl From<&StructArg> for SyntaxStablePtrId {
7169    fn from(node: &StructArg) -> Self {
7170        node.stable_ptr().untyped()
7171    }
7172}
7173impl StructArg {
7174    /// Checks if a kind of a variant of [StructArg].
7175    pub fn is_variant(kind: SyntaxKind) -> bool {
7176        matches!(kind, SyntaxKind::StructArgSingle | SyntaxKind::StructArgTail)
7177    }
7178}
7179#[derive(Clone, Debug, Eq, Hash, PartialEq)]
7180pub struct StructArgList(ElementList<StructArg, 2>);
7181impl Deref for StructArgList {
7182    type Target = ElementList<StructArg, 2>;
7183    fn deref(&self) -> &Self::Target {
7184        &self.0
7185    }
7186}
7187impl StructArgList {
7188    pub fn new_green(
7189        db: &dyn SyntaxGroup,
7190        children: Vec<StructArgListElementOrSeparatorGreen>,
7191    ) -> StructArgListGreen {
7192        let width = children.iter().map(|id| id.id().lookup_intern(db).width()).sum();
7193        StructArgListGreen(
7194            Arc::new(GreenNode {
7195                kind: SyntaxKind::StructArgList,
7196                details: GreenNodeDetails::Node {
7197                    children: children.iter().map(|x| x.id()).collect(),
7198                    width,
7199                },
7200            })
7201            .intern(db),
7202        )
7203    }
7204}
7205#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
7206pub struct StructArgListPtr(pub SyntaxStablePtrId);
7207impl TypedStablePtr for StructArgListPtr {
7208    type SyntaxNode = StructArgList;
7209    fn untyped(&self) -> SyntaxStablePtrId {
7210        self.0
7211    }
7212    fn lookup(&self, db: &dyn SyntaxGroup) -> StructArgList {
7213        StructArgList::from_syntax_node(db, self.0.lookup(db))
7214    }
7215}
7216impl From<StructArgListPtr> for SyntaxStablePtrId {
7217    fn from(ptr: StructArgListPtr) -> Self {
7218        ptr.untyped()
7219    }
7220}
7221#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
7222pub enum StructArgListElementOrSeparatorGreen {
7223    Separator(TerminalCommaGreen),
7224    Element(StructArgGreen),
7225}
7226impl From<TerminalCommaGreen> for StructArgListElementOrSeparatorGreen {
7227    fn from(value: TerminalCommaGreen) -> Self {
7228        StructArgListElementOrSeparatorGreen::Separator(value)
7229    }
7230}
7231impl From<StructArgGreen> for StructArgListElementOrSeparatorGreen {
7232    fn from(value: StructArgGreen) -> Self {
7233        StructArgListElementOrSeparatorGreen::Element(value)
7234    }
7235}
7236impl StructArgListElementOrSeparatorGreen {
7237    fn id(&self) -> GreenId {
7238        match self {
7239            StructArgListElementOrSeparatorGreen::Separator(green) => green.0,
7240            StructArgListElementOrSeparatorGreen::Element(green) => green.0,
7241        }
7242    }
7243}
7244#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
7245pub struct StructArgListGreen(pub GreenId);
7246impl TypedSyntaxNode for StructArgList {
7247    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StructArgList);
7248    type StablePtr = StructArgListPtr;
7249    type Green = StructArgListGreen;
7250    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
7251        StructArgListGreen(
7252            Arc::new(GreenNode {
7253                kind: SyntaxKind::StructArgList,
7254                details: GreenNodeDetails::Node { children: vec![], width: TextWidth::default() },
7255            })
7256            .intern(db),
7257        )
7258    }
7259    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
7260        Self(ElementList::new(node))
7261    }
7262    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
7263        if node.kind(db) == SyntaxKind::StructArgList {
7264            Some(Self(ElementList::new(node)))
7265        } else {
7266            None
7267        }
7268    }
7269    fn as_syntax_node(&self) -> SyntaxNode {
7270        self.node.clone()
7271    }
7272    fn stable_ptr(&self) -> Self::StablePtr {
7273        StructArgListPtr(self.node.0.stable_ptr)
7274    }
7275}
7276impl From<&StructArgList> for SyntaxStablePtrId {
7277    fn from(node: &StructArgList) -> Self {
7278        node.stable_ptr().untyped()
7279    }
7280}
7281#[derive(Clone, Debug, Eq, Hash, PartialEq)]
7282pub struct ArgListBraced {
7283    node: SyntaxNode,
7284    children: Arc<[SyntaxNode]>,
7285}
7286impl ArgListBraced {
7287    pub const INDEX_LBRACE: usize = 0;
7288    pub const INDEX_ARGUMENTS: usize = 1;
7289    pub const INDEX_RBRACE: usize = 2;
7290    pub fn new_green(
7291        db: &dyn SyntaxGroup,
7292        lbrace: TerminalLBraceGreen,
7293        arguments: ArgListGreen,
7294        rbrace: TerminalRBraceGreen,
7295    ) -> ArgListBracedGreen {
7296        let children: Vec<GreenId> = vec![lbrace.0, arguments.0, rbrace.0];
7297        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
7298        ArgListBracedGreen(
7299            Arc::new(GreenNode {
7300                kind: SyntaxKind::ArgListBraced,
7301                details: GreenNodeDetails::Node { children, width },
7302            })
7303            .intern(db),
7304        )
7305    }
7306}
7307impl ArgListBraced {
7308    pub fn lbrace(&self, db: &dyn SyntaxGroup) -> TerminalLBrace {
7309        TerminalLBrace::from_syntax_node(db, self.children[0].clone())
7310    }
7311    pub fn arguments(&self, db: &dyn SyntaxGroup) -> ArgList {
7312        ArgList::from_syntax_node(db, self.children[1].clone())
7313    }
7314    pub fn rbrace(&self, db: &dyn SyntaxGroup) -> TerminalRBrace {
7315        TerminalRBrace::from_syntax_node(db, self.children[2].clone())
7316    }
7317}
7318#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
7319pub struct ArgListBracedPtr(pub SyntaxStablePtrId);
7320impl ArgListBracedPtr {}
7321impl TypedStablePtr for ArgListBracedPtr {
7322    type SyntaxNode = ArgListBraced;
7323    fn untyped(&self) -> SyntaxStablePtrId {
7324        self.0
7325    }
7326    fn lookup(&self, db: &dyn SyntaxGroup) -> ArgListBraced {
7327        ArgListBraced::from_syntax_node(db, self.0.lookup(db))
7328    }
7329}
7330impl From<ArgListBracedPtr> for SyntaxStablePtrId {
7331    fn from(ptr: ArgListBracedPtr) -> Self {
7332        ptr.untyped()
7333    }
7334}
7335#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
7336pub struct ArgListBracedGreen(pub GreenId);
7337impl TypedSyntaxNode for ArgListBraced {
7338    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ArgListBraced);
7339    type StablePtr = ArgListBracedPtr;
7340    type Green = ArgListBracedGreen;
7341    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
7342        ArgListBracedGreen(
7343            Arc::new(GreenNode {
7344                kind: SyntaxKind::ArgListBraced,
7345                details: GreenNodeDetails::Node {
7346                    children: vec![
7347                        TerminalLBrace::missing(db).0,
7348                        ArgList::missing(db).0,
7349                        TerminalRBrace::missing(db).0,
7350                    ],
7351                    width: TextWidth::default(),
7352                },
7353            })
7354            .intern(db),
7355        )
7356    }
7357    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
7358        let kind = node.kind(db);
7359        assert_eq!(
7360            kind,
7361            SyntaxKind::ArgListBraced,
7362            "Unexpected SyntaxKind {:?}. Expected {:?}.",
7363            kind,
7364            SyntaxKind::ArgListBraced
7365        );
7366        let children = db.get_children(node.clone());
7367        Self { node, children }
7368    }
7369    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
7370        let kind = node.kind(db);
7371        if kind == SyntaxKind::ArgListBraced {
7372            Some(Self::from_syntax_node(db, node))
7373        } else {
7374            None
7375        }
7376    }
7377    fn as_syntax_node(&self) -> SyntaxNode {
7378        self.node.clone()
7379    }
7380    fn stable_ptr(&self) -> Self::StablePtr {
7381        ArgListBracedPtr(self.node.0.stable_ptr)
7382    }
7383}
7384impl From<&ArgListBraced> for SyntaxStablePtrId {
7385    fn from(node: &ArgListBraced) -> Self {
7386        node.stable_ptr().untyped()
7387    }
7388}
7389#[derive(Clone, Debug, Eq, Hash, PartialEq)]
7390pub struct ArgListBracketed {
7391    node: SyntaxNode,
7392    children: Arc<[SyntaxNode]>,
7393}
7394impl ArgListBracketed {
7395    pub const INDEX_LBRACK: usize = 0;
7396    pub const INDEX_ARGUMENTS: usize = 1;
7397    pub const INDEX_RBRACK: usize = 2;
7398    pub fn new_green(
7399        db: &dyn SyntaxGroup,
7400        lbrack: TerminalLBrackGreen,
7401        arguments: ArgListGreen,
7402        rbrack: TerminalRBrackGreen,
7403    ) -> ArgListBracketedGreen {
7404        let children: Vec<GreenId> = vec![lbrack.0, arguments.0, rbrack.0];
7405        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
7406        ArgListBracketedGreen(
7407            Arc::new(GreenNode {
7408                kind: SyntaxKind::ArgListBracketed,
7409                details: GreenNodeDetails::Node { children, width },
7410            })
7411            .intern(db),
7412        )
7413    }
7414}
7415impl ArgListBracketed {
7416    pub fn lbrack(&self, db: &dyn SyntaxGroup) -> TerminalLBrack {
7417        TerminalLBrack::from_syntax_node(db, self.children[0].clone())
7418    }
7419    pub fn arguments(&self, db: &dyn SyntaxGroup) -> ArgList {
7420        ArgList::from_syntax_node(db, self.children[1].clone())
7421    }
7422    pub fn rbrack(&self, db: &dyn SyntaxGroup) -> TerminalRBrack {
7423        TerminalRBrack::from_syntax_node(db, self.children[2].clone())
7424    }
7425}
7426#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
7427pub struct ArgListBracketedPtr(pub SyntaxStablePtrId);
7428impl ArgListBracketedPtr {}
7429impl TypedStablePtr for ArgListBracketedPtr {
7430    type SyntaxNode = ArgListBracketed;
7431    fn untyped(&self) -> SyntaxStablePtrId {
7432        self.0
7433    }
7434    fn lookup(&self, db: &dyn SyntaxGroup) -> ArgListBracketed {
7435        ArgListBracketed::from_syntax_node(db, self.0.lookup(db))
7436    }
7437}
7438impl From<ArgListBracketedPtr> for SyntaxStablePtrId {
7439    fn from(ptr: ArgListBracketedPtr) -> Self {
7440        ptr.untyped()
7441    }
7442}
7443#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
7444pub struct ArgListBracketedGreen(pub GreenId);
7445impl TypedSyntaxNode for ArgListBracketed {
7446    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ArgListBracketed);
7447    type StablePtr = ArgListBracketedPtr;
7448    type Green = ArgListBracketedGreen;
7449    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
7450        ArgListBracketedGreen(
7451            Arc::new(GreenNode {
7452                kind: SyntaxKind::ArgListBracketed,
7453                details: GreenNodeDetails::Node {
7454                    children: vec![
7455                        TerminalLBrack::missing(db).0,
7456                        ArgList::missing(db).0,
7457                        TerminalRBrack::missing(db).0,
7458                    ],
7459                    width: TextWidth::default(),
7460                },
7461            })
7462            .intern(db),
7463        )
7464    }
7465    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
7466        let kind = node.kind(db);
7467        assert_eq!(
7468            kind,
7469            SyntaxKind::ArgListBracketed,
7470            "Unexpected SyntaxKind {:?}. Expected {:?}.",
7471            kind,
7472            SyntaxKind::ArgListBracketed
7473        );
7474        let children = db.get_children(node.clone());
7475        Self { node, children }
7476    }
7477    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
7478        let kind = node.kind(db);
7479        if kind == SyntaxKind::ArgListBracketed {
7480            Some(Self::from_syntax_node(db, node))
7481        } else {
7482            None
7483        }
7484    }
7485    fn as_syntax_node(&self) -> SyntaxNode {
7486        self.node.clone()
7487    }
7488    fn stable_ptr(&self) -> Self::StablePtr {
7489        ArgListBracketedPtr(self.node.0.stable_ptr)
7490    }
7491}
7492impl From<&ArgListBracketed> for SyntaxStablePtrId {
7493    fn from(node: &ArgListBracketed) -> Self {
7494        node.stable_ptr().untyped()
7495    }
7496}
7497#[derive(Clone, Debug, Eq, Hash, PartialEq)]
7498pub enum WrappedArgList {
7499    BracketedArgList(ArgListBracketed),
7500    ParenthesizedArgList(ArgListParenthesized),
7501    BracedArgList(ArgListBraced),
7502    Missing(WrappedArgListMissing),
7503}
7504#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
7505pub struct WrappedArgListPtr(pub SyntaxStablePtrId);
7506impl TypedStablePtr for WrappedArgListPtr {
7507    type SyntaxNode = WrappedArgList;
7508    fn untyped(&self) -> SyntaxStablePtrId {
7509        self.0
7510    }
7511    fn lookup(&self, db: &dyn SyntaxGroup) -> WrappedArgList {
7512        WrappedArgList::from_syntax_node(db, self.0.lookup(db))
7513    }
7514}
7515impl From<WrappedArgListPtr> for SyntaxStablePtrId {
7516    fn from(ptr: WrappedArgListPtr) -> Self {
7517        ptr.untyped()
7518    }
7519}
7520impl From<ArgListBracketedPtr> for WrappedArgListPtr {
7521    fn from(value: ArgListBracketedPtr) -> Self {
7522        Self(value.0)
7523    }
7524}
7525impl From<ArgListParenthesizedPtr> for WrappedArgListPtr {
7526    fn from(value: ArgListParenthesizedPtr) -> Self {
7527        Self(value.0)
7528    }
7529}
7530impl From<ArgListBracedPtr> for WrappedArgListPtr {
7531    fn from(value: ArgListBracedPtr) -> Self {
7532        Self(value.0)
7533    }
7534}
7535impl From<WrappedArgListMissingPtr> for WrappedArgListPtr {
7536    fn from(value: WrappedArgListMissingPtr) -> Self {
7537        Self(value.0)
7538    }
7539}
7540impl From<ArgListBracketedGreen> for WrappedArgListGreen {
7541    fn from(value: ArgListBracketedGreen) -> Self {
7542        Self(value.0)
7543    }
7544}
7545impl From<ArgListParenthesizedGreen> for WrappedArgListGreen {
7546    fn from(value: ArgListParenthesizedGreen) -> Self {
7547        Self(value.0)
7548    }
7549}
7550impl From<ArgListBracedGreen> for WrappedArgListGreen {
7551    fn from(value: ArgListBracedGreen) -> Self {
7552        Self(value.0)
7553    }
7554}
7555impl From<WrappedArgListMissingGreen> for WrappedArgListGreen {
7556    fn from(value: WrappedArgListMissingGreen) -> Self {
7557        Self(value.0)
7558    }
7559}
7560#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
7561pub struct WrappedArgListGreen(pub GreenId);
7562impl TypedSyntaxNode for WrappedArgList {
7563    const OPTIONAL_KIND: Option<SyntaxKind> = None;
7564    type StablePtr = WrappedArgListPtr;
7565    type Green = WrappedArgListGreen;
7566    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
7567        WrappedArgListGreen(WrappedArgListMissing::missing(db).0)
7568    }
7569    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
7570        let kind = node.kind(db);
7571        match kind {
7572            SyntaxKind::ArgListBracketed => {
7573                WrappedArgList::BracketedArgList(ArgListBracketed::from_syntax_node(db, node))
7574            }
7575            SyntaxKind::ArgListParenthesized => WrappedArgList::ParenthesizedArgList(
7576                ArgListParenthesized::from_syntax_node(db, node),
7577            ),
7578            SyntaxKind::ArgListBraced => {
7579                WrappedArgList::BracedArgList(ArgListBraced::from_syntax_node(db, node))
7580            }
7581            SyntaxKind::WrappedArgListMissing => {
7582                WrappedArgList::Missing(WrappedArgListMissing::from_syntax_node(db, node))
7583            }
7584            _ => {
7585                panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "WrappedArgList")
7586            }
7587        }
7588    }
7589    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
7590        let kind = node.kind(db);
7591        match kind {
7592            SyntaxKind::ArgListBracketed => {
7593                Some(WrappedArgList::BracketedArgList(ArgListBracketed::from_syntax_node(db, node)))
7594            }
7595            SyntaxKind::ArgListParenthesized => Some(WrappedArgList::ParenthesizedArgList(
7596                ArgListParenthesized::from_syntax_node(db, node),
7597            )),
7598            SyntaxKind::ArgListBraced => {
7599                Some(WrappedArgList::BracedArgList(ArgListBraced::from_syntax_node(db, node)))
7600            }
7601            SyntaxKind::WrappedArgListMissing => {
7602                Some(WrappedArgList::Missing(WrappedArgListMissing::from_syntax_node(db, node)))
7603            }
7604            _ => None,
7605        }
7606    }
7607    fn as_syntax_node(&self) -> SyntaxNode {
7608        match self {
7609            WrappedArgList::BracketedArgList(x) => x.as_syntax_node(),
7610            WrappedArgList::ParenthesizedArgList(x) => x.as_syntax_node(),
7611            WrappedArgList::BracedArgList(x) => x.as_syntax_node(),
7612            WrappedArgList::Missing(x) => x.as_syntax_node(),
7613        }
7614    }
7615    fn stable_ptr(&self) -> Self::StablePtr {
7616        WrappedArgListPtr(self.as_syntax_node().0.stable_ptr)
7617    }
7618}
7619impl From<&WrappedArgList> for SyntaxStablePtrId {
7620    fn from(node: &WrappedArgList) -> Self {
7621        node.stable_ptr().untyped()
7622    }
7623}
7624impl WrappedArgList {
7625    /// Checks if a kind of a variant of [WrappedArgList].
7626    pub fn is_variant(kind: SyntaxKind) -> bool {
7627        matches!(
7628            kind,
7629            SyntaxKind::ArgListBracketed
7630                | SyntaxKind::ArgListParenthesized
7631                | SyntaxKind::ArgListBraced
7632                | SyntaxKind::WrappedArgListMissing
7633        )
7634    }
7635}
7636#[derive(Clone, Debug, Eq, Hash, PartialEq)]
7637pub struct WrappedArgListMissing {
7638    node: SyntaxNode,
7639    children: Arc<[SyntaxNode]>,
7640}
7641impl WrappedArgListMissing {
7642    pub fn new_green(db: &dyn SyntaxGroup) -> WrappedArgListMissingGreen {
7643        let children: Vec<GreenId> = vec![];
7644        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
7645        WrappedArgListMissingGreen(
7646            Arc::new(GreenNode {
7647                kind: SyntaxKind::WrappedArgListMissing,
7648                details: GreenNodeDetails::Node { children, width },
7649            })
7650            .intern(db),
7651        )
7652    }
7653}
7654impl WrappedArgListMissing {}
7655#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
7656pub struct WrappedArgListMissingPtr(pub SyntaxStablePtrId);
7657impl WrappedArgListMissingPtr {}
7658impl TypedStablePtr for WrappedArgListMissingPtr {
7659    type SyntaxNode = WrappedArgListMissing;
7660    fn untyped(&self) -> SyntaxStablePtrId {
7661        self.0
7662    }
7663    fn lookup(&self, db: &dyn SyntaxGroup) -> WrappedArgListMissing {
7664        WrappedArgListMissing::from_syntax_node(db, self.0.lookup(db))
7665    }
7666}
7667impl From<WrappedArgListMissingPtr> for SyntaxStablePtrId {
7668    fn from(ptr: WrappedArgListMissingPtr) -> Self {
7669        ptr.untyped()
7670    }
7671}
7672#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
7673pub struct WrappedArgListMissingGreen(pub GreenId);
7674impl TypedSyntaxNode for WrappedArgListMissing {
7675    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::WrappedArgListMissing);
7676    type StablePtr = WrappedArgListMissingPtr;
7677    type Green = WrappedArgListMissingGreen;
7678    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
7679        WrappedArgListMissingGreen(
7680            Arc::new(GreenNode {
7681                kind: SyntaxKind::WrappedArgListMissing,
7682                details: GreenNodeDetails::Node { children: vec![], width: TextWidth::default() },
7683            })
7684            .intern(db),
7685        )
7686    }
7687    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
7688        let kind = node.kind(db);
7689        assert_eq!(
7690            kind,
7691            SyntaxKind::WrappedArgListMissing,
7692            "Unexpected SyntaxKind {:?}. Expected {:?}.",
7693            kind,
7694            SyntaxKind::WrappedArgListMissing
7695        );
7696        let children = db.get_children(node.clone());
7697        Self { node, children }
7698    }
7699    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
7700        let kind = node.kind(db);
7701        if kind == SyntaxKind::WrappedArgListMissing {
7702            Some(Self::from_syntax_node(db, node))
7703        } else {
7704            None
7705        }
7706    }
7707    fn as_syntax_node(&self) -> SyntaxNode {
7708        self.node.clone()
7709    }
7710    fn stable_ptr(&self) -> Self::StablePtr {
7711        WrappedArgListMissingPtr(self.node.0.stable_ptr)
7712    }
7713}
7714impl From<&WrappedArgListMissing> for SyntaxStablePtrId {
7715    fn from(node: &WrappedArgListMissing) -> Self {
7716        node.stable_ptr().untyped()
7717    }
7718}
7719#[derive(Clone, Debug, Eq, Hash, PartialEq)]
7720pub enum Pattern {
7721    Underscore(TerminalUnderscore),
7722    Literal(TerminalLiteralNumber),
7723    False(TerminalFalse),
7724    True(TerminalTrue),
7725    ShortString(TerminalShortString),
7726    String(TerminalString),
7727    Identifier(PatternIdentifier),
7728    Struct(PatternStruct),
7729    Tuple(PatternTuple),
7730    Enum(PatternEnum),
7731    FixedSizeArray(PatternFixedSizeArray),
7732    Path(ExprPath),
7733}
7734#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
7735pub struct PatternPtr(pub SyntaxStablePtrId);
7736impl TypedStablePtr for PatternPtr {
7737    type SyntaxNode = Pattern;
7738    fn untyped(&self) -> SyntaxStablePtrId {
7739        self.0
7740    }
7741    fn lookup(&self, db: &dyn SyntaxGroup) -> Pattern {
7742        Pattern::from_syntax_node(db, self.0.lookup(db))
7743    }
7744}
7745impl From<PatternPtr> for SyntaxStablePtrId {
7746    fn from(ptr: PatternPtr) -> Self {
7747        ptr.untyped()
7748    }
7749}
7750impl From<TerminalUnderscorePtr> for PatternPtr {
7751    fn from(value: TerminalUnderscorePtr) -> Self {
7752        Self(value.0)
7753    }
7754}
7755impl From<TerminalLiteralNumberPtr> for PatternPtr {
7756    fn from(value: TerminalLiteralNumberPtr) -> Self {
7757        Self(value.0)
7758    }
7759}
7760impl From<TerminalFalsePtr> for PatternPtr {
7761    fn from(value: TerminalFalsePtr) -> Self {
7762        Self(value.0)
7763    }
7764}
7765impl From<TerminalTruePtr> for PatternPtr {
7766    fn from(value: TerminalTruePtr) -> Self {
7767        Self(value.0)
7768    }
7769}
7770impl From<TerminalShortStringPtr> for PatternPtr {
7771    fn from(value: TerminalShortStringPtr) -> Self {
7772        Self(value.0)
7773    }
7774}
7775impl From<TerminalStringPtr> for PatternPtr {
7776    fn from(value: TerminalStringPtr) -> Self {
7777        Self(value.0)
7778    }
7779}
7780impl From<PatternIdentifierPtr> for PatternPtr {
7781    fn from(value: PatternIdentifierPtr) -> Self {
7782        Self(value.0)
7783    }
7784}
7785impl From<PatternStructPtr> for PatternPtr {
7786    fn from(value: PatternStructPtr) -> Self {
7787        Self(value.0)
7788    }
7789}
7790impl From<PatternTuplePtr> for PatternPtr {
7791    fn from(value: PatternTuplePtr) -> Self {
7792        Self(value.0)
7793    }
7794}
7795impl From<PatternEnumPtr> for PatternPtr {
7796    fn from(value: PatternEnumPtr) -> Self {
7797        Self(value.0)
7798    }
7799}
7800impl From<PatternFixedSizeArrayPtr> for PatternPtr {
7801    fn from(value: PatternFixedSizeArrayPtr) -> Self {
7802        Self(value.0)
7803    }
7804}
7805impl From<ExprPathPtr> for PatternPtr {
7806    fn from(value: ExprPathPtr) -> Self {
7807        Self(value.0)
7808    }
7809}
7810impl From<TerminalUnderscoreGreen> for PatternGreen {
7811    fn from(value: TerminalUnderscoreGreen) -> Self {
7812        Self(value.0)
7813    }
7814}
7815impl From<TerminalLiteralNumberGreen> for PatternGreen {
7816    fn from(value: TerminalLiteralNumberGreen) -> Self {
7817        Self(value.0)
7818    }
7819}
7820impl From<TerminalFalseGreen> for PatternGreen {
7821    fn from(value: TerminalFalseGreen) -> Self {
7822        Self(value.0)
7823    }
7824}
7825impl From<TerminalTrueGreen> for PatternGreen {
7826    fn from(value: TerminalTrueGreen) -> Self {
7827        Self(value.0)
7828    }
7829}
7830impl From<TerminalShortStringGreen> for PatternGreen {
7831    fn from(value: TerminalShortStringGreen) -> Self {
7832        Self(value.0)
7833    }
7834}
7835impl From<TerminalStringGreen> for PatternGreen {
7836    fn from(value: TerminalStringGreen) -> Self {
7837        Self(value.0)
7838    }
7839}
7840impl From<PatternIdentifierGreen> for PatternGreen {
7841    fn from(value: PatternIdentifierGreen) -> Self {
7842        Self(value.0)
7843    }
7844}
7845impl From<PatternStructGreen> for PatternGreen {
7846    fn from(value: PatternStructGreen) -> Self {
7847        Self(value.0)
7848    }
7849}
7850impl From<PatternTupleGreen> for PatternGreen {
7851    fn from(value: PatternTupleGreen) -> Self {
7852        Self(value.0)
7853    }
7854}
7855impl From<PatternEnumGreen> for PatternGreen {
7856    fn from(value: PatternEnumGreen) -> Self {
7857        Self(value.0)
7858    }
7859}
7860impl From<PatternFixedSizeArrayGreen> for PatternGreen {
7861    fn from(value: PatternFixedSizeArrayGreen) -> Self {
7862        Self(value.0)
7863    }
7864}
7865impl From<ExprPathGreen> for PatternGreen {
7866    fn from(value: ExprPathGreen) -> Self {
7867        Self(value.0)
7868    }
7869}
7870#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
7871pub struct PatternGreen(pub GreenId);
7872impl TypedSyntaxNode for Pattern {
7873    const OPTIONAL_KIND: Option<SyntaxKind> = None;
7874    type StablePtr = PatternPtr;
7875    type Green = PatternGreen;
7876    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
7877        panic!("No missing variant.");
7878    }
7879    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
7880        let kind = node.kind(db);
7881        match kind {
7882            SyntaxKind::TerminalUnderscore => {
7883                Pattern::Underscore(TerminalUnderscore::from_syntax_node(db, node))
7884            }
7885            SyntaxKind::TerminalLiteralNumber => {
7886                Pattern::Literal(TerminalLiteralNumber::from_syntax_node(db, node))
7887            }
7888            SyntaxKind::TerminalFalse => Pattern::False(TerminalFalse::from_syntax_node(db, node)),
7889            SyntaxKind::TerminalTrue => Pattern::True(TerminalTrue::from_syntax_node(db, node)),
7890            SyntaxKind::TerminalShortString => {
7891                Pattern::ShortString(TerminalShortString::from_syntax_node(db, node))
7892            }
7893            SyntaxKind::TerminalString => {
7894                Pattern::String(TerminalString::from_syntax_node(db, node))
7895            }
7896            SyntaxKind::PatternIdentifier => {
7897                Pattern::Identifier(PatternIdentifier::from_syntax_node(db, node))
7898            }
7899            SyntaxKind::PatternStruct => Pattern::Struct(PatternStruct::from_syntax_node(db, node)),
7900            SyntaxKind::PatternTuple => Pattern::Tuple(PatternTuple::from_syntax_node(db, node)),
7901            SyntaxKind::PatternEnum => Pattern::Enum(PatternEnum::from_syntax_node(db, node)),
7902            SyntaxKind::PatternFixedSizeArray => {
7903                Pattern::FixedSizeArray(PatternFixedSizeArray::from_syntax_node(db, node))
7904            }
7905            SyntaxKind::ExprPath => Pattern::Path(ExprPath::from_syntax_node(db, node)),
7906            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "Pattern"),
7907        }
7908    }
7909    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
7910        let kind = node.kind(db);
7911        match kind {
7912            SyntaxKind::TerminalUnderscore => {
7913                Some(Pattern::Underscore(TerminalUnderscore::from_syntax_node(db, node)))
7914            }
7915            SyntaxKind::TerminalLiteralNumber => {
7916                Some(Pattern::Literal(TerminalLiteralNumber::from_syntax_node(db, node)))
7917            }
7918            SyntaxKind::TerminalFalse => {
7919                Some(Pattern::False(TerminalFalse::from_syntax_node(db, node)))
7920            }
7921            SyntaxKind::TerminalTrue => {
7922                Some(Pattern::True(TerminalTrue::from_syntax_node(db, node)))
7923            }
7924            SyntaxKind::TerminalShortString => {
7925                Some(Pattern::ShortString(TerminalShortString::from_syntax_node(db, node)))
7926            }
7927            SyntaxKind::TerminalString => {
7928                Some(Pattern::String(TerminalString::from_syntax_node(db, node)))
7929            }
7930            SyntaxKind::PatternIdentifier => {
7931                Some(Pattern::Identifier(PatternIdentifier::from_syntax_node(db, node)))
7932            }
7933            SyntaxKind::PatternStruct => {
7934                Some(Pattern::Struct(PatternStruct::from_syntax_node(db, node)))
7935            }
7936            SyntaxKind::PatternTuple => {
7937                Some(Pattern::Tuple(PatternTuple::from_syntax_node(db, node)))
7938            }
7939            SyntaxKind::PatternEnum => Some(Pattern::Enum(PatternEnum::from_syntax_node(db, node))),
7940            SyntaxKind::PatternFixedSizeArray => {
7941                Some(Pattern::FixedSizeArray(PatternFixedSizeArray::from_syntax_node(db, node)))
7942            }
7943            SyntaxKind::ExprPath => Some(Pattern::Path(ExprPath::from_syntax_node(db, node))),
7944            _ => None,
7945        }
7946    }
7947    fn as_syntax_node(&self) -> SyntaxNode {
7948        match self {
7949            Pattern::Underscore(x) => x.as_syntax_node(),
7950            Pattern::Literal(x) => x.as_syntax_node(),
7951            Pattern::False(x) => x.as_syntax_node(),
7952            Pattern::True(x) => x.as_syntax_node(),
7953            Pattern::ShortString(x) => x.as_syntax_node(),
7954            Pattern::String(x) => x.as_syntax_node(),
7955            Pattern::Identifier(x) => x.as_syntax_node(),
7956            Pattern::Struct(x) => x.as_syntax_node(),
7957            Pattern::Tuple(x) => x.as_syntax_node(),
7958            Pattern::Enum(x) => x.as_syntax_node(),
7959            Pattern::FixedSizeArray(x) => x.as_syntax_node(),
7960            Pattern::Path(x) => x.as_syntax_node(),
7961        }
7962    }
7963    fn stable_ptr(&self) -> Self::StablePtr {
7964        PatternPtr(self.as_syntax_node().0.stable_ptr)
7965    }
7966}
7967impl From<&Pattern> for SyntaxStablePtrId {
7968    fn from(node: &Pattern) -> Self {
7969        node.stable_ptr().untyped()
7970    }
7971}
7972impl Pattern {
7973    /// Checks if a kind of a variant of [Pattern].
7974    pub fn is_variant(kind: SyntaxKind) -> bool {
7975        matches!(
7976            kind,
7977            SyntaxKind::TerminalUnderscore
7978                | SyntaxKind::TerminalLiteralNumber
7979                | SyntaxKind::TerminalFalse
7980                | SyntaxKind::TerminalTrue
7981                | SyntaxKind::TerminalShortString
7982                | SyntaxKind::TerminalString
7983                | SyntaxKind::PatternIdentifier
7984                | SyntaxKind::PatternStruct
7985                | SyntaxKind::PatternTuple
7986                | SyntaxKind::PatternEnum
7987                | SyntaxKind::PatternFixedSizeArray
7988                | SyntaxKind::ExprPath
7989        )
7990    }
7991}
7992#[derive(Clone, Debug, Eq, Hash, PartialEq)]
7993pub struct PatternIdentifier {
7994    node: SyntaxNode,
7995    children: Arc<[SyntaxNode]>,
7996}
7997impl PatternIdentifier {
7998    pub const INDEX_MODIFIERS: usize = 0;
7999    pub const INDEX_NAME: usize = 1;
8000    pub fn new_green(
8001        db: &dyn SyntaxGroup,
8002        modifiers: ModifierListGreen,
8003        name: TerminalIdentifierGreen,
8004    ) -> PatternIdentifierGreen {
8005        let children: Vec<GreenId> = vec![modifiers.0, name.0];
8006        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
8007        PatternIdentifierGreen(
8008            Arc::new(GreenNode {
8009                kind: SyntaxKind::PatternIdentifier,
8010                details: GreenNodeDetails::Node { children, width },
8011            })
8012            .intern(db),
8013        )
8014    }
8015}
8016impl PatternIdentifier {
8017    pub fn modifiers(&self, db: &dyn SyntaxGroup) -> ModifierList {
8018        ModifierList::from_syntax_node(db, self.children[0].clone())
8019    }
8020    pub fn name(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier {
8021        TerminalIdentifier::from_syntax_node(db, self.children[1].clone())
8022    }
8023}
8024#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
8025pub struct PatternIdentifierPtr(pub SyntaxStablePtrId);
8026impl PatternIdentifierPtr {
8027    pub fn name_green(self, db: &dyn SyntaxGroup) -> TerminalIdentifierGreen {
8028        let ptr = self.0.lookup_intern(db);
8029        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
8030            TerminalIdentifierGreen(key_fields[0])
8031        } else {
8032            panic!("Unexpected key field query on root.");
8033        }
8034    }
8035}
8036impl TypedStablePtr for PatternIdentifierPtr {
8037    type SyntaxNode = PatternIdentifier;
8038    fn untyped(&self) -> SyntaxStablePtrId {
8039        self.0
8040    }
8041    fn lookup(&self, db: &dyn SyntaxGroup) -> PatternIdentifier {
8042        PatternIdentifier::from_syntax_node(db, self.0.lookup(db))
8043    }
8044}
8045impl From<PatternIdentifierPtr> for SyntaxStablePtrId {
8046    fn from(ptr: PatternIdentifierPtr) -> Self {
8047        ptr.untyped()
8048    }
8049}
8050#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
8051pub struct PatternIdentifierGreen(pub GreenId);
8052impl TypedSyntaxNode for PatternIdentifier {
8053    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PatternIdentifier);
8054    type StablePtr = PatternIdentifierPtr;
8055    type Green = PatternIdentifierGreen;
8056    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
8057        PatternIdentifierGreen(
8058            Arc::new(GreenNode {
8059                kind: SyntaxKind::PatternIdentifier,
8060                details: GreenNodeDetails::Node {
8061                    children: vec![ModifierList::missing(db).0, TerminalIdentifier::missing(db).0],
8062                    width: TextWidth::default(),
8063                },
8064            })
8065            .intern(db),
8066        )
8067    }
8068    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
8069        let kind = node.kind(db);
8070        assert_eq!(
8071            kind,
8072            SyntaxKind::PatternIdentifier,
8073            "Unexpected SyntaxKind {:?}. Expected {:?}.",
8074            kind,
8075            SyntaxKind::PatternIdentifier
8076        );
8077        let children = db.get_children(node.clone());
8078        Self { node, children }
8079    }
8080    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
8081        let kind = node.kind(db);
8082        if kind == SyntaxKind::PatternIdentifier {
8083            Some(Self::from_syntax_node(db, node))
8084        } else {
8085            None
8086        }
8087    }
8088    fn as_syntax_node(&self) -> SyntaxNode {
8089        self.node.clone()
8090    }
8091    fn stable_ptr(&self) -> Self::StablePtr {
8092        PatternIdentifierPtr(self.node.0.stable_ptr)
8093    }
8094}
8095impl From<&PatternIdentifier> for SyntaxStablePtrId {
8096    fn from(node: &PatternIdentifier) -> Self {
8097        node.stable_ptr().untyped()
8098    }
8099}
8100#[derive(Clone, Debug, Eq, Hash, PartialEq)]
8101pub struct PatternStruct {
8102    node: SyntaxNode,
8103    children: Arc<[SyntaxNode]>,
8104}
8105impl PatternStruct {
8106    pub const INDEX_PATH: usize = 0;
8107    pub const INDEX_LBRACE: usize = 1;
8108    pub const INDEX_PARAMS: usize = 2;
8109    pub const INDEX_RBRACE: usize = 3;
8110    pub fn new_green(
8111        db: &dyn SyntaxGroup,
8112        path: ExprPathGreen,
8113        lbrace: TerminalLBraceGreen,
8114        params: PatternStructParamListGreen,
8115        rbrace: TerminalRBraceGreen,
8116    ) -> PatternStructGreen {
8117        let children: Vec<GreenId> = vec![path.0, lbrace.0, params.0, rbrace.0];
8118        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
8119        PatternStructGreen(
8120            Arc::new(GreenNode {
8121                kind: SyntaxKind::PatternStruct,
8122                details: GreenNodeDetails::Node { children, width },
8123            })
8124            .intern(db),
8125        )
8126    }
8127}
8128impl PatternStruct {
8129    pub fn path(&self, db: &dyn SyntaxGroup) -> ExprPath {
8130        ExprPath::from_syntax_node(db, self.children[0].clone())
8131    }
8132    pub fn lbrace(&self, db: &dyn SyntaxGroup) -> TerminalLBrace {
8133        TerminalLBrace::from_syntax_node(db, self.children[1].clone())
8134    }
8135    pub fn params(&self, db: &dyn SyntaxGroup) -> PatternStructParamList {
8136        PatternStructParamList::from_syntax_node(db, self.children[2].clone())
8137    }
8138    pub fn rbrace(&self, db: &dyn SyntaxGroup) -> TerminalRBrace {
8139        TerminalRBrace::from_syntax_node(db, self.children[3].clone())
8140    }
8141}
8142#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
8143pub struct PatternStructPtr(pub SyntaxStablePtrId);
8144impl PatternStructPtr {}
8145impl TypedStablePtr for PatternStructPtr {
8146    type SyntaxNode = PatternStruct;
8147    fn untyped(&self) -> SyntaxStablePtrId {
8148        self.0
8149    }
8150    fn lookup(&self, db: &dyn SyntaxGroup) -> PatternStruct {
8151        PatternStruct::from_syntax_node(db, self.0.lookup(db))
8152    }
8153}
8154impl From<PatternStructPtr> for SyntaxStablePtrId {
8155    fn from(ptr: PatternStructPtr) -> Self {
8156        ptr.untyped()
8157    }
8158}
8159#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
8160pub struct PatternStructGreen(pub GreenId);
8161impl TypedSyntaxNode for PatternStruct {
8162    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PatternStruct);
8163    type StablePtr = PatternStructPtr;
8164    type Green = PatternStructGreen;
8165    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
8166        PatternStructGreen(
8167            Arc::new(GreenNode {
8168                kind: SyntaxKind::PatternStruct,
8169                details: GreenNodeDetails::Node {
8170                    children: vec![
8171                        ExprPath::missing(db).0,
8172                        TerminalLBrace::missing(db).0,
8173                        PatternStructParamList::missing(db).0,
8174                        TerminalRBrace::missing(db).0,
8175                    ],
8176                    width: TextWidth::default(),
8177                },
8178            })
8179            .intern(db),
8180        )
8181    }
8182    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
8183        let kind = node.kind(db);
8184        assert_eq!(
8185            kind,
8186            SyntaxKind::PatternStruct,
8187            "Unexpected SyntaxKind {:?}. Expected {:?}.",
8188            kind,
8189            SyntaxKind::PatternStruct
8190        );
8191        let children = db.get_children(node.clone());
8192        Self { node, children }
8193    }
8194    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
8195        let kind = node.kind(db);
8196        if kind == SyntaxKind::PatternStruct {
8197            Some(Self::from_syntax_node(db, node))
8198        } else {
8199            None
8200        }
8201    }
8202    fn as_syntax_node(&self) -> SyntaxNode {
8203        self.node.clone()
8204    }
8205    fn stable_ptr(&self) -> Self::StablePtr {
8206        PatternStructPtr(self.node.0.stable_ptr)
8207    }
8208}
8209impl From<&PatternStruct> for SyntaxStablePtrId {
8210    fn from(node: &PatternStruct) -> Self {
8211        node.stable_ptr().untyped()
8212    }
8213}
8214#[derive(Clone, Debug, Eq, Hash, PartialEq)]
8215pub struct PatternStructParamList(ElementList<PatternStructParam, 2>);
8216impl Deref for PatternStructParamList {
8217    type Target = ElementList<PatternStructParam, 2>;
8218    fn deref(&self) -> &Self::Target {
8219        &self.0
8220    }
8221}
8222impl PatternStructParamList {
8223    pub fn new_green(
8224        db: &dyn SyntaxGroup,
8225        children: Vec<PatternStructParamListElementOrSeparatorGreen>,
8226    ) -> PatternStructParamListGreen {
8227        let width = children.iter().map(|id| id.id().lookup_intern(db).width()).sum();
8228        PatternStructParamListGreen(
8229            Arc::new(GreenNode {
8230                kind: SyntaxKind::PatternStructParamList,
8231                details: GreenNodeDetails::Node {
8232                    children: children.iter().map(|x| x.id()).collect(),
8233                    width,
8234                },
8235            })
8236            .intern(db),
8237        )
8238    }
8239}
8240#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
8241pub struct PatternStructParamListPtr(pub SyntaxStablePtrId);
8242impl TypedStablePtr for PatternStructParamListPtr {
8243    type SyntaxNode = PatternStructParamList;
8244    fn untyped(&self) -> SyntaxStablePtrId {
8245        self.0
8246    }
8247    fn lookup(&self, db: &dyn SyntaxGroup) -> PatternStructParamList {
8248        PatternStructParamList::from_syntax_node(db, self.0.lookup(db))
8249    }
8250}
8251impl From<PatternStructParamListPtr> for SyntaxStablePtrId {
8252    fn from(ptr: PatternStructParamListPtr) -> Self {
8253        ptr.untyped()
8254    }
8255}
8256#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
8257pub enum PatternStructParamListElementOrSeparatorGreen {
8258    Separator(TerminalCommaGreen),
8259    Element(PatternStructParamGreen),
8260}
8261impl From<TerminalCommaGreen> for PatternStructParamListElementOrSeparatorGreen {
8262    fn from(value: TerminalCommaGreen) -> Self {
8263        PatternStructParamListElementOrSeparatorGreen::Separator(value)
8264    }
8265}
8266impl From<PatternStructParamGreen> for PatternStructParamListElementOrSeparatorGreen {
8267    fn from(value: PatternStructParamGreen) -> Self {
8268        PatternStructParamListElementOrSeparatorGreen::Element(value)
8269    }
8270}
8271impl PatternStructParamListElementOrSeparatorGreen {
8272    fn id(&self) -> GreenId {
8273        match self {
8274            PatternStructParamListElementOrSeparatorGreen::Separator(green) => green.0,
8275            PatternStructParamListElementOrSeparatorGreen::Element(green) => green.0,
8276        }
8277    }
8278}
8279#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
8280pub struct PatternStructParamListGreen(pub GreenId);
8281impl TypedSyntaxNode for PatternStructParamList {
8282    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PatternStructParamList);
8283    type StablePtr = PatternStructParamListPtr;
8284    type Green = PatternStructParamListGreen;
8285    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
8286        PatternStructParamListGreen(
8287            Arc::new(GreenNode {
8288                kind: SyntaxKind::PatternStructParamList,
8289                details: GreenNodeDetails::Node { children: vec![], width: TextWidth::default() },
8290            })
8291            .intern(db),
8292        )
8293    }
8294    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
8295        Self(ElementList::new(node))
8296    }
8297    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
8298        if node.kind(db) == SyntaxKind::PatternStructParamList {
8299            Some(Self(ElementList::new(node)))
8300        } else {
8301            None
8302        }
8303    }
8304    fn as_syntax_node(&self) -> SyntaxNode {
8305        self.node.clone()
8306    }
8307    fn stable_ptr(&self) -> Self::StablePtr {
8308        PatternStructParamListPtr(self.node.0.stable_ptr)
8309    }
8310}
8311impl From<&PatternStructParamList> for SyntaxStablePtrId {
8312    fn from(node: &PatternStructParamList) -> Self {
8313        node.stable_ptr().untyped()
8314    }
8315}
8316#[derive(Clone, Debug, Eq, Hash, PartialEq)]
8317pub struct PatternTuple {
8318    node: SyntaxNode,
8319    children: Arc<[SyntaxNode]>,
8320}
8321impl PatternTuple {
8322    pub const INDEX_LPAREN: usize = 0;
8323    pub const INDEX_PATTERNS: usize = 1;
8324    pub const INDEX_RPAREN: usize = 2;
8325    pub fn new_green(
8326        db: &dyn SyntaxGroup,
8327        lparen: TerminalLParenGreen,
8328        patterns: PatternListGreen,
8329        rparen: TerminalRParenGreen,
8330    ) -> PatternTupleGreen {
8331        let children: Vec<GreenId> = vec![lparen.0, patterns.0, rparen.0];
8332        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
8333        PatternTupleGreen(
8334            Arc::new(GreenNode {
8335                kind: SyntaxKind::PatternTuple,
8336                details: GreenNodeDetails::Node { children, width },
8337            })
8338            .intern(db),
8339        )
8340    }
8341}
8342impl PatternTuple {
8343    pub fn lparen(&self, db: &dyn SyntaxGroup) -> TerminalLParen {
8344        TerminalLParen::from_syntax_node(db, self.children[0].clone())
8345    }
8346    pub fn patterns(&self, db: &dyn SyntaxGroup) -> PatternList {
8347        PatternList::from_syntax_node(db, self.children[1].clone())
8348    }
8349    pub fn rparen(&self, db: &dyn SyntaxGroup) -> TerminalRParen {
8350        TerminalRParen::from_syntax_node(db, self.children[2].clone())
8351    }
8352}
8353#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
8354pub struct PatternTuplePtr(pub SyntaxStablePtrId);
8355impl PatternTuplePtr {}
8356impl TypedStablePtr for PatternTuplePtr {
8357    type SyntaxNode = PatternTuple;
8358    fn untyped(&self) -> SyntaxStablePtrId {
8359        self.0
8360    }
8361    fn lookup(&self, db: &dyn SyntaxGroup) -> PatternTuple {
8362        PatternTuple::from_syntax_node(db, self.0.lookup(db))
8363    }
8364}
8365impl From<PatternTuplePtr> for SyntaxStablePtrId {
8366    fn from(ptr: PatternTuplePtr) -> Self {
8367        ptr.untyped()
8368    }
8369}
8370#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
8371pub struct PatternTupleGreen(pub GreenId);
8372impl TypedSyntaxNode for PatternTuple {
8373    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PatternTuple);
8374    type StablePtr = PatternTuplePtr;
8375    type Green = PatternTupleGreen;
8376    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
8377        PatternTupleGreen(
8378            Arc::new(GreenNode {
8379                kind: SyntaxKind::PatternTuple,
8380                details: GreenNodeDetails::Node {
8381                    children: vec![
8382                        TerminalLParen::missing(db).0,
8383                        PatternList::missing(db).0,
8384                        TerminalRParen::missing(db).0,
8385                    ],
8386                    width: TextWidth::default(),
8387                },
8388            })
8389            .intern(db),
8390        )
8391    }
8392    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
8393        let kind = node.kind(db);
8394        assert_eq!(
8395            kind,
8396            SyntaxKind::PatternTuple,
8397            "Unexpected SyntaxKind {:?}. Expected {:?}.",
8398            kind,
8399            SyntaxKind::PatternTuple
8400        );
8401        let children = db.get_children(node.clone());
8402        Self { node, children }
8403    }
8404    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
8405        let kind = node.kind(db);
8406        if kind == SyntaxKind::PatternTuple { Some(Self::from_syntax_node(db, node)) } else { None }
8407    }
8408    fn as_syntax_node(&self) -> SyntaxNode {
8409        self.node.clone()
8410    }
8411    fn stable_ptr(&self) -> Self::StablePtr {
8412        PatternTuplePtr(self.node.0.stable_ptr)
8413    }
8414}
8415impl From<&PatternTuple> for SyntaxStablePtrId {
8416    fn from(node: &PatternTuple) -> Self {
8417        node.stable_ptr().untyped()
8418    }
8419}
8420#[derive(Clone, Debug, Eq, Hash, PartialEq)]
8421pub struct PatternFixedSizeArray {
8422    node: SyntaxNode,
8423    children: Arc<[SyntaxNode]>,
8424}
8425impl PatternFixedSizeArray {
8426    pub const INDEX_LBRACK: usize = 0;
8427    pub const INDEX_PATTERNS: usize = 1;
8428    pub const INDEX_RBRACK: usize = 2;
8429    pub fn new_green(
8430        db: &dyn SyntaxGroup,
8431        lbrack: TerminalLBrackGreen,
8432        patterns: PatternListGreen,
8433        rbrack: TerminalRBrackGreen,
8434    ) -> PatternFixedSizeArrayGreen {
8435        let children: Vec<GreenId> = vec![lbrack.0, patterns.0, rbrack.0];
8436        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
8437        PatternFixedSizeArrayGreen(
8438            Arc::new(GreenNode {
8439                kind: SyntaxKind::PatternFixedSizeArray,
8440                details: GreenNodeDetails::Node { children, width },
8441            })
8442            .intern(db),
8443        )
8444    }
8445}
8446impl PatternFixedSizeArray {
8447    pub fn lbrack(&self, db: &dyn SyntaxGroup) -> TerminalLBrack {
8448        TerminalLBrack::from_syntax_node(db, self.children[0].clone())
8449    }
8450    pub fn patterns(&self, db: &dyn SyntaxGroup) -> PatternList {
8451        PatternList::from_syntax_node(db, self.children[1].clone())
8452    }
8453    pub fn rbrack(&self, db: &dyn SyntaxGroup) -> TerminalRBrack {
8454        TerminalRBrack::from_syntax_node(db, self.children[2].clone())
8455    }
8456}
8457#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
8458pub struct PatternFixedSizeArrayPtr(pub SyntaxStablePtrId);
8459impl PatternFixedSizeArrayPtr {}
8460impl TypedStablePtr for PatternFixedSizeArrayPtr {
8461    type SyntaxNode = PatternFixedSizeArray;
8462    fn untyped(&self) -> SyntaxStablePtrId {
8463        self.0
8464    }
8465    fn lookup(&self, db: &dyn SyntaxGroup) -> PatternFixedSizeArray {
8466        PatternFixedSizeArray::from_syntax_node(db, self.0.lookup(db))
8467    }
8468}
8469impl From<PatternFixedSizeArrayPtr> for SyntaxStablePtrId {
8470    fn from(ptr: PatternFixedSizeArrayPtr) -> Self {
8471        ptr.untyped()
8472    }
8473}
8474#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
8475pub struct PatternFixedSizeArrayGreen(pub GreenId);
8476impl TypedSyntaxNode for PatternFixedSizeArray {
8477    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PatternFixedSizeArray);
8478    type StablePtr = PatternFixedSizeArrayPtr;
8479    type Green = PatternFixedSizeArrayGreen;
8480    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
8481        PatternFixedSizeArrayGreen(
8482            Arc::new(GreenNode {
8483                kind: SyntaxKind::PatternFixedSizeArray,
8484                details: GreenNodeDetails::Node {
8485                    children: vec![
8486                        TerminalLBrack::missing(db).0,
8487                        PatternList::missing(db).0,
8488                        TerminalRBrack::missing(db).0,
8489                    ],
8490                    width: TextWidth::default(),
8491                },
8492            })
8493            .intern(db),
8494        )
8495    }
8496    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
8497        let kind = node.kind(db);
8498        assert_eq!(
8499            kind,
8500            SyntaxKind::PatternFixedSizeArray,
8501            "Unexpected SyntaxKind {:?}. Expected {:?}.",
8502            kind,
8503            SyntaxKind::PatternFixedSizeArray
8504        );
8505        let children = db.get_children(node.clone());
8506        Self { node, children }
8507    }
8508    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
8509        let kind = node.kind(db);
8510        if kind == SyntaxKind::PatternFixedSizeArray {
8511            Some(Self::from_syntax_node(db, node))
8512        } else {
8513            None
8514        }
8515    }
8516    fn as_syntax_node(&self) -> SyntaxNode {
8517        self.node.clone()
8518    }
8519    fn stable_ptr(&self) -> Self::StablePtr {
8520        PatternFixedSizeArrayPtr(self.node.0.stable_ptr)
8521    }
8522}
8523impl From<&PatternFixedSizeArray> for SyntaxStablePtrId {
8524    fn from(node: &PatternFixedSizeArray) -> Self {
8525        node.stable_ptr().untyped()
8526    }
8527}
8528#[derive(Clone, Debug, Eq, Hash, PartialEq)]
8529pub struct PatternList(ElementList<Pattern, 2>);
8530impl Deref for PatternList {
8531    type Target = ElementList<Pattern, 2>;
8532    fn deref(&self) -> &Self::Target {
8533        &self.0
8534    }
8535}
8536impl PatternList {
8537    pub fn new_green(
8538        db: &dyn SyntaxGroup,
8539        children: Vec<PatternListElementOrSeparatorGreen>,
8540    ) -> PatternListGreen {
8541        let width = children.iter().map(|id| id.id().lookup_intern(db).width()).sum();
8542        PatternListGreen(
8543            Arc::new(GreenNode {
8544                kind: SyntaxKind::PatternList,
8545                details: GreenNodeDetails::Node {
8546                    children: children.iter().map(|x| x.id()).collect(),
8547                    width,
8548                },
8549            })
8550            .intern(db),
8551        )
8552    }
8553}
8554#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
8555pub struct PatternListPtr(pub SyntaxStablePtrId);
8556impl TypedStablePtr for PatternListPtr {
8557    type SyntaxNode = PatternList;
8558    fn untyped(&self) -> SyntaxStablePtrId {
8559        self.0
8560    }
8561    fn lookup(&self, db: &dyn SyntaxGroup) -> PatternList {
8562        PatternList::from_syntax_node(db, self.0.lookup(db))
8563    }
8564}
8565impl From<PatternListPtr> for SyntaxStablePtrId {
8566    fn from(ptr: PatternListPtr) -> Self {
8567        ptr.untyped()
8568    }
8569}
8570#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
8571pub enum PatternListElementOrSeparatorGreen {
8572    Separator(TerminalCommaGreen),
8573    Element(PatternGreen),
8574}
8575impl From<TerminalCommaGreen> for PatternListElementOrSeparatorGreen {
8576    fn from(value: TerminalCommaGreen) -> Self {
8577        PatternListElementOrSeparatorGreen::Separator(value)
8578    }
8579}
8580impl From<PatternGreen> for PatternListElementOrSeparatorGreen {
8581    fn from(value: PatternGreen) -> Self {
8582        PatternListElementOrSeparatorGreen::Element(value)
8583    }
8584}
8585impl PatternListElementOrSeparatorGreen {
8586    fn id(&self) -> GreenId {
8587        match self {
8588            PatternListElementOrSeparatorGreen::Separator(green) => green.0,
8589            PatternListElementOrSeparatorGreen::Element(green) => green.0,
8590        }
8591    }
8592}
8593#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
8594pub struct PatternListGreen(pub GreenId);
8595impl TypedSyntaxNode for PatternList {
8596    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PatternList);
8597    type StablePtr = PatternListPtr;
8598    type Green = PatternListGreen;
8599    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
8600        PatternListGreen(
8601            Arc::new(GreenNode {
8602                kind: SyntaxKind::PatternList,
8603                details: GreenNodeDetails::Node { children: vec![], width: TextWidth::default() },
8604            })
8605            .intern(db),
8606        )
8607    }
8608    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
8609        Self(ElementList::new(node))
8610    }
8611    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
8612        if node.kind(db) == SyntaxKind::PatternList {
8613            Some(Self(ElementList::new(node)))
8614        } else {
8615            None
8616        }
8617    }
8618    fn as_syntax_node(&self) -> SyntaxNode {
8619        self.node.clone()
8620    }
8621    fn stable_ptr(&self) -> Self::StablePtr {
8622        PatternListPtr(self.node.0.stable_ptr)
8623    }
8624}
8625impl From<&PatternList> for SyntaxStablePtrId {
8626    fn from(node: &PatternList) -> Self {
8627        node.stable_ptr().untyped()
8628    }
8629}
8630#[derive(Clone, Debug, Eq, Hash, PartialEq)]
8631pub struct PatternListOr(ElementList<Pattern, 2>);
8632impl Deref for PatternListOr {
8633    type Target = ElementList<Pattern, 2>;
8634    fn deref(&self) -> &Self::Target {
8635        &self.0
8636    }
8637}
8638impl PatternListOr {
8639    pub fn new_green(
8640        db: &dyn SyntaxGroup,
8641        children: Vec<PatternListOrElementOrSeparatorGreen>,
8642    ) -> PatternListOrGreen {
8643        let width = children.iter().map(|id| id.id().lookup_intern(db).width()).sum();
8644        PatternListOrGreen(
8645            Arc::new(GreenNode {
8646                kind: SyntaxKind::PatternListOr,
8647                details: GreenNodeDetails::Node {
8648                    children: children.iter().map(|x| x.id()).collect(),
8649                    width,
8650                },
8651            })
8652            .intern(db),
8653        )
8654    }
8655}
8656#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
8657pub struct PatternListOrPtr(pub SyntaxStablePtrId);
8658impl TypedStablePtr for PatternListOrPtr {
8659    type SyntaxNode = PatternListOr;
8660    fn untyped(&self) -> SyntaxStablePtrId {
8661        self.0
8662    }
8663    fn lookup(&self, db: &dyn SyntaxGroup) -> PatternListOr {
8664        PatternListOr::from_syntax_node(db, self.0.lookup(db))
8665    }
8666}
8667impl From<PatternListOrPtr> for SyntaxStablePtrId {
8668    fn from(ptr: PatternListOrPtr) -> Self {
8669        ptr.untyped()
8670    }
8671}
8672#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
8673pub enum PatternListOrElementOrSeparatorGreen {
8674    Separator(TerminalOrGreen),
8675    Element(PatternGreen),
8676}
8677impl From<TerminalOrGreen> for PatternListOrElementOrSeparatorGreen {
8678    fn from(value: TerminalOrGreen) -> Self {
8679        PatternListOrElementOrSeparatorGreen::Separator(value)
8680    }
8681}
8682impl From<PatternGreen> for PatternListOrElementOrSeparatorGreen {
8683    fn from(value: PatternGreen) -> Self {
8684        PatternListOrElementOrSeparatorGreen::Element(value)
8685    }
8686}
8687impl PatternListOrElementOrSeparatorGreen {
8688    fn id(&self) -> GreenId {
8689        match self {
8690            PatternListOrElementOrSeparatorGreen::Separator(green) => green.0,
8691            PatternListOrElementOrSeparatorGreen::Element(green) => green.0,
8692        }
8693    }
8694}
8695#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
8696pub struct PatternListOrGreen(pub GreenId);
8697impl TypedSyntaxNode for PatternListOr {
8698    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PatternListOr);
8699    type StablePtr = PatternListOrPtr;
8700    type Green = PatternListOrGreen;
8701    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
8702        PatternListOrGreen(
8703            Arc::new(GreenNode {
8704                kind: SyntaxKind::PatternListOr,
8705                details: GreenNodeDetails::Node { children: vec![], width: TextWidth::default() },
8706            })
8707            .intern(db),
8708        )
8709    }
8710    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
8711        Self(ElementList::new(node))
8712    }
8713    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
8714        if node.kind(db) == SyntaxKind::PatternListOr {
8715            Some(Self(ElementList::new(node)))
8716        } else {
8717            None
8718        }
8719    }
8720    fn as_syntax_node(&self) -> SyntaxNode {
8721        self.node.clone()
8722    }
8723    fn stable_ptr(&self) -> Self::StablePtr {
8724        PatternListOrPtr(self.node.0.stable_ptr)
8725    }
8726}
8727impl From<&PatternListOr> for SyntaxStablePtrId {
8728    fn from(node: &PatternListOr) -> Self {
8729        node.stable_ptr().untyped()
8730    }
8731}
8732#[derive(Clone, Debug, Eq, Hash, PartialEq)]
8733pub enum PatternStructParam {
8734    Single(PatternIdentifier),
8735    WithExpr(PatternStructParamWithExpr),
8736    Tail(TerminalDotDot),
8737}
8738#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
8739pub struct PatternStructParamPtr(pub SyntaxStablePtrId);
8740impl TypedStablePtr for PatternStructParamPtr {
8741    type SyntaxNode = PatternStructParam;
8742    fn untyped(&self) -> SyntaxStablePtrId {
8743        self.0
8744    }
8745    fn lookup(&self, db: &dyn SyntaxGroup) -> PatternStructParam {
8746        PatternStructParam::from_syntax_node(db, self.0.lookup(db))
8747    }
8748}
8749impl From<PatternStructParamPtr> for SyntaxStablePtrId {
8750    fn from(ptr: PatternStructParamPtr) -> Self {
8751        ptr.untyped()
8752    }
8753}
8754impl From<PatternIdentifierPtr> for PatternStructParamPtr {
8755    fn from(value: PatternIdentifierPtr) -> Self {
8756        Self(value.0)
8757    }
8758}
8759impl From<PatternStructParamWithExprPtr> for PatternStructParamPtr {
8760    fn from(value: PatternStructParamWithExprPtr) -> Self {
8761        Self(value.0)
8762    }
8763}
8764impl From<TerminalDotDotPtr> for PatternStructParamPtr {
8765    fn from(value: TerminalDotDotPtr) -> Self {
8766        Self(value.0)
8767    }
8768}
8769impl From<PatternIdentifierGreen> for PatternStructParamGreen {
8770    fn from(value: PatternIdentifierGreen) -> Self {
8771        Self(value.0)
8772    }
8773}
8774impl From<PatternStructParamWithExprGreen> for PatternStructParamGreen {
8775    fn from(value: PatternStructParamWithExprGreen) -> Self {
8776        Self(value.0)
8777    }
8778}
8779impl From<TerminalDotDotGreen> for PatternStructParamGreen {
8780    fn from(value: TerminalDotDotGreen) -> Self {
8781        Self(value.0)
8782    }
8783}
8784#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
8785pub struct PatternStructParamGreen(pub GreenId);
8786impl TypedSyntaxNode for PatternStructParam {
8787    const OPTIONAL_KIND: Option<SyntaxKind> = None;
8788    type StablePtr = PatternStructParamPtr;
8789    type Green = PatternStructParamGreen;
8790    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
8791        panic!("No missing variant.");
8792    }
8793    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
8794        let kind = node.kind(db);
8795        match kind {
8796            SyntaxKind::PatternIdentifier => {
8797                PatternStructParam::Single(PatternIdentifier::from_syntax_node(db, node))
8798            }
8799            SyntaxKind::PatternStructParamWithExpr => {
8800                PatternStructParam::WithExpr(PatternStructParamWithExpr::from_syntax_node(db, node))
8801            }
8802            SyntaxKind::TerminalDotDot => {
8803                PatternStructParam::Tail(TerminalDotDot::from_syntax_node(db, node))
8804            }
8805            _ => panic!(
8806                "Unexpected syntax kind {:?} when constructing {}.",
8807                kind, "PatternStructParam"
8808            ),
8809        }
8810    }
8811    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
8812        let kind = node.kind(db);
8813        match kind {
8814            SyntaxKind::PatternIdentifier => {
8815                Some(PatternStructParam::Single(PatternIdentifier::from_syntax_node(db, node)))
8816            }
8817            SyntaxKind::PatternStructParamWithExpr => Some(PatternStructParam::WithExpr(
8818                PatternStructParamWithExpr::from_syntax_node(db, node),
8819            )),
8820            SyntaxKind::TerminalDotDot => {
8821                Some(PatternStructParam::Tail(TerminalDotDot::from_syntax_node(db, node)))
8822            }
8823            _ => None,
8824        }
8825    }
8826    fn as_syntax_node(&self) -> SyntaxNode {
8827        match self {
8828            PatternStructParam::Single(x) => x.as_syntax_node(),
8829            PatternStructParam::WithExpr(x) => x.as_syntax_node(),
8830            PatternStructParam::Tail(x) => x.as_syntax_node(),
8831        }
8832    }
8833    fn stable_ptr(&self) -> Self::StablePtr {
8834        PatternStructParamPtr(self.as_syntax_node().0.stable_ptr)
8835    }
8836}
8837impl From<&PatternStructParam> for SyntaxStablePtrId {
8838    fn from(node: &PatternStructParam) -> Self {
8839        node.stable_ptr().untyped()
8840    }
8841}
8842impl PatternStructParam {
8843    /// Checks if a kind of a variant of [PatternStructParam].
8844    pub fn is_variant(kind: SyntaxKind) -> bool {
8845        matches!(
8846            kind,
8847            SyntaxKind::PatternIdentifier
8848                | SyntaxKind::PatternStructParamWithExpr
8849                | SyntaxKind::TerminalDotDot
8850        )
8851    }
8852}
8853#[derive(Clone, Debug, Eq, Hash, PartialEq)]
8854pub struct PatternStructParamWithExpr {
8855    node: SyntaxNode,
8856    children: Arc<[SyntaxNode]>,
8857}
8858impl PatternStructParamWithExpr {
8859    pub const INDEX_MODIFIERS: usize = 0;
8860    pub const INDEX_NAME: usize = 1;
8861    pub const INDEX_COLON: usize = 2;
8862    pub const INDEX_PATTERN: usize = 3;
8863    pub fn new_green(
8864        db: &dyn SyntaxGroup,
8865        modifiers: ModifierListGreen,
8866        name: TerminalIdentifierGreen,
8867        colon: TerminalColonGreen,
8868        pattern: PatternGreen,
8869    ) -> PatternStructParamWithExprGreen {
8870        let children: Vec<GreenId> = vec![modifiers.0, name.0, colon.0, pattern.0];
8871        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
8872        PatternStructParamWithExprGreen(
8873            Arc::new(GreenNode {
8874                kind: SyntaxKind::PatternStructParamWithExpr,
8875                details: GreenNodeDetails::Node { children, width },
8876            })
8877            .intern(db),
8878        )
8879    }
8880}
8881impl PatternStructParamWithExpr {
8882    pub fn modifiers(&self, db: &dyn SyntaxGroup) -> ModifierList {
8883        ModifierList::from_syntax_node(db, self.children[0].clone())
8884    }
8885    pub fn name(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier {
8886        TerminalIdentifier::from_syntax_node(db, self.children[1].clone())
8887    }
8888    pub fn colon(&self, db: &dyn SyntaxGroup) -> TerminalColon {
8889        TerminalColon::from_syntax_node(db, self.children[2].clone())
8890    }
8891    pub fn pattern(&self, db: &dyn SyntaxGroup) -> Pattern {
8892        Pattern::from_syntax_node(db, self.children[3].clone())
8893    }
8894}
8895#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
8896pub struct PatternStructParamWithExprPtr(pub SyntaxStablePtrId);
8897impl PatternStructParamWithExprPtr {}
8898impl TypedStablePtr for PatternStructParamWithExprPtr {
8899    type SyntaxNode = PatternStructParamWithExpr;
8900    fn untyped(&self) -> SyntaxStablePtrId {
8901        self.0
8902    }
8903    fn lookup(&self, db: &dyn SyntaxGroup) -> PatternStructParamWithExpr {
8904        PatternStructParamWithExpr::from_syntax_node(db, self.0.lookup(db))
8905    }
8906}
8907impl From<PatternStructParamWithExprPtr> for SyntaxStablePtrId {
8908    fn from(ptr: PatternStructParamWithExprPtr) -> Self {
8909        ptr.untyped()
8910    }
8911}
8912#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
8913pub struct PatternStructParamWithExprGreen(pub GreenId);
8914impl TypedSyntaxNode for PatternStructParamWithExpr {
8915    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PatternStructParamWithExpr);
8916    type StablePtr = PatternStructParamWithExprPtr;
8917    type Green = PatternStructParamWithExprGreen;
8918    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
8919        PatternStructParamWithExprGreen(
8920            Arc::new(GreenNode {
8921                kind: SyntaxKind::PatternStructParamWithExpr,
8922                details: GreenNodeDetails::Node {
8923                    children: vec![
8924                        ModifierList::missing(db).0,
8925                        TerminalIdentifier::missing(db).0,
8926                        TerminalColon::missing(db).0,
8927                        Pattern::missing(db).0,
8928                    ],
8929                    width: TextWidth::default(),
8930                },
8931            })
8932            .intern(db),
8933        )
8934    }
8935    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
8936        let kind = node.kind(db);
8937        assert_eq!(
8938            kind,
8939            SyntaxKind::PatternStructParamWithExpr,
8940            "Unexpected SyntaxKind {:?}. Expected {:?}.",
8941            kind,
8942            SyntaxKind::PatternStructParamWithExpr
8943        );
8944        let children = db.get_children(node.clone());
8945        Self { node, children }
8946    }
8947    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
8948        let kind = node.kind(db);
8949        if kind == SyntaxKind::PatternStructParamWithExpr {
8950            Some(Self::from_syntax_node(db, node))
8951        } else {
8952            None
8953        }
8954    }
8955    fn as_syntax_node(&self) -> SyntaxNode {
8956        self.node.clone()
8957    }
8958    fn stable_ptr(&self) -> Self::StablePtr {
8959        PatternStructParamWithExprPtr(self.node.0.stable_ptr)
8960    }
8961}
8962impl From<&PatternStructParamWithExpr> for SyntaxStablePtrId {
8963    fn from(node: &PatternStructParamWithExpr) -> Self {
8964        node.stable_ptr().untyped()
8965    }
8966}
8967#[derive(Clone, Debug, Eq, Hash, PartialEq)]
8968pub struct PatternEnum {
8969    node: SyntaxNode,
8970    children: Arc<[SyntaxNode]>,
8971}
8972impl PatternEnum {
8973    pub const INDEX_PATH: usize = 0;
8974    pub const INDEX_PATTERN: usize = 1;
8975    pub fn new_green(
8976        db: &dyn SyntaxGroup,
8977        path: ExprPathGreen,
8978        pattern: OptionPatternEnumInnerPatternGreen,
8979    ) -> PatternEnumGreen {
8980        let children: Vec<GreenId> = vec![path.0, pattern.0];
8981        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
8982        PatternEnumGreen(
8983            Arc::new(GreenNode {
8984                kind: SyntaxKind::PatternEnum,
8985                details: GreenNodeDetails::Node { children, width },
8986            })
8987            .intern(db),
8988        )
8989    }
8990}
8991impl PatternEnum {
8992    pub fn path(&self, db: &dyn SyntaxGroup) -> ExprPath {
8993        ExprPath::from_syntax_node(db, self.children[0].clone())
8994    }
8995    pub fn pattern(&self, db: &dyn SyntaxGroup) -> OptionPatternEnumInnerPattern {
8996        OptionPatternEnumInnerPattern::from_syntax_node(db, self.children[1].clone())
8997    }
8998}
8999#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
9000pub struct PatternEnumPtr(pub SyntaxStablePtrId);
9001impl PatternEnumPtr {}
9002impl TypedStablePtr for PatternEnumPtr {
9003    type SyntaxNode = PatternEnum;
9004    fn untyped(&self) -> SyntaxStablePtrId {
9005        self.0
9006    }
9007    fn lookup(&self, db: &dyn SyntaxGroup) -> PatternEnum {
9008        PatternEnum::from_syntax_node(db, self.0.lookup(db))
9009    }
9010}
9011impl From<PatternEnumPtr> for SyntaxStablePtrId {
9012    fn from(ptr: PatternEnumPtr) -> Self {
9013        ptr.untyped()
9014    }
9015}
9016#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
9017pub struct PatternEnumGreen(pub GreenId);
9018impl TypedSyntaxNode for PatternEnum {
9019    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PatternEnum);
9020    type StablePtr = PatternEnumPtr;
9021    type Green = PatternEnumGreen;
9022    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
9023        PatternEnumGreen(
9024            Arc::new(GreenNode {
9025                kind: SyntaxKind::PatternEnum,
9026                details: GreenNodeDetails::Node {
9027                    children: vec![
9028                        ExprPath::missing(db).0,
9029                        OptionPatternEnumInnerPattern::missing(db).0,
9030                    ],
9031                    width: TextWidth::default(),
9032                },
9033            })
9034            .intern(db),
9035        )
9036    }
9037    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
9038        let kind = node.kind(db);
9039        assert_eq!(
9040            kind,
9041            SyntaxKind::PatternEnum,
9042            "Unexpected SyntaxKind {:?}. Expected {:?}.",
9043            kind,
9044            SyntaxKind::PatternEnum
9045        );
9046        let children = db.get_children(node.clone());
9047        Self { node, children }
9048    }
9049    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
9050        let kind = node.kind(db);
9051        if kind == SyntaxKind::PatternEnum { Some(Self::from_syntax_node(db, node)) } else { None }
9052    }
9053    fn as_syntax_node(&self) -> SyntaxNode {
9054        self.node.clone()
9055    }
9056    fn stable_ptr(&self) -> Self::StablePtr {
9057        PatternEnumPtr(self.node.0.stable_ptr)
9058    }
9059}
9060impl From<&PatternEnum> for SyntaxStablePtrId {
9061    fn from(node: &PatternEnum) -> Self {
9062        node.stable_ptr().untyped()
9063    }
9064}
9065#[derive(Clone, Debug, Eq, Hash, PartialEq)]
9066pub struct PatternEnumInnerPattern {
9067    node: SyntaxNode,
9068    children: Arc<[SyntaxNode]>,
9069}
9070impl PatternEnumInnerPattern {
9071    pub const INDEX_LPAREN: usize = 0;
9072    pub const INDEX_PATTERN: usize = 1;
9073    pub const INDEX_RPAREN: usize = 2;
9074    pub fn new_green(
9075        db: &dyn SyntaxGroup,
9076        lparen: TerminalLParenGreen,
9077        pattern: PatternGreen,
9078        rparen: TerminalRParenGreen,
9079    ) -> PatternEnumInnerPatternGreen {
9080        let children: Vec<GreenId> = vec![lparen.0, pattern.0, rparen.0];
9081        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
9082        PatternEnumInnerPatternGreen(
9083            Arc::new(GreenNode {
9084                kind: SyntaxKind::PatternEnumInnerPattern,
9085                details: GreenNodeDetails::Node { children, width },
9086            })
9087            .intern(db),
9088        )
9089    }
9090}
9091impl PatternEnumInnerPattern {
9092    pub fn lparen(&self, db: &dyn SyntaxGroup) -> TerminalLParen {
9093        TerminalLParen::from_syntax_node(db, self.children[0].clone())
9094    }
9095    pub fn pattern(&self, db: &dyn SyntaxGroup) -> Pattern {
9096        Pattern::from_syntax_node(db, self.children[1].clone())
9097    }
9098    pub fn rparen(&self, db: &dyn SyntaxGroup) -> TerminalRParen {
9099        TerminalRParen::from_syntax_node(db, self.children[2].clone())
9100    }
9101}
9102#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
9103pub struct PatternEnumInnerPatternPtr(pub SyntaxStablePtrId);
9104impl PatternEnumInnerPatternPtr {}
9105impl TypedStablePtr for PatternEnumInnerPatternPtr {
9106    type SyntaxNode = PatternEnumInnerPattern;
9107    fn untyped(&self) -> SyntaxStablePtrId {
9108        self.0
9109    }
9110    fn lookup(&self, db: &dyn SyntaxGroup) -> PatternEnumInnerPattern {
9111        PatternEnumInnerPattern::from_syntax_node(db, self.0.lookup(db))
9112    }
9113}
9114impl From<PatternEnumInnerPatternPtr> for SyntaxStablePtrId {
9115    fn from(ptr: PatternEnumInnerPatternPtr) -> Self {
9116        ptr.untyped()
9117    }
9118}
9119#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
9120pub struct PatternEnumInnerPatternGreen(pub GreenId);
9121impl TypedSyntaxNode for PatternEnumInnerPattern {
9122    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PatternEnumInnerPattern);
9123    type StablePtr = PatternEnumInnerPatternPtr;
9124    type Green = PatternEnumInnerPatternGreen;
9125    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
9126        PatternEnumInnerPatternGreen(
9127            Arc::new(GreenNode {
9128                kind: SyntaxKind::PatternEnumInnerPattern,
9129                details: GreenNodeDetails::Node {
9130                    children: vec![
9131                        TerminalLParen::missing(db).0,
9132                        Pattern::missing(db).0,
9133                        TerminalRParen::missing(db).0,
9134                    ],
9135                    width: TextWidth::default(),
9136                },
9137            })
9138            .intern(db),
9139        )
9140    }
9141    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
9142        let kind = node.kind(db);
9143        assert_eq!(
9144            kind,
9145            SyntaxKind::PatternEnumInnerPattern,
9146            "Unexpected SyntaxKind {:?}. Expected {:?}.",
9147            kind,
9148            SyntaxKind::PatternEnumInnerPattern
9149        );
9150        let children = db.get_children(node.clone());
9151        Self { node, children }
9152    }
9153    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
9154        let kind = node.kind(db);
9155        if kind == SyntaxKind::PatternEnumInnerPattern {
9156            Some(Self::from_syntax_node(db, node))
9157        } else {
9158            None
9159        }
9160    }
9161    fn as_syntax_node(&self) -> SyntaxNode {
9162        self.node.clone()
9163    }
9164    fn stable_ptr(&self) -> Self::StablePtr {
9165        PatternEnumInnerPatternPtr(self.node.0.stable_ptr)
9166    }
9167}
9168impl From<&PatternEnumInnerPattern> for SyntaxStablePtrId {
9169    fn from(node: &PatternEnumInnerPattern) -> Self {
9170        node.stable_ptr().untyped()
9171    }
9172}
9173#[derive(Clone, Debug, Eq, Hash, PartialEq)]
9174pub enum OptionPatternEnumInnerPattern {
9175    Empty(OptionPatternEnumInnerPatternEmpty),
9176    PatternEnumInnerPattern(PatternEnumInnerPattern),
9177}
9178#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
9179pub struct OptionPatternEnumInnerPatternPtr(pub SyntaxStablePtrId);
9180impl TypedStablePtr for OptionPatternEnumInnerPatternPtr {
9181    type SyntaxNode = OptionPatternEnumInnerPattern;
9182    fn untyped(&self) -> SyntaxStablePtrId {
9183        self.0
9184    }
9185    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionPatternEnumInnerPattern {
9186        OptionPatternEnumInnerPattern::from_syntax_node(db, self.0.lookup(db))
9187    }
9188}
9189impl From<OptionPatternEnumInnerPatternPtr> for SyntaxStablePtrId {
9190    fn from(ptr: OptionPatternEnumInnerPatternPtr) -> Self {
9191        ptr.untyped()
9192    }
9193}
9194impl From<OptionPatternEnumInnerPatternEmptyPtr> for OptionPatternEnumInnerPatternPtr {
9195    fn from(value: OptionPatternEnumInnerPatternEmptyPtr) -> Self {
9196        Self(value.0)
9197    }
9198}
9199impl From<PatternEnumInnerPatternPtr> for OptionPatternEnumInnerPatternPtr {
9200    fn from(value: PatternEnumInnerPatternPtr) -> Self {
9201        Self(value.0)
9202    }
9203}
9204impl From<OptionPatternEnumInnerPatternEmptyGreen> for OptionPatternEnumInnerPatternGreen {
9205    fn from(value: OptionPatternEnumInnerPatternEmptyGreen) -> Self {
9206        Self(value.0)
9207    }
9208}
9209impl From<PatternEnumInnerPatternGreen> for OptionPatternEnumInnerPatternGreen {
9210    fn from(value: PatternEnumInnerPatternGreen) -> Self {
9211        Self(value.0)
9212    }
9213}
9214#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
9215pub struct OptionPatternEnumInnerPatternGreen(pub GreenId);
9216impl TypedSyntaxNode for OptionPatternEnumInnerPattern {
9217    const OPTIONAL_KIND: Option<SyntaxKind> = None;
9218    type StablePtr = OptionPatternEnumInnerPatternPtr;
9219    type Green = OptionPatternEnumInnerPatternGreen;
9220    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
9221        panic!("No missing variant.");
9222    }
9223    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
9224        let kind = node.kind(db);
9225        match kind {
9226            SyntaxKind::OptionPatternEnumInnerPatternEmpty => OptionPatternEnumInnerPattern::Empty(
9227                OptionPatternEnumInnerPatternEmpty::from_syntax_node(db, node),
9228            ),
9229            SyntaxKind::PatternEnumInnerPattern => {
9230                OptionPatternEnumInnerPattern::PatternEnumInnerPattern(
9231                    PatternEnumInnerPattern::from_syntax_node(db, node),
9232                )
9233            }
9234            _ => panic!(
9235                "Unexpected syntax kind {:?} when constructing {}.",
9236                kind, "OptionPatternEnumInnerPattern"
9237            ),
9238        }
9239    }
9240    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
9241        let kind = node.kind(db);
9242        match kind {
9243            SyntaxKind::OptionPatternEnumInnerPatternEmpty => {
9244                Some(OptionPatternEnumInnerPattern::Empty(
9245                    OptionPatternEnumInnerPatternEmpty::from_syntax_node(db, node),
9246                ))
9247            }
9248            SyntaxKind::PatternEnumInnerPattern => {
9249                Some(OptionPatternEnumInnerPattern::PatternEnumInnerPattern(
9250                    PatternEnumInnerPattern::from_syntax_node(db, node),
9251                ))
9252            }
9253            _ => None,
9254        }
9255    }
9256    fn as_syntax_node(&self) -> SyntaxNode {
9257        match self {
9258            OptionPatternEnumInnerPattern::Empty(x) => x.as_syntax_node(),
9259            OptionPatternEnumInnerPattern::PatternEnumInnerPattern(x) => x.as_syntax_node(),
9260        }
9261    }
9262    fn stable_ptr(&self) -> Self::StablePtr {
9263        OptionPatternEnumInnerPatternPtr(self.as_syntax_node().0.stable_ptr)
9264    }
9265}
9266impl From<&OptionPatternEnumInnerPattern> for SyntaxStablePtrId {
9267    fn from(node: &OptionPatternEnumInnerPattern) -> Self {
9268        node.stable_ptr().untyped()
9269    }
9270}
9271impl OptionPatternEnumInnerPattern {
9272    /// Checks if a kind of a variant of [OptionPatternEnumInnerPattern].
9273    pub fn is_variant(kind: SyntaxKind) -> bool {
9274        matches!(
9275            kind,
9276            SyntaxKind::OptionPatternEnumInnerPatternEmpty | SyntaxKind::PatternEnumInnerPattern
9277        )
9278    }
9279}
9280#[derive(Clone, Debug, Eq, Hash, PartialEq)]
9281pub struct OptionPatternEnumInnerPatternEmpty {
9282    node: SyntaxNode,
9283    children: Arc<[SyntaxNode]>,
9284}
9285impl OptionPatternEnumInnerPatternEmpty {
9286    pub fn new_green(db: &dyn SyntaxGroup) -> OptionPatternEnumInnerPatternEmptyGreen {
9287        let children: Vec<GreenId> = vec![];
9288        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
9289        OptionPatternEnumInnerPatternEmptyGreen(
9290            Arc::new(GreenNode {
9291                kind: SyntaxKind::OptionPatternEnumInnerPatternEmpty,
9292                details: GreenNodeDetails::Node { children, width },
9293            })
9294            .intern(db),
9295        )
9296    }
9297}
9298impl OptionPatternEnumInnerPatternEmpty {}
9299#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
9300pub struct OptionPatternEnumInnerPatternEmptyPtr(pub SyntaxStablePtrId);
9301impl OptionPatternEnumInnerPatternEmptyPtr {}
9302impl TypedStablePtr for OptionPatternEnumInnerPatternEmptyPtr {
9303    type SyntaxNode = OptionPatternEnumInnerPatternEmpty;
9304    fn untyped(&self) -> SyntaxStablePtrId {
9305        self.0
9306    }
9307    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionPatternEnumInnerPatternEmpty {
9308        OptionPatternEnumInnerPatternEmpty::from_syntax_node(db, self.0.lookup(db))
9309    }
9310}
9311impl From<OptionPatternEnumInnerPatternEmptyPtr> for SyntaxStablePtrId {
9312    fn from(ptr: OptionPatternEnumInnerPatternEmptyPtr) -> Self {
9313        ptr.untyped()
9314    }
9315}
9316#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
9317pub struct OptionPatternEnumInnerPatternEmptyGreen(pub GreenId);
9318impl TypedSyntaxNode for OptionPatternEnumInnerPatternEmpty {
9319    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionPatternEnumInnerPatternEmpty);
9320    type StablePtr = OptionPatternEnumInnerPatternEmptyPtr;
9321    type Green = OptionPatternEnumInnerPatternEmptyGreen;
9322    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
9323        OptionPatternEnumInnerPatternEmptyGreen(
9324            Arc::new(GreenNode {
9325                kind: SyntaxKind::OptionPatternEnumInnerPatternEmpty,
9326                details: GreenNodeDetails::Node { children: vec![], width: TextWidth::default() },
9327            })
9328            .intern(db),
9329        )
9330    }
9331    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
9332        let kind = node.kind(db);
9333        assert_eq!(
9334            kind,
9335            SyntaxKind::OptionPatternEnumInnerPatternEmpty,
9336            "Unexpected SyntaxKind {:?}. Expected {:?}.",
9337            kind,
9338            SyntaxKind::OptionPatternEnumInnerPatternEmpty
9339        );
9340        let children = db.get_children(node.clone());
9341        Self { node, children }
9342    }
9343    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
9344        let kind = node.kind(db);
9345        if kind == SyntaxKind::OptionPatternEnumInnerPatternEmpty {
9346            Some(Self::from_syntax_node(db, node))
9347        } else {
9348            None
9349        }
9350    }
9351    fn as_syntax_node(&self) -> SyntaxNode {
9352        self.node.clone()
9353    }
9354    fn stable_ptr(&self) -> Self::StablePtr {
9355        OptionPatternEnumInnerPatternEmptyPtr(self.node.0.stable_ptr)
9356    }
9357}
9358impl From<&OptionPatternEnumInnerPatternEmpty> for SyntaxStablePtrId {
9359    fn from(node: &OptionPatternEnumInnerPatternEmpty) -> Self {
9360        node.stable_ptr().untyped()
9361    }
9362}
9363#[derive(Clone, Debug, Eq, Hash, PartialEq)]
9364pub struct TypeClause {
9365    node: SyntaxNode,
9366    children: Arc<[SyntaxNode]>,
9367}
9368impl TypeClause {
9369    pub const INDEX_COLON: usize = 0;
9370    pub const INDEX_TY: usize = 1;
9371    pub fn new_green(
9372        db: &dyn SyntaxGroup,
9373        colon: TerminalColonGreen,
9374        ty: ExprGreen,
9375    ) -> TypeClauseGreen {
9376        let children: Vec<GreenId> = vec![colon.0, ty.0];
9377        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
9378        TypeClauseGreen(
9379            Arc::new(GreenNode {
9380                kind: SyntaxKind::TypeClause,
9381                details: GreenNodeDetails::Node { children, width },
9382            })
9383            .intern(db),
9384        )
9385    }
9386}
9387impl TypeClause {
9388    pub fn colon(&self, db: &dyn SyntaxGroup) -> TerminalColon {
9389        TerminalColon::from_syntax_node(db, self.children[0].clone())
9390    }
9391    pub fn ty(&self, db: &dyn SyntaxGroup) -> Expr {
9392        Expr::from_syntax_node(db, self.children[1].clone())
9393    }
9394}
9395#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
9396pub struct TypeClausePtr(pub SyntaxStablePtrId);
9397impl TypeClausePtr {}
9398impl TypedStablePtr for TypeClausePtr {
9399    type SyntaxNode = TypeClause;
9400    fn untyped(&self) -> SyntaxStablePtrId {
9401        self.0
9402    }
9403    fn lookup(&self, db: &dyn SyntaxGroup) -> TypeClause {
9404        TypeClause::from_syntax_node(db, self.0.lookup(db))
9405    }
9406}
9407impl From<TypeClausePtr> for SyntaxStablePtrId {
9408    fn from(ptr: TypeClausePtr) -> Self {
9409        ptr.untyped()
9410    }
9411}
9412#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
9413pub struct TypeClauseGreen(pub GreenId);
9414impl TypedSyntaxNode for TypeClause {
9415    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TypeClause);
9416    type StablePtr = TypeClausePtr;
9417    type Green = TypeClauseGreen;
9418    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
9419        TypeClauseGreen(
9420            Arc::new(GreenNode {
9421                kind: SyntaxKind::TypeClause,
9422                details: GreenNodeDetails::Node {
9423                    children: vec![TerminalColon::missing(db).0, Expr::missing(db).0],
9424                    width: TextWidth::default(),
9425                },
9426            })
9427            .intern(db),
9428        )
9429    }
9430    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
9431        let kind = node.kind(db);
9432        assert_eq!(
9433            kind,
9434            SyntaxKind::TypeClause,
9435            "Unexpected SyntaxKind {:?}. Expected {:?}.",
9436            kind,
9437            SyntaxKind::TypeClause
9438        );
9439        let children = db.get_children(node.clone());
9440        Self { node, children }
9441    }
9442    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
9443        let kind = node.kind(db);
9444        if kind == SyntaxKind::TypeClause { Some(Self::from_syntax_node(db, node)) } else { None }
9445    }
9446    fn as_syntax_node(&self) -> SyntaxNode {
9447        self.node.clone()
9448    }
9449    fn stable_ptr(&self) -> Self::StablePtr {
9450        TypeClausePtr(self.node.0.stable_ptr)
9451    }
9452}
9453impl From<&TypeClause> for SyntaxStablePtrId {
9454    fn from(node: &TypeClause) -> Self {
9455        node.stable_ptr().untyped()
9456    }
9457}
9458#[derive(Clone, Debug, Eq, Hash, PartialEq)]
9459pub enum OptionTypeClause {
9460    Empty(OptionTypeClauseEmpty),
9461    TypeClause(TypeClause),
9462}
9463#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
9464pub struct OptionTypeClausePtr(pub SyntaxStablePtrId);
9465impl TypedStablePtr for OptionTypeClausePtr {
9466    type SyntaxNode = OptionTypeClause;
9467    fn untyped(&self) -> SyntaxStablePtrId {
9468        self.0
9469    }
9470    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionTypeClause {
9471        OptionTypeClause::from_syntax_node(db, self.0.lookup(db))
9472    }
9473}
9474impl From<OptionTypeClausePtr> for SyntaxStablePtrId {
9475    fn from(ptr: OptionTypeClausePtr) -> Self {
9476        ptr.untyped()
9477    }
9478}
9479impl From<OptionTypeClauseEmptyPtr> for OptionTypeClausePtr {
9480    fn from(value: OptionTypeClauseEmptyPtr) -> Self {
9481        Self(value.0)
9482    }
9483}
9484impl From<TypeClausePtr> for OptionTypeClausePtr {
9485    fn from(value: TypeClausePtr) -> Self {
9486        Self(value.0)
9487    }
9488}
9489impl From<OptionTypeClauseEmptyGreen> for OptionTypeClauseGreen {
9490    fn from(value: OptionTypeClauseEmptyGreen) -> Self {
9491        Self(value.0)
9492    }
9493}
9494impl From<TypeClauseGreen> for OptionTypeClauseGreen {
9495    fn from(value: TypeClauseGreen) -> Self {
9496        Self(value.0)
9497    }
9498}
9499#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
9500pub struct OptionTypeClauseGreen(pub GreenId);
9501impl TypedSyntaxNode for OptionTypeClause {
9502    const OPTIONAL_KIND: Option<SyntaxKind> = None;
9503    type StablePtr = OptionTypeClausePtr;
9504    type Green = OptionTypeClauseGreen;
9505    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
9506        panic!("No missing variant.");
9507    }
9508    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
9509        let kind = node.kind(db);
9510        match kind {
9511            SyntaxKind::OptionTypeClauseEmpty => {
9512                OptionTypeClause::Empty(OptionTypeClauseEmpty::from_syntax_node(db, node))
9513            }
9514            SyntaxKind::TypeClause => {
9515                OptionTypeClause::TypeClause(TypeClause::from_syntax_node(db, node))
9516            }
9517            _ => panic!(
9518                "Unexpected syntax kind {:?} when constructing {}.",
9519                kind, "OptionTypeClause"
9520            ),
9521        }
9522    }
9523    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
9524        let kind = node.kind(db);
9525        match kind {
9526            SyntaxKind::OptionTypeClauseEmpty => {
9527                Some(OptionTypeClause::Empty(OptionTypeClauseEmpty::from_syntax_node(db, node)))
9528            }
9529            SyntaxKind::TypeClause => {
9530                Some(OptionTypeClause::TypeClause(TypeClause::from_syntax_node(db, node)))
9531            }
9532            _ => None,
9533        }
9534    }
9535    fn as_syntax_node(&self) -> SyntaxNode {
9536        match self {
9537            OptionTypeClause::Empty(x) => x.as_syntax_node(),
9538            OptionTypeClause::TypeClause(x) => x.as_syntax_node(),
9539        }
9540    }
9541    fn stable_ptr(&self) -> Self::StablePtr {
9542        OptionTypeClausePtr(self.as_syntax_node().0.stable_ptr)
9543    }
9544}
9545impl From<&OptionTypeClause> for SyntaxStablePtrId {
9546    fn from(node: &OptionTypeClause) -> Self {
9547        node.stable_ptr().untyped()
9548    }
9549}
9550impl OptionTypeClause {
9551    /// Checks if a kind of a variant of [OptionTypeClause].
9552    pub fn is_variant(kind: SyntaxKind) -> bool {
9553        matches!(kind, SyntaxKind::OptionTypeClauseEmpty | SyntaxKind::TypeClause)
9554    }
9555}
9556#[derive(Clone, Debug, Eq, Hash, PartialEq)]
9557pub struct OptionTypeClauseEmpty {
9558    node: SyntaxNode,
9559    children: Arc<[SyntaxNode]>,
9560}
9561impl OptionTypeClauseEmpty {
9562    pub fn new_green(db: &dyn SyntaxGroup) -> OptionTypeClauseEmptyGreen {
9563        let children: Vec<GreenId> = vec![];
9564        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
9565        OptionTypeClauseEmptyGreen(
9566            Arc::new(GreenNode {
9567                kind: SyntaxKind::OptionTypeClauseEmpty,
9568                details: GreenNodeDetails::Node { children, width },
9569            })
9570            .intern(db),
9571        )
9572    }
9573}
9574impl OptionTypeClauseEmpty {}
9575#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
9576pub struct OptionTypeClauseEmptyPtr(pub SyntaxStablePtrId);
9577impl OptionTypeClauseEmptyPtr {}
9578impl TypedStablePtr for OptionTypeClauseEmptyPtr {
9579    type SyntaxNode = OptionTypeClauseEmpty;
9580    fn untyped(&self) -> SyntaxStablePtrId {
9581        self.0
9582    }
9583    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionTypeClauseEmpty {
9584        OptionTypeClauseEmpty::from_syntax_node(db, self.0.lookup(db))
9585    }
9586}
9587impl From<OptionTypeClauseEmptyPtr> for SyntaxStablePtrId {
9588    fn from(ptr: OptionTypeClauseEmptyPtr) -> Self {
9589        ptr.untyped()
9590    }
9591}
9592#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
9593pub struct OptionTypeClauseEmptyGreen(pub GreenId);
9594impl TypedSyntaxNode for OptionTypeClauseEmpty {
9595    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionTypeClauseEmpty);
9596    type StablePtr = OptionTypeClauseEmptyPtr;
9597    type Green = OptionTypeClauseEmptyGreen;
9598    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
9599        OptionTypeClauseEmptyGreen(
9600            Arc::new(GreenNode {
9601                kind: SyntaxKind::OptionTypeClauseEmpty,
9602                details: GreenNodeDetails::Node { children: vec![], width: TextWidth::default() },
9603            })
9604            .intern(db),
9605        )
9606    }
9607    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
9608        let kind = node.kind(db);
9609        assert_eq!(
9610            kind,
9611            SyntaxKind::OptionTypeClauseEmpty,
9612            "Unexpected SyntaxKind {:?}. Expected {:?}.",
9613            kind,
9614            SyntaxKind::OptionTypeClauseEmpty
9615        );
9616        let children = db.get_children(node.clone());
9617        Self { node, children }
9618    }
9619    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
9620        let kind = node.kind(db);
9621        if kind == SyntaxKind::OptionTypeClauseEmpty {
9622            Some(Self::from_syntax_node(db, node))
9623        } else {
9624            None
9625        }
9626    }
9627    fn as_syntax_node(&self) -> SyntaxNode {
9628        self.node.clone()
9629    }
9630    fn stable_ptr(&self) -> Self::StablePtr {
9631        OptionTypeClauseEmptyPtr(self.node.0.stable_ptr)
9632    }
9633}
9634impl From<&OptionTypeClauseEmpty> for SyntaxStablePtrId {
9635    fn from(node: &OptionTypeClauseEmpty) -> Self {
9636        node.stable_ptr().untyped()
9637    }
9638}
9639#[derive(Clone, Debug, Eq, Hash, PartialEq)]
9640pub struct ReturnTypeClause {
9641    node: SyntaxNode,
9642    children: Arc<[SyntaxNode]>,
9643}
9644impl ReturnTypeClause {
9645    pub const INDEX_ARROW: usize = 0;
9646    pub const INDEX_TY: usize = 1;
9647    pub fn new_green(
9648        db: &dyn SyntaxGroup,
9649        arrow: TerminalArrowGreen,
9650        ty: ExprGreen,
9651    ) -> ReturnTypeClauseGreen {
9652        let children: Vec<GreenId> = vec![arrow.0, ty.0];
9653        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
9654        ReturnTypeClauseGreen(
9655            Arc::new(GreenNode {
9656                kind: SyntaxKind::ReturnTypeClause,
9657                details: GreenNodeDetails::Node { children, width },
9658            })
9659            .intern(db),
9660        )
9661    }
9662}
9663impl ReturnTypeClause {
9664    pub fn arrow(&self, db: &dyn SyntaxGroup) -> TerminalArrow {
9665        TerminalArrow::from_syntax_node(db, self.children[0].clone())
9666    }
9667    pub fn ty(&self, db: &dyn SyntaxGroup) -> Expr {
9668        Expr::from_syntax_node(db, self.children[1].clone())
9669    }
9670}
9671#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
9672pub struct ReturnTypeClausePtr(pub SyntaxStablePtrId);
9673impl ReturnTypeClausePtr {}
9674impl TypedStablePtr for ReturnTypeClausePtr {
9675    type SyntaxNode = ReturnTypeClause;
9676    fn untyped(&self) -> SyntaxStablePtrId {
9677        self.0
9678    }
9679    fn lookup(&self, db: &dyn SyntaxGroup) -> ReturnTypeClause {
9680        ReturnTypeClause::from_syntax_node(db, self.0.lookup(db))
9681    }
9682}
9683impl From<ReturnTypeClausePtr> for SyntaxStablePtrId {
9684    fn from(ptr: ReturnTypeClausePtr) -> Self {
9685        ptr.untyped()
9686    }
9687}
9688#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
9689pub struct ReturnTypeClauseGreen(pub GreenId);
9690impl TypedSyntaxNode for ReturnTypeClause {
9691    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ReturnTypeClause);
9692    type StablePtr = ReturnTypeClausePtr;
9693    type Green = ReturnTypeClauseGreen;
9694    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
9695        ReturnTypeClauseGreen(
9696            Arc::new(GreenNode {
9697                kind: SyntaxKind::ReturnTypeClause,
9698                details: GreenNodeDetails::Node {
9699                    children: vec![TerminalArrow::missing(db).0, Expr::missing(db).0],
9700                    width: TextWidth::default(),
9701                },
9702            })
9703            .intern(db),
9704        )
9705    }
9706    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
9707        let kind = node.kind(db);
9708        assert_eq!(
9709            kind,
9710            SyntaxKind::ReturnTypeClause,
9711            "Unexpected SyntaxKind {:?}. Expected {:?}.",
9712            kind,
9713            SyntaxKind::ReturnTypeClause
9714        );
9715        let children = db.get_children(node.clone());
9716        Self { node, children }
9717    }
9718    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
9719        let kind = node.kind(db);
9720        if kind == SyntaxKind::ReturnTypeClause {
9721            Some(Self::from_syntax_node(db, node))
9722        } else {
9723            None
9724        }
9725    }
9726    fn as_syntax_node(&self) -> SyntaxNode {
9727        self.node.clone()
9728    }
9729    fn stable_ptr(&self) -> Self::StablePtr {
9730        ReturnTypeClausePtr(self.node.0.stable_ptr)
9731    }
9732}
9733impl From<&ReturnTypeClause> for SyntaxStablePtrId {
9734    fn from(node: &ReturnTypeClause) -> Self {
9735        node.stable_ptr().untyped()
9736    }
9737}
9738#[derive(Clone, Debug, Eq, Hash, PartialEq)]
9739pub enum OptionReturnTypeClause {
9740    Empty(OptionReturnTypeClauseEmpty),
9741    ReturnTypeClause(ReturnTypeClause),
9742}
9743#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
9744pub struct OptionReturnTypeClausePtr(pub SyntaxStablePtrId);
9745impl TypedStablePtr for OptionReturnTypeClausePtr {
9746    type SyntaxNode = OptionReturnTypeClause;
9747    fn untyped(&self) -> SyntaxStablePtrId {
9748        self.0
9749    }
9750    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionReturnTypeClause {
9751        OptionReturnTypeClause::from_syntax_node(db, self.0.lookup(db))
9752    }
9753}
9754impl From<OptionReturnTypeClausePtr> for SyntaxStablePtrId {
9755    fn from(ptr: OptionReturnTypeClausePtr) -> Self {
9756        ptr.untyped()
9757    }
9758}
9759impl From<OptionReturnTypeClauseEmptyPtr> for OptionReturnTypeClausePtr {
9760    fn from(value: OptionReturnTypeClauseEmptyPtr) -> Self {
9761        Self(value.0)
9762    }
9763}
9764impl From<ReturnTypeClausePtr> for OptionReturnTypeClausePtr {
9765    fn from(value: ReturnTypeClausePtr) -> Self {
9766        Self(value.0)
9767    }
9768}
9769impl From<OptionReturnTypeClauseEmptyGreen> for OptionReturnTypeClauseGreen {
9770    fn from(value: OptionReturnTypeClauseEmptyGreen) -> Self {
9771        Self(value.0)
9772    }
9773}
9774impl From<ReturnTypeClauseGreen> for OptionReturnTypeClauseGreen {
9775    fn from(value: ReturnTypeClauseGreen) -> Self {
9776        Self(value.0)
9777    }
9778}
9779#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
9780pub struct OptionReturnTypeClauseGreen(pub GreenId);
9781impl TypedSyntaxNode for OptionReturnTypeClause {
9782    const OPTIONAL_KIND: Option<SyntaxKind> = None;
9783    type StablePtr = OptionReturnTypeClausePtr;
9784    type Green = OptionReturnTypeClauseGreen;
9785    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
9786        panic!("No missing variant.");
9787    }
9788    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
9789        let kind = node.kind(db);
9790        match kind {
9791            SyntaxKind::OptionReturnTypeClauseEmpty => OptionReturnTypeClause::Empty(
9792                OptionReturnTypeClauseEmpty::from_syntax_node(db, node),
9793            ),
9794            SyntaxKind::ReturnTypeClause => OptionReturnTypeClause::ReturnTypeClause(
9795                ReturnTypeClause::from_syntax_node(db, node),
9796            ),
9797            _ => panic!(
9798                "Unexpected syntax kind {:?} when constructing {}.",
9799                kind, "OptionReturnTypeClause"
9800            ),
9801        }
9802    }
9803    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
9804        let kind = node.kind(db);
9805        match kind {
9806            SyntaxKind::OptionReturnTypeClauseEmpty => Some(OptionReturnTypeClause::Empty(
9807                OptionReturnTypeClauseEmpty::from_syntax_node(db, node),
9808            )),
9809            SyntaxKind::ReturnTypeClause => Some(OptionReturnTypeClause::ReturnTypeClause(
9810                ReturnTypeClause::from_syntax_node(db, node),
9811            )),
9812            _ => None,
9813        }
9814    }
9815    fn as_syntax_node(&self) -> SyntaxNode {
9816        match self {
9817            OptionReturnTypeClause::Empty(x) => x.as_syntax_node(),
9818            OptionReturnTypeClause::ReturnTypeClause(x) => x.as_syntax_node(),
9819        }
9820    }
9821    fn stable_ptr(&self) -> Self::StablePtr {
9822        OptionReturnTypeClausePtr(self.as_syntax_node().0.stable_ptr)
9823    }
9824}
9825impl From<&OptionReturnTypeClause> for SyntaxStablePtrId {
9826    fn from(node: &OptionReturnTypeClause) -> Self {
9827        node.stable_ptr().untyped()
9828    }
9829}
9830impl OptionReturnTypeClause {
9831    /// Checks if a kind of a variant of [OptionReturnTypeClause].
9832    pub fn is_variant(kind: SyntaxKind) -> bool {
9833        matches!(kind, SyntaxKind::OptionReturnTypeClauseEmpty | SyntaxKind::ReturnTypeClause)
9834    }
9835}
9836#[derive(Clone, Debug, Eq, Hash, PartialEq)]
9837pub struct OptionReturnTypeClauseEmpty {
9838    node: SyntaxNode,
9839    children: Arc<[SyntaxNode]>,
9840}
9841impl OptionReturnTypeClauseEmpty {
9842    pub fn new_green(db: &dyn SyntaxGroup) -> OptionReturnTypeClauseEmptyGreen {
9843        let children: Vec<GreenId> = vec![];
9844        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
9845        OptionReturnTypeClauseEmptyGreen(
9846            Arc::new(GreenNode {
9847                kind: SyntaxKind::OptionReturnTypeClauseEmpty,
9848                details: GreenNodeDetails::Node { children, width },
9849            })
9850            .intern(db),
9851        )
9852    }
9853}
9854impl OptionReturnTypeClauseEmpty {}
9855#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
9856pub struct OptionReturnTypeClauseEmptyPtr(pub SyntaxStablePtrId);
9857impl OptionReturnTypeClauseEmptyPtr {}
9858impl TypedStablePtr for OptionReturnTypeClauseEmptyPtr {
9859    type SyntaxNode = OptionReturnTypeClauseEmpty;
9860    fn untyped(&self) -> SyntaxStablePtrId {
9861        self.0
9862    }
9863    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionReturnTypeClauseEmpty {
9864        OptionReturnTypeClauseEmpty::from_syntax_node(db, self.0.lookup(db))
9865    }
9866}
9867impl From<OptionReturnTypeClauseEmptyPtr> for SyntaxStablePtrId {
9868    fn from(ptr: OptionReturnTypeClauseEmptyPtr) -> Self {
9869        ptr.untyped()
9870    }
9871}
9872#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
9873pub struct OptionReturnTypeClauseEmptyGreen(pub GreenId);
9874impl TypedSyntaxNode for OptionReturnTypeClauseEmpty {
9875    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionReturnTypeClauseEmpty);
9876    type StablePtr = OptionReturnTypeClauseEmptyPtr;
9877    type Green = OptionReturnTypeClauseEmptyGreen;
9878    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
9879        OptionReturnTypeClauseEmptyGreen(
9880            Arc::new(GreenNode {
9881                kind: SyntaxKind::OptionReturnTypeClauseEmpty,
9882                details: GreenNodeDetails::Node { children: vec![], width: TextWidth::default() },
9883            })
9884            .intern(db),
9885        )
9886    }
9887    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
9888        let kind = node.kind(db);
9889        assert_eq!(
9890            kind,
9891            SyntaxKind::OptionReturnTypeClauseEmpty,
9892            "Unexpected SyntaxKind {:?}. Expected {:?}.",
9893            kind,
9894            SyntaxKind::OptionReturnTypeClauseEmpty
9895        );
9896        let children = db.get_children(node.clone());
9897        Self { node, children }
9898    }
9899    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
9900        let kind = node.kind(db);
9901        if kind == SyntaxKind::OptionReturnTypeClauseEmpty {
9902            Some(Self::from_syntax_node(db, node))
9903        } else {
9904            None
9905        }
9906    }
9907    fn as_syntax_node(&self) -> SyntaxNode {
9908        self.node.clone()
9909    }
9910    fn stable_ptr(&self) -> Self::StablePtr {
9911        OptionReturnTypeClauseEmptyPtr(self.node.0.stable_ptr)
9912    }
9913}
9914impl From<&OptionReturnTypeClauseEmpty> for SyntaxStablePtrId {
9915    fn from(node: &OptionReturnTypeClauseEmpty) -> Self {
9916        node.stable_ptr().untyped()
9917    }
9918}
9919#[derive(Clone, Debug, Eq, Hash, PartialEq)]
9920pub enum Statement {
9921    Let(StatementLet),
9922    Expr(StatementExpr),
9923    Continue(StatementContinue),
9924    Return(StatementReturn),
9925    Break(StatementBreak),
9926    Item(StatementItem),
9927    Missing(StatementMissing),
9928}
9929#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
9930pub struct StatementPtr(pub SyntaxStablePtrId);
9931impl TypedStablePtr for StatementPtr {
9932    type SyntaxNode = Statement;
9933    fn untyped(&self) -> SyntaxStablePtrId {
9934        self.0
9935    }
9936    fn lookup(&self, db: &dyn SyntaxGroup) -> Statement {
9937        Statement::from_syntax_node(db, self.0.lookup(db))
9938    }
9939}
9940impl From<StatementPtr> for SyntaxStablePtrId {
9941    fn from(ptr: StatementPtr) -> Self {
9942        ptr.untyped()
9943    }
9944}
9945impl From<StatementLetPtr> for StatementPtr {
9946    fn from(value: StatementLetPtr) -> Self {
9947        Self(value.0)
9948    }
9949}
9950impl From<StatementExprPtr> for StatementPtr {
9951    fn from(value: StatementExprPtr) -> Self {
9952        Self(value.0)
9953    }
9954}
9955impl From<StatementContinuePtr> for StatementPtr {
9956    fn from(value: StatementContinuePtr) -> Self {
9957        Self(value.0)
9958    }
9959}
9960impl From<StatementReturnPtr> for StatementPtr {
9961    fn from(value: StatementReturnPtr) -> Self {
9962        Self(value.0)
9963    }
9964}
9965impl From<StatementBreakPtr> for StatementPtr {
9966    fn from(value: StatementBreakPtr) -> Self {
9967        Self(value.0)
9968    }
9969}
9970impl From<StatementItemPtr> for StatementPtr {
9971    fn from(value: StatementItemPtr) -> Self {
9972        Self(value.0)
9973    }
9974}
9975impl From<StatementMissingPtr> for StatementPtr {
9976    fn from(value: StatementMissingPtr) -> Self {
9977        Self(value.0)
9978    }
9979}
9980impl From<StatementLetGreen> for StatementGreen {
9981    fn from(value: StatementLetGreen) -> Self {
9982        Self(value.0)
9983    }
9984}
9985impl From<StatementExprGreen> for StatementGreen {
9986    fn from(value: StatementExprGreen) -> Self {
9987        Self(value.0)
9988    }
9989}
9990impl From<StatementContinueGreen> for StatementGreen {
9991    fn from(value: StatementContinueGreen) -> Self {
9992        Self(value.0)
9993    }
9994}
9995impl From<StatementReturnGreen> for StatementGreen {
9996    fn from(value: StatementReturnGreen) -> Self {
9997        Self(value.0)
9998    }
9999}
10000impl From<StatementBreakGreen> for StatementGreen {
10001    fn from(value: StatementBreakGreen) -> Self {
10002        Self(value.0)
10003    }
10004}
10005impl From<StatementItemGreen> for StatementGreen {
10006    fn from(value: StatementItemGreen) -> Self {
10007        Self(value.0)
10008    }
10009}
10010impl From<StatementMissingGreen> for StatementGreen {
10011    fn from(value: StatementMissingGreen) -> Self {
10012        Self(value.0)
10013    }
10014}
10015#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
10016pub struct StatementGreen(pub GreenId);
10017impl TypedSyntaxNode for Statement {
10018    const OPTIONAL_KIND: Option<SyntaxKind> = None;
10019    type StablePtr = StatementPtr;
10020    type Green = StatementGreen;
10021    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
10022        StatementGreen(StatementMissing::missing(db).0)
10023    }
10024    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
10025        let kind = node.kind(db);
10026        match kind {
10027            SyntaxKind::StatementLet => Statement::Let(StatementLet::from_syntax_node(db, node)),
10028            SyntaxKind::StatementExpr => Statement::Expr(StatementExpr::from_syntax_node(db, node)),
10029            SyntaxKind::StatementContinue => {
10030                Statement::Continue(StatementContinue::from_syntax_node(db, node))
10031            }
10032            SyntaxKind::StatementReturn => {
10033                Statement::Return(StatementReturn::from_syntax_node(db, node))
10034            }
10035            SyntaxKind::StatementBreak => {
10036                Statement::Break(StatementBreak::from_syntax_node(db, node))
10037            }
10038            SyntaxKind::StatementItem => Statement::Item(StatementItem::from_syntax_node(db, node)),
10039            SyntaxKind::StatementMissing => {
10040                Statement::Missing(StatementMissing::from_syntax_node(db, node))
10041            }
10042            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "Statement"),
10043        }
10044    }
10045    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
10046        let kind = node.kind(db);
10047        match kind {
10048            SyntaxKind::StatementLet => {
10049                Some(Statement::Let(StatementLet::from_syntax_node(db, node)))
10050            }
10051            SyntaxKind::StatementExpr => {
10052                Some(Statement::Expr(StatementExpr::from_syntax_node(db, node)))
10053            }
10054            SyntaxKind::StatementContinue => {
10055                Some(Statement::Continue(StatementContinue::from_syntax_node(db, node)))
10056            }
10057            SyntaxKind::StatementReturn => {
10058                Some(Statement::Return(StatementReturn::from_syntax_node(db, node)))
10059            }
10060            SyntaxKind::StatementBreak => {
10061                Some(Statement::Break(StatementBreak::from_syntax_node(db, node)))
10062            }
10063            SyntaxKind::StatementItem => {
10064                Some(Statement::Item(StatementItem::from_syntax_node(db, node)))
10065            }
10066            SyntaxKind::StatementMissing => {
10067                Some(Statement::Missing(StatementMissing::from_syntax_node(db, node)))
10068            }
10069            _ => None,
10070        }
10071    }
10072    fn as_syntax_node(&self) -> SyntaxNode {
10073        match self {
10074            Statement::Let(x) => x.as_syntax_node(),
10075            Statement::Expr(x) => x.as_syntax_node(),
10076            Statement::Continue(x) => x.as_syntax_node(),
10077            Statement::Return(x) => x.as_syntax_node(),
10078            Statement::Break(x) => x.as_syntax_node(),
10079            Statement::Item(x) => x.as_syntax_node(),
10080            Statement::Missing(x) => x.as_syntax_node(),
10081        }
10082    }
10083    fn stable_ptr(&self) -> Self::StablePtr {
10084        StatementPtr(self.as_syntax_node().0.stable_ptr)
10085    }
10086}
10087impl From<&Statement> for SyntaxStablePtrId {
10088    fn from(node: &Statement) -> Self {
10089        node.stable_ptr().untyped()
10090    }
10091}
10092impl Statement {
10093    /// Checks if a kind of a variant of [Statement].
10094    pub fn is_variant(kind: SyntaxKind) -> bool {
10095        matches!(
10096            kind,
10097            SyntaxKind::StatementLet
10098                | SyntaxKind::StatementExpr
10099                | SyntaxKind::StatementContinue
10100                | SyntaxKind::StatementReturn
10101                | SyntaxKind::StatementBreak
10102                | SyntaxKind::StatementItem
10103                | SyntaxKind::StatementMissing
10104        )
10105    }
10106}
10107#[derive(Clone, Debug, Eq, Hash, PartialEq)]
10108pub struct StatementList(ElementList<Statement, 1>);
10109impl Deref for StatementList {
10110    type Target = ElementList<Statement, 1>;
10111    fn deref(&self) -> &Self::Target {
10112        &self.0
10113    }
10114}
10115impl StatementList {
10116    pub fn new_green(db: &dyn SyntaxGroup, children: Vec<StatementGreen>) -> StatementListGreen {
10117        let width = children.iter().map(|id| id.0.lookup_intern(db).width()).sum();
10118        StatementListGreen(
10119            Arc::new(GreenNode {
10120                kind: SyntaxKind::StatementList,
10121                details: GreenNodeDetails::Node {
10122                    children: children.iter().map(|x| x.0).collect(),
10123                    width,
10124                },
10125            })
10126            .intern(db),
10127        )
10128    }
10129}
10130#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
10131pub struct StatementListPtr(pub SyntaxStablePtrId);
10132impl TypedStablePtr for StatementListPtr {
10133    type SyntaxNode = StatementList;
10134    fn untyped(&self) -> SyntaxStablePtrId {
10135        self.0
10136    }
10137    fn lookup(&self, db: &dyn SyntaxGroup) -> StatementList {
10138        StatementList::from_syntax_node(db, self.0.lookup(db))
10139    }
10140}
10141impl From<StatementListPtr> for SyntaxStablePtrId {
10142    fn from(ptr: StatementListPtr) -> Self {
10143        ptr.untyped()
10144    }
10145}
10146#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
10147pub struct StatementListGreen(pub GreenId);
10148impl TypedSyntaxNode for StatementList {
10149    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StatementList);
10150    type StablePtr = StatementListPtr;
10151    type Green = StatementListGreen;
10152    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
10153        StatementListGreen(
10154            Arc::new(GreenNode {
10155                kind: SyntaxKind::StatementList,
10156                details: GreenNodeDetails::Node { children: vec![], width: TextWidth::default() },
10157            })
10158            .intern(db),
10159        )
10160    }
10161    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
10162        Self(ElementList::new(node))
10163    }
10164    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
10165        if node.kind(db) == SyntaxKind::StatementList {
10166            Some(Self(ElementList::new(node)))
10167        } else {
10168            None
10169        }
10170    }
10171    fn as_syntax_node(&self) -> SyntaxNode {
10172        self.node.clone()
10173    }
10174    fn stable_ptr(&self) -> Self::StablePtr {
10175        StatementListPtr(self.node.0.stable_ptr)
10176    }
10177}
10178impl From<&StatementList> for SyntaxStablePtrId {
10179    fn from(node: &StatementList) -> Self {
10180        node.stable_ptr().untyped()
10181    }
10182}
10183#[derive(Clone, Debug, Eq, Hash, PartialEq)]
10184pub struct StatementMissing {
10185    node: SyntaxNode,
10186    children: Arc<[SyntaxNode]>,
10187}
10188impl StatementMissing {
10189    pub fn new_green(db: &dyn SyntaxGroup) -> StatementMissingGreen {
10190        let children: Vec<GreenId> = vec![];
10191        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
10192        StatementMissingGreen(
10193            Arc::new(GreenNode {
10194                kind: SyntaxKind::StatementMissing,
10195                details: GreenNodeDetails::Node { children, width },
10196            })
10197            .intern(db),
10198        )
10199    }
10200}
10201impl StatementMissing {}
10202#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
10203pub struct StatementMissingPtr(pub SyntaxStablePtrId);
10204impl StatementMissingPtr {}
10205impl TypedStablePtr for StatementMissingPtr {
10206    type SyntaxNode = StatementMissing;
10207    fn untyped(&self) -> SyntaxStablePtrId {
10208        self.0
10209    }
10210    fn lookup(&self, db: &dyn SyntaxGroup) -> StatementMissing {
10211        StatementMissing::from_syntax_node(db, self.0.lookup(db))
10212    }
10213}
10214impl From<StatementMissingPtr> for SyntaxStablePtrId {
10215    fn from(ptr: StatementMissingPtr) -> Self {
10216        ptr.untyped()
10217    }
10218}
10219#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
10220pub struct StatementMissingGreen(pub GreenId);
10221impl TypedSyntaxNode for StatementMissing {
10222    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StatementMissing);
10223    type StablePtr = StatementMissingPtr;
10224    type Green = StatementMissingGreen;
10225    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
10226        StatementMissingGreen(
10227            Arc::new(GreenNode {
10228                kind: SyntaxKind::StatementMissing,
10229                details: GreenNodeDetails::Node { children: vec![], width: TextWidth::default() },
10230            })
10231            .intern(db),
10232        )
10233    }
10234    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
10235        let kind = node.kind(db);
10236        assert_eq!(
10237            kind,
10238            SyntaxKind::StatementMissing,
10239            "Unexpected SyntaxKind {:?}. Expected {:?}.",
10240            kind,
10241            SyntaxKind::StatementMissing
10242        );
10243        let children = db.get_children(node.clone());
10244        Self { node, children }
10245    }
10246    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
10247        let kind = node.kind(db);
10248        if kind == SyntaxKind::StatementMissing {
10249            Some(Self::from_syntax_node(db, node))
10250        } else {
10251            None
10252        }
10253    }
10254    fn as_syntax_node(&self) -> SyntaxNode {
10255        self.node.clone()
10256    }
10257    fn stable_ptr(&self) -> Self::StablePtr {
10258        StatementMissingPtr(self.node.0.stable_ptr)
10259    }
10260}
10261impl From<&StatementMissing> for SyntaxStablePtrId {
10262    fn from(node: &StatementMissing) -> Self {
10263        node.stable_ptr().untyped()
10264    }
10265}
10266#[derive(Clone, Debug, Eq, Hash, PartialEq)]
10267pub struct StatementLet {
10268    node: SyntaxNode,
10269    children: Arc<[SyntaxNode]>,
10270}
10271impl StatementLet {
10272    pub const INDEX_ATTRIBUTES: usize = 0;
10273    pub const INDEX_LET_KW: usize = 1;
10274    pub const INDEX_PATTERN: usize = 2;
10275    pub const INDEX_TYPE_CLAUSE: usize = 3;
10276    pub const INDEX_EQ: usize = 4;
10277    pub const INDEX_RHS: usize = 5;
10278    pub const INDEX_SEMICOLON: usize = 6;
10279    pub fn new_green(
10280        db: &dyn SyntaxGroup,
10281        attributes: AttributeListGreen,
10282        let_kw: TerminalLetGreen,
10283        pattern: PatternGreen,
10284        type_clause: OptionTypeClauseGreen,
10285        eq: TerminalEqGreen,
10286        rhs: ExprGreen,
10287        semicolon: TerminalSemicolonGreen,
10288    ) -> StatementLetGreen {
10289        let children: Vec<GreenId> =
10290            vec![attributes.0, let_kw.0, pattern.0, type_clause.0, eq.0, rhs.0, semicolon.0];
10291        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
10292        StatementLetGreen(
10293            Arc::new(GreenNode {
10294                kind: SyntaxKind::StatementLet,
10295                details: GreenNodeDetails::Node { children, width },
10296            })
10297            .intern(db),
10298        )
10299    }
10300}
10301impl StatementLet {
10302    pub fn attributes(&self, db: &dyn SyntaxGroup) -> AttributeList {
10303        AttributeList::from_syntax_node(db, self.children[0].clone())
10304    }
10305    pub fn let_kw(&self, db: &dyn SyntaxGroup) -> TerminalLet {
10306        TerminalLet::from_syntax_node(db, self.children[1].clone())
10307    }
10308    pub fn pattern(&self, db: &dyn SyntaxGroup) -> Pattern {
10309        Pattern::from_syntax_node(db, self.children[2].clone())
10310    }
10311    pub fn type_clause(&self, db: &dyn SyntaxGroup) -> OptionTypeClause {
10312        OptionTypeClause::from_syntax_node(db, self.children[3].clone())
10313    }
10314    pub fn eq(&self, db: &dyn SyntaxGroup) -> TerminalEq {
10315        TerminalEq::from_syntax_node(db, self.children[4].clone())
10316    }
10317    pub fn rhs(&self, db: &dyn SyntaxGroup) -> Expr {
10318        Expr::from_syntax_node(db, self.children[5].clone())
10319    }
10320    pub fn semicolon(&self, db: &dyn SyntaxGroup) -> TerminalSemicolon {
10321        TerminalSemicolon::from_syntax_node(db, self.children[6].clone())
10322    }
10323}
10324#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
10325pub struct StatementLetPtr(pub SyntaxStablePtrId);
10326impl StatementLetPtr {
10327    pub fn pattern_green(self, db: &dyn SyntaxGroup) -> PatternGreen {
10328        let ptr = self.0.lookup_intern(db);
10329        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
10330            PatternGreen(key_fields[0])
10331        } else {
10332            panic!("Unexpected key field query on root.");
10333        }
10334    }
10335}
10336impl TypedStablePtr for StatementLetPtr {
10337    type SyntaxNode = StatementLet;
10338    fn untyped(&self) -> SyntaxStablePtrId {
10339        self.0
10340    }
10341    fn lookup(&self, db: &dyn SyntaxGroup) -> StatementLet {
10342        StatementLet::from_syntax_node(db, self.0.lookup(db))
10343    }
10344}
10345impl From<StatementLetPtr> for SyntaxStablePtrId {
10346    fn from(ptr: StatementLetPtr) -> Self {
10347        ptr.untyped()
10348    }
10349}
10350#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
10351pub struct StatementLetGreen(pub GreenId);
10352impl TypedSyntaxNode for StatementLet {
10353    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StatementLet);
10354    type StablePtr = StatementLetPtr;
10355    type Green = StatementLetGreen;
10356    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
10357        StatementLetGreen(
10358            Arc::new(GreenNode {
10359                kind: SyntaxKind::StatementLet,
10360                details: GreenNodeDetails::Node {
10361                    children: vec![
10362                        AttributeList::missing(db).0,
10363                        TerminalLet::missing(db).0,
10364                        Pattern::missing(db).0,
10365                        OptionTypeClause::missing(db).0,
10366                        TerminalEq::missing(db).0,
10367                        Expr::missing(db).0,
10368                        TerminalSemicolon::missing(db).0,
10369                    ],
10370                    width: TextWidth::default(),
10371                },
10372            })
10373            .intern(db),
10374        )
10375    }
10376    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
10377        let kind = node.kind(db);
10378        assert_eq!(
10379            kind,
10380            SyntaxKind::StatementLet,
10381            "Unexpected SyntaxKind {:?}. Expected {:?}.",
10382            kind,
10383            SyntaxKind::StatementLet
10384        );
10385        let children = db.get_children(node.clone());
10386        Self { node, children }
10387    }
10388    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
10389        let kind = node.kind(db);
10390        if kind == SyntaxKind::StatementLet { Some(Self::from_syntax_node(db, node)) } else { None }
10391    }
10392    fn as_syntax_node(&self) -> SyntaxNode {
10393        self.node.clone()
10394    }
10395    fn stable_ptr(&self) -> Self::StablePtr {
10396        StatementLetPtr(self.node.0.stable_ptr)
10397    }
10398}
10399impl From<&StatementLet> for SyntaxStablePtrId {
10400    fn from(node: &StatementLet) -> Self {
10401        node.stable_ptr().untyped()
10402    }
10403}
10404#[derive(Clone, Debug, Eq, Hash, PartialEq)]
10405pub enum OptionTerminalSemicolon {
10406    Empty(OptionTerminalSemicolonEmpty),
10407    TerminalSemicolon(TerminalSemicolon),
10408}
10409#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
10410pub struct OptionTerminalSemicolonPtr(pub SyntaxStablePtrId);
10411impl TypedStablePtr for OptionTerminalSemicolonPtr {
10412    type SyntaxNode = OptionTerminalSemicolon;
10413    fn untyped(&self) -> SyntaxStablePtrId {
10414        self.0
10415    }
10416    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionTerminalSemicolon {
10417        OptionTerminalSemicolon::from_syntax_node(db, self.0.lookup(db))
10418    }
10419}
10420impl From<OptionTerminalSemicolonPtr> for SyntaxStablePtrId {
10421    fn from(ptr: OptionTerminalSemicolonPtr) -> Self {
10422        ptr.untyped()
10423    }
10424}
10425impl From<OptionTerminalSemicolonEmptyPtr> for OptionTerminalSemicolonPtr {
10426    fn from(value: OptionTerminalSemicolonEmptyPtr) -> Self {
10427        Self(value.0)
10428    }
10429}
10430impl From<TerminalSemicolonPtr> for OptionTerminalSemicolonPtr {
10431    fn from(value: TerminalSemicolonPtr) -> Self {
10432        Self(value.0)
10433    }
10434}
10435impl From<OptionTerminalSemicolonEmptyGreen> for OptionTerminalSemicolonGreen {
10436    fn from(value: OptionTerminalSemicolonEmptyGreen) -> Self {
10437        Self(value.0)
10438    }
10439}
10440impl From<TerminalSemicolonGreen> for OptionTerminalSemicolonGreen {
10441    fn from(value: TerminalSemicolonGreen) -> Self {
10442        Self(value.0)
10443    }
10444}
10445#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
10446pub struct OptionTerminalSemicolonGreen(pub GreenId);
10447impl TypedSyntaxNode for OptionTerminalSemicolon {
10448    const OPTIONAL_KIND: Option<SyntaxKind> = None;
10449    type StablePtr = OptionTerminalSemicolonPtr;
10450    type Green = OptionTerminalSemicolonGreen;
10451    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
10452        panic!("No missing variant.");
10453    }
10454    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
10455        let kind = node.kind(db);
10456        match kind {
10457            SyntaxKind::OptionTerminalSemicolonEmpty => OptionTerminalSemicolon::Empty(
10458                OptionTerminalSemicolonEmpty::from_syntax_node(db, node),
10459            ),
10460            SyntaxKind::TerminalSemicolon => OptionTerminalSemicolon::TerminalSemicolon(
10461                TerminalSemicolon::from_syntax_node(db, node),
10462            ),
10463            _ => panic!(
10464                "Unexpected syntax kind {:?} when constructing {}.",
10465                kind, "OptionTerminalSemicolon"
10466            ),
10467        }
10468    }
10469    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
10470        let kind = node.kind(db);
10471        match kind {
10472            SyntaxKind::OptionTerminalSemicolonEmpty => Some(OptionTerminalSemicolon::Empty(
10473                OptionTerminalSemicolonEmpty::from_syntax_node(db, node),
10474            )),
10475            SyntaxKind::TerminalSemicolon => Some(OptionTerminalSemicolon::TerminalSemicolon(
10476                TerminalSemicolon::from_syntax_node(db, node),
10477            )),
10478            _ => None,
10479        }
10480    }
10481    fn as_syntax_node(&self) -> SyntaxNode {
10482        match self {
10483            OptionTerminalSemicolon::Empty(x) => x.as_syntax_node(),
10484            OptionTerminalSemicolon::TerminalSemicolon(x) => x.as_syntax_node(),
10485        }
10486    }
10487    fn stable_ptr(&self) -> Self::StablePtr {
10488        OptionTerminalSemicolonPtr(self.as_syntax_node().0.stable_ptr)
10489    }
10490}
10491impl From<&OptionTerminalSemicolon> for SyntaxStablePtrId {
10492    fn from(node: &OptionTerminalSemicolon) -> Self {
10493        node.stable_ptr().untyped()
10494    }
10495}
10496impl OptionTerminalSemicolon {
10497    /// Checks if a kind of a variant of [OptionTerminalSemicolon].
10498    pub fn is_variant(kind: SyntaxKind) -> bool {
10499        matches!(kind, SyntaxKind::OptionTerminalSemicolonEmpty | SyntaxKind::TerminalSemicolon)
10500    }
10501}
10502#[derive(Clone, Debug, Eq, Hash, PartialEq)]
10503pub struct OptionTerminalSemicolonEmpty {
10504    node: SyntaxNode,
10505    children: Arc<[SyntaxNode]>,
10506}
10507impl OptionTerminalSemicolonEmpty {
10508    pub fn new_green(db: &dyn SyntaxGroup) -> OptionTerminalSemicolonEmptyGreen {
10509        let children: Vec<GreenId> = vec![];
10510        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
10511        OptionTerminalSemicolonEmptyGreen(
10512            Arc::new(GreenNode {
10513                kind: SyntaxKind::OptionTerminalSemicolonEmpty,
10514                details: GreenNodeDetails::Node { children, width },
10515            })
10516            .intern(db),
10517        )
10518    }
10519}
10520impl OptionTerminalSemicolonEmpty {}
10521#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
10522pub struct OptionTerminalSemicolonEmptyPtr(pub SyntaxStablePtrId);
10523impl OptionTerminalSemicolonEmptyPtr {}
10524impl TypedStablePtr for OptionTerminalSemicolonEmptyPtr {
10525    type SyntaxNode = OptionTerminalSemicolonEmpty;
10526    fn untyped(&self) -> SyntaxStablePtrId {
10527        self.0
10528    }
10529    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionTerminalSemicolonEmpty {
10530        OptionTerminalSemicolonEmpty::from_syntax_node(db, self.0.lookup(db))
10531    }
10532}
10533impl From<OptionTerminalSemicolonEmptyPtr> for SyntaxStablePtrId {
10534    fn from(ptr: OptionTerminalSemicolonEmptyPtr) -> Self {
10535        ptr.untyped()
10536    }
10537}
10538#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
10539pub struct OptionTerminalSemicolonEmptyGreen(pub GreenId);
10540impl TypedSyntaxNode for OptionTerminalSemicolonEmpty {
10541    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionTerminalSemicolonEmpty);
10542    type StablePtr = OptionTerminalSemicolonEmptyPtr;
10543    type Green = OptionTerminalSemicolonEmptyGreen;
10544    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
10545        OptionTerminalSemicolonEmptyGreen(
10546            Arc::new(GreenNode {
10547                kind: SyntaxKind::OptionTerminalSemicolonEmpty,
10548                details: GreenNodeDetails::Node { children: vec![], width: TextWidth::default() },
10549            })
10550            .intern(db),
10551        )
10552    }
10553    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
10554        let kind = node.kind(db);
10555        assert_eq!(
10556            kind,
10557            SyntaxKind::OptionTerminalSemicolonEmpty,
10558            "Unexpected SyntaxKind {:?}. Expected {:?}.",
10559            kind,
10560            SyntaxKind::OptionTerminalSemicolonEmpty
10561        );
10562        let children = db.get_children(node.clone());
10563        Self { node, children }
10564    }
10565    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
10566        let kind = node.kind(db);
10567        if kind == SyntaxKind::OptionTerminalSemicolonEmpty {
10568            Some(Self::from_syntax_node(db, node))
10569        } else {
10570            None
10571        }
10572    }
10573    fn as_syntax_node(&self) -> SyntaxNode {
10574        self.node.clone()
10575    }
10576    fn stable_ptr(&self) -> Self::StablePtr {
10577        OptionTerminalSemicolonEmptyPtr(self.node.0.stable_ptr)
10578    }
10579}
10580impl From<&OptionTerminalSemicolonEmpty> for SyntaxStablePtrId {
10581    fn from(node: &OptionTerminalSemicolonEmpty) -> Self {
10582        node.stable_ptr().untyped()
10583    }
10584}
10585#[derive(Clone, Debug, Eq, Hash, PartialEq)]
10586pub struct StatementExpr {
10587    node: SyntaxNode,
10588    children: Arc<[SyntaxNode]>,
10589}
10590impl StatementExpr {
10591    pub const INDEX_ATTRIBUTES: usize = 0;
10592    pub const INDEX_EXPR: usize = 1;
10593    pub const INDEX_SEMICOLON: usize = 2;
10594    pub fn new_green(
10595        db: &dyn SyntaxGroup,
10596        attributes: AttributeListGreen,
10597        expr: ExprGreen,
10598        semicolon: OptionTerminalSemicolonGreen,
10599    ) -> StatementExprGreen {
10600        let children: Vec<GreenId> = vec![attributes.0, expr.0, semicolon.0];
10601        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
10602        StatementExprGreen(
10603            Arc::new(GreenNode {
10604                kind: SyntaxKind::StatementExpr,
10605                details: GreenNodeDetails::Node { children, width },
10606            })
10607            .intern(db),
10608        )
10609    }
10610}
10611impl StatementExpr {
10612    pub fn attributes(&self, db: &dyn SyntaxGroup) -> AttributeList {
10613        AttributeList::from_syntax_node(db, self.children[0].clone())
10614    }
10615    pub fn expr(&self, db: &dyn SyntaxGroup) -> Expr {
10616        Expr::from_syntax_node(db, self.children[1].clone())
10617    }
10618    pub fn semicolon(&self, db: &dyn SyntaxGroup) -> OptionTerminalSemicolon {
10619        OptionTerminalSemicolon::from_syntax_node(db, self.children[2].clone())
10620    }
10621}
10622#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
10623pub struct StatementExprPtr(pub SyntaxStablePtrId);
10624impl StatementExprPtr {}
10625impl TypedStablePtr for StatementExprPtr {
10626    type SyntaxNode = StatementExpr;
10627    fn untyped(&self) -> SyntaxStablePtrId {
10628        self.0
10629    }
10630    fn lookup(&self, db: &dyn SyntaxGroup) -> StatementExpr {
10631        StatementExpr::from_syntax_node(db, self.0.lookup(db))
10632    }
10633}
10634impl From<StatementExprPtr> for SyntaxStablePtrId {
10635    fn from(ptr: StatementExprPtr) -> Self {
10636        ptr.untyped()
10637    }
10638}
10639#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
10640pub struct StatementExprGreen(pub GreenId);
10641impl TypedSyntaxNode for StatementExpr {
10642    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StatementExpr);
10643    type StablePtr = StatementExprPtr;
10644    type Green = StatementExprGreen;
10645    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
10646        StatementExprGreen(
10647            Arc::new(GreenNode {
10648                kind: SyntaxKind::StatementExpr,
10649                details: GreenNodeDetails::Node {
10650                    children: vec![
10651                        AttributeList::missing(db).0,
10652                        Expr::missing(db).0,
10653                        OptionTerminalSemicolon::missing(db).0,
10654                    ],
10655                    width: TextWidth::default(),
10656                },
10657            })
10658            .intern(db),
10659        )
10660    }
10661    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
10662        let kind = node.kind(db);
10663        assert_eq!(
10664            kind,
10665            SyntaxKind::StatementExpr,
10666            "Unexpected SyntaxKind {:?}. Expected {:?}.",
10667            kind,
10668            SyntaxKind::StatementExpr
10669        );
10670        let children = db.get_children(node.clone());
10671        Self { node, children }
10672    }
10673    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
10674        let kind = node.kind(db);
10675        if kind == SyntaxKind::StatementExpr {
10676            Some(Self::from_syntax_node(db, node))
10677        } else {
10678            None
10679        }
10680    }
10681    fn as_syntax_node(&self) -> SyntaxNode {
10682        self.node.clone()
10683    }
10684    fn stable_ptr(&self) -> Self::StablePtr {
10685        StatementExprPtr(self.node.0.stable_ptr)
10686    }
10687}
10688impl From<&StatementExpr> for SyntaxStablePtrId {
10689    fn from(node: &StatementExpr) -> Self {
10690        node.stable_ptr().untyped()
10691    }
10692}
10693#[derive(Clone, Debug, Eq, Hash, PartialEq)]
10694pub struct StatementContinue {
10695    node: SyntaxNode,
10696    children: Arc<[SyntaxNode]>,
10697}
10698impl StatementContinue {
10699    pub const INDEX_ATTRIBUTES: usize = 0;
10700    pub const INDEX_CONTINUE_KW: usize = 1;
10701    pub const INDEX_SEMICOLON: usize = 2;
10702    pub fn new_green(
10703        db: &dyn SyntaxGroup,
10704        attributes: AttributeListGreen,
10705        continue_kw: TerminalContinueGreen,
10706        semicolon: TerminalSemicolonGreen,
10707    ) -> StatementContinueGreen {
10708        let children: Vec<GreenId> = vec![attributes.0, continue_kw.0, semicolon.0];
10709        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
10710        StatementContinueGreen(
10711            Arc::new(GreenNode {
10712                kind: SyntaxKind::StatementContinue,
10713                details: GreenNodeDetails::Node { children, width },
10714            })
10715            .intern(db),
10716        )
10717    }
10718}
10719impl StatementContinue {
10720    pub fn attributes(&self, db: &dyn SyntaxGroup) -> AttributeList {
10721        AttributeList::from_syntax_node(db, self.children[0].clone())
10722    }
10723    pub fn continue_kw(&self, db: &dyn SyntaxGroup) -> TerminalContinue {
10724        TerminalContinue::from_syntax_node(db, self.children[1].clone())
10725    }
10726    pub fn semicolon(&self, db: &dyn SyntaxGroup) -> TerminalSemicolon {
10727        TerminalSemicolon::from_syntax_node(db, self.children[2].clone())
10728    }
10729}
10730#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
10731pub struct StatementContinuePtr(pub SyntaxStablePtrId);
10732impl StatementContinuePtr {}
10733impl TypedStablePtr for StatementContinuePtr {
10734    type SyntaxNode = StatementContinue;
10735    fn untyped(&self) -> SyntaxStablePtrId {
10736        self.0
10737    }
10738    fn lookup(&self, db: &dyn SyntaxGroup) -> StatementContinue {
10739        StatementContinue::from_syntax_node(db, self.0.lookup(db))
10740    }
10741}
10742impl From<StatementContinuePtr> for SyntaxStablePtrId {
10743    fn from(ptr: StatementContinuePtr) -> Self {
10744        ptr.untyped()
10745    }
10746}
10747#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
10748pub struct StatementContinueGreen(pub GreenId);
10749impl TypedSyntaxNode for StatementContinue {
10750    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StatementContinue);
10751    type StablePtr = StatementContinuePtr;
10752    type Green = StatementContinueGreen;
10753    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
10754        StatementContinueGreen(
10755            Arc::new(GreenNode {
10756                kind: SyntaxKind::StatementContinue,
10757                details: GreenNodeDetails::Node {
10758                    children: vec![
10759                        AttributeList::missing(db).0,
10760                        TerminalContinue::missing(db).0,
10761                        TerminalSemicolon::missing(db).0,
10762                    ],
10763                    width: TextWidth::default(),
10764                },
10765            })
10766            .intern(db),
10767        )
10768    }
10769    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
10770        let kind = node.kind(db);
10771        assert_eq!(
10772            kind,
10773            SyntaxKind::StatementContinue,
10774            "Unexpected SyntaxKind {:?}. Expected {:?}.",
10775            kind,
10776            SyntaxKind::StatementContinue
10777        );
10778        let children = db.get_children(node.clone());
10779        Self { node, children }
10780    }
10781    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
10782        let kind = node.kind(db);
10783        if kind == SyntaxKind::StatementContinue {
10784            Some(Self::from_syntax_node(db, node))
10785        } else {
10786            None
10787        }
10788    }
10789    fn as_syntax_node(&self) -> SyntaxNode {
10790        self.node.clone()
10791    }
10792    fn stable_ptr(&self) -> Self::StablePtr {
10793        StatementContinuePtr(self.node.0.stable_ptr)
10794    }
10795}
10796impl From<&StatementContinue> for SyntaxStablePtrId {
10797    fn from(node: &StatementContinue) -> Self {
10798        node.stable_ptr().untyped()
10799    }
10800}
10801#[derive(Clone, Debug, Eq, Hash, PartialEq)]
10802pub struct ExprClause {
10803    node: SyntaxNode,
10804    children: Arc<[SyntaxNode]>,
10805}
10806impl ExprClause {
10807    pub const INDEX_EXPR: usize = 0;
10808    pub fn new_green(db: &dyn SyntaxGroup, expr: ExprGreen) -> ExprClauseGreen {
10809        let children: Vec<GreenId> = vec![expr.0];
10810        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
10811        ExprClauseGreen(
10812            Arc::new(GreenNode {
10813                kind: SyntaxKind::ExprClause,
10814                details: GreenNodeDetails::Node { children, width },
10815            })
10816            .intern(db),
10817        )
10818    }
10819}
10820impl ExprClause {
10821    pub fn expr(&self, db: &dyn SyntaxGroup) -> Expr {
10822        Expr::from_syntax_node(db, self.children[0].clone())
10823    }
10824}
10825#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
10826pub struct ExprClausePtr(pub SyntaxStablePtrId);
10827impl ExprClausePtr {}
10828impl TypedStablePtr for ExprClausePtr {
10829    type SyntaxNode = ExprClause;
10830    fn untyped(&self) -> SyntaxStablePtrId {
10831        self.0
10832    }
10833    fn lookup(&self, db: &dyn SyntaxGroup) -> ExprClause {
10834        ExprClause::from_syntax_node(db, self.0.lookup(db))
10835    }
10836}
10837impl From<ExprClausePtr> for SyntaxStablePtrId {
10838    fn from(ptr: ExprClausePtr) -> Self {
10839        ptr.untyped()
10840    }
10841}
10842#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
10843pub struct ExprClauseGreen(pub GreenId);
10844impl TypedSyntaxNode for ExprClause {
10845    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprClause);
10846    type StablePtr = ExprClausePtr;
10847    type Green = ExprClauseGreen;
10848    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
10849        ExprClauseGreen(
10850            Arc::new(GreenNode {
10851                kind: SyntaxKind::ExprClause,
10852                details: GreenNodeDetails::Node {
10853                    children: vec![Expr::missing(db).0],
10854                    width: TextWidth::default(),
10855                },
10856            })
10857            .intern(db),
10858        )
10859    }
10860    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
10861        let kind = node.kind(db);
10862        assert_eq!(
10863            kind,
10864            SyntaxKind::ExprClause,
10865            "Unexpected SyntaxKind {:?}. Expected {:?}.",
10866            kind,
10867            SyntaxKind::ExprClause
10868        );
10869        let children = db.get_children(node.clone());
10870        Self { node, children }
10871    }
10872    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
10873        let kind = node.kind(db);
10874        if kind == SyntaxKind::ExprClause { Some(Self::from_syntax_node(db, node)) } else { None }
10875    }
10876    fn as_syntax_node(&self) -> SyntaxNode {
10877        self.node.clone()
10878    }
10879    fn stable_ptr(&self) -> Self::StablePtr {
10880        ExprClausePtr(self.node.0.stable_ptr)
10881    }
10882}
10883impl From<&ExprClause> for SyntaxStablePtrId {
10884    fn from(node: &ExprClause) -> Self {
10885        node.stable_ptr().untyped()
10886    }
10887}
10888#[derive(Clone, Debug, Eq, Hash, PartialEq)]
10889pub enum OptionExprClause {
10890    Empty(OptionExprClauseEmpty),
10891    ExprClause(ExprClause),
10892}
10893#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
10894pub struct OptionExprClausePtr(pub SyntaxStablePtrId);
10895impl TypedStablePtr for OptionExprClausePtr {
10896    type SyntaxNode = OptionExprClause;
10897    fn untyped(&self) -> SyntaxStablePtrId {
10898        self.0
10899    }
10900    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionExprClause {
10901        OptionExprClause::from_syntax_node(db, self.0.lookup(db))
10902    }
10903}
10904impl From<OptionExprClausePtr> for SyntaxStablePtrId {
10905    fn from(ptr: OptionExprClausePtr) -> Self {
10906        ptr.untyped()
10907    }
10908}
10909impl From<OptionExprClauseEmptyPtr> for OptionExprClausePtr {
10910    fn from(value: OptionExprClauseEmptyPtr) -> Self {
10911        Self(value.0)
10912    }
10913}
10914impl From<ExprClausePtr> for OptionExprClausePtr {
10915    fn from(value: ExprClausePtr) -> Self {
10916        Self(value.0)
10917    }
10918}
10919impl From<OptionExprClauseEmptyGreen> for OptionExprClauseGreen {
10920    fn from(value: OptionExprClauseEmptyGreen) -> Self {
10921        Self(value.0)
10922    }
10923}
10924impl From<ExprClauseGreen> for OptionExprClauseGreen {
10925    fn from(value: ExprClauseGreen) -> Self {
10926        Self(value.0)
10927    }
10928}
10929#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
10930pub struct OptionExprClauseGreen(pub GreenId);
10931impl TypedSyntaxNode for OptionExprClause {
10932    const OPTIONAL_KIND: Option<SyntaxKind> = None;
10933    type StablePtr = OptionExprClausePtr;
10934    type Green = OptionExprClauseGreen;
10935    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
10936        panic!("No missing variant.");
10937    }
10938    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
10939        let kind = node.kind(db);
10940        match kind {
10941            SyntaxKind::OptionExprClauseEmpty => {
10942                OptionExprClause::Empty(OptionExprClauseEmpty::from_syntax_node(db, node))
10943            }
10944            SyntaxKind::ExprClause => {
10945                OptionExprClause::ExprClause(ExprClause::from_syntax_node(db, node))
10946            }
10947            _ => panic!(
10948                "Unexpected syntax kind {:?} when constructing {}.",
10949                kind, "OptionExprClause"
10950            ),
10951        }
10952    }
10953    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
10954        let kind = node.kind(db);
10955        match kind {
10956            SyntaxKind::OptionExprClauseEmpty => {
10957                Some(OptionExprClause::Empty(OptionExprClauseEmpty::from_syntax_node(db, node)))
10958            }
10959            SyntaxKind::ExprClause => {
10960                Some(OptionExprClause::ExprClause(ExprClause::from_syntax_node(db, node)))
10961            }
10962            _ => None,
10963        }
10964    }
10965    fn as_syntax_node(&self) -> SyntaxNode {
10966        match self {
10967            OptionExprClause::Empty(x) => x.as_syntax_node(),
10968            OptionExprClause::ExprClause(x) => x.as_syntax_node(),
10969        }
10970    }
10971    fn stable_ptr(&self) -> Self::StablePtr {
10972        OptionExprClausePtr(self.as_syntax_node().0.stable_ptr)
10973    }
10974}
10975impl From<&OptionExprClause> for SyntaxStablePtrId {
10976    fn from(node: &OptionExprClause) -> Self {
10977        node.stable_ptr().untyped()
10978    }
10979}
10980impl OptionExprClause {
10981    /// Checks if a kind of a variant of [OptionExprClause].
10982    pub fn is_variant(kind: SyntaxKind) -> bool {
10983        matches!(kind, SyntaxKind::OptionExprClauseEmpty | SyntaxKind::ExprClause)
10984    }
10985}
10986#[derive(Clone, Debug, Eq, Hash, PartialEq)]
10987pub struct OptionExprClauseEmpty {
10988    node: SyntaxNode,
10989    children: Arc<[SyntaxNode]>,
10990}
10991impl OptionExprClauseEmpty {
10992    pub fn new_green(db: &dyn SyntaxGroup) -> OptionExprClauseEmptyGreen {
10993        let children: Vec<GreenId> = vec![];
10994        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
10995        OptionExprClauseEmptyGreen(
10996            Arc::new(GreenNode {
10997                kind: SyntaxKind::OptionExprClauseEmpty,
10998                details: GreenNodeDetails::Node { children, width },
10999            })
11000            .intern(db),
11001        )
11002    }
11003}
11004impl OptionExprClauseEmpty {}
11005#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
11006pub struct OptionExprClauseEmptyPtr(pub SyntaxStablePtrId);
11007impl OptionExprClauseEmptyPtr {}
11008impl TypedStablePtr for OptionExprClauseEmptyPtr {
11009    type SyntaxNode = OptionExprClauseEmpty;
11010    fn untyped(&self) -> SyntaxStablePtrId {
11011        self.0
11012    }
11013    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionExprClauseEmpty {
11014        OptionExprClauseEmpty::from_syntax_node(db, self.0.lookup(db))
11015    }
11016}
11017impl From<OptionExprClauseEmptyPtr> for SyntaxStablePtrId {
11018    fn from(ptr: OptionExprClauseEmptyPtr) -> Self {
11019        ptr.untyped()
11020    }
11021}
11022#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
11023pub struct OptionExprClauseEmptyGreen(pub GreenId);
11024impl TypedSyntaxNode for OptionExprClauseEmpty {
11025    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionExprClauseEmpty);
11026    type StablePtr = OptionExprClauseEmptyPtr;
11027    type Green = OptionExprClauseEmptyGreen;
11028    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
11029        OptionExprClauseEmptyGreen(
11030            Arc::new(GreenNode {
11031                kind: SyntaxKind::OptionExprClauseEmpty,
11032                details: GreenNodeDetails::Node { children: vec![], width: TextWidth::default() },
11033            })
11034            .intern(db),
11035        )
11036    }
11037    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
11038        let kind = node.kind(db);
11039        assert_eq!(
11040            kind,
11041            SyntaxKind::OptionExprClauseEmpty,
11042            "Unexpected SyntaxKind {:?}. Expected {:?}.",
11043            kind,
11044            SyntaxKind::OptionExprClauseEmpty
11045        );
11046        let children = db.get_children(node.clone());
11047        Self { node, children }
11048    }
11049    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
11050        let kind = node.kind(db);
11051        if kind == SyntaxKind::OptionExprClauseEmpty {
11052            Some(Self::from_syntax_node(db, node))
11053        } else {
11054            None
11055        }
11056    }
11057    fn as_syntax_node(&self) -> SyntaxNode {
11058        self.node.clone()
11059    }
11060    fn stable_ptr(&self) -> Self::StablePtr {
11061        OptionExprClauseEmptyPtr(self.node.0.stable_ptr)
11062    }
11063}
11064impl From<&OptionExprClauseEmpty> for SyntaxStablePtrId {
11065    fn from(node: &OptionExprClauseEmpty) -> Self {
11066        node.stable_ptr().untyped()
11067    }
11068}
11069#[derive(Clone, Debug, Eq, Hash, PartialEq)]
11070pub struct StatementReturn {
11071    node: SyntaxNode,
11072    children: Arc<[SyntaxNode]>,
11073}
11074impl StatementReturn {
11075    pub const INDEX_ATTRIBUTES: usize = 0;
11076    pub const INDEX_RETURN_KW: usize = 1;
11077    pub const INDEX_EXPR_CLAUSE: usize = 2;
11078    pub const INDEX_SEMICOLON: usize = 3;
11079    pub fn new_green(
11080        db: &dyn SyntaxGroup,
11081        attributes: AttributeListGreen,
11082        return_kw: TerminalReturnGreen,
11083        expr_clause: OptionExprClauseGreen,
11084        semicolon: TerminalSemicolonGreen,
11085    ) -> StatementReturnGreen {
11086        let children: Vec<GreenId> = vec![attributes.0, return_kw.0, expr_clause.0, semicolon.0];
11087        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
11088        StatementReturnGreen(
11089            Arc::new(GreenNode {
11090                kind: SyntaxKind::StatementReturn,
11091                details: GreenNodeDetails::Node { children, width },
11092            })
11093            .intern(db),
11094        )
11095    }
11096}
11097impl StatementReturn {
11098    pub fn attributes(&self, db: &dyn SyntaxGroup) -> AttributeList {
11099        AttributeList::from_syntax_node(db, self.children[0].clone())
11100    }
11101    pub fn return_kw(&self, db: &dyn SyntaxGroup) -> TerminalReturn {
11102        TerminalReturn::from_syntax_node(db, self.children[1].clone())
11103    }
11104    pub fn expr_clause(&self, db: &dyn SyntaxGroup) -> OptionExprClause {
11105        OptionExprClause::from_syntax_node(db, self.children[2].clone())
11106    }
11107    pub fn semicolon(&self, db: &dyn SyntaxGroup) -> TerminalSemicolon {
11108        TerminalSemicolon::from_syntax_node(db, self.children[3].clone())
11109    }
11110}
11111#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
11112pub struct StatementReturnPtr(pub SyntaxStablePtrId);
11113impl StatementReturnPtr {}
11114impl TypedStablePtr for StatementReturnPtr {
11115    type SyntaxNode = StatementReturn;
11116    fn untyped(&self) -> SyntaxStablePtrId {
11117        self.0
11118    }
11119    fn lookup(&self, db: &dyn SyntaxGroup) -> StatementReturn {
11120        StatementReturn::from_syntax_node(db, self.0.lookup(db))
11121    }
11122}
11123impl From<StatementReturnPtr> for SyntaxStablePtrId {
11124    fn from(ptr: StatementReturnPtr) -> Self {
11125        ptr.untyped()
11126    }
11127}
11128#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
11129pub struct StatementReturnGreen(pub GreenId);
11130impl TypedSyntaxNode for StatementReturn {
11131    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StatementReturn);
11132    type StablePtr = StatementReturnPtr;
11133    type Green = StatementReturnGreen;
11134    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
11135        StatementReturnGreen(
11136            Arc::new(GreenNode {
11137                kind: SyntaxKind::StatementReturn,
11138                details: GreenNodeDetails::Node {
11139                    children: vec![
11140                        AttributeList::missing(db).0,
11141                        TerminalReturn::missing(db).0,
11142                        OptionExprClause::missing(db).0,
11143                        TerminalSemicolon::missing(db).0,
11144                    ],
11145                    width: TextWidth::default(),
11146                },
11147            })
11148            .intern(db),
11149        )
11150    }
11151    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
11152        let kind = node.kind(db);
11153        assert_eq!(
11154            kind,
11155            SyntaxKind::StatementReturn,
11156            "Unexpected SyntaxKind {:?}. Expected {:?}.",
11157            kind,
11158            SyntaxKind::StatementReturn
11159        );
11160        let children = db.get_children(node.clone());
11161        Self { node, children }
11162    }
11163    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
11164        let kind = node.kind(db);
11165        if kind == SyntaxKind::StatementReturn {
11166            Some(Self::from_syntax_node(db, node))
11167        } else {
11168            None
11169        }
11170    }
11171    fn as_syntax_node(&self) -> SyntaxNode {
11172        self.node.clone()
11173    }
11174    fn stable_ptr(&self) -> Self::StablePtr {
11175        StatementReturnPtr(self.node.0.stable_ptr)
11176    }
11177}
11178impl From<&StatementReturn> for SyntaxStablePtrId {
11179    fn from(node: &StatementReturn) -> Self {
11180        node.stable_ptr().untyped()
11181    }
11182}
11183#[derive(Clone, Debug, Eq, Hash, PartialEq)]
11184pub struct StatementBreak {
11185    node: SyntaxNode,
11186    children: Arc<[SyntaxNode]>,
11187}
11188impl StatementBreak {
11189    pub const INDEX_ATTRIBUTES: usize = 0;
11190    pub const INDEX_BREAK_KW: usize = 1;
11191    pub const INDEX_EXPR_CLAUSE: usize = 2;
11192    pub const INDEX_SEMICOLON: usize = 3;
11193    pub fn new_green(
11194        db: &dyn SyntaxGroup,
11195        attributes: AttributeListGreen,
11196        break_kw: TerminalBreakGreen,
11197        expr_clause: OptionExprClauseGreen,
11198        semicolon: TerminalSemicolonGreen,
11199    ) -> StatementBreakGreen {
11200        let children: Vec<GreenId> = vec![attributes.0, break_kw.0, expr_clause.0, semicolon.0];
11201        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
11202        StatementBreakGreen(
11203            Arc::new(GreenNode {
11204                kind: SyntaxKind::StatementBreak,
11205                details: GreenNodeDetails::Node { children, width },
11206            })
11207            .intern(db),
11208        )
11209    }
11210}
11211impl StatementBreak {
11212    pub fn attributes(&self, db: &dyn SyntaxGroup) -> AttributeList {
11213        AttributeList::from_syntax_node(db, self.children[0].clone())
11214    }
11215    pub fn break_kw(&self, db: &dyn SyntaxGroup) -> TerminalBreak {
11216        TerminalBreak::from_syntax_node(db, self.children[1].clone())
11217    }
11218    pub fn expr_clause(&self, db: &dyn SyntaxGroup) -> OptionExprClause {
11219        OptionExprClause::from_syntax_node(db, self.children[2].clone())
11220    }
11221    pub fn semicolon(&self, db: &dyn SyntaxGroup) -> TerminalSemicolon {
11222        TerminalSemicolon::from_syntax_node(db, self.children[3].clone())
11223    }
11224}
11225#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
11226pub struct StatementBreakPtr(pub SyntaxStablePtrId);
11227impl StatementBreakPtr {}
11228impl TypedStablePtr for StatementBreakPtr {
11229    type SyntaxNode = StatementBreak;
11230    fn untyped(&self) -> SyntaxStablePtrId {
11231        self.0
11232    }
11233    fn lookup(&self, db: &dyn SyntaxGroup) -> StatementBreak {
11234        StatementBreak::from_syntax_node(db, self.0.lookup(db))
11235    }
11236}
11237impl From<StatementBreakPtr> for SyntaxStablePtrId {
11238    fn from(ptr: StatementBreakPtr) -> Self {
11239        ptr.untyped()
11240    }
11241}
11242#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
11243pub struct StatementBreakGreen(pub GreenId);
11244impl TypedSyntaxNode for StatementBreak {
11245    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StatementBreak);
11246    type StablePtr = StatementBreakPtr;
11247    type Green = StatementBreakGreen;
11248    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
11249        StatementBreakGreen(
11250            Arc::new(GreenNode {
11251                kind: SyntaxKind::StatementBreak,
11252                details: GreenNodeDetails::Node {
11253                    children: vec![
11254                        AttributeList::missing(db).0,
11255                        TerminalBreak::missing(db).0,
11256                        OptionExprClause::missing(db).0,
11257                        TerminalSemicolon::missing(db).0,
11258                    ],
11259                    width: TextWidth::default(),
11260                },
11261            })
11262            .intern(db),
11263        )
11264    }
11265    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
11266        let kind = node.kind(db);
11267        assert_eq!(
11268            kind,
11269            SyntaxKind::StatementBreak,
11270            "Unexpected SyntaxKind {:?}. Expected {:?}.",
11271            kind,
11272            SyntaxKind::StatementBreak
11273        );
11274        let children = db.get_children(node.clone());
11275        Self { node, children }
11276    }
11277    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
11278        let kind = node.kind(db);
11279        if kind == SyntaxKind::StatementBreak {
11280            Some(Self::from_syntax_node(db, node))
11281        } else {
11282            None
11283        }
11284    }
11285    fn as_syntax_node(&self) -> SyntaxNode {
11286        self.node.clone()
11287    }
11288    fn stable_ptr(&self) -> Self::StablePtr {
11289        StatementBreakPtr(self.node.0.stable_ptr)
11290    }
11291}
11292impl From<&StatementBreak> for SyntaxStablePtrId {
11293    fn from(node: &StatementBreak) -> Self {
11294        node.stable_ptr().untyped()
11295    }
11296}
11297#[derive(Clone, Debug, Eq, Hash, PartialEq)]
11298pub struct StatementItem {
11299    node: SyntaxNode,
11300    children: Arc<[SyntaxNode]>,
11301}
11302impl StatementItem {
11303    pub const INDEX_ITEM: usize = 0;
11304    pub fn new_green(db: &dyn SyntaxGroup, item: ModuleItemGreen) -> StatementItemGreen {
11305        let children: Vec<GreenId> = vec![item.0];
11306        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
11307        StatementItemGreen(
11308            Arc::new(GreenNode {
11309                kind: SyntaxKind::StatementItem,
11310                details: GreenNodeDetails::Node { children, width },
11311            })
11312            .intern(db),
11313        )
11314    }
11315}
11316impl StatementItem {
11317    pub fn item(&self, db: &dyn SyntaxGroup) -> ModuleItem {
11318        ModuleItem::from_syntax_node(db, self.children[0].clone())
11319    }
11320}
11321#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
11322pub struct StatementItemPtr(pub SyntaxStablePtrId);
11323impl StatementItemPtr {}
11324impl TypedStablePtr for StatementItemPtr {
11325    type SyntaxNode = StatementItem;
11326    fn untyped(&self) -> SyntaxStablePtrId {
11327        self.0
11328    }
11329    fn lookup(&self, db: &dyn SyntaxGroup) -> StatementItem {
11330        StatementItem::from_syntax_node(db, self.0.lookup(db))
11331    }
11332}
11333impl From<StatementItemPtr> for SyntaxStablePtrId {
11334    fn from(ptr: StatementItemPtr) -> Self {
11335        ptr.untyped()
11336    }
11337}
11338#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
11339pub struct StatementItemGreen(pub GreenId);
11340impl TypedSyntaxNode for StatementItem {
11341    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StatementItem);
11342    type StablePtr = StatementItemPtr;
11343    type Green = StatementItemGreen;
11344    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
11345        StatementItemGreen(
11346            Arc::new(GreenNode {
11347                kind: SyntaxKind::StatementItem,
11348                details: GreenNodeDetails::Node {
11349                    children: vec![ModuleItem::missing(db).0],
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::StatementItem,
11361            "Unexpected SyntaxKind {:?}. Expected {:?}.",
11362            kind,
11363            SyntaxKind::StatementItem
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::StatementItem {
11371            Some(Self::from_syntax_node(db, node))
11372        } else {
11373            None
11374        }
11375    }
11376    fn as_syntax_node(&self) -> SyntaxNode {
11377        self.node.clone()
11378    }
11379    fn stable_ptr(&self) -> Self::StablePtr {
11380        StatementItemPtr(self.node.0.stable_ptr)
11381    }
11382}
11383impl From<&StatementItem> for SyntaxStablePtrId {
11384    fn from(node: &StatementItem) -> Self {
11385        node.stable_ptr().untyped()
11386    }
11387}
11388#[derive(Clone, Debug, Eq, Hash, PartialEq)]
11389pub struct Param {
11390    node: SyntaxNode,
11391    children: Arc<[SyntaxNode]>,
11392}
11393impl Param {
11394    pub const INDEX_MODIFIERS: usize = 0;
11395    pub const INDEX_NAME: usize = 1;
11396    pub const INDEX_TYPE_CLAUSE: usize = 2;
11397    pub fn new_green(
11398        db: &dyn SyntaxGroup,
11399        modifiers: ModifierListGreen,
11400        name: TerminalIdentifierGreen,
11401        type_clause: OptionTypeClauseGreen,
11402    ) -> ParamGreen {
11403        let children: Vec<GreenId> = vec![modifiers.0, name.0, type_clause.0];
11404        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
11405        ParamGreen(
11406            Arc::new(GreenNode {
11407                kind: SyntaxKind::Param,
11408                details: GreenNodeDetails::Node { children, width },
11409            })
11410            .intern(db),
11411        )
11412    }
11413}
11414impl Param {
11415    pub fn modifiers(&self, db: &dyn SyntaxGroup) -> ModifierList {
11416        ModifierList::from_syntax_node(db, self.children[0].clone())
11417    }
11418    pub fn name(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier {
11419        TerminalIdentifier::from_syntax_node(db, self.children[1].clone())
11420    }
11421    pub fn type_clause(&self, db: &dyn SyntaxGroup) -> OptionTypeClause {
11422        OptionTypeClause::from_syntax_node(db, self.children[2].clone())
11423    }
11424}
11425#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
11426pub struct ParamPtr(pub SyntaxStablePtrId);
11427impl ParamPtr {
11428    pub fn name_green(self, db: &dyn SyntaxGroup) -> TerminalIdentifierGreen {
11429        let ptr = self.0.lookup_intern(db);
11430        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
11431            TerminalIdentifierGreen(key_fields[0])
11432        } else {
11433            panic!("Unexpected key field query on root.");
11434        }
11435    }
11436}
11437impl TypedStablePtr for ParamPtr {
11438    type SyntaxNode = Param;
11439    fn untyped(&self) -> SyntaxStablePtrId {
11440        self.0
11441    }
11442    fn lookup(&self, db: &dyn SyntaxGroup) -> Param {
11443        Param::from_syntax_node(db, self.0.lookup(db))
11444    }
11445}
11446impl From<ParamPtr> for SyntaxStablePtrId {
11447    fn from(ptr: ParamPtr) -> Self {
11448        ptr.untyped()
11449    }
11450}
11451#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
11452pub struct ParamGreen(pub GreenId);
11453impl TypedSyntaxNode for Param {
11454    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::Param);
11455    type StablePtr = ParamPtr;
11456    type Green = ParamGreen;
11457    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
11458        ParamGreen(
11459            Arc::new(GreenNode {
11460                kind: SyntaxKind::Param,
11461                details: GreenNodeDetails::Node {
11462                    children: vec![
11463                        ModifierList::missing(db).0,
11464                        TerminalIdentifier::missing(db).0,
11465                        OptionTypeClause::missing(db).0,
11466                    ],
11467                    width: TextWidth::default(),
11468                },
11469            })
11470            .intern(db),
11471        )
11472    }
11473    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
11474        let kind = node.kind(db);
11475        assert_eq!(
11476            kind,
11477            SyntaxKind::Param,
11478            "Unexpected SyntaxKind {:?}. Expected {:?}.",
11479            kind,
11480            SyntaxKind::Param
11481        );
11482        let children = db.get_children(node.clone());
11483        Self { node, children }
11484    }
11485    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
11486        let kind = node.kind(db);
11487        if kind == SyntaxKind::Param { Some(Self::from_syntax_node(db, node)) } else { None }
11488    }
11489    fn as_syntax_node(&self) -> SyntaxNode {
11490        self.node.clone()
11491    }
11492    fn stable_ptr(&self) -> Self::StablePtr {
11493        ParamPtr(self.node.0.stable_ptr)
11494    }
11495}
11496impl From<&Param> for SyntaxStablePtrId {
11497    fn from(node: &Param) -> Self {
11498        node.stable_ptr().untyped()
11499    }
11500}
11501#[derive(Clone, Debug, Eq, Hash, PartialEq)]
11502pub struct ModifierList(ElementList<Modifier, 1>);
11503impl Deref for ModifierList {
11504    type Target = ElementList<Modifier, 1>;
11505    fn deref(&self) -> &Self::Target {
11506        &self.0
11507    }
11508}
11509impl ModifierList {
11510    pub fn new_green(db: &dyn SyntaxGroup, children: Vec<ModifierGreen>) -> ModifierListGreen {
11511        let width = children.iter().map(|id| id.0.lookup_intern(db).width()).sum();
11512        ModifierListGreen(
11513            Arc::new(GreenNode {
11514                kind: SyntaxKind::ModifierList,
11515                details: GreenNodeDetails::Node {
11516                    children: children.iter().map(|x| x.0).collect(),
11517                    width,
11518                },
11519            })
11520            .intern(db),
11521        )
11522    }
11523}
11524#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
11525pub struct ModifierListPtr(pub SyntaxStablePtrId);
11526impl TypedStablePtr for ModifierListPtr {
11527    type SyntaxNode = ModifierList;
11528    fn untyped(&self) -> SyntaxStablePtrId {
11529        self.0
11530    }
11531    fn lookup(&self, db: &dyn SyntaxGroup) -> ModifierList {
11532        ModifierList::from_syntax_node(db, self.0.lookup(db))
11533    }
11534}
11535impl From<ModifierListPtr> for SyntaxStablePtrId {
11536    fn from(ptr: ModifierListPtr) -> Self {
11537        ptr.untyped()
11538    }
11539}
11540#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
11541pub struct ModifierListGreen(pub GreenId);
11542impl TypedSyntaxNode for ModifierList {
11543    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ModifierList);
11544    type StablePtr = ModifierListPtr;
11545    type Green = ModifierListGreen;
11546    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
11547        ModifierListGreen(
11548            Arc::new(GreenNode {
11549                kind: SyntaxKind::ModifierList,
11550                details: GreenNodeDetails::Node { children: vec![], width: TextWidth::default() },
11551            })
11552            .intern(db),
11553        )
11554    }
11555    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
11556        Self(ElementList::new(node))
11557    }
11558    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
11559        if node.kind(db) == SyntaxKind::ModifierList {
11560            Some(Self(ElementList::new(node)))
11561        } else {
11562            None
11563        }
11564    }
11565    fn as_syntax_node(&self) -> SyntaxNode {
11566        self.node.clone()
11567    }
11568    fn stable_ptr(&self) -> Self::StablePtr {
11569        ModifierListPtr(self.node.0.stable_ptr)
11570    }
11571}
11572impl From<&ModifierList> for SyntaxStablePtrId {
11573    fn from(node: &ModifierList) -> Self {
11574        node.stable_ptr().untyped()
11575    }
11576}
11577#[derive(Clone, Debug, Eq, Hash, PartialEq)]
11578pub enum Modifier {
11579    Ref(TerminalRef),
11580    Mut(TerminalMut),
11581}
11582#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
11583pub struct ModifierPtr(pub SyntaxStablePtrId);
11584impl TypedStablePtr for ModifierPtr {
11585    type SyntaxNode = Modifier;
11586    fn untyped(&self) -> SyntaxStablePtrId {
11587        self.0
11588    }
11589    fn lookup(&self, db: &dyn SyntaxGroup) -> Modifier {
11590        Modifier::from_syntax_node(db, self.0.lookup(db))
11591    }
11592}
11593impl From<ModifierPtr> for SyntaxStablePtrId {
11594    fn from(ptr: ModifierPtr) -> Self {
11595        ptr.untyped()
11596    }
11597}
11598impl From<TerminalRefPtr> for ModifierPtr {
11599    fn from(value: TerminalRefPtr) -> Self {
11600        Self(value.0)
11601    }
11602}
11603impl From<TerminalMutPtr> for ModifierPtr {
11604    fn from(value: TerminalMutPtr) -> Self {
11605        Self(value.0)
11606    }
11607}
11608impl From<TerminalRefGreen> for ModifierGreen {
11609    fn from(value: TerminalRefGreen) -> Self {
11610        Self(value.0)
11611    }
11612}
11613impl From<TerminalMutGreen> for ModifierGreen {
11614    fn from(value: TerminalMutGreen) -> Self {
11615        Self(value.0)
11616    }
11617}
11618#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
11619pub struct ModifierGreen(pub GreenId);
11620impl TypedSyntaxNode for Modifier {
11621    const OPTIONAL_KIND: Option<SyntaxKind> = None;
11622    type StablePtr = ModifierPtr;
11623    type Green = ModifierGreen;
11624    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
11625        panic!("No missing variant.");
11626    }
11627    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
11628        let kind = node.kind(db);
11629        match kind {
11630            SyntaxKind::TerminalRef => Modifier::Ref(TerminalRef::from_syntax_node(db, node)),
11631            SyntaxKind::TerminalMut => Modifier::Mut(TerminalMut::from_syntax_node(db, node)),
11632            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "Modifier"),
11633        }
11634    }
11635    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
11636        let kind = node.kind(db);
11637        match kind {
11638            SyntaxKind::TerminalRef => Some(Modifier::Ref(TerminalRef::from_syntax_node(db, node))),
11639            SyntaxKind::TerminalMut => Some(Modifier::Mut(TerminalMut::from_syntax_node(db, node))),
11640            _ => None,
11641        }
11642    }
11643    fn as_syntax_node(&self) -> SyntaxNode {
11644        match self {
11645            Modifier::Ref(x) => x.as_syntax_node(),
11646            Modifier::Mut(x) => x.as_syntax_node(),
11647        }
11648    }
11649    fn stable_ptr(&self) -> Self::StablePtr {
11650        ModifierPtr(self.as_syntax_node().0.stable_ptr)
11651    }
11652}
11653impl From<&Modifier> for SyntaxStablePtrId {
11654    fn from(node: &Modifier) -> Self {
11655        node.stable_ptr().untyped()
11656    }
11657}
11658impl Modifier {
11659    /// Checks if a kind of a variant of [Modifier].
11660    pub fn is_variant(kind: SyntaxKind) -> bool {
11661        matches!(kind, SyntaxKind::TerminalRef | SyntaxKind::TerminalMut)
11662    }
11663}
11664#[derive(Clone, Debug, Eq, Hash, PartialEq)]
11665pub struct ParamList(ElementList<Param, 2>);
11666impl Deref for ParamList {
11667    type Target = ElementList<Param, 2>;
11668    fn deref(&self) -> &Self::Target {
11669        &self.0
11670    }
11671}
11672impl ParamList {
11673    pub fn new_green(
11674        db: &dyn SyntaxGroup,
11675        children: Vec<ParamListElementOrSeparatorGreen>,
11676    ) -> ParamListGreen {
11677        let width = children.iter().map(|id| id.id().lookup_intern(db).width()).sum();
11678        ParamListGreen(
11679            Arc::new(GreenNode {
11680                kind: SyntaxKind::ParamList,
11681                details: GreenNodeDetails::Node {
11682                    children: children.iter().map(|x| x.id()).collect(),
11683                    width,
11684                },
11685            })
11686            .intern(db),
11687        )
11688    }
11689}
11690#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
11691pub struct ParamListPtr(pub SyntaxStablePtrId);
11692impl TypedStablePtr for ParamListPtr {
11693    type SyntaxNode = ParamList;
11694    fn untyped(&self) -> SyntaxStablePtrId {
11695        self.0
11696    }
11697    fn lookup(&self, db: &dyn SyntaxGroup) -> ParamList {
11698        ParamList::from_syntax_node(db, self.0.lookup(db))
11699    }
11700}
11701impl From<ParamListPtr> for SyntaxStablePtrId {
11702    fn from(ptr: ParamListPtr) -> Self {
11703        ptr.untyped()
11704    }
11705}
11706#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
11707pub enum ParamListElementOrSeparatorGreen {
11708    Separator(TerminalCommaGreen),
11709    Element(ParamGreen),
11710}
11711impl From<TerminalCommaGreen> for ParamListElementOrSeparatorGreen {
11712    fn from(value: TerminalCommaGreen) -> Self {
11713        ParamListElementOrSeparatorGreen::Separator(value)
11714    }
11715}
11716impl From<ParamGreen> for ParamListElementOrSeparatorGreen {
11717    fn from(value: ParamGreen) -> Self {
11718        ParamListElementOrSeparatorGreen::Element(value)
11719    }
11720}
11721impl ParamListElementOrSeparatorGreen {
11722    fn id(&self) -> GreenId {
11723        match self {
11724            ParamListElementOrSeparatorGreen::Separator(green) => green.0,
11725            ParamListElementOrSeparatorGreen::Element(green) => green.0,
11726        }
11727    }
11728}
11729#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
11730pub struct ParamListGreen(pub GreenId);
11731impl TypedSyntaxNode for ParamList {
11732    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ParamList);
11733    type StablePtr = ParamListPtr;
11734    type Green = ParamListGreen;
11735    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
11736        ParamListGreen(
11737            Arc::new(GreenNode {
11738                kind: SyntaxKind::ParamList,
11739                details: GreenNodeDetails::Node { children: vec![], width: TextWidth::default() },
11740            })
11741            .intern(db),
11742        )
11743    }
11744    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
11745        Self(ElementList::new(node))
11746    }
11747    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
11748        if node.kind(db) == SyntaxKind::ParamList {
11749            Some(Self(ElementList::new(node)))
11750        } else {
11751            None
11752        }
11753    }
11754    fn as_syntax_node(&self) -> SyntaxNode {
11755        self.node.clone()
11756    }
11757    fn stable_ptr(&self) -> Self::StablePtr {
11758        ParamListPtr(self.node.0.stable_ptr)
11759    }
11760}
11761impl From<&ParamList> for SyntaxStablePtrId {
11762    fn from(node: &ParamList) -> Self {
11763        node.stable_ptr().untyped()
11764    }
11765}
11766#[derive(Clone, Debug, Eq, Hash, PartialEq)]
11767pub struct ImplicitsClause {
11768    node: SyntaxNode,
11769    children: Arc<[SyntaxNode]>,
11770}
11771impl ImplicitsClause {
11772    pub const INDEX_IMPLICITS_KW: usize = 0;
11773    pub const INDEX_LPAREN: usize = 1;
11774    pub const INDEX_IMPLICITS: usize = 2;
11775    pub const INDEX_RPAREN: usize = 3;
11776    pub fn new_green(
11777        db: &dyn SyntaxGroup,
11778        implicits_kw: TerminalImplicitsGreen,
11779        lparen: TerminalLParenGreen,
11780        implicits: ImplicitsListGreen,
11781        rparen: TerminalRParenGreen,
11782    ) -> ImplicitsClauseGreen {
11783        let children: Vec<GreenId> = vec![implicits_kw.0, lparen.0, implicits.0, rparen.0];
11784        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
11785        ImplicitsClauseGreen(
11786            Arc::new(GreenNode {
11787                kind: SyntaxKind::ImplicitsClause,
11788                details: GreenNodeDetails::Node { children, width },
11789            })
11790            .intern(db),
11791        )
11792    }
11793}
11794impl ImplicitsClause {
11795    pub fn implicits_kw(&self, db: &dyn SyntaxGroup) -> TerminalImplicits {
11796        TerminalImplicits::from_syntax_node(db, self.children[0].clone())
11797    }
11798    pub fn lparen(&self, db: &dyn SyntaxGroup) -> TerminalLParen {
11799        TerminalLParen::from_syntax_node(db, self.children[1].clone())
11800    }
11801    pub fn implicits(&self, db: &dyn SyntaxGroup) -> ImplicitsList {
11802        ImplicitsList::from_syntax_node(db, self.children[2].clone())
11803    }
11804    pub fn rparen(&self, db: &dyn SyntaxGroup) -> TerminalRParen {
11805        TerminalRParen::from_syntax_node(db, self.children[3].clone())
11806    }
11807}
11808#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
11809pub struct ImplicitsClausePtr(pub SyntaxStablePtrId);
11810impl ImplicitsClausePtr {}
11811impl TypedStablePtr for ImplicitsClausePtr {
11812    type SyntaxNode = ImplicitsClause;
11813    fn untyped(&self) -> SyntaxStablePtrId {
11814        self.0
11815    }
11816    fn lookup(&self, db: &dyn SyntaxGroup) -> ImplicitsClause {
11817        ImplicitsClause::from_syntax_node(db, self.0.lookup(db))
11818    }
11819}
11820impl From<ImplicitsClausePtr> for SyntaxStablePtrId {
11821    fn from(ptr: ImplicitsClausePtr) -> Self {
11822        ptr.untyped()
11823    }
11824}
11825#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
11826pub struct ImplicitsClauseGreen(pub GreenId);
11827impl TypedSyntaxNode for ImplicitsClause {
11828    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ImplicitsClause);
11829    type StablePtr = ImplicitsClausePtr;
11830    type Green = ImplicitsClauseGreen;
11831    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
11832        ImplicitsClauseGreen(
11833            Arc::new(GreenNode {
11834                kind: SyntaxKind::ImplicitsClause,
11835                details: GreenNodeDetails::Node {
11836                    children: vec![
11837                        TerminalImplicits::missing(db).0,
11838                        TerminalLParen::missing(db).0,
11839                        ImplicitsList::missing(db).0,
11840                        TerminalRParen::missing(db).0,
11841                    ],
11842                    width: TextWidth::default(),
11843                },
11844            })
11845            .intern(db),
11846        )
11847    }
11848    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
11849        let kind = node.kind(db);
11850        assert_eq!(
11851            kind,
11852            SyntaxKind::ImplicitsClause,
11853            "Unexpected SyntaxKind {:?}. Expected {:?}.",
11854            kind,
11855            SyntaxKind::ImplicitsClause
11856        );
11857        let children = db.get_children(node.clone());
11858        Self { node, children }
11859    }
11860    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
11861        let kind = node.kind(db);
11862        if kind == SyntaxKind::ImplicitsClause {
11863            Some(Self::from_syntax_node(db, node))
11864        } else {
11865            None
11866        }
11867    }
11868    fn as_syntax_node(&self) -> SyntaxNode {
11869        self.node.clone()
11870    }
11871    fn stable_ptr(&self) -> Self::StablePtr {
11872        ImplicitsClausePtr(self.node.0.stable_ptr)
11873    }
11874}
11875impl From<&ImplicitsClause> for SyntaxStablePtrId {
11876    fn from(node: &ImplicitsClause) -> Self {
11877        node.stable_ptr().untyped()
11878    }
11879}
11880#[derive(Clone, Debug, Eq, Hash, PartialEq)]
11881pub struct ImplicitsList(ElementList<ExprPath, 2>);
11882impl Deref for ImplicitsList {
11883    type Target = ElementList<ExprPath, 2>;
11884    fn deref(&self) -> &Self::Target {
11885        &self.0
11886    }
11887}
11888impl ImplicitsList {
11889    pub fn new_green(
11890        db: &dyn SyntaxGroup,
11891        children: Vec<ImplicitsListElementOrSeparatorGreen>,
11892    ) -> ImplicitsListGreen {
11893        let width = children.iter().map(|id| id.id().lookup_intern(db).width()).sum();
11894        ImplicitsListGreen(
11895            Arc::new(GreenNode {
11896                kind: SyntaxKind::ImplicitsList,
11897                details: GreenNodeDetails::Node {
11898                    children: children.iter().map(|x| x.id()).collect(),
11899                    width,
11900                },
11901            })
11902            .intern(db),
11903        )
11904    }
11905}
11906#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
11907pub struct ImplicitsListPtr(pub SyntaxStablePtrId);
11908impl TypedStablePtr for ImplicitsListPtr {
11909    type SyntaxNode = ImplicitsList;
11910    fn untyped(&self) -> SyntaxStablePtrId {
11911        self.0
11912    }
11913    fn lookup(&self, db: &dyn SyntaxGroup) -> ImplicitsList {
11914        ImplicitsList::from_syntax_node(db, self.0.lookup(db))
11915    }
11916}
11917impl From<ImplicitsListPtr> for SyntaxStablePtrId {
11918    fn from(ptr: ImplicitsListPtr) -> Self {
11919        ptr.untyped()
11920    }
11921}
11922#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
11923pub enum ImplicitsListElementOrSeparatorGreen {
11924    Separator(TerminalCommaGreen),
11925    Element(ExprPathGreen),
11926}
11927impl From<TerminalCommaGreen> for ImplicitsListElementOrSeparatorGreen {
11928    fn from(value: TerminalCommaGreen) -> Self {
11929        ImplicitsListElementOrSeparatorGreen::Separator(value)
11930    }
11931}
11932impl From<ExprPathGreen> for ImplicitsListElementOrSeparatorGreen {
11933    fn from(value: ExprPathGreen) -> Self {
11934        ImplicitsListElementOrSeparatorGreen::Element(value)
11935    }
11936}
11937impl ImplicitsListElementOrSeparatorGreen {
11938    fn id(&self) -> GreenId {
11939        match self {
11940            ImplicitsListElementOrSeparatorGreen::Separator(green) => green.0,
11941            ImplicitsListElementOrSeparatorGreen::Element(green) => green.0,
11942        }
11943    }
11944}
11945#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
11946pub struct ImplicitsListGreen(pub GreenId);
11947impl TypedSyntaxNode for ImplicitsList {
11948    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ImplicitsList);
11949    type StablePtr = ImplicitsListPtr;
11950    type Green = ImplicitsListGreen;
11951    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
11952        ImplicitsListGreen(
11953            Arc::new(GreenNode {
11954                kind: SyntaxKind::ImplicitsList,
11955                details: GreenNodeDetails::Node { children: vec![], width: TextWidth::default() },
11956            })
11957            .intern(db),
11958        )
11959    }
11960    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
11961        Self(ElementList::new(node))
11962    }
11963    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
11964        if node.kind(db) == SyntaxKind::ImplicitsList {
11965            Some(Self(ElementList::new(node)))
11966        } else {
11967            None
11968        }
11969    }
11970    fn as_syntax_node(&self) -> SyntaxNode {
11971        self.node.clone()
11972    }
11973    fn stable_ptr(&self) -> Self::StablePtr {
11974        ImplicitsListPtr(self.node.0.stable_ptr)
11975    }
11976}
11977impl From<&ImplicitsList> for SyntaxStablePtrId {
11978    fn from(node: &ImplicitsList) -> Self {
11979        node.stable_ptr().untyped()
11980    }
11981}
11982#[derive(Clone, Debug, Eq, Hash, PartialEq)]
11983pub enum OptionImplicitsClause {
11984    Empty(OptionImplicitsClauseEmpty),
11985    ImplicitsClause(ImplicitsClause),
11986}
11987#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
11988pub struct OptionImplicitsClausePtr(pub SyntaxStablePtrId);
11989impl TypedStablePtr for OptionImplicitsClausePtr {
11990    type SyntaxNode = OptionImplicitsClause;
11991    fn untyped(&self) -> SyntaxStablePtrId {
11992        self.0
11993    }
11994    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionImplicitsClause {
11995        OptionImplicitsClause::from_syntax_node(db, self.0.lookup(db))
11996    }
11997}
11998impl From<OptionImplicitsClausePtr> for SyntaxStablePtrId {
11999    fn from(ptr: OptionImplicitsClausePtr) -> Self {
12000        ptr.untyped()
12001    }
12002}
12003impl From<OptionImplicitsClauseEmptyPtr> for OptionImplicitsClausePtr {
12004    fn from(value: OptionImplicitsClauseEmptyPtr) -> Self {
12005        Self(value.0)
12006    }
12007}
12008impl From<ImplicitsClausePtr> for OptionImplicitsClausePtr {
12009    fn from(value: ImplicitsClausePtr) -> Self {
12010        Self(value.0)
12011    }
12012}
12013impl From<OptionImplicitsClauseEmptyGreen> for OptionImplicitsClauseGreen {
12014    fn from(value: OptionImplicitsClauseEmptyGreen) -> Self {
12015        Self(value.0)
12016    }
12017}
12018impl From<ImplicitsClauseGreen> for OptionImplicitsClauseGreen {
12019    fn from(value: ImplicitsClauseGreen) -> Self {
12020        Self(value.0)
12021    }
12022}
12023#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
12024pub struct OptionImplicitsClauseGreen(pub GreenId);
12025impl TypedSyntaxNode for OptionImplicitsClause {
12026    const OPTIONAL_KIND: Option<SyntaxKind> = None;
12027    type StablePtr = OptionImplicitsClausePtr;
12028    type Green = OptionImplicitsClauseGreen;
12029    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
12030        panic!("No missing variant.");
12031    }
12032    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
12033        let kind = node.kind(db);
12034        match kind {
12035            SyntaxKind::OptionImplicitsClauseEmpty => {
12036                OptionImplicitsClause::Empty(OptionImplicitsClauseEmpty::from_syntax_node(db, node))
12037            }
12038            SyntaxKind::ImplicitsClause => {
12039                OptionImplicitsClause::ImplicitsClause(ImplicitsClause::from_syntax_node(db, node))
12040            }
12041            _ => panic!(
12042                "Unexpected syntax kind {:?} when constructing {}.",
12043                kind, "OptionImplicitsClause"
12044            ),
12045        }
12046    }
12047    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
12048        let kind = node.kind(db);
12049        match kind {
12050            SyntaxKind::OptionImplicitsClauseEmpty => Some(OptionImplicitsClause::Empty(
12051                OptionImplicitsClauseEmpty::from_syntax_node(db, node),
12052            )),
12053            SyntaxKind::ImplicitsClause => Some(OptionImplicitsClause::ImplicitsClause(
12054                ImplicitsClause::from_syntax_node(db, node),
12055            )),
12056            _ => None,
12057        }
12058    }
12059    fn as_syntax_node(&self) -> SyntaxNode {
12060        match self {
12061            OptionImplicitsClause::Empty(x) => x.as_syntax_node(),
12062            OptionImplicitsClause::ImplicitsClause(x) => x.as_syntax_node(),
12063        }
12064    }
12065    fn stable_ptr(&self) -> Self::StablePtr {
12066        OptionImplicitsClausePtr(self.as_syntax_node().0.stable_ptr)
12067    }
12068}
12069impl From<&OptionImplicitsClause> for SyntaxStablePtrId {
12070    fn from(node: &OptionImplicitsClause) -> Self {
12071        node.stable_ptr().untyped()
12072    }
12073}
12074impl OptionImplicitsClause {
12075    /// Checks if a kind of a variant of [OptionImplicitsClause].
12076    pub fn is_variant(kind: SyntaxKind) -> bool {
12077        matches!(kind, SyntaxKind::OptionImplicitsClauseEmpty | SyntaxKind::ImplicitsClause)
12078    }
12079}
12080#[derive(Clone, Debug, Eq, Hash, PartialEq)]
12081pub struct OptionImplicitsClauseEmpty {
12082    node: SyntaxNode,
12083    children: Arc<[SyntaxNode]>,
12084}
12085impl OptionImplicitsClauseEmpty {
12086    pub fn new_green(db: &dyn SyntaxGroup) -> OptionImplicitsClauseEmptyGreen {
12087        let children: Vec<GreenId> = vec![];
12088        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
12089        OptionImplicitsClauseEmptyGreen(
12090            Arc::new(GreenNode {
12091                kind: SyntaxKind::OptionImplicitsClauseEmpty,
12092                details: GreenNodeDetails::Node { children, width },
12093            })
12094            .intern(db),
12095        )
12096    }
12097}
12098impl OptionImplicitsClauseEmpty {}
12099#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
12100pub struct OptionImplicitsClauseEmptyPtr(pub SyntaxStablePtrId);
12101impl OptionImplicitsClauseEmptyPtr {}
12102impl TypedStablePtr for OptionImplicitsClauseEmptyPtr {
12103    type SyntaxNode = OptionImplicitsClauseEmpty;
12104    fn untyped(&self) -> SyntaxStablePtrId {
12105        self.0
12106    }
12107    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionImplicitsClauseEmpty {
12108        OptionImplicitsClauseEmpty::from_syntax_node(db, self.0.lookup(db))
12109    }
12110}
12111impl From<OptionImplicitsClauseEmptyPtr> for SyntaxStablePtrId {
12112    fn from(ptr: OptionImplicitsClauseEmptyPtr) -> Self {
12113        ptr.untyped()
12114    }
12115}
12116#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
12117pub struct OptionImplicitsClauseEmptyGreen(pub GreenId);
12118impl TypedSyntaxNode for OptionImplicitsClauseEmpty {
12119    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionImplicitsClauseEmpty);
12120    type StablePtr = OptionImplicitsClauseEmptyPtr;
12121    type Green = OptionImplicitsClauseEmptyGreen;
12122    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
12123        OptionImplicitsClauseEmptyGreen(
12124            Arc::new(GreenNode {
12125                kind: SyntaxKind::OptionImplicitsClauseEmpty,
12126                details: GreenNodeDetails::Node { children: vec![], width: TextWidth::default() },
12127            })
12128            .intern(db),
12129        )
12130    }
12131    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
12132        let kind = node.kind(db);
12133        assert_eq!(
12134            kind,
12135            SyntaxKind::OptionImplicitsClauseEmpty,
12136            "Unexpected SyntaxKind {:?}. Expected {:?}.",
12137            kind,
12138            SyntaxKind::OptionImplicitsClauseEmpty
12139        );
12140        let children = db.get_children(node.clone());
12141        Self { node, children }
12142    }
12143    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
12144        let kind = node.kind(db);
12145        if kind == SyntaxKind::OptionImplicitsClauseEmpty {
12146            Some(Self::from_syntax_node(db, node))
12147        } else {
12148            None
12149        }
12150    }
12151    fn as_syntax_node(&self) -> SyntaxNode {
12152        self.node.clone()
12153    }
12154    fn stable_ptr(&self) -> Self::StablePtr {
12155        OptionImplicitsClauseEmptyPtr(self.node.0.stable_ptr)
12156    }
12157}
12158impl From<&OptionImplicitsClauseEmpty> for SyntaxStablePtrId {
12159    fn from(node: &OptionImplicitsClauseEmpty) -> Self {
12160        node.stable_ptr().untyped()
12161    }
12162}
12163#[derive(Clone, Debug, Eq, Hash, PartialEq)]
12164pub enum OptionTerminalNoPanic {
12165    Empty(OptionTerminalNoPanicEmpty),
12166    TerminalNoPanic(TerminalNoPanic),
12167}
12168#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
12169pub struct OptionTerminalNoPanicPtr(pub SyntaxStablePtrId);
12170impl TypedStablePtr for OptionTerminalNoPanicPtr {
12171    type SyntaxNode = OptionTerminalNoPanic;
12172    fn untyped(&self) -> SyntaxStablePtrId {
12173        self.0
12174    }
12175    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionTerminalNoPanic {
12176        OptionTerminalNoPanic::from_syntax_node(db, self.0.lookup(db))
12177    }
12178}
12179impl From<OptionTerminalNoPanicPtr> for SyntaxStablePtrId {
12180    fn from(ptr: OptionTerminalNoPanicPtr) -> Self {
12181        ptr.untyped()
12182    }
12183}
12184impl From<OptionTerminalNoPanicEmptyPtr> for OptionTerminalNoPanicPtr {
12185    fn from(value: OptionTerminalNoPanicEmptyPtr) -> Self {
12186        Self(value.0)
12187    }
12188}
12189impl From<TerminalNoPanicPtr> for OptionTerminalNoPanicPtr {
12190    fn from(value: TerminalNoPanicPtr) -> Self {
12191        Self(value.0)
12192    }
12193}
12194impl From<OptionTerminalNoPanicEmptyGreen> for OptionTerminalNoPanicGreen {
12195    fn from(value: OptionTerminalNoPanicEmptyGreen) -> Self {
12196        Self(value.0)
12197    }
12198}
12199impl From<TerminalNoPanicGreen> for OptionTerminalNoPanicGreen {
12200    fn from(value: TerminalNoPanicGreen) -> Self {
12201        Self(value.0)
12202    }
12203}
12204#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
12205pub struct OptionTerminalNoPanicGreen(pub GreenId);
12206impl TypedSyntaxNode for OptionTerminalNoPanic {
12207    const OPTIONAL_KIND: Option<SyntaxKind> = None;
12208    type StablePtr = OptionTerminalNoPanicPtr;
12209    type Green = OptionTerminalNoPanicGreen;
12210    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
12211        panic!("No missing variant.");
12212    }
12213    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
12214        let kind = node.kind(db);
12215        match kind {
12216            SyntaxKind::OptionTerminalNoPanicEmpty => {
12217                OptionTerminalNoPanic::Empty(OptionTerminalNoPanicEmpty::from_syntax_node(db, node))
12218            }
12219            SyntaxKind::TerminalNoPanic => {
12220                OptionTerminalNoPanic::TerminalNoPanic(TerminalNoPanic::from_syntax_node(db, node))
12221            }
12222            _ => panic!(
12223                "Unexpected syntax kind {:?} when constructing {}.",
12224                kind, "OptionTerminalNoPanic"
12225            ),
12226        }
12227    }
12228    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
12229        let kind = node.kind(db);
12230        match kind {
12231            SyntaxKind::OptionTerminalNoPanicEmpty => Some(OptionTerminalNoPanic::Empty(
12232                OptionTerminalNoPanicEmpty::from_syntax_node(db, node),
12233            )),
12234            SyntaxKind::TerminalNoPanic => Some(OptionTerminalNoPanic::TerminalNoPanic(
12235                TerminalNoPanic::from_syntax_node(db, node),
12236            )),
12237            _ => None,
12238        }
12239    }
12240    fn as_syntax_node(&self) -> SyntaxNode {
12241        match self {
12242            OptionTerminalNoPanic::Empty(x) => x.as_syntax_node(),
12243            OptionTerminalNoPanic::TerminalNoPanic(x) => x.as_syntax_node(),
12244        }
12245    }
12246    fn stable_ptr(&self) -> Self::StablePtr {
12247        OptionTerminalNoPanicPtr(self.as_syntax_node().0.stable_ptr)
12248    }
12249}
12250impl From<&OptionTerminalNoPanic> for SyntaxStablePtrId {
12251    fn from(node: &OptionTerminalNoPanic) -> Self {
12252        node.stable_ptr().untyped()
12253    }
12254}
12255impl OptionTerminalNoPanic {
12256    /// Checks if a kind of a variant of [OptionTerminalNoPanic].
12257    pub fn is_variant(kind: SyntaxKind) -> bool {
12258        matches!(kind, SyntaxKind::OptionTerminalNoPanicEmpty | SyntaxKind::TerminalNoPanic)
12259    }
12260}
12261#[derive(Clone, Debug, Eq, Hash, PartialEq)]
12262pub struct OptionTerminalNoPanicEmpty {
12263    node: SyntaxNode,
12264    children: Arc<[SyntaxNode]>,
12265}
12266impl OptionTerminalNoPanicEmpty {
12267    pub fn new_green(db: &dyn SyntaxGroup) -> OptionTerminalNoPanicEmptyGreen {
12268        let children: Vec<GreenId> = vec![];
12269        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
12270        OptionTerminalNoPanicEmptyGreen(
12271            Arc::new(GreenNode {
12272                kind: SyntaxKind::OptionTerminalNoPanicEmpty,
12273                details: GreenNodeDetails::Node { children, width },
12274            })
12275            .intern(db),
12276        )
12277    }
12278}
12279impl OptionTerminalNoPanicEmpty {}
12280#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
12281pub struct OptionTerminalNoPanicEmptyPtr(pub SyntaxStablePtrId);
12282impl OptionTerminalNoPanicEmptyPtr {}
12283impl TypedStablePtr for OptionTerminalNoPanicEmptyPtr {
12284    type SyntaxNode = OptionTerminalNoPanicEmpty;
12285    fn untyped(&self) -> SyntaxStablePtrId {
12286        self.0
12287    }
12288    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionTerminalNoPanicEmpty {
12289        OptionTerminalNoPanicEmpty::from_syntax_node(db, self.0.lookup(db))
12290    }
12291}
12292impl From<OptionTerminalNoPanicEmptyPtr> for SyntaxStablePtrId {
12293    fn from(ptr: OptionTerminalNoPanicEmptyPtr) -> Self {
12294        ptr.untyped()
12295    }
12296}
12297#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
12298pub struct OptionTerminalNoPanicEmptyGreen(pub GreenId);
12299impl TypedSyntaxNode for OptionTerminalNoPanicEmpty {
12300    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionTerminalNoPanicEmpty);
12301    type StablePtr = OptionTerminalNoPanicEmptyPtr;
12302    type Green = OptionTerminalNoPanicEmptyGreen;
12303    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
12304        OptionTerminalNoPanicEmptyGreen(
12305            Arc::new(GreenNode {
12306                kind: SyntaxKind::OptionTerminalNoPanicEmpty,
12307                details: GreenNodeDetails::Node { children: vec![], width: TextWidth::default() },
12308            })
12309            .intern(db),
12310        )
12311    }
12312    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
12313        let kind = node.kind(db);
12314        assert_eq!(
12315            kind,
12316            SyntaxKind::OptionTerminalNoPanicEmpty,
12317            "Unexpected SyntaxKind {:?}. Expected {:?}.",
12318            kind,
12319            SyntaxKind::OptionTerminalNoPanicEmpty
12320        );
12321        let children = db.get_children(node.clone());
12322        Self { node, children }
12323    }
12324    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
12325        let kind = node.kind(db);
12326        if kind == SyntaxKind::OptionTerminalNoPanicEmpty {
12327            Some(Self::from_syntax_node(db, node))
12328        } else {
12329            None
12330        }
12331    }
12332    fn as_syntax_node(&self) -> SyntaxNode {
12333        self.node.clone()
12334    }
12335    fn stable_ptr(&self) -> Self::StablePtr {
12336        OptionTerminalNoPanicEmptyPtr(self.node.0.stable_ptr)
12337    }
12338}
12339impl From<&OptionTerminalNoPanicEmpty> for SyntaxStablePtrId {
12340    fn from(node: &OptionTerminalNoPanicEmpty) -> Self {
12341        node.stable_ptr().untyped()
12342    }
12343}
12344#[derive(Clone, Debug, Eq, Hash, PartialEq)]
12345pub enum OptionTerminalConst {
12346    Empty(OptionTerminalConstEmpty),
12347    TerminalConst(TerminalConst),
12348}
12349#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
12350pub struct OptionTerminalConstPtr(pub SyntaxStablePtrId);
12351impl TypedStablePtr for OptionTerminalConstPtr {
12352    type SyntaxNode = OptionTerminalConst;
12353    fn untyped(&self) -> SyntaxStablePtrId {
12354        self.0
12355    }
12356    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionTerminalConst {
12357        OptionTerminalConst::from_syntax_node(db, self.0.lookup(db))
12358    }
12359}
12360impl From<OptionTerminalConstPtr> for SyntaxStablePtrId {
12361    fn from(ptr: OptionTerminalConstPtr) -> Self {
12362        ptr.untyped()
12363    }
12364}
12365impl From<OptionTerminalConstEmptyPtr> for OptionTerminalConstPtr {
12366    fn from(value: OptionTerminalConstEmptyPtr) -> Self {
12367        Self(value.0)
12368    }
12369}
12370impl From<TerminalConstPtr> for OptionTerminalConstPtr {
12371    fn from(value: TerminalConstPtr) -> Self {
12372        Self(value.0)
12373    }
12374}
12375impl From<OptionTerminalConstEmptyGreen> for OptionTerminalConstGreen {
12376    fn from(value: OptionTerminalConstEmptyGreen) -> Self {
12377        Self(value.0)
12378    }
12379}
12380impl From<TerminalConstGreen> for OptionTerminalConstGreen {
12381    fn from(value: TerminalConstGreen) -> Self {
12382        Self(value.0)
12383    }
12384}
12385#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
12386pub struct OptionTerminalConstGreen(pub GreenId);
12387impl TypedSyntaxNode for OptionTerminalConst {
12388    const OPTIONAL_KIND: Option<SyntaxKind> = None;
12389    type StablePtr = OptionTerminalConstPtr;
12390    type Green = OptionTerminalConstGreen;
12391    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
12392        panic!("No missing variant.");
12393    }
12394    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
12395        let kind = node.kind(db);
12396        match kind {
12397            SyntaxKind::OptionTerminalConstEmpty => {
12398                OptionTerminalConst::Empty(OptionTerminalConstEmpty::from_syntax_node(db, node))
12399            }
12400            SyntaxKind::TerminalConst => {
12401                OptionTerminalConst::TerminalConst(TerminalConst::from_syntax_node(db, node))
12402            }
12403            _ => panic!(
12404                "Unexpected syntax kind {:?} when constructing {}.",
12405                kind, "OptionTerminalConst"
12406            ),
12407        }
12408    }
12409    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
12410        let kind = node.kind(db);
12411        match kind {
12412            SyntaxKind::OptionTerminalConstEmpty => Some(OptionTerminalConst::Empty(
12413                OptionTerminalConstEmpty::from_syntax_node(db, node),
12414            )),
12415            SyntaxKind::TerminalConst => {
12416                Some(OptionTerminalConst::TerminalConst(TerminalConst::from_syntax_node(db, node)))
12417            }
12418            _ => None,
12419        }
12420    }
12421    fn as_syntax_node(&self) -> SyntaxNode {
12422        match self {
12423            OptionTerminalConst::Empty(x) => x.as_syntax_node(),
12424            OptionTerminalConst::TerminalConst(x) => x.as_syntax_node(),
12425        }
12426    }
12427    fn stable_ptr(&self) -> Self::StablePtr {
12428        OptionTerminalConstPtr(self.as_syntax_node().0.stable_ptr)
12429    }
12430}
12431impl From<&OptionTerminalConst> for SyntaxStablePtrId {
12432    fn from(node: &OptionTerminalConst) -> Self {
12433        node.stable_ptr().untyped()
12434    }
12435}
12436impl OptionTerminalConst {
12437    /// Checks if a kind of a variant of [OptionTerminalConst].
12438    pub fn is_variant(kind: SyntaxKind) -> bool {
12439        matches!(kind, SyntaxKind::OptionTerminalConstEmpty | SyntaxKind::TerminalConst)
12440    }
12441}
12442#[derive(Clone, Debug, Eq, Hash, PartialEq)]
12443pub struct OptionTerminalConstEmpty {
12444    node: SyntaxNode,
12445    children: Arc<[SyntaxNode]>,
12446}
12447impl OptionTerminalConstEmpty {
12448    pub fn new_green(db: &dyn SyntaxGroup) -> OptionTerminalConstEmptyGreen {
12449        let children: Vec<GreenId> = vec![];
12450        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
12451        OptionTerminalConstEmptyGreen(
12452            Arc::new(GreenNode {
12453                kind: SyntaxKind::OptionTerminalConstEmpty,
12454                details: GreenNodeDetails::Node { children, width },
12455            })
12456            .intern(db),
12457        )
12458    }
12459}
12460impl OptionTerminalConstEmpty {}
12461#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
12462pub struct OptionTerminalConstEmptyPtr(pub SyntaxStablePtrId);
12463impl OptionTerminalConstEmptyPtr {}
12464impl TypedStablePtr for OptionTerminalConstEmptyPtr {
12465    type SyntaxNode = OptionTerminalConstEmpty;
12466    fn untyped(&self) -> SyntaxStablePtrId {
12467        self.0
12468    }
12469    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionTerminalConstEmpty {
12470        OptionTerminalConstEmpty::from_syntax_node(db, self.0.lookup(db))
12471    }
12472}
12473impl From<OptionTerminalConstEmptyPtr> for SyntaxStablePtrId {
12474    fn from(ptr: OptionTerminalConstEmptyPtr) -> Self {
12475        ptr.untyped()
12476    }
12477}
12478#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
12479pub struct OptionTerminalConstEmptyGreen(pub GreenId);
12480impl TypedSyntaxNode for OptionTerminalConstEmpty {
12481    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionTerminalConstEmpty);
12482    type StablePtr = OptionTerminalConstEmptyPtr;
12483    type Green = OptionTerminalConstEmptyGreen;
12484    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
12485        OptionTerminalConstEmptyGreen(
12486            Arc::new(GreenNode {
12487                kind: SyntaxKind::OptionTerminalConstEmpty,
12488                details: GreenNodeDetails::Node { children: vec![], width: TextWidth::default() },
12489            })
12490            .intern(db),
12491        )
12492    }
12493    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
12494        let kind = node.kind(db);
12495        assert_eq!(
12496            kind,
12497            SyntaxKind::OptionTerminalConstEmpty,
12498            "Unexpected SyntaxKind {:?}. Expected {:?}.",
12499            kind,
12500            SyntaxKind::OptionTerminalConstEmpty
12501        );
12502        let children = db.get_children(node.clone());
12503        Self { node, children }
12504    }
12505    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
12506        let kind = node.kind(db);
12507        if kind == SyntaxKind::OptionTerminalConstEmpty {
12508            Some(Self::from_syntax_node(db, node))
12509        } else {
12510            None
12511        }
12512    }
12513    fn as_syntax_node(&self) -> SyntaxNode {
12514        self.node.clone()
12515    }
12516    fn stable_ptr(&self) -> Self::StablePtr {
12517        OptionTerminalConstEmptyPtr(self.node.0.stable_ptr)
12518    }
12519}
12520impl From<&OptionTerminalConstEmpty> for SyntaxStablePtrId {
12521    fn from(node: &OptionTerminalConstEmpty) -> Self {
12522        node.stable_ptr().untyped()
12523    }
12524}
12525#[derive(Clone, Debug, Eq, Hash, PartialEq)]
12526pub struct FunctionSignature {
12527    node: SyntaxNode,
12528    children: Arc<[SyntaxNode]>,
12529}
12530impl FunctionSignature {
12531    pub const INDEX_LPAREN: usize = 0;
12532    pub const INDEX_PARAMETERS: usize = 1;
12533    pub const INDEX_RPAREN: usize = 2;
12534    pub const INDEX_RET_TY: usize = 3;
12535    pub const INDEX_IMPLICITS_CLAUSE: usize = 4;
12536    pub const INDEX_OPTIONAL_NO_PANIC: usize = 5;
12537    pub fn new_green(
12538        db: &dyn SyntaxGroup,
12539        lparen: TerminalLParenGreen,
12540        parameters: ParamListGreen,
12541        rparen: TerminalRParenGreen,
12542        ret_ty: OptionReturnTypeClauseGreen,
12543        implicits_clause: OptionImplicitsClauseGreen,
12544        optional_no_panic: OptionTerminalNoPanicGreen,
12545    ) -> FunctionSignatureGreen {
12546        let children: Vec<GreenId> = vec![
12547            lparen.0,
12548            parameters.0,
12549            rparen.0,
12550            ret_ty.0,
12551            implicits_clause.0,
12552            optional_no_panic.0,
12553        ];
12554        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
12555        FunctionSignatureGreen(
12556            Arc::new(GreenNode {
12557                kind: SyntaxKind::FunctionSignature,
12558                details: GreenNodeDetails::Node { children, width },
12559            })
12560            .intern(db),
12561        )
12562    }
12563}
12564impl FunctionSignature {
12565    pub fn lparen(&self, db: &dyn SyntaxGroup) -> TerminalLParen {
12566        TerminalLParen::from_syntax_node(db, self.children[0].clone())
12567    }
12568    pub fn parameters(&self, db: &dyn SyntaxGroup) -> ParamList {
12569        ParamList::from_syntax_node(db, self.children[1].clone())
12570    }
12571    pub fn rparen(&self, db: &dyn SyntaxGroup) -> TerminalRParen {
12572        TerminalRParen::from_syntax_node(db, self.children[2].clone())
12573    }
12574    pub fn ret_ty(&self, db: &dyn SyntaxGroup) -> OptionReturnTypeClause {
12575        OptionReturnTypeClause::from_syntax_node(db, self.children[3].clone())
12576    }
12577    pub fn implicits_clause(&self, db: &dyn SyntaxGroup) -> OptionImplicitsClause {
12578        OptionImplicitsClause::from_syntax_node(db, self.children[4].clone())
12579    }
12580    pub fn optional_no_panic(&self, db: &dyn SyntaxGroup) -> OptionTerminalNoPanic {
12581        OptionTerminalNoPanic::from_syntax_node(db, self.children[5].clone())
12582    }
12583}
12584#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
12585pub struct FunctionSignaturePtr(pub SyntaxStablePtrId);
12586impl FunctionSignaturePtr {}
12587impl TypedStablePtr for FunctionSignaturePtr {
12588    type SyntaxNode = FunctionSignature;
12589    fn untyped(&self) -> SyntaxStablePtrId {
12590        self.0
12591    }
12592    fn lookup(&self, db: &dyn SyntaxGroup) -> FunctionSignature {
12593        FunctionSignature::from_syntax_node(db, self.0.lookup(db))
12594    }
12595}
12596impl From<FunctionSignaturePtr> for SyntaxStablePtrId {
12597    fn from(ptr: FunctionSignaturePtr) -> Self {
12598        ptr.untyped()
12599    }
12600}
12601#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
12602pub struct FunctionSignatureGreen(pub GreenId);
12603impl TypedSyntaxNode for FunctionSignature {
12604    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::FunctionSignature);
12605    type StablePtr = FunctionSignaturePtr;
12606    type Green = FunctionSignatureGreen;
12607    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
12608        FunctionSignatureGreen(
12609            Arc::new(GreenNode {
12610                kind: SyntaxKind::FunctionSignature,
12611                details: GreenNodeDetails::Node {
12612                    children: vec![
12613                        TerminalLParen::missing(db).0,
12614                        ParamList::missing(db).0,
12615                        TerminalRParen::missing(db).0,
12616                        OptionReturnTypeClause::missing(db).0,
12617                        OptionImplicitsClause::missing(db).0,
12618                        OptionTerminalNoPanic::missing(db).0,
12619                    ],
12620                    width: TextWidth::default(),
12621                },
12622            })
12623            .intern(db),
12624        )
12625    }
12626    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
12627        let kind = node.kind(db);
12628        assert_eq!(
12629            kind,
12630            SyntaxKind::FunctionSignature,
12631            "Unexpected SyntaxKind {:?}. Expected {:?}.",
12632            kind,
12633            SyntaxKind::FunctionSignature
12634        );
12635        let children = db.get_children(node.clone());
12636        Self { node, children }
12637    }
12638    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
12639        let kind = node.kind(db);
12640        if kind == SyntaxKind::FunctionSignature {
12641            Some(Self::from_syntax_node(db, node))
12642        } else {
12643            None
12644        }
12645    }
12646    fn as_syntax_node(&self) -> SyntaxNode {
12647        self.node.clone()
12648    }
12649    fn stable_ptr(&self) -> Self::StablePtr {
12650        FunctionSignaturePtr(self.node.0.stable_ptr)
12651    }
12652}
12653impl From<&FunctionSignature> for SyntaxStablePtrId {
12654    fn from(node: &FunctionSignature) -> Self {
12655        node.stable_ptr().untyped()
12656    }
12657}
12658#[derive(Clone, Debug, Eq, Hash, PartialEq)]
12659pub struct Member {
12660    node: SyntaxNode,
12661    children: Arc<[SyntaxNode]>,
12662}
12663impl Member {
12664    pub const INDEX_ATTRIBUTES: usize = 0;
12665    pub const INDEX_VISIBILITY: usize = 1;
12666    pub const INDEX_NAME: usize = 2;
12667    pub const INDEX_TYPE_CLAUSE: usize = 3;
12668    pub fn new_green(
12669        db: &dyn SyntaxGroup,
12670        attributes: AttributeListGreen,
12671        visibility: VisibilityGreen,
12672        name: TerminalIdentifierGreen,
12673        type_clause: TypeClauseGreen,
12674    ) -> MemberGreen {
12675        let children: Vec<GreenId> = vec![attributes.0, visibility.0, name.0, type_clause.0];
12676        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
12677        MemberGreen(
12678            Arc::new(GreenNode {
12679                kind: SyntaxKind::Member,
12680                details: GreenNodeDetails::Node { children, width },
12681            })
12682            .intern(db),
12683        )
12684    }
12685}
12686impl Member {
12687    pub fn attributes(&self, db: &dyn SyntaxGroup) -> AttributeList {
12688        AttributeList::from_syntax_node(db, self.children[0].clone())
12689    }
12690    pub fn visibility(&self, db: &dyn SyntaxGroup) -> Visibility {
12691        Visibility::from_syntax_node(db, self.children[1].clone())
12692    }
12693    pub fn name(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier {
12694        TerminalIdentifier::from_syntax_node(db, self.children[2].clone())
12695    }
12696    pub fn type_clause(&self, db: &dyn SyntaxGroup) -> TypeClause {
12697        TypeClause::from_syntax_node(db, self.children[3].clone())
12698    }
12699}
12700#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
12701pub struct MemberPtr(pub SyntaxStablePtrId);
12702impl MemberPtr {
12703    pub fn name_green(self, db: &dyn SyntaxGroup) -> TerminalIdentifierGreen {
12704        let ptr = self.0.lookup_intern(db);
12705        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
12706            TerminalIdentifierGreen(key_fields[0])
12707        } else {
12708            panic!("Unexpected key field query on root.");
12709        }
12710    }
12711}
12712impl TypedStablePtr for MemberPtr {
12713    type SyntaxNode = Member;
12714    fn untyped(&self) -> SyntaxStablePtrId {
12715        self.0
12716    }
12717    fn lookup(&self, db: &dyn SyntaxGroup) -> Member {
12718        Member::from_syntax_node(db, self.0.lookup(db))
12719    }
12720}
12721impl From<MemberPtr> for SyntaxStablePtrId {
12722    fn from(ptr: MemberPtr) -> Self {
12723        ptr.untyped()
12724    }
12725}
12726#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
12727pub struct MemberGreen(pub GreenId);
12728impl TypedSyntaxNode for Member {
12729    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::Member);
12730    type StablePtr = MemberPtr;
12731    type Green = MemberGreen;
12732    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
12733        MemberGreen(
12734            Arc::new(GreenNode {
12735                kind: SyntaxKind::Member,
12736                details: GreenNodeDetails::Node {
12737                    children: vec![
12738                        AttributeList::missing(db).0,
12739                        Visibility::missing(db).0,
12740                        TerminalIdentifier::missing(db).0,
12741                        TypeClause::missing(db).0,
12742                    ],
12743                    width: TextWidth::default(),
12744                },
12745            })
12746            .intern(db),
12747        )
12748    }
12749    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
12750        let kind = node.kind(db);
12751        assert_eq!(
12752            kind,
12753            SyntaxKind::Member,
12754            "Unexpected SyntaxKind {:?}. Expected {:?}.",
12755            kind,
12756            SyntaxKind::Member
12757        );
12758        let children = db.get_children(node.clone());
12759        Self { node, children }
12760    }
12761    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
12762        let kind = node.kind(db);
12763        if kind == SyntaxKind::Member { Some(Self::from_syntax_node(db, node)) } else { None }
12764    }
12765    fn as_syntax_node(&self) -> SyntaxNode {
12766        self.node.clone()
12767    }
12768    fn stable_ptr(&self) -> Self::StablePtr {
12769        MemberPtr(self.node.0.stable_ptr)
12770    }
12771}
12772impl From<&Member> for SyntaxStablePtrId {
12773    fn from(node: &Member) -> Self {
12774        node.stable_ptr().untyped()
12775    }
12776}
12777#[derive(Clone, Debug, Eq, Hash, PartialEq)]
12778pub struct MemberList(ElementList<Member, 2>);
12779impl Deref for MemberList {
12780    type Target = ElementList<Member, 2>;
12781    fn deref(&self) -> &Self::Target {
12782        &self.0
12783    }
12784}
12785impl MemberList {
12786    pub fn new_green(
12787        db: &dyn SyntaxGroup,
12788        children: Vec<MemberListElementOrSeparatorGreen>,
12789    ) -> MemberListGreen {
12790        let width = children.iter().map(|id| id.id().lookup_intern(db).width()).sum();
12791        MemberListGreen(
12792            Arc::new(GreenNode {
12793                kind: SyntaxKind::MemberList,
12794                details: GreenNodeDetails::Node {
12795                    children: children.iter().map(|x| x.id()).collect(),
12796                    width,
12797                },
12798            })
12799            .intern(db),
12800        )
12801    }
12802}
12803#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
12804pub struct MemberListPtr(pub SyntaxStablePtrId);
12805impl TypedStablePtr for MemberListPtr {
12806    type SyntaxNode = MemberList;
12807    fn untyped(&self) -> SyntaxStablePtrId {
12808        self.0
12809    }
12810    fn lookup(&self, db: &dyn SyntaxGroup) -> MemberList {
12811        MemberList::from_syntax_node(db, self.0.lookup(db))
12812    }
12813}
12814impl From<MemberListPtr> for SyntaxStablePtrId {
12815    fn from(ptr: MemberListPtr) -> Self {
12816        ptr.untyped()
12817    }
12818}
12819#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
12820pub enum MemberListElementOrSeparatorGreen {
12821    Separator(TerminalCommaGreen),
12822    Element(MemberGreen),
12823}
12824impl From<TerminalCommaGreen> for MemberListElementOrSeparatorGreen {
12825    fn from(value: TerminalCommaGreen) -> Self {
12826        MemberListElementOrSeparatorGreen::Separator(value)
12827    }
12828}
12829impl From<MemberGreen> for MemberListElementOrSeparatorGreen {
12830    fn from(value: MemberGreen) -> Self {
12831        MemberListElementOrSeparatorGreen::Element(value)
12832    }
12833}
12834impl MemberListElementOrSeparatorGreen {
12835    fn id(&self) -> GreenId {
12836        match self {
12837            MemberListElementOrSeparatorGreen::Separator(green) => green.0,
12838            MemberListElementOrSeparatorGreen::Element(green) => green.0,
12839        }
12840    }
12841}
12842#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
12843pub struct MemberListGreen(pub GreenId);
12844impl TypedSyntaxNode for MemberList {
12845    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::MemberList);
12846    type StablePtr = MemberListPtr;
12847    type Green = MemberListGreen;
12848    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
12849        MemberListGreen(
12850            Arc::new(GreenNode {
12851                kind: SyntaxKind::MemberList,
12852                details: GreenNodeDetails::Node { children: vec![], width: TextWidth::default() },
12853            })
12854            .intern(db),
12855        )
12856    }
12857    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
12858        Self(ElementList::new(node))
12859    }
12860    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
12861        if node.kind(db) == SyntaxKind::MemberList {
12862            Some(Self(ElementList::new(node)))
12863        } else {
12864            None
12865        }
12866    }
12867    fn as_syntax_node(&self) -> SyntaxNode {
12868        self.node.clone()
12869    }
12870    fn stable_ptr(&self) -> Self::StablePtr {
12871        MemberListPtr(self.node.0.stable_ptr)
12872    }
12873}
12874impl From<&MemberList> for SyntaxStablePtrId {
12875    fn from(node: &MemberList) -> Self {
12876        node.stable_ptr().untyped()
12877    }
12878}
12879#[derive(Clone, Debug, Eq, Hash, PartialEq)]
12880pub struct Variant {
12881    node: SyntaxNode,
12882    children: Arc<[SyntaxNode]>,
12883}
12884impl Variant {
12885    pub const INDEX_ATTRIBUTES: usize = 0;
12886    pub const INDEX_NAME: usize = 1;
12887    pub const INDEX_TYPE_CLAUSE: usize = 2;
12888    pub fn new_green(
12889        db: &dyn SyntaxGroup,
12890        attributes: AttributeListGreen,
12891        name: TerminalIdentifierGreen,
12892        type_clause: OptionTypeClauseGreen,
12893    ) -> VariantGreen {
12894        let children: Vec<GreenId> = vec![attributes.0, name.0, type_clause.0];
12895        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
12896        VariantGreen(
12897            Arc::new(GreenNode {
12898                kind: SyntaxKind::Variant,
12899                details: GreenNodeDetails::Node { children, width },
12900            })
12901            .intern(db),
12902        )
12903    }
12904}
12905impl Variant {
12906    pub fn attributes(&self, db: &dyn SyntaxGroup) -> AttributeList {
12907        AttributeList::from_syntax_node(db, self.children[0].clone())
12908    }
12909    pub fn name(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier {
12910        TerminalIdentifier::from_syntax_node(db, self.children[1].clone())
12911    }
12912    pub fn type_clause(&self, db: &dyn SyntaxGroup) -> OptionTypeClause {
12913        OptionTypeClause::from_syntax_node(db, self.children[2].clone())
12914    }
12915}
12916#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
12917pub struct VariantPtr(pub SyntaxStablePtrId);
12918impl VariantPtr {
12919    pub fn name_green(self, db: &dyn SyntaxGroup) -> TerminalIdentifierGreen {
12920        let ptr = self.0.lookup_intern(db);
12921        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
12922            TerminalIdentifierGreen(key_fields[0])
12923        } else {
12924            panic!("Unexpected key field query on root.");
12925        }
12926    }
12927}
12928impl TypedStablePtr for VariantPtr {
12929    type SyntaxNode = Variant;
12930    fn untyped(&self) -> SyntaxStablePtrId {
12931        self.0
12932    }
12933    fn lookup(&self, db: &dyn SyntaxGroup) -> Variant {
12934        Variant::from_syntax_node(db, self.0.lookup(db))
12935    }
12936}
12937impl From<VariantPtr> for SyntaxStablePtrId {
12938    fn from(ptr: VariantPtr) -> Self {
12939        ptr.untyped()
12940    }
12941}
12942#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
12943pub struct VariantGreen(pub GreenId);
12944impl TypedSyntaxNode for Variant {
12945    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::Variant);
12946    type StablePtr = VariantPtr;
12947    type Green = VariantGreen;
12948    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
12949        VariantGreen(
12950            Arc::new(GreenNode {
12951                kind: SyntaxKind::Variant,
12952                details: GreenNodeDetails::Node {
12953                    children: vec![
12954                        AttributeList::missing(db).0,
12955                        TerminalIdentifier::missing(db).0,
12956                        OptionTypeClause::missing(db).0,
12957                    ],
12958                    width: TextWidth::default(),
12959                },
12960            })
12961            .intern(db),
12962        )
12963    }
12964    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
12965        let kind = node.kind(db);
12966        assert_eq!(
12967            kind,
12968            SyntaxKind::Variant,
12969            "Unexpected SyntaxKind {:?}. Expected {:?}.",
12970            kind,
12971            SyntaxKind::Variant
12972        );
12973        let children = db.get_children(node.clone());
12974        Self { node, children }
12975    }
12976    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
12977        let kind = node.kind(db);
12978        if kind == SyntaxKind::Variant { Some(Self::from_syntax_node(db, node)) } else { None }
12979    }
12980    fn as_syntax_node(&self) -> SyntaxNode {
12981        self.node.clone()
12982    }
12983    fn stable_ptr(&self) -> Self::StablePtr {
12984        VariantPtr(self.node.0.stable_ptr)
12985    }
12986}
12987impl From<&Variant> for SyntaxStablePtrId {
12988    fn from(node: &Variant) -> Self {
12989        node.stable_ptr().untyped()
12990    }
12991}
12992#[derive(Clone, Debug, Eq, Hash, PartialEq)]
12993pub struct VariantList(ElementList<Variant, 2>);
12994impl Deref for VariantList {
12995    type Target = ElementList<Variant, 2>;
12996    fn deref(&self) -> &Self::Target {
12997        &self.0
12998    }
12999}
13000impl VariantList {
13001    pub fn new_green(
13002        db: &dyn SyntaxGroup,
13003        children: Vec<VariantListElementOrSeparatorGreen>,
13004    ) -> VariantListGreen {
13005        let width = children.iter().map(|id| id.id().lookup_intern(db).width()).sum();
13006        VariantListGreen(
13007            Arc::new(GreenNode {
13008                kind: SyntaxKind::VariantList,
13009                details: GreenNodeDetails::Node {
13010                    children: children.iter().map(|x| x.id()).collect(),
13011                    width,
13012                },
13013            })
13014            .intern(db),
13015        )
13016    }
13017}
13018#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
13019pub struct VariantListPtr(pub SyntaxStablePtrId);
13020impl TypedStablePtr for VariantListPtr {
13021    type SyntaxNode = VariantList;
13022    fn untyped(&self) -> SyntaxStablePtrId {
13023        self.0
13024    }
13025    fn lookup(&self, db: &dyn SyntaxGroup) -> VariantList {
13026        VariantList::from_syntax_node(db, self.0.lookup(db))
13027    }
13028}
13029impl From<VariantListPtr> for SyntaxStablePtrId {
13030    fn from(ptr: VariantListPtr) -> Self {
13031        ptr.untyped()
13032    }
13033}
13034#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
13035pub enum VariantListElementOrSeparatorGreen {
13036    Separator(TerminalCommaGreen),
13037    Element(VariantGreen),
13038}
13039impl From<TerminalCommaGreen> for VariantListElementOrSeparatorGreen {
13040    fn from(value: TerminalCommaGreen) -> Self {
13041        VariantListElementOrSeparatorGreen::Separator(value)
13042    }
13043}
13044impl From<VariantGreen> for VariantListElementOrSeparatorGreen {
13045    fn from(value: VariantGreen) -> Self {
13046        VariantListElementOrSeparatorGreen::Element(value)
13047    }
13048}
13049impl VariantListElementOrSeparatorGreen {
13050    fn id(&self) -> GreenId {
13051        match self {
13052            VariantListElementOrSeparatorGreen::Separator(green) => green.0,
13053            VariantListElementOrSeparatorGreen::Element(green) => green.0,
13054        }
13055    }
13056}
13057#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
13058pub struct VariantListGreen(pub GreenId);
13059impl TypedSyntaxNode for VariantList {
13060    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::VariantList);
13061    type StablePtr = VariantListPtr;
13062    type Green = VariantListGreen;
13063    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
13064        VariantListGreen(
13065            Arc::new(GreenNode {
13066                kind: SyntaxKind::VariantList,
13067                details: GreenNodeDetails::Node { children: vec![], width: TextWidth::default() },
13068            })
13069            .intern(db),
13070        )
13071    }
13072    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
13073        Self(ElementList::new(node))
13074    }
13075    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
13076        if node.kind(db) == SyntaxKind::VariantList {
13077            Some(Self(ElementList::new(node)))
13078        } else {
13079            None
13080        }
13081    }
13082    fn as_syntax_node(&self) -> SyntaxNode {
13083        self.node.clone()
13084    }
13085    fn stable_ptr(&self) -> Self::StablePtr {
13086        VariantListPtr(self.node.0.stable_ptr)
13087    }
13088}
13089impl From<&VariantList> for SyntaxStablePtrId {
13090    fn from(node: &VariantList) -> Self {
13091        node.stable_ptr().untyped()
13092    }
13093}
13094#[derive(Clone, Debug, Eq, Hash, PartialEq)]
13095pub enum ModuleItem {
13096    Constant(ItemConstant),
13097    Module(ItemModule),
13098    Use(ItemUse),
13099    FreeFunction(FunctionWithBody),
13100    ExternFunction(ItemExternFunction),
13101    ExternType(ItemExternType),
13102    Trait(ItemTrait),
13103    Impl(ItemImpl),
13104    ImplAlias(ItemImplAlias),
13105    Struct(ItemStruct),
13106    Enum(ItemEnum),
13107    TypeAlias(ItemTypeAlias),
13108    InlineMacro(ItemInlineMacro),
13109    HeaderDoc(ItemHeaderDoc),
13110    Missing(ModuleItemMissing),
13111}
13112#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
13113pub struct ModuleItemPtr(pub SyntaxStablePtrId);
13114impl TypedStablePtr for ModuleItemPtr {
13115    type SyntaxNode = ModuleItem;
13116    fn untyped(&self) -> SyntaxStablePtrId {
13117        self.0
13118    }
13119    fn lookup(&self, db: &dyn SyntaxGroup) -> ModuleItem {
13120        ModuleItem::from_syntax_node(db, self.0.lookup(db))
13121    }
13122}
13123impl From<ModuleItemPtr> for SyntaxStablePtrId {
13124    fn from(ptr: ModuleItemPtr) -> Self {
13125        ptr.untyped()
13126    }
13127}
13128impl From<ItemConstantPtr> for ModuleItemPtr {
13129    fn from(value: ItemConstantPtr) -> Self {
13130        Self(value.0)
13131    }
13132}
13133impl From<ItemModulePtr> for ModuleItemPtr {
13134    fn from(value: ItemModulePtr) -> Self {
13135        Self(value.0)
13136    }
13137}
13138impl From<ItemUsePtr> for ModuleItemPtr {
13139    fn from(value: ItemUsePtr) -> Self {
13140        Self(value.0)
13141    }
13142}
13143impl From<FunctionWithBodyPtr> for ModuleItemPtr {
13144    fn from(value: FunctionWithBodyPtr) -> Self {
13145        Self(value.0)
13146    }
13147}
13148impl From<ItemExternFunctionPtr> for ModuleItemPtr {
13149    fn from(value: ItemExternFunctionPtr) -> Self {
13150        Self(value.0)
13151    }
13152}
13153impl From<ItemExternTypePtr> for ModuleItemPtr {
13154    fn from(value: ItemExternTypePtr) -> Self {
13155        Self(value.0)
13156    }
13157}
13158impl From<ItemTraitPtr> for ModuleItemPtr {
13159    fn from(value: ItemTraitPtr) -> Self {
13160        Self(value.0)
13161    }
13162}
13163impl From<ItemImplPtr> for ModuleItemPtr {
13164    fn from(value: ItemImplPtr) -> Self {
13165        Self(value.0)
13166    }
13167}
13168impl From<ItemImplAliasPtr> for ModuleItemPtr {
13169    fn from(value: ItemImplAliasPtr) -> Self {
13170        Self(value.0)
13171    }
13172}
13173impl From<ItemStructPtr> for ModuleItemPtr {
13174    fn from(value: ItemStructPtr) -> Self {
13175        Self(value.0)
13176    }
13177}
13178impl From<ItemEnumPtr> for ModuleItemPtr {
13179    fn from(value: ItemEnumPtr) -> Self {
13180        Self(value.0)
13181    }
13182}
13183impl From<ItemTypeAliasPtr> for ModuleItemPtr {
13184    fn from(value: ItemTypeAliasPtr) -> Self {
13185        Self(value.0)
13186    }
13187}
13188impl From<ItemInlineMacroPtr> for ModuleItemPtr {
13189    fn from(value: ItemInlineMacroPtr) -> Self {
13190        Self(value.0)
13191    }
13192}
13193impl From<ItemHeaderDocPtr> for ModuleItemPtr {
13194    fn from(value: ItemHeaderDocPtr) -> Self {
13195        Self(value.0)
13196    }
13197}
13198impl From<ModuleItemMissingPtr> for ModuleItemPtr {
13199    fn from(value: ModuleItemMissingPtr) -> Self {
13200        Self(value.0)
13201    }
13202}
13203impl From<ItemConstantGreen> for ModuleItemGreen {
13204    fn from(value: ItemConstantGreen) -> Self {
13205        Self(value.0)
13206    }
13207}
13208impl From<ItemModuleGreen> for ModuleItemGreen {
13209    fn from(value: ItemModuleGreen) -> Self {
13210        Self(value.0)
13211    }
13212}
13213impl From<ItemUseGreen> for ModuleItemGreen {
13214    fn from(value: ItemUseGreen) -> Self {
13215        Self(value.0)
13216    }
13217}
13218impl From<FunctionWithBodyGreen> for ModuleItemGreen {
13219    fn from(value: FunctionWithBodyGreen) -> Self {
13220        Self(value.0)
13221    }
13222}
13223impl From<ItemExternFunctionGreen> for ModuleItemGreen {
13224    fn from(value: ItemExternFunctionGreen) -> Self {
13225        Self(value.0)
13226    }
13227}
13228impl From<ItemExternTypeGreen> for ModuleItemGreen {
13229    fn from(value: ItemExternTypeGreen) -> Self {
13230        Self(value.0)
13231    }
13232}
13233impl From<ItemTraitGreen> for ModuleItemGreen {
13234    fn from(value: ItemTraitGreen) -> Self {
13235        Self(value.0)
13236    }
13237}
13238impl From<ItemImplGreen> for ModuleItemGreen {
13239    fn from(value: ItemImplGreen) -> Self {
13240        Self(value.0)
13241    }
13242}
13243impl From<ItemImplAliasGreen> for ModuleItemGreen {
13244    fn from(value: ItemImplAliasGreen) -> Self {
13245        Self(value.0)
13246    }
13247}
13248impl From<ItemStructGreen> for ModuleItemGreen {
13249    fn from(value: ItemStructGreen) -> Self {
13250        Self(value.0)
13251    }
13252}
13253impl From<ItemEnumGreen> for ModuleItemGreen {
13254    fn from(value: ItemEnumGreen) -> Self {
13255        Self(value.0)
13256    }
13257}
13258impl From<ItemTypeAliasGreen> for ModuleItemGreen {
13259    fn from(value: ItemTypeAliasGreen) -> Self {
13260        Self(value.0)
13261    }
13262}
13263impl From<ItemInlineMacroGreen> for ModuleItemGreen {
13264    fn from(value: ItemInlineMacroGreen) -> Self {
13265        Self(value.0)
13266    }
13267}
13268impl From<ItemHeaderDocGreen> for ModuleItemGreen {
13269    fn from(value: ItemHeaderDocGreen) -> Self {
13270        Self(value.0)
13271    }
13272}
13273impl From<ModuleItemMissingGreen> for ModuleItemGreen {
13274    fn from(value: ModuleItemMissingGreen) -> Self {
13275        Self(value.0)
13276    }
13277}
13278#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
13279pub struct ModuleItemGreen(pub GreenId);
13280impl TypedSyntaxNode for ModuleItem {
13281    const OPTIONAL_KIND: Option<SyntaxKind> = None;
13282    type StablePtr = ModuleItemPtr;
13283    type Green = ModuleItemGreen;
13284    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
13285        ModuleItemGreen(ModuleItemMissing::missing(db).0)
13286    }
13287    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
13288        let kind = node.kind(db);
13289        match kind {
13290            SyntaxKind::ItemConstant => {
13291                ModuleItem::Constant(ItemConstant::from_syntax_node(db, node))
13292            }
13293            SyntaxKind::ItemModule => ModuleItem::Module(ItemModule::from_syntax_node(db, node)),
13294            SyntaxKind::ItemUse => ModuleItem::Use(ItemUse::from_syntax_node(db, node)),
13295            SyntaxKind::FunctionWithBody => {
13296                ModuleItem::FreeFunction(FunctionWithBody::from_syntax_node(db, node))
13297            }
13298            SyntaxKind::ItemExternFunction => {
13299                ModuleItem::ExternFunction(ItemExternFunction::from_syntax_node(db, node))
13300            }
13301            SyntaxKind::ItemExternType => {
13302                ModuleItem::ExternType(ItemExternType::from_syntax_node(db, node))
13303            }
13304            SyntaxKind::ItemTrait => ModuleItem::Trait(ItemTrait::from_syntax_node(db, node)),
13305            SyntaxKind::ItemImpl => ModuleItem::Impl(ItemImpl::from_syntax_node(db, node)),
13306            SyntaxKind::ItemImplAlias => {
13307                ModuleItem::ImplAlias(ItemImplAlias::from_syntax_node(db, node))
13308            }
13309            SyntaxKind::ItemStruct => ModuleItem::Struct(ItemStruct::from_syntax_node(db, node)),
13310            SyntaxKind::ItemEnum => ModuleItem::Enum(ItemEnum::from_syntax_node(db, node)),
13311            SyntaxKind::ItemTypeAlias => {
13312                ModuleItem::TypeAlias(ItemTypeAlias::from_syntax_node(db, node))
13313            }
13314            SyntaxKind::ItemInlineMacro => {
13315                ModuleItem::InlineMacro(ItemInlineMacro::from_syntax_node(db, node))
13316            }
13317            SyntaxKind::ItemHeaderDoc => {
13318                ModuleItem::HeaderDoc(ItemHeaderDoc::from_syntax_node(db, node))
13319            }
13320            SyntaxKind::ModuleItemMissing => {
13321                ModuleItem::Missing(ModuleItemMissing::from_syntax_node(db, node))
13322            }
13323            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "ModuleItem"),
13324        }
13325    }
13326    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
13327        let kind = node.kind(db);
13328        match kind {
13329            SyntaxKind::ItemConstant => {
13330                Some(ModuleItem::Constant(ItemConstant::from_syntax_node(db, node)))
13331            }
13332            SyntaxKind::ItemModule => {
13333                Some(ModuleItem::Module(ItemModule::from_syntax_node(db, node)))
13334            }
13335            SyntaxKind::ItemUse => Some(ModuleItem::Use(ItemUse::from_syntax_node(db, node))),
13336            SyntaxKind::FunctionWithBody => {
13337                Some(ModuleItem::FreeFunction(FunctionWithBody::from_syntax_node(db, node)))
13338            }
13339            SyntaxKind::ItemExternFunction => {
13340                Some(ModuleItem::ExternFunction(ItemExternFunction::from_syntax_node(db, node)))
13341            }
13342            SyntaxKind::ItemExternType => {
13343                Some(ModuleItem::ExternType(ItemExternType::from_syntax_node(db, node)))
13344            }
13345            SyntaxKind::ItemTrait => Some(ModuleItem::Trait(ItemTrait::from_syntax_node(db, node))),
13346            SyntaxKind::ItemImpl => Some(ModuleItem::Impl(ItemImpl::from_syntax_node(db, node))),
13347            SyntaxKind::ItemImplAlias => {
13348                Some(ModuleItem::ImplAlias(ItemImplAlias::from_syntax_node(db, node)))
13349            }
13350            SyntaxKind::ItemStruct => {
13351                Some(ModuleItem::Struct(ItemStruct::from_syntax_node(db, node)))
13352            }
13353            SyntaxKind::ItemEnum => Some(ModuleItem::Enum(ItemEnum::from_syntax_node(db, node))),
13354            SyntaxKind::ItemTypeAlias => {
13355                Some(ModuleItem::TypeAlias(ItemTypeAlias::from_syntax_node(db, node)))
13356            }
13357            SyntaxKind::ItemInlineMacro => {
13358                Some(ModuleItem::InlineMacro(ItemInlineMacro::from_syntax_node(db, node)))
13359            }
13360            SyntaxKind::ItemHeaderDoc => {
13361                Some(ModuleItem::HeaderDoc(ItemHeaderDoc::from_syntax_node(db, node)))
13362            }
13363            SyntaxKind::ModuleItemMissing => {
13364                Some(ModuleItem::Missing(ModuleItemMissing::from_syntax_node(db, node)))
13365            }
13366            _ => None,
13367        }
13368    }
13369    fn as_syntax_node(&self) -> SyntaxNode {
13370        match self {
13371            ModuleItem::Constant(x) => x.as_syntax_node(),
13372            ModuleItem::Module(x) => x.as_syntax_node(),
13373            ModuleItem::Use(x) => x.as_syntax_node(),
13374            ModuleItem::FreeFunction(x) => x.as_syntax_node(),
13375            ModuleItem::ExternFunction(x) => x.as_syntax_node(),
13376            ModuleItem::ExternType(x) => x.as_syntax_node(),
13377            ModuleItem::Trait(x) => x.as_syntax_node(),
13378            ModuleItem::Impl(x) => x.as_syntax_node(),
13379            ModuleItem::ImplAlias(x) => x.as_syntax_node(),
13380            ModuleItem::Struct(x) => x.as_syntax_node(),
13381            ModuleItem::Enum(x) => x.as_syntax_node(),
13382            ModuleItem::TypeAlias(x) => x.as_syntax_node(),
13383            ModuleItem::InlineMacro(x) => x.as_syntax_node(),
13384            ModuleItem::HeaderDoc(x) => x.as_syntax_node(),
13385            ModuleItem::Missing(x) => x.as_syntax_node(),
13386        }
13387    }
13388    fn stable_ptr(&self) -> Self::StablePtr {
13389        ModuleItemPtr(self.as_syntax_node().0.stable_ptr)
13390    }
13391}
13392impl From<&ModuleItem> for SyntaxStablePtrId {
13393    fn from(node: &ModuleItem) -> Self {
13394        node.stable_ptr().untyped()
13395    }
13396}
13397impl ModuleItem {
13398    /// Checks if a kind of a variant of [ModuleItem].
13399    pub fn is_variant(kind: SyntaxKind) -> bool {
13400        matches!(
13401            kind,
13402            SyntaxKind::ItemConstant
13403                | SyntaxKind::ItemModule
13404                | SyntaxKind::ItemUse
13405                | SyntaxKind::FunctionWithBody
13406                | SyntaxKind::ItemExternFunction
13407                | SyntaxKind::ItemExternType
13408                | SyntaxKind::ItemTrait
13409                | SyntaxKind::ItemImpl
13410                | SyntaxKind::ItemImplAlias
13411                | SyntaxKind::ItemStruct
13412                | SyntaxKind::ItemEnum
13413                | SyntaxKind::ItemTypeAlias
13414                | SyntaxKind::ItemInlineMacro
13415                | SyntaxKind::ItemHeaderDoc
13416                | SyntaxKind::ModuleItemMissing
13417        )
13418    }
13419}
13420#[derive(Clone, Debug, Eq, Hash, PartialEq)]
13421pub struct ModuleItemList(ElementList<ModuleItem, 1>);
13422impl Deref for ModuleItemList {
13423    type Target = ElementList<ModuleItem, 1>;
13424    fn deref(&self) -> &Self::Target {
13425        &self.0
13426    }
13427}
13428impl ModuleItemList {
13429    pub fn new_green(db: &dyn SyntaxGroup, children: Vec<ModuleItemGreen>) -> ModuleItemListGreen {
13430        let width = children.iter().map(|id| id.0.lookup_intern(db).width()).sum();
13431        ModuleItemListGreen(
13432            Arc::new(GreenNode {
13433                kind: SyntaxKind::ModuleItemList,
13434                details: GreenNodeDetails::Node {
13435                    children: children.iter().map(|x| x.0).collect(),
13436                    width,
13437                },
13438            })
13439            .intern(db),
13440        )
13441    }
13442}
13443#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
13444pub struct ModuleItemListPtr(pub SyntaxStablePtrId);
13445impl TypedStablePtr for ModuleItemListPtr {
13446    type SyntaxNode = ModuleItemList;
13447    fn untyped(&self) -> SyntaxStablePtrId {
13448        self.0
13449    }
13450    fn lookup(&self, db: &dyn SyntaxGroup) -> ModuleItemList {
13451        ModuleItemList::from_syntax_node(db, self.0.lookup(db))
13452    }
13453}
13454impl From<ModuleItemListPtr> for SyntaxStablePtrId {
13455    fn from(ptr: ModuleItemListPtr) -> Self {
13456        ptr.untyped()
13457    }
13458}
13459#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
13460pub struct ModuleItemListGreen(pub GreenId);
13461impl TypedSyntaxNode for ModuleItemList {
13462    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ModuleItemList);
13463    type StablePtr = ModuleItemListPtr;
13464    type Green = ModuleItemListGreen;
13465    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
13466        ModuleItemListGreen(
13467            Arc::new(GreenNode {
13468                kind: SyntaxKind::ModuleItemList,
13469                details: GreenNodeDetails::Node { children: vec![], width: TextWidth::default() },
13470            })
13471            .intern(db),
13472        )
13473    }
13474    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
13475        Self(ElementList::new(node))
13476    }
13477    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
13478        if node.kind(db) == SyntaxKind::ModuleItemList {
13479            Some(Self(ElementList::new(node)))
13480        } else {
13481            None
13482        }
13483    }
13484    fn as_syntax_node(&self) -> SyntaxNode {
13485        self.node.clone()
13486    }
13487    fn stable_ptr(&self) -> Self::StablePtr {
13488        ModuleItemListPtr(self.node.0.stable_ptr)
13489    }
13490}
13491impl From<&ModuleItemList> for SyntaxStablePtrId {
13492    fn from(node: &ModuleItemList) -> Self {
13493        node.stable_ptr().untyped()
13494    }
13495}
13496#[derive(Clone, Debug, Eq, Hash, PartialEq)]
13497pub struct ModuleItemMissing {
13498    node: SyntaxNode,
13499    children: Arc<[SyntaxNode]>,
13500}
13501impl ModuleItemMissing {
13502    pub fn new_green(db: &dyn SyntaxGroup) -> ModuleItemMissingGreen {
13503        let children: Vec<GreenId> = vec![];
13504        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
13505        ModuleItemMissingGreen(
13506            Arc::new(GreenNode {
13507                kind: SyntaxKind::ModuleItemMissing,
13508                details: GreenNodeDetails::Node { children, width },
13509            })
13510            .intern(db),
13511        )
13512    }
13513}
13514impl ModuleItemMissing {}
13515#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
13516pub struct ModuleItemMissingPtr(pub SyntaxStablePtrId);
13517impl ModuleItemMissingPtr {}
13518impl TypedStablePtr for ModuleItemMissingPtr {
13519    type SyntaxNode = ModuleItemMissing;
13520    fn untyped(&self) -> SyntaxStablePtrId {
13521        self.0
13522    }
13523    fn lookup(&self, db: &dyn SyntaxGroup) -> ModuleItemMissing {
13524        ModuleItemMissing::from_syntax_node(db, self.0.lookup(db))
13525    }
13526}
13527impl From<ModuleItemMissingPtr> for SyntaxStablePtrId {
13528    fn from(ptr: ModuleItemMissingPtr) -> Self {
13529        ptr.untyped()
13530    }
13531}
13532#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
13533pub struct ModuleItemMissingGreen(pub GreenId);
13534impl TypedSyntaxNode for ModuleItemMissing {
13535    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ModuleItemMissing);
13536    type StablePtr = ModuleItemMissingPtr;
13537    type Green = ModuleItemMissingGreen;
13538    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
13539        ModuleItemMissingGreen(
13540            Arc::new(GreenNode {
13541                kind: SyntaxKind::ModuleItemMissing,
13542                details: GreenNodeDetails::Node { children: vec![], width: TextWidth::default() },
13543            })
13544            .intern(db),
13545        )
13546    }
13547    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
13548        let kind = node.kind(db);
13549        assert_eq!(
13550            kind,
13551            SyntaxKind::ModuleItemMissing,
13552            "Unexpected SyntaxKind {:?}. Expected {:?}.",
13553            kind,
13554            SyntaxKind::ModuleItemMissing
13555        );
13556        let children = db.get_children(node.clone());
13557        Self { node, children }
13558    }
13559    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
13560        let kind = node.kind(db);
13561        if kind == SyntaxKind::ModuleItemMissing {
13562            Some(Self::from_syntax_node(db, node))
13563        } else {
13564            None
13565        }
13566    }
13567    fn as_syntax_node(&self) -> SyntaxNode {
13568        self.node.clone()
13569    }
13570    fn stable_ptr(&self) -> Self::StablePtr {
13571        ModuleItemMissingPtr(self.node.0.stable_ptr)
13572    }
13573}
13574impl From<&ModuleItemMissing> for SyntaxStablePtrId {
13575    fn from(node: &ModuleItemMissing) -> Self {
13576        node.stable_ptr().untyped()
13577    }
13578}
13579#[derive(Clone, Debug, Eq, Hash, PartialEq)]
13580pub struct Attribute {
13581    node: SyntaxNode,
13582    children: Arc<[SyntaxNode]>,
13583}
13584impl Attribute {
13585    pub const INDEX_HASH: usize = 0;
13586    pub const INDEX_LBRACK: usize = 1;
13587    pub const INDEX_ATTR: usize = 2;
13588    pub const INDEX_ARGUMENTS: usize = 3;
13589    pub const INDEX_RBRACK: usize = 4;
13590    pub fn new_green(
13591        db: &dyn SyntaxGroup,
13592        hash: TerminalHashGreen,
13593        lbrack: TerminalLBrackGreen,
13594        attr: ExprPathGreen,
13595        arguments: OptionArgListParenthesizedGreen,
13596        rbrack: TerminalRBrackGreen,
13597    ) -> AttributeGreen {
13598        let children: Vec<GreenId> = vec![hash.0, lbrack.0, attr.0, arguments.0, rbrack.0];
13599        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
13600        AttributeGreen(
13601            Arc::new(GreenNode {
13602                kind: SyntaxKind::Attribute,
13603                details: GreenNodeDetails::Node { children, width },
13604            })
13605            .intern(db),
13606        )
13607    }
13608}
13609impl Attribute {
13610    pub fn hash(&self, db: &dyn SyntaxGroup) -> TerminalHash {
13611        TerminalHash::from_syntax_node(db, self.children[0].clone())
13612    }
13613    pub fn lbrack(&self, db: &dyn SyntaxGroup) -> TerminalLBrack {
13614        TerminalLBrack::from_syntax_node(db, self.children[1].clone())
13615    }
13616    pub fn attr(&self, db: &dyn SyntaxGroup) -> ExprPath {
13617        ExprPath::from_syntax_node(db, self.children[2].clone())
13618    }
13619    pub fn arguments(&self, db: &dyn SyntaxGroup) -> OptionArgListParenthesized {
13620        OptionArgListParenthesized::from_syntax_node(db, self.children[3].clone())
13621    }
13622    pub fn rbrack(&self, db: &dyn SyntaxGroup) -> TerminalRBrack {
13623        TerminalRBrack::from_syntax_node(db, self.children[4].clone())
13624    }
13625}
13626#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
13627pub struct AttributePtr(pub SyntaxStablePtrId);
13628impl AttributePtr {}
13629impl TypedStablePtr for AttributePtr {
13630    type SyntaxNode = Attribute;
13631    fn untyped(&self) -> SyntaxStablePtrId {
13632        self.0
13633    }
13634    fn lookup(&self, db: &dyn SyntaxGroup) -> Attribute {
13635        Attribute::from_syntax_node(db, self.0.lookup(db))
13636    }
13637}
13638impl From<AttributePtr> for SyntaxStablePtrId {
13639    fn from(ptr: AttributePtr) -> Self {
13640        ptr.untyped()
13641    }
13642}
13643#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
13644pub struct AttributeGreen(pub GreenId);
13645impl TypedSyntaxNode for Attribute {
13646    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::Attribute);
13647    type StablePtr = AttributePtr;
13648    type Green = AttributeGreen;
13649    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
13650        AttributeGreen(
13651            Arc::new(GreenNode {
13652                kind: SyntaxKind::Attribute,
13653                details: GreenNodeDetails::Node {
13654                    children: vec![
13655                        TerminalHash::missing(db).0,
13656                        TerminalLBrack::missing(db).0,
13657                        ExprPath::missing(db).0,
13658                        OptionArgListParenthesized::missing(db).0,
13659                        TerminalRBrack::missing(db).0,
13660                    ],
13661                    width: TextWidth::default(),
13662                },
13663            })
13664            .intern(db),
13665        )
13666    }
13667    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
13668        let kind = node.kind(db);
13669        assert_eq!(
13670            kind,
13671            SyntaxKind::Attribute,
13672            "Unexpected SyntaxKind {:?}. Expected {:?}.",
13673            kind,
13674            SyntaxKind::Attribute
13675        );
13676        let children = db.get_children(node.clone());
13677        Self { node, children }
13678    }
13679    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
13680        let kind = node.kind(db);
13681        if kind == SyntaxKind::Attribute { Some(Self::from_syntax_node(db, node)) } else { None }
13682    }
13683    fn as_syntax_node(&self) -> SyntaxNode {
13684        self.node.clone()
13685    }
13686    fn stable_ptr(&self) -> Self::StablePtr {
13687        AttributePtr(self.node.0.stable_ptr)
13688    }
13689}
13690impl From<&Attribute> for SyntaxStablePtrId {
13691    fn from(node: &Attribute) -> Self {
13692        node.stable_ptr().untyped()
13693    }
13694}
13695#[derive(Clone, Debug, Eq, Hash, PartialEq)]
13696pub struct AttributeList(ElementList<Attribute, 1>);
13697impl Deref for AttributeList {
13698    type Target = ElementList<Attribute, 1>;
13699    fn deref(&self) -> &Self::Target {
13700        &self.0
13701    }
13702}
13703impl AttributeList {
13704    pub fn new_green(db: &dyn SyntaxGroup, children: Vec<AttributeGreen>) -> AttributeListGreen {
13705        let width = children.iter().map(|id| id.0.lookup_intern(db).width()).sum();
13706        AttributeListGreen(
13707            Arc::new(GreenNode {
13708                kind: SyntaxKind::AttributeList,
13709                details: GreenNodeDetails::Node {
13710                    children: children.iter().map(|x| x.0).collect(),
13711                    width,
13712                },
13713            })
13714            .intern(db),
13715        )
13716    }
13717}
13718#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
13719pub struct AttributeListPtr(pub SyntaxStablePtrId);
13720impl TypedStablePtr for AttributeListPtr {
13721    type SyntaxNode = AttributeList;
13722    fn untyped(&self) -> SyntaxStablePtrId {
13723        self.0
13724    }
13725    fn lookup(&self, db: &dyn SyntaxGroup) -> AttributeList {
13726        AttributeList::from_syntax_node(db, self.0.lookup(db))
13727    }
13728}
13729impl From<AttributeListPtr> for SyntaxStablePtrId {
13730    fn from(ptr: AttributeListPtr) -> Self {
13731        ptr.untyped()
13732    }
13733}
13734#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
13735pub struct AttributeListGreen(pub GreenId);
13736impl TypedSyntaxNode for AttributeList {
13737    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::AttributeList);
13738    type StablePtr = AttributeListPtr;
13739    type Green = AttributeListGreen;
13740    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
13741        AttributeListGreen(
13742            Arc::new(GreenNode {
13743                kind: SyntaxKind::AttributeList,
13744                details: GreenNodeDetails::Node { children: vec![], width: TextWidth::default() },
13745            })
13746            .intern(db),
13747        )
13748    }
13749    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
13750        Self(ElementList::new(node))
13751    }
13752    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
13753        if node.kind(db) == SyntaxKind::AttributeList {
13754            Some(Self(ElementList::new(node)))
13755        } else {
13756            None
13757        }
13758    }
13759    fn as_syntax_node(&self) -> SyntaxNode {
13760        self.node.clone()
13761    }
13762    fn stable_ptr(&self) -> Self::StablePtr {
13763        AttributeListPtr(self.node.0.stable_ptr)
13764    }
13765}
13766impl From<&AttributeList> for SyntaxStablePtrId {
13767    fn from(node: &AttributeList) -> Self {
13768        node.stable_ptr().untyped()
13769    }
13770}
13771#[derive(Clone, Debug, Eq, Hash, PartialEq)]
13772pub struct VisibilityDefault {
13773    node: SyntaxNode,
13774    children: Arc<[SyntaxNode]>,
13775}
13776impl VisibilityDefault {
13777    pub fn new_green(db: &dyn SyntaxGroup) -> VisibilityDefaultGreen {
13778        let children: Vec<GreenId> = vec![];
13779        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
13780        VisibilityDefaultGreen(
13781            Arc::new(GreenNode {
13782                kind: SyntaxKind::VisibilityDefault,
13783                details: GreenNodeDetails::Node { children, width },
13784            })
13785            .intern(db),
13786        )
13787    }
13788}
13789impl VisibilityDefault {}
13790#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
13791pub struct VisibilityDefaultPtr(pub SyntaxStablePtrId);
13792impl VisibilityDefaultPtr {}
13793impl TypedStablePtr for VisibilityDefaultPtr {
13794    type SyntaxNode = VisibilityDefault;
13795    fn untyped(&self) -> SyntaxStablePtrId {
13796        self.0
13797    }
13798    fn lookup(&self, db: &dyn SyntaxGroup) -> VisibilityDefault {
13799        VisibilityDefault::from_syntax_node(db, self.0.lookup(db))
13800    }
13801}
13802impl From<VisibilityDefaultPtr> for SyntaxStablePtrId {
13803    fn from(ptr: VisibilityDefaultPtr) -> Self {
13804        ptr.untyped()
13805    }
13806}
13807#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
13808pub struct VisibilityDefaultGreen(pub GreenId);
13809impl TypedSyntaxNode for VisibilityDefault {
13810    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::VisibilityDefault);
13811    type StablePtr = VisibilityDefaultPtr;
13812    type Green = VisibilityDefaultGreen;
13813    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
13814        VisibilityDefaultGreen(
13815            Arc::new(GreenNode {
13816                kind: SyntaxKind::VisibilityDefault,
13817                details: GreenNodeDetails::Node { children: vec![], width: TextWidth::default() },
13818            })
13819            .intern(db),
13820        )
13821    }
13822    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
13823        let kind = node.kind(db);
13824        assert_eq!(
13825            kind,
13826            SyntaxKind::VisibilityDefault,
13827            "Unexpected SyntaxKind {:?}. Expected {:?}.",
13828            kind,
13829            SyntaxKind::VisibilityDefault
13830        );
13831        let children = db.get_children(node.clone());
13832        Self { node, children }
13833    }
13834    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
13835        let kind = node.kind(db);
13836        if kind == SyntaxKind::VisibilityDefault {
13837            Some(Self::from_syntax_node(db, node))
13838        } else {
13839            None
13840        }
13841    }
13842    fn as_syntax_node(&self) -> SyntaxNode {
13843        self.node.clone()
13844    }
13845    fn stable_ptr(&self) -> Self::StablePtr {
13846        VisibilityDefaultPtr(self.node.0.stable_ptr)
13847    }
13848}
13849impl From<&VisibilityDefault> for SyntaxStablePtrId {
13850    fn from(node: &VisibilityDefault) -> Self {
13851        node.stable_ptr().untyped()
13852    }
13853}
13854#[derive(Clone, Debug, Eq, Hash, PartialEq)]
13855pub struct VisibilityPubArgumentClause {
13856    node: SyntaxNode,
13857    children: Arc<[SyntaxNode]>,
13858}
13859impl VisibilityPubArgumentClause {
13860    pub const INDEX_LPAREN: usize = 0;
13861    pub const INDEX_ARGUMENT: usize = 1;
13862    pub const INDEX_RPAREN: usize = 2;
13863    pub fn new_green(
13864        db: &dyn SyntaxGroup,
13865        lparen: TerminalLParenGreen,
13866        argument: TerminalIdentifierGreen,
13867        rparen: TerminalRParenGreen,
13868    ) -> VisibilityPubArgumentClauseGreen {
13869        let children: Vec<GreenId> = vec![lparen.0, argument.0, rparen.0];
13870        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
13871        VisibilityPubArgumentClauseGreen(
13872            Arc::new(GreenNode {
13873                kind: SyntaxKind::VisibilityPubArgumentClause,
13874                details: GreenNodeDetails::Node { children, width },
13875            })
13876            .intern(db),
13877        )
13878    }
13879}
13880impl VisibilityPubArgumentClause {
13881    pub fn lparen(&self, db: &dyn SyntaxGroup) -> TerminalLParen {
13882        TerminalLParen::from_syntax_node(db, self.children[0].clone())
13883    }
13884    pub fn argument(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier {
13885        TerminalIdentifier::from_syntax_node(db, self.children[1].clone())
13886    }
13887    pub fn rparen(&self, db: &dyn SyntaxGroup) -> TerminalRParen {
13888        TerminalRParen::from_syntax_node(db, self.children[2].clone())
13889    }
13890}
13891#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
13892pub struct VisibilityPubArgumentClausePtr(pub SyntaxStablePtrId);
13893impl VisibilityPubArgumentClausePtr {}
13894impl TypedStablePtr for VisibilityPubArgumentClausePtr {
13895    type SyntaxNode = VisibilityPubArgumentClause;
13896    fn untyped(&self) -> SyntaxStablePtrId {
13897        self.0
13898    }
13899    fn lookup(&self, db: &dyn SyntaxGroup) -> VisibilityPubArgumentClause {
13900        VisibilityPubArgumentClause::from_syntax_node(db, self.0.lookup(db))
13901    }
13902}
13903impl From<VisibilityPubArgumentClausePtr> for SyntaxStablePtrId {
13904    fn from(ptr: VisibilityPubArgumentClausePtr) -> Self {
13905        ptr.untyped()
13906    }
13907}
13908#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
13909pub struct VisibilityPubArgumentClauseGreen(pub GreenId);
13910impl TypedSyntaxNode for VisibilityPubArgumentClause {
13911    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::VisibilityPubArgumentClause);
13912    type StablePtr = VisibilityPubArgumentClausePtr;
13913    type Green = VisibilityPubArgumentClauseGreen;
13914    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
13915        VisibilityPubArgumentClauseGreen(
13916            Arc::new(GreenNode {
13917                kind: SyntaxKind::VisibilityPubArgumentClause,
13918                details: GreenNodeDetails::Node {
13919                    children: vec![
13920                        TerminalLParen::missing(db).0,
13921                        TerminalIdentifier::missing(db).0,
13922                        TerminalRParen::missing(db).0,
13923                    ],
13924                    width: TextWidth::default(),
13925                },
13926            })
13927            .intern(db),
13928        )
13929    }
13930    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
13931        let kind = node.kind(db);
13932        assert_eq!(
13933            kind,
13934            SyntaxKind::VisibilityPubArgumentClause,
13935            "Unexpected SyntaxKind {:?}. Expected {:?}.",
13936            kind,
13937            SyntaxKind::VisibilityPubArgumentClause
13938        );
13939        let children = db.get_children(node.clone());
13940        Self { node, children }
13941    }
13942    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
13943        let kind = node.kind(db);
13944        if kind == SyntaxKind::VisibilityPubArgumentClause {
13945            Some(Self::from_syntax_node(db, node))
13946        } else {
13947            None
13948        }
13949    }
13950    fn as_syntax_node(&self) -> SyntaxNode {
13951        self.node.clone()
13952    }
13953    fn stable_ptr(&self) -> Self::StablePtr {
13954        VisibilityPubArgumentClausePtr(self.node.0.stable_ptr)
13955    }
13956}
13957impl From<&VisibilityPubArgumentClause> for SyntaxStablePtrId {
13958    fn from(node: &VisibilityPubArgumentClause) -> Self {
13959        node.stable_ptr().untyped()
13960    }
13961}
13962#[derive(Clone, Debug, Eq, Hash, PartialEq)]
13963pub enum OptionVisibilityPubArgumentClause {
13964    Empty(OptionVisibilityPubArgumentClauseEmpty),
13965    VisibilityPubArgumentClause(VisibilityPubArgumentClause),
13966}
13967#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
13968pub struct OptionVisibilityPubArgumentClausePtr(pub SyntaxStablePtrId);
13969impl TypedStablePtr for OptionVisibilityPubArgumentClausePtr {
13970    type SyntaxNode = OptionVisibilityPubArgumentClause;
13971    fn untyped(&self) -> SyntaxStablePtrId {
13972        self.0
13973    }
13974    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionVisibilityPubArgumentClause {
13975        OptionVisibilityPubArgumentClause::from_syntax_node(db, self.0.lookup(db))
13976    }
13977}
13978impl From<OptionVisibilityPubArgumentClausePtr> for SyntaxStablePtrId {
13979    fn from(ptr: OptionVisibilityPubArgumentClausePtr) -> Self {
13980        ptr.untyped()
13981    }
13982}
13983impl From<OptionVisibilityPubArgumentClauseEmptyPtr> for OptionVisibilityPubArgumentClausePtr {
13984    fn from(value: OptionVisibilityPubArgumentClauseEmptyPtr) -> Self {
13985        Self(value.0)
13986    }
13987}
13988impl From<VisibilityPubArgumentClausePtr> for OptionVisibilityPubArgumentClausePtr {
13989    fn from(value: VisibilityPubArgumentClausePtr) -> Self {
13990        Self(value.0)
13991    }
13992}
13993impl From<OptionVisibilityPubArgumentClauseEmptyGreen> for OptionVisibilityPubArgumentClauseGreen {
13994    fn from(value: OptionVisibilityPubArgumentClauseEmptyGreen) -> Self {
13995        Self(value.0)
13996    }
13997}
13998impl From<VisibilityPubArgumentClauseGreen> for OptionVisibilityPubArgumentClauseGreen {
13999    fn from(value: VisibilityPubArgumentClauseGreen) -> Self {
14000        Self(value.0)
14001    }
14002}
14003#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
14004pub struct OptionVisibilityPubArgumentClauseGreen(pub GreenId);
14005impl TypedSyntaxNode for OptionVisibilityPubArgumentClause {
14006    const OPTIONAL_KIND: Option<SyntaxKind> = None;
14007    type StablePtr = OptionVisibilityPubArgumentClausePtr;
14008    type Green = OptionVisibilityPubArgumentClauseGreen;
14009    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
14010        panic!("No missing variant.");
14011    }
14012    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
14013        let kind = node.kind(db);
14014        match kind {
14015            SyntaxKind::OptionVisibilityPubArgumentClauseEmpty => {
14016                OptionVisibilityPubArgumentClause::Empty(
14017                    OptionVisibilityPubArgumentClauseEmpty::from_syntax_node(db, node),
14018                )
14019            }
14020            SyntaxKind::VisibilityPubArgumentClause => {
14021                OptionVisibilityPubArgumentClause::VisibilityPubArgumentClause(
14022                    VisibilityPubArgumentClause::from_syntax_node(db, node),
14023                )
14024            }
14025            _ => panic!(
14026                "Unexpected syntax kind {:?} when constructing {}.",
14027                kind, "OptionVisibilityPubArgumentClause"
14028            ),
14029        }
14030    }
14031    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
14032        let kind = node.kind(db);
14033        match kind {
14034            SyntaxKind::OptionVisibilityPubArgumentClauseEmpty => {
14035                Some(OptionVisibilityPubArgumentClause::Empty(
14036                    OptionVisibilityPubArgumentClauseEmpty::from_syntax_node(db, node),
14037                ))
14038            }
14039            SyntaxKind::VisibilityPubArgumentClause => {
14040                Some(OptionVisibilityPubArgumentClause::VisibilityPubArgumentClause(
14041                    VisibilityPubArgumentClause::from_syntax_node(db, node),
14042                ))
14043            }
14044            _ => None,
14045        }
14046    }
14047    fn as_syntax_node(&self) -> SyntaxNode {
14048        match self {
14049            OptionVisibilityPubArgumentClause::Empty(x) => x.as_syntax_node(),
14050            OptionVisibilityPubArgumentClause::VisibilityPubArgumentClause(x) => x.as_syntax_node(),
14051        }
14052    }
14053    fn stable_ptr(&self) -> Self::StablePtr {
14054        OptionVisibilityPubArgumentClausePtr(self.as_syntax_node().0.stable_ptr)
14055    }
14056}
14057impl From<&OptionVisibilityPubArgumentClause> for SyntaxStablePtrId {
14058    fn from(node: &OptionVisibilityPubArgumentClause) -> Self {
14059        node.stable_ptr().untyped()
14060    }
14061}
14062impl OptionVisibilityPubArgumentClause {
14063    /// Checks if a kind of a variant of [OptionVisibilityPubArgumentClause].
14064    pub fn is_variant(kind: SyntaxKind) -> bool {
14065        matches!(
14066            kind,
14067            SyntaxKind::OptionVisibilityPubArgumentClauseEmpty
14068                | SyntaxKind::VisibilityPubArgumentClause
14069        )
14070    }
14071}
14072#[derive(Clone, Debug, Eq, Hash, PartialEq)]
14073pub struct OptionVisibilityPubArgumentClauseEmpty {
14074    node: SyntaxNode,
14075    children: Arc<[SyntaxNode]>,
14076}
14077impl OptionVisibilityPubArgumentClauseEmpty {
14078    pub fn new_green(db: &dyn SyntaxGroup) -> OptionVisibilityPubArgumentClauseEmptyGreen {
14079        let children: Vec<GreenId> = vec![];
14080        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
14081        OptionVisibilityPubArgumentClauseEmptyGreen(
14082            Arc::new(GreenNode {
14083                kind: SyntaxKind::OptionVisibilityPubArgumentClauseEmpty,
14084                details: GreenNodeDetails::Node { children, width },
14085            })
14086            .intern(db),
14087        )
14088    }
14089}
14090impl OptionVisibilityPubArgumentClauseEmpty {}
14091#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
14092pub struct OptionVisibilityPubArgumentClauseEmptyPtr(pub SyntaxStablePtrId);
14093impl OptionVisibilityPubArgumentClauseEmptyPtr {}
14094impl TypedStablePtr for OptionVisibilityPubArgumentClauseEmptyPtr {
14095    type SyntaxNode = OptionVisibilityPubArgumentClauseEmpty;
14096    fn untyped(&self) -> SyntaxStablePtrId {
14097        self.0
14098    }
14099    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionVisibilityPubArgumentClauseEmpty {
14100        OptionVisibilityPubArgumentClauseEmpty::from_syntax_node(db, self.0.lookup(db))
14101    }
14102}
14103impl From<OptionVisibilityPubArgumentClauseEmptyPtr> for SyntaxStablePtrId {
14104    fn from(ptr: OptionVisibilityPubArgumentClauseEmptyPtr) -> Self {
14105        ptr.untyped()
14106    }
14107}
14108#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
14109pub struct OptionVisibilityPubArgumentClauseEmptyGreen(pub GreenId);
14110impl TypedSyntaxNode for OptionVisibilityPubArgumentClauseEmpty {
14111    const OPTIONAL_KIND: Option<SyntaxKind> =
14112        Some(SyntaxKind::OptionVisibilityPubArgumentClauseEmpty);
14113    type StablePtr = OptionVisibilityPubArgumentClauseEmptyPtr;
14114    type Green = OptionVisibilityPubArgumentClauseEmptyGreen;
14115    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
14116        OptionVisibilityPubArgumentClauseEmptyGreen(
14117            Arc::new(GreenNode {
14118                kind: SyntaxKind::OptionVisibilityPubArgumentClauseEmpty,
14119                details: GreenNodeDetails::Node { children: vec![], width: TextWidth::default() },
14120            })
14121            .intern(db),
14122        )
14123    }
14124    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
14125        let kind = node.kind(db);
14126        assert_eq!(
14127            kind,
14128            SyntaxKind::OptionVisibilityPubArgumentClauseEmpty,
14129            "Unexpected SyntaxKind {:?}. Expected {:?}.",
14130            kind,
14131            SyntaxKind::OptionVisibilityPubArgumentClauseEmpty
14132        );
14133        let children = db.get_children(node.clone());
14134        Self { node, children }
14135    }
14136    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
14137        let kind = node.kind(db);
14138        if kind == SyntaxKind::OptionVisibilityPubArgumentClauseEmpty {
14139            Some(Self::from_syntax_node(db, node))
14140        } else {
14141            None
14142        }
14143    }
14144    fn as_syntax_node(&self) -> SyntaxNode {
14145        self.node.clone()
14146    }
14147    fn stable_ptr(&self) -> Self::StablePtr {
14148        OptionVisibilityPubArgumentClauseEmptyPtr(self.node.0.stable_ptr)
14149    }
14150}
14151impl From<&OptionVisibilityPubArgumentClauseEmpty> for SyntaxStablePtrId {
14152    fn from(node: &OptionVisibilityPubArgumentClauseEmpty) -> Self {
14153        node.stable_ptr().untyped()
14154    }
14155}
14156#[derive(Clone, Debug, Eq, Hash, PartialEq)]
14157pub struct VisibilityPub {
14158    node: SyntaxNode,
14159    children: Arc<[SyntaxNode]>,
14160}
14161impl VisibilityPub {
14162    pub const INDEX_PUB_KW: usize = 0;
14163    pub const INDEX_ARGUMENT_CLAUSE: usize = 1;
14164    pub fn new_green(
14165        db: &dyn SyntaxGroup,
14166        pub_kw: TerminalPubGreen,
14167        argument_clause: OptionVisibilityPubArgumentClauseGreen,
14168    ) -> VisibilityPubGreen {
14169        let children: Vec<GreenId> = vec![pub_kw.0, argument_clause.0];
14170        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
14171        VisibilityPubGreen(
14172            Arc::new(GreenNode {
14173                kind: SyntaxKind::VisibilityPub,
14174                details: GreenNodeDetails::Node { children, width },
14175            })
14176            .intern(db),
14177        )
14178    }
14179}
14180impl VisibilityPub {
14181    pub fn pub_kw(&self, db: &dyn SyntaxGroup) -> TerminalPub {
14182        TerminalPub::from_syntax_node(db, self.children[0].clone())
14183    }
14184    pub fn argument_clause(&self, db: &dyn SyntaxGroup) -> OptionVisibilityPubArgumentClause {
14185        OptionVisibilityPubArgumentClause::from_syntax_node(db, self.children[1].clone())
14186    }
14187}
14188#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
14189pub struct VisibilityPubPtr(pub SyntaxStablePtrId);
14190impl VisibilityPubPtr {}
14191impl TypedStablePtr for VisibilityPubPtr {
14192    type SyntaxNode = VisibilityPub;
14193    fn untyped(&self) -> SyntaxStablePtrId {
14194        self.0
14195    }
14196    fn lookup(&self, db: &dyn SyntaxGroup) -> VisibilityPub {
14197        VisibilityPub::from_syntax_node(db, self.0.lookup(db))
14198    }
14199}
14200impl From<VisibilityPubPtr> for SyntaxStablePtrId {
14201    fn from(ptr: VisibilityPubPtr) -> Self {
14202        ptr.untyped()
14203    }
14204}
14205#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
14206pub struct VisibilityPubGreen(pub GreenId);
14207impl TypedSyntaxNode for VisibilityPub {
14208    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::VisibilityPub);
14209    type StablePtr = VisibilityPubPtr;
14210    type Green = VisibilityPubGreen;
14211    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
14212        VisibilityPubGreen(
14213            Arc::new(GreenNode {
14214                kind: SyntaxKind::VisibilityPub,
14215                details: GreenNodeDetails::Node {
14216                    children: vec![
14217                        TerminalPub::missing(db).0,
14218                        OptionVisibilityPubArgumentClause::missing(db).0,
14219                    ],
14220                    width: TextWidth::default(),
14221                },
14222            })
14223            .intern(db),
14224        )
14225    }
14226    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
14227        let kind = node.kind(db);
14228        assert_eq!(
14229            kind,
14230            SyntaxKind::VisibilityPub,
14231            "Unexpected SyntaxKind {:?}. Expected {:?}.",
14232            kind,
14233            SyntaxKind::VisibilityPub
14234        );
14235        let children = db.get_children(node.clone());
14236        Self { node, children }
14237    }
14238    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
14239        let kind = node.kind(db);
14240        if kind == SyntaxKind::VisibilityPub {
14241            Some(Self::from_syntax_node(db, node))
14242        } else {
14243            None
14244        }
14245    }
14246    fn as_syntax_node(&self) -> SyntaxNode {
14247        self.node.clone()
14248    }
14249    fn stable_ptr(&self) -> Self::StablePtr {
14250        VisibilityPubPtr(self.node.0.stable_ptr)
14251    }
14252}
14253impl From<&VisibilityPub> for SyntaxStablePtrId {
14254    fn from(node: &VisibilityPub) -> Self {
14255        node.stable_ptr().untyped()
14256    }
14257}
14258#[derive(Clone, Debug, Eq, Hash, PartialEq)]
14259pub enum Visibility {
14260    Default(VisibilityDefault),
14261    Pub(VisibilityPub),
14262}
14263#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
14264pub struct VisibilityPtr(pub SyntaxStablePtrId);
14265impl TypedStablePtr for VisibilityPtr {
14266    type SyntaxNode = Visibility;
14267    fn untyped(&self) -> SyntaxStablePtrId {
14268        self.0
14269    }
14270    fn lookup(&self, db: &dyn SyntaxGroup) -> Visibility {
14271        Visibility::from_syntax_node(db, self.0.lookup(db))
14272    }
14273}
14274impl From<VisibilityPtr> for SyntaxStablePtrId {
14275    fn from(ptr: VisibilityPtr) -> Self {
14276        ptr.untyped()
14277    }
14278}
14279impl From<VisibilityDefaultPtr> for VisibilityPtr {
14280    fn from(value: VisibilityDefaultPtr) -> Self {
14281        Self(value.0)
14282    }
14283}
14284impl From<VisibilityPubPtr> for VisibilityPtr {
14285    fn from(value: VisibilityPubPtr) -> Self {
14286        Self(value.0)
14287    }
14288}
14289impl From<VisibilityDefaultGreen> for VisibilityGreen {
14290    fn from(value: VisibilityDefaultGreen) -> Self {
14291        Self(value.0)
14292    }
14293}
14294impl From<VisibilityPubGreen> for VisibilityGreen {
14295    fn from(value: VisibilityPubGreen) -> Self {
14296        Self(value.0)
14297    }
14298}
14299#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
14300pub struct VisibilityGreen(pub GreenId);
14301impl TypedSyntaxNode for Visibility {
14302    const OPTIONAL_KIND: Option<SyntaxKind> = None;
14303    type StablePtr = VisibilityPtr;
14304    type Green = VisibilityGreen;
14305    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
14306        panic!("No missing variant.");
14307    }
14308    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
14309        let kind = node.kind(db);
14310        match kind {
14311            SyntaxKind::VisibilityDefault => {
14312                Visibility::Default(VisibilityDefault::from_syntax_node(db, node))
14313            }
14314            SyntaxKind::VisibilityPub => Visibility::Pub(VisibilityPub::from_syntax_node(db, node)),
14315            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "Visibility"),
14316        }
14317    }
14318    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
14319        let kind = node.kind(db);
14320        match kind {
14321            SyntaxKind::VisibilityDefault => {
14322                Some(Visibility::Default(VisibilityDefault::from_syntax_node(db, node)))
14323            }
14324            SyntaxKind::VisibilityPub => {
14325                Some(Visibility::Pub(VisibilityPub::from_syntax_node(db, node)))
14326            }
14327            _ => None,
14328        }
14329    }
14330    fn as_syntax_node(&self) -> SyntaxNode {
14331        match self {
14332            Visibility::Default(x) => x.as_syntax_node(),
14333            Visibility::Pub(x) => x.as_syntax_node(),
14334        }
14335    }
14336    fn stable_ptr(&self) -> Self::StablePtr {
14337        VisibilityPtr(self.as_syntax_node().0.stable_ptr)
14338    }
14339}
14340impl From<&Visibility> for SyntaxStablePtrId {
14341    fn from(node: &Visibility) -> Self {
14342        node.stable_ptr().untyped()
14343    }
14344}
14345impl Visibility {
14346    /// Checks if a kind of a variant of [Visibility].
14347    pub fn is_variant(kind: SyntaxKind) -> bool {
14348        matches!(kind, SyntaxKind::VisibilityDefault | SyntaxKind::VisibilityPub)
14349    }
14350}
14351#[derive(Clone, Debug, Eq, Hash, PartialEq)]
14352pub struct ItemModule {
14353    node: SyntaxNode,
14354    children: Arc<[SyntaxNode]>,
14355}
14356impl ItemModule {
14357    pub const INDEX_ATTRIBUTES: usize = 0;
14358    pub const INDEX_VISIBILITY: usize = 1;
14359    pub const INDEX_MODULE_KW: usize = 2;
14360    pub const INDEX_NAME: usize = 3;
14361    pub const INDEX_BODY: usize = 4;
14362    pub fn new_green(
14363        db: &dyn SyntaxGroup,
14364        attributes: AttributeListGreen,
14365        visibility: VisibilityGreen,
14366        module_kw: TerminalModuleGreen,
14367        name: TerminalIdentifierGreen,
14368        body: MaybeModuleBodyGreen,
14369    ) -> ItemModuleGreen {
14370        let children: Vec<GreenId> = vec![attributes.0, visibility.0, module_kw.0, name.0, body.0];
14371        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
14372        ItemModuleGreen(
14373            Arc::new(GreenNode {
14374                kind: SyntaxKind::ItemModule,
14375                details: GreenNodeDetails::Node { children, width },
14376            })
14377            .intern(db),
14378        )
14379    }
14380}
14381impl ItemModule {
14382    pub fn attributes(&self, db: &dyn SyntaxGroup) -> AttributeList {
14383        AttributeList::from_syntax_node(db, self.children[0].clone())
14384    }
14385    pub fn visibility(&self, db: &dyn SyntaxGroup) -> Visibility {
14386        Visibility::from_syntax_node(db, self.children[1].clone())
14387    }
14388    pub fn module_kw(&self, db: &dyn SyntaxGroup) -> TerminalModule {
14389        TerminalModule::from_syntax_node(db, self.children[2].clone())
14390    }
14391    pub fn name(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier {
14392        TerminalIdentifier::from_syntax_node(db, self.children[3].clone())
14393    }
14394    pub fn body(&self, db: &dyn SyntaxGroup) -> MaybeModuleBody {
14395        MaybeModuleBody::from_syntax_node(db, self.children[4].clone())
14396    }
14397}
14398#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
14399pub struct ItemModulePtr(pub SyntaxStablePtrId);
14400impl ItemModulePtr {
14401    pub fn name_green(self, db: &dyn SyntaxGroup) -> TerminalIdentifierGreen {
14402        let ptr = self.0.lookup_intern(db);
14403        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
14404            TerminalIdentifierGreen(key_fields[0])
14405        } else {
14406            panic!("Unexpected key field query on root.");
14407        }
14408    }
14409}
14410impl TypedStablePtr for ItemModulePtr {
14411    type SyntaxNode = ItemModule;
14412    fn untyped(&self) -> SyntaxStablePtrId {
14413        self.0
14414    }
14415    fn lookup(&self, db: &dyn SyntaxGroup) -> ItemModule {
14416        ItemModule::from_syntax_node(db, self.0.lookup(db))
14417    }
14418}
14419impl From<ItemModulePtr> for SyntaxStablePtrId {
14420    fn from(ptr: ItemModulePtr) -> Self {
14421        ptr.untyped()
14422    }
14423}
14424#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
14425pub struct ItemModuleGreen(pub GreenId);
14426impl TypedSyntaxNode for ItemModule {
14427    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemModule);
14428    type StablePtr = ItemModulePtr;
14429    type Green = ItemModuleGreen;
14430    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
14431        ItemModuleGreen(
14432            Arc::new(GreenNode {
14433                kind: SyntaxKind::ItemModule,
14434                details: GreenNodeDetails::Node {
14435                    children: vec![
14436                        AttributeList::missing(db).0,
14437                        Visibility::missing(db).0,
14438                        TerminalModule::missing(db).0,
14439                        TerminalIdentifier::missing(db).0,
14440                        MaybeModuleBody::missing(db).0,
14441                    ],
14442                    width: TextWidth::default(),
14443                },
14444            })
14445            .intern(db),
14446        )
14447    }
14448    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
14449        let kind = node.kind(db);
14450        assert_eq!(
14451            kind,
14452            SyntaxKind::ItemModule,
14453            "Unexpected SyntaxKind {:?}. Expected {:?}.",
14454            kind,
14455            SyntaxKind::ItemModule
14456        );
14457        let children = db.get_children(node.clone());
14458        Self { node, children }
14459    }
14460    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
14461        let kind = node.kind(db);
14462        if kind == SyntaxKind::ItemModule { Some(Self::from_syntax_node(db, node)) } else { None }
14463    }
14464    fn as_syntax_node(&self) -> SyntaxNode {
14465        self.node.clone()
14466    }
14467    fn stable_ptr(&self) -> Self::StablePtr {
14468        ItemModulePtr(self.node.0.stable_ptr)
14469    }
14470}
14471impl From<&ItemModule> for SyntaxStablePtrId {
14472    fn from(node: &ItemModule) -> Self {
14473        node.stable_ptr().untyped()
14474    }
14475}
14476#[derive(Clone, Debug, Eq, Hash, PartialEq)]
14477pub enum MaybeModuleBody {
14478    Some(ModuleBody),
14479    None(TerminalSemicolon),
14480}
14481#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
14482pub struct MaybeModuleBodyPtr(pub SyntaxStablePtrId);
14483impl TypedStablePtr for MaybeModuleBodyPtr {
14484    type SyntaxNode = MaybeModuleBody;
14485    fn untyped(&self) -> SyntaxStablePtrId {
14486        self.0
14487    }
14488    fn lookup(&self, db: &dyn SyntaxGroup) -> MaybeModuleBody {
14489        MaybeModuleBody::from_syntax_node(db, self.0.lookup(db))
14490    }
14491}
14492impl From<MaybeModuleBodyPtr> for SyntaxStablePtrId {
14493    fn from(ptr: MaybeModuleBodyPtr) -> Self {
14494        ptr.untyped()
14495    }
14496}
14497impl From<ModuleBodyPtr> for MaybeModuleBodyPtr {
14498    fn from(value: ModuleBodyPtr) -> Self {
14499        Self(value.0)
14500    }
14501}
14502impl From<TerminalSemicolonPtr> for MaybeModuleBodyPtr {
14503    fn from(value: TerminalSemicolonPtr) -> Self {
14504        Self(value.0)
14505    }
14506}
14507impl From<ModuleBodyGreen> for MaybeModuleBodyGreen {
14508    fn from(value: ModuleBodyGreen) -> Self {
14509        Self(value.0)
14510    }
14511}
14512impl From<TerminalSemicolonGreen> for MaybeModuleBodyGreen {
14513    fn from(value: TerminalSemicolonGreen) -> Self {
14514        Self(value.0)
14515    }
14516}
14517#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
14518pub struct MaybeModuleBodyGreen(pub GreenId);
14519impl TypedSyntaxNode for MaybeModuleBody {
14520    const OPTIONAL_KIND: Option<SyntaxKind> = None;
14521    type StablePtr = MaybeModuleBodyPtr;
14522    type Green = MaybeModuleBodyGreen;
14523    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
14524        panic!("No missing variant.");
14525    }
14526    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
14527        let kind = node.kind(db);
14528        match kind {
14529            SyntaxKind::ModuleBody => MaybeModuleBody::Some(ModuleBody::from_syntax_node(db, node)),
14530            SyntaxKind::TerminalSemicolon => {
14531                MaybeModuleBody::None(TerminalSemicolon::from_syntax_node(db, node))
14532            }
14533            _ => {
14534                panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "MaybeModuleBody")
14535            }
14536        }
14537    }
14538    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
14539        let kind = node.kind(db);
14540        match kind {
14541            SyntaxKind::ModuleBody => {
14542                Some(MaybeModuleBody::Some(ModuleBody::from_syntax_node(db, node)))
14543            }
14544            SyntaxKind::TerminalSemicolon => {
14545                Some(MaybeModuleBody::None(TerminalSemicolon::from_syntax_node(db, node)))
14546            }
14547            _ => None,
14548        }
14549    }
14550    fn as_syntax_node(&self) -> SyntaxNode {
14551        match self {
14552            MaybeModuleBody::Some(x) => x.as_syntax_node(),
14553            MaybeModuleBody::None(x) => x.as_syntax_node(),
14554        }
14555    }
14556    fn stable_ptr(&self) -> Self::StablePtr {
14557        MaybeModuleBodyPtr(self.as_syntax_node().0.stable_ptr)
14558    }
14559}
14560impl From<&MaybeModuleBody> for SyntaxStablePtrId {
14561    fn from(node: &MaybeModuleBody) -> Self {
14562        node.stable_ptr().untyped()
14563    }
14564}
14565impl MaybeModuleBody {
14566    /// Checks if a kind of a variant of [MaybeModuleBody].
14567    pub fn is_variant(kind: SyntaxKind) -> bool {
14568        matches!(kind, SyntaxKind::ModuleBody | SyntaxKind::TerminalSemicolon)
14569    }
14570}
14571#[derive(Clone, Debug, Eq, Hash, PartialEq)]
14572pub struct ModuleBody {
14573    node: SyntaxNode,
14574    children: Arc<[SyntaxNode]>,
14575}
14576impl ModuleBody {
14577    pub const INDEX_LBRACE: usize = 0;
14578    pub const INDEX_ITEMS: usize = 1;
14579    pub const INDEX_RBRACE: usize = 2;
14580    pub fn new_green(
14581        db: &dyn SyntaxGroup,
14582        lbrace: TerminalLBraceGreen,
14583        items: ModuleItemListGreen,
14584        rbrace: TerminalRBraceGreen,
14585    ) -> ModuleBodyGreen {
14586        let children: Vec<GreenId> = vec![lbrace.0, items.0, rbrace.0];
14587        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
14588        ModuleBodyGreen(
14589            Arc::new(GreenNode {
14590                kind: SyntaxKind::ModuleBody,
14591                details: GreenNodeDetails::Node { children, width },
14592            })
14593            .intern(db),
14594        )
14595    }
14596}
14597impl ModuleBody {
14598    pub fn lbrace(&self, db: &dyn SyntaxGroup) -> TerminalLBrace {
14599        TerminalLBrace::from_syntax_node(db, self.children[0].clone())
14600    }
14601    pub fn items(&self, db: &dyn SyntaxGroup) -> ModuleItemList {
14602        ModuleItemList::from_syntax_node(db, self.children[1].clone())
14603    }
14604    pub fn rbrace(&self, db: &dyn SyntaxGroup) -> TerminalRBrace {
14605        TerminalRBrace::from_syntax_node(db, self.children[2].clone())
14606    }
14607}
14608#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
14609pub struct ModuleBodyPtr(pub SyntaxStablePtrId);
14610impl ModuleBodyPtr {}
14611impl TypedStablePtr for ModuleBodyPtr {
14612    type SyntaxNode = ModuleBody;
14613    fn untyped(&self) -> SyntaxStablePtrId {
14614        self.0
14615    }
14616    fn lookup(&self, db: &dyn SyntaxGroup) -> ModuleBody {
14617        ModuleBody::from_syntax_node(db, self.0.lookup(db))
14618    }
14619}
14620impl From<ModuleBodyPtr> for SyntaxStablePtrId {
14621    fn from(ptr: ModuleBodyPtr) -> Self {
14622        ptr.untyped()
14623    }
14624}
14625#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
14626pub struct ModuleBodyGreen(pub GreenId);
14627impl TypedSyntaxNode for ModuleBody {
14628    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ModuleBody);
14629    type StablePtr = ModuleBodyPtr;
14630    type Green = ModuleBodyGreen;
14631    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
14632        ModuleBodyGreen(
14633            Arc::new(GreenNode {
14634                kind: SyntaxKind::ModuleBody,
14635                details: GreenNodeDetails::Node {
14636                    children: vec![
14637                        TerminalLBrace::missing(db).0,
14638                        ModuleItemList::missing(db).0,
14639                        TerminalRBrace::missing(db).0,
14640                    ],
14641                    width: TextWidth::default(),
14642                },
14643            })
14644            .intern(db),
14645        )
14646    }
14647    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
14648        let kind = node.kind(db);
14649        assert_eq!(
14650            kind,
14651            SyntaxKind::ModuleBody,
14652            "Unexpected SyntaxKind {:?}. Expected {:?}.",
14653            kind,
14654            SyntaxKind::ModuleBody
14655        );
14656        let children = db.get_children(node.clone());
14657        Self { node, children }
14658    }
14659    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
14660        let kind = node.kind(db);
14661        if kind == SyntaxKind::ModuleBody { Some(Self::from_syntax_node(db, node)) } else { None }
14662    }
14663    fn as_syntax_node(&self) -> SyntaxNode {
14664        self.node.clone()
14665    }
14666    fn stable_ptr(&self) -> Self::StablePtr {
14667        ModuleBodyPtr(self.node.0.stable_ptr)
14668    }
14669}
14670impl From<&ModuleBody> for SyntaxStablePtrId {
14671    fn from(node: &ModuleBody) -> Self {
14672        node.stable_ptr().untyped()
14673    }
14674}
14675#[derive(Clone, Debug, Eq, Hash, PartialEq)]
14676pub struct FunctionDeclaration {
14677    node: SyntaxNode,
14678    children: Arc<[SyntaxNode]>,
14679}
14680impl FunctionDeclaration {
14681    pub const INDEX_OPTIONAL_CONST: usize = 0;
14682    pub const INDEX_FUNCTION_KW: usize = 1;
14683    pub const INDEX_NAME: usize = 2;
14684    pub const INDEX_GENERIC_PARAMS: usize = 3;
14685    pub const INDEX_SIGNATURE: usize = 4;
14686    pub fn new_green(
14687        db: &dyn SyntaxGroup,
14688        optional_const: OptionTerminalConstGreen,
14689        function_kw: TerminalFunctionGreen,
14690        name: TerminalIdentifierGreen,
14691        generic_params: OptionWrappedGenericParamListGreen,
14692        signature: FunctionSignatureGreen,
14693    ) -> FunctionDeclarationGreen {
14694        let children: Vec<GreenId> =
14695            vec![optional_const.0, function_kw.0, name.0, generic_params.0, signature.0];
14696        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
14697        FunctionDeclarationGreen(
14698            Arc::new(GreenNode {
14699                kind: SyntaxKind::FunctionDeclaration,
14700                details: GreenNodeDetails::Node { children, width },
14701            })
14702            .intern(db),
14703        )
14704    }
14705}
14706impl FunctionDeclaration {
14707    pub fn optional_const(&self, db: &dyn SyntaxGroup) -> OptionTerminalConst {
14708        OptionTerminalConst::from_syntax_node(db, self.children[0].clone())
14709    }
14710    pub fn function_kw(&self, db: &dyn SyntaxGroup) -> TerminalFunction {
14711        TerminalFunction::from_syntax_node(db, self.children[1].clone())
14712    }
14713    pub fn name(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier {
14714        TerminalIdentifier::from_syntax_node(db, self.children[2].clone())
14715    }
14716    pub fn generic_params(&self, db: &dyn SyntaxGroup) -> OptionWrappedGenericParamList {
14717        OptionWrappedGenericParamList::from_syntax_node(db, self.children[3].clone())
14718    }
14719    pub fn signature(&self, db: &dyn SyntaxGroup) -> FunctionSignature {
14720        FunctionSignature::from_syntax_node(db, self.children[4].clone())
14721    }
14722}
14723#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
14724pub struct FunctionDeclarationPtr(pub SyntaxStablePtrId);
14725impl FunctionDeclarationPtr {
14726    pub fn name_green(self, db: &dyn SyntaxGroup) -> TerminalIdentifierGreen {
14727        let ptr = self.0.lookup_intern(db);
14728        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
14729            TerminalIdentifierGreen(key_fields[0])
14730        } else {
14731            panic!("Unexpected key field query on root.");
14732        }
14733    }
14734}
14735impl TypedStablePtr for FunctionDeclarationPtr {
14736    type SyntaxNode = FunctionDeclaration;
14737    fn untyped(&self) -> SyntaxStablePtrId {
14738        self.0
14739    }
14740    fn lookup(&self, db: &dyn SyntaxGroup) -> FunctionDeclaration {
14741        FunctionDeclaration::from_syntax_node(db, self.0.lookup(db))
14742    }
14743}
14744impl From<FunctionDeclarationPtr> for SyntaxStablePtrId {
14745    fn from(ptr: FunctionDeclarationPtr) -> Self {
14746        ptr.untyped()
14747    }
14748}
14749#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
14750pub struct FunctionDeclarationGreen(pub GreenId);
14751impl TypedSyntaxNode for FunctionDeclaration {
14752    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::FunctionDeclaration);
14753    type StablePtr = FunctionDeclarationPtr;
14754    type Green = FunctionDeclarationGreen;
14755    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
14756        FunctionDeclarationGreen(
14757            Arc::new(GreenNode {
14758                kind: SyntaxKind::FunctionDeclaration,
14759                details: GreenNodeDetails::Node {
14760                    children: vec![
14761                        OptionTerminalConst::missing(db).0,
14762                        TerminalFunction::missing(db).0,
14763                        TerminalIdentifier::missing(db).0,
14764                        OptionWrappedGenericParamList::missing(db).0,
14765                        FunctionSignature::missing(db).0,
14766                    ],
14767                    width: TextWidth::default(),
14768                },
14769            })
14770            .intern(db),
14771        )
14772    }
14773    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
14774        let kind = node.kind(db);
14775        assert_eq!(
14776            kind,
14777            SyntaxKind::FunctionDeclaration,
14778            "Unexpected SyntaxKind {:?}. Expected {:?}.",
14779            kind,
14780            SyntaxKind::FunctionDeclaration
14781        );
14782        let children = db.get_children(node.clone());
14783        Self { node, children }
14784    }
14785    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
14786        let kind = node.kind(db);
14787        if kind == SyntaxKind::FunctionDeclaration {
14788            Some(Self::from_syntax_node(db, node))
14789        } else {
14790            None
14791        }
14792    }
14793    fn as_syntax_node(&self) -> SyntaxNode {
14794        self.node.clone()
14795    }
14796    fn stable_ptr(&self) -> Self::StablePtr {
14797        FunctionDeclarationPtr(self.node.0.stable_ptr)
14798    }
14799}
14800impl From<&FunctionDeclaration> for SyntaxStablePtrId {
14801    fn from(node: &FunctionDeclaration) -> Self {
14802        node.stable_ptr().untyped()
14803    }
14804}
14805#[derive(Clone, Debug, Eq, Hash, PartialEq)]
14806pub struct ItemConstant {
14807    node: SyntaxNode,
14808    children: Arc<[SyntaxNode]>,
14809}
14810impl ItemConstant {
14811    pub const INDEX_ATTRIBUTES: usize = 0;
14812    pub const INDEX_VISIBILITY: usize = 1;
14813    pub const INDEX_CONST_KW: usize = 2;
14814    pub const INDEX_NAME: usize = 3;
14815    pub const INDEX_TYPE_CLAUSE: usize = 4;
14816    pub const INDEX_EQ: usize = 5;
14817    pub const INDEX_VALUE: usize = 6;
14818    pub const INDEX_SEMICOLON: usize = 7;
14819    pub fn new_green(
14820        db: &dyn SyntaxGroup,
14821        attributes: AttributeListGreen,
14822        visibility: VisibilityGreen,
14823        const_kw: TerminalConstGreen,
14824        name: TerminalIdentifierGreen,
14825        type_clause: TypeClauseGreen,
14826        eq: TerminalEqGreen,
14827        value: ExprGreen,
14828        semicolon: TerminalSemicolonGreen,
14829    ) -> ItemConstantGreen {
14830        let children: Vec<GreenId> = vec![
14831            attributes.0,
14832            visibility.0,
14833            const_kw.0,
14834            name.0,
14835            type_clause.0,
14836            eq.0,
14837            value.0,
14838            semicolon.0,
14839        ];
14840        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
14841        ItemConstantGreen(
14842            Arc::new(GreenNode {
14843                kind: SyntaxKind::ItemConstant,
14844                details: GreenNodeDetails::Node { children, width },
14845            })
14846            .intern(db),
14847        )
14848    }
14849}
14850impl ItemConstant {
14851    pub fn attributes(&self, db: &dyn SyntaxGroup) -> AttributeList {
14852        AttributeList::from_syntax_node(db, self.children[0].clone())
14853    }
14854    pub fn visibility(&self, db: &dyn SyntaxGroup) -> Visibility {
14855        Visibility::from_syntax_node(db, self.children[1].clone())
14856    }
14857    pub fn const_kw(&self, db: &dyn SyntaxGroup) -> TerminalConst {
14858        TerminalConst::from_syntax_node(db, self.children[2].clone())
14859    }
14860    pub fn name(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier {
14861        TerminalIdentifier::from_syntax_node(db, self.children[3].clone())
14862    }
14863    pub fn type_clause(&self, db: &dyn SyntaxGroup) -> TypeClause {
14864        TypeClause::from_syntax_node(db, self.children[4].clone())
14865    }
14866    pub fn eq(&self, db: &dyn SyntaxGroup) -> TerminalEq {
14867        TerminalEq::from_syntax_node(db, self.children[5].clone())
14868    }
14869    pub fn value(&self, db: &dyn SyntaxGroup) -> Expr {
14870        Expr::from_syntax_node(db, self.children[6].clone())
14871    }
14872    pub fn semicolon(&self, db: &dyn SyntaxGroup) -> TerminalSemicolon {
14873        TerminalSemicolon::from_syntax_node(db, self.children[7].clone())
14874    }
14875}
14876#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
14877pub struct ItemConstantPtr(pub SyntaxStablePtrId);
14878impl ItemConstantPtr {
14879    pub fn name_green(self, db: &dyn SyntaxGroup) -> TerminalIdentifierGreen {
14880        let ptr = self.0.lookup_intern(db);
14881        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
14882            TerminalIdentifierGreen(key_fields[0])
14883        } else {
14884            panic!("Unexpected key field query on root.");
14885        }
14886    }
14887}
14888impl TypedStablePtr for ItemConstantPtr {
14889    type SyntaxNode = ItemConstant;
14890    fn untyped(&self) -> SyntaxStablePtrId {
14891        self.0
14892    }
14893    fn lookup(&self, db: &dyn SyntaxGroup) -> ItemConstant {
14894        ItemConstant::from_syntax_node(db, self.0.lookup(db))
14895    }
14896}
14897impl From<ItemConstantPtr> for SyntaxStablePtrId {
14898    fn from(ptr: ItemConstantPtr) -> Self {
14899        ptr.untyped()
14900    }
14901}
14902#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
14903pub struct ItemConstantGreen(pub GreenId);
14904impl TypedSyntaxNode for ItemConstant {
14905    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemConstant);
14906    type StablePtr = ItemConstantPtr;
14907    type Green = ItemConstantGreen;
14908    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
14909        ItemConstantGreen(
14910            Arc::new(GreenNode {
14911                kind: SyntaxKind::ItemConstant,
14912                details: GreenNodeDetails::Node {
14913                    children: vec![
14914                        AttributeList::missing(db).0,
14915                        Visibility::missing(db).0,
14916                        TerminalConst::missing(db).0,
14917                        TerminalIdentifier::missing(db).0,
14918                        TypeClause::missing(db).0,
14919                        TerminalEq::missing(db).0,
14920                        Expr::missing(db).0,
14921                        TerminalSemicolon::missing(db).0,
14922                    ],
14923                    width: TextWidth::default(),
14924                },
14925            })
14926            .intern(db),
14927        )
14928    }
14929    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
14930        let kind = node.kind(db);
14931        assert_eq!(
14932            kind,
14933            SyntaxKind::ItemConstant,
14934            "Unexpected SyntaxKind {:?}. Expected {:?}.",
14935            kind,
14936            SyntaxKind::ItemConstant
14937        );
14938        let children = db.get_children(node.clone());
14939        Self { node, children }
14940    }
14941    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
14942        let kind = node.kind(db);
14943        if kind == SyntaxKind::ItemConstant { Some(Self::from_syntax_node(db, node)) } else { None }
14944    }
14945    fn as_syntax_node(&self) -> SyntaxNode {
14946        self.node.clone()
14947    }
14948    fn stable_ptr(&self) -> Self::StablePtr {
14949        ItemConstantPtr(self.node.0.stable_ptr)
14950    }
14951}
14952impl From<&ItemConstant> for SyntaxStablePtrId {
14953    fn from(node: &ItemConstant) -> Self {
14954        node.stable_ptr().untyped()
14955    }
14956}
14957#[derive(Clone, Debug, Eq, Hash, PartialEq)]
14958pub struct FunctionWithBody {
14959    node: SyntaxNode,
14960    children: Arc<[SyntaxNode]>,
14961}
14962impl FunctionWithBody {
14963    pub const INDEX_ATTRIBUTES: usize = 0;
14964    pub const INDEX_VISIBILITY: usize = 1;
14965    pub const INDEX_DECLARATION: usize = 2;
14966    pub const INDEX_BODY: usize = 3;
14967    pub fn new_green(
14968        db: &dyn SyntaxGroup,
14969        attributes: AttributeListGreen,
14970        visibility: VisibilityGreen,
14971        declaration: FunctionDeclarationGreen,
14972        body: ExprBlockGreen,
14973    ) -> FunctionWithBodyGreen {
14974        let children: Vec<GreenId> = vec![attributes.0, visibility.0, declaration.0, body.0];
14975        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
14976        FunctionWithBodyGreen(
14977            Arc::new(GreenNode {
14978                kind: SyntaxKind::FunctionWithBody,
14979                details: GreenNodeDetails::Node { children, width },
14980            })
14981            .intern(db),
14982        )
14983    }
14984}
14985impl FunctionWithBody {
14986    pub fn attributes(&self, db: &dyn SyntaxGroup) -> AttributeList {
14987        AttributeList::from_syntax_node(db, self.children[0].clone())
14988    }
14989    pub fn visibility(&self, db: &dyn SyntaxGroup) -> Visibility {
14990        Visibility::from_syntax_node(db, self.children[1].clone())
14991    }
14992    pub fn declaration(&self, db: &dyn SyntaxGroup) -> FunctionDeclaration {
14993        FunctionDeclaration::from_syntax_node(db, self.children[2].clone())
14994    }
14995    pub fn body(&self, db: &dyn SyntaxGroup) -> ExprBlock {
14996        ExprBlock::from_syntax_node(db, self.children[3].clone())
14997    }
14998}
14999#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
15000pub struct FunctionWithBodyPtr(pub SyntaxStablePtrId);
15001impl FunctionWithBodyPtr {
15002    pub fn declaration_green(self, db: &dyn SyntaxGroup) -> FunctionDeclarationGreen {
15003        let ptr = self.0.lookup_intern(db);
15004        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
15005            FunctionDeclarationGreen(key_fields[0])
15006        } else {
15007            panic!("Unexpected key field query on root.");
15008        }
15009    }
15010}
15011impl TypedStablePtr for FunctionWithBodyPtr {
15012    type SyntaxNode = FunctionWithBody;
15013    fn untyped(&self) -> SyntaxStablePtrId {
15014        self.0
15015    }
15016    fn lookup(&self, db: &dyn SyntaxGroup) -> FunctionWithBody {
15017        FunctionWithBody::from_syntax_node(db, self.0.lookup(db))
15018    }
15019}
15020impl From<FunctionWithBodyPtr> for SyntaxStablePtrId {
15021    fn from(ptr: FunctionWithBodyPtr) -> Self {
15022        ptr.untyped()
15023    }
15024}
15025#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
15026pub struct FunctionWithBodyGreen(pub GreenId);
15027impl TypedSyntaxNode for FunctionWithBody {
15028    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::FunctionWithBody);
15029    type StablePtr = FunctionWithBodyPtr;
15030    type Green = FunctionWithBodyGreen;
15031    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
15032        FunctionWithBodyGreen(
15033            Arc::new(GreenNode {
15034                kind: SyntaxKind::FunctionWithBody,
15035                details: GreenNodeDetails::Node {
15036                    children: vec![
15037                        AttributeList::missing(db).0,
15038                        Visibility::missing(db).0,
15039                        FunctionDeclaration::missing(db).0,
15040                        ExprBlock::missing(db).0,
15041                    ],
15042                    width: TextWidth::default(),
15043                },
15044            })
15045            .intern(db),
15046        )
15047    }
15048    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
15049        let kind = node.kind(db);
15050        assert_eq!(
15051            kind,
15052            SyntaxKind::FunctionWithBody,
15053            "Unexpected SyntaxKind {:?}. Expected {:?}.",
15054            kind,
15055            SyntaxKind::FunctionWithBody
15056        );
15057        let children = db.get_children(node.clone());
15058        Self { node, children }
15059    }
15060    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
15061        let kind = node.kind(db);
15062        if kind == SyntaxKind::FunctionWithBody {
15063            Some(Self::from_syntax_node(db, node))
15064        } else {
15065            None
15066        }
15067    }
15068    fn as_syntax_node(&self) -> SyntaxNode {
15069        self.node.clone()
15070    }
15071    fn stable_ptr(&self) -> Self::StablePtr {
15072        FunctionWithBodyPtr(self.node.0.stable_ptr)
15073    }
15074}
15075impl From<&FunctionWithBody> for SyntaxStablePtrId {
15076    fn from(node: &FunctionWithBody) -> Self {
15077        node.stable_ptr().untyped()
15078    }
15079}
15080#[derive(Clone, Debug, Eq, Hash, PartialEq)]
15081pub struct ItemExternFunction {
15082    node: SyntaxNode,
15083    children: Arc<[SyntaxNode]>,
15084}
15085impl ItemExternFunction {
15086    pub const INDEX_ATTRIBUTES: usize = 0;
15087    pub const INDEX_VISIBILITY: usize = 1;
15088    pub const INDEX_EXTERN_KW: usize = 2;
15089    pub const INDEX_DECLARATION: usize = 3;
15090    pub const INDEX_SEMICOLON: usize = 4;
15091    pub fn new_green(
15092        db: &dyn SyntaxGroup,
15093        attributes: AttributeListGreen,
15094        visibility: VisibilityGreen,
15095        extern_kw: TerminalExternGreen,
15096        declaration: FunctionDeclarationGreen,
15097        semicolon: TerminalSemicolonGreen,
15098    ) -> ItemExternFunctionGreen {
15099        let children: Vec<GreenId> =
15100            vec![attributes.0, visibility.0, extern_kw.0, declaration.0, semicolon.0];
15101        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
15102        ItemExternFunctionGreen(
15103            Arc::new(GreenNode {
15104                kind: SyntaxKind::ItemExternFunction,
15105                details: GreenNodeDetails::Node { children, width },
15106            })
15107            .intern(db),
15108        )
15109    }
15110}
15111impl ItemExternFunction {
15112    pub fn attributes(&self, db: &dyn SyntaxGroup) -> AttributeList {
15113        AttributeList::from_syntax_node(db, self.children[0].clone())
15114    }
15115    pub fn visibility(&self, db: &dyn SyntaxGroup) -> Visibility {
15116        Visibility::from_syntax_node(db, self.children[1].clone())
15117    }
15118    pub fn extern_kw(&self, db: &dyn SyntaxGroup) -> TerminalExtern {
15119        TerminalExtern::from_syntax_node(db, self.children[2].clone())
15120    }
15121    pub fn declaration(&self, db: &dyn SyntaxGroup) -> FunctionDeclaration {
15122        FunctionDeclaration::from_syntax_node(db, self.children[3].clone())
15123    }
15124    pub fn semicolon(&self, db: &dyn SyntaxGroup) -> TerminalSemicolon {
15125        TerminalSemicolon::from_syntax_node(db, self.children[4].clone())
15126    }
15127}
15128#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
15129pub struct ItemExternFunctionPtr(pub SyntaxStablePtrId);
15130impl ItemExternFunctionPtr {
15131    pub fn declaration_green(self, db: &dyn SyntaxGroup) -> FunctionDeclarationGreen {
15132        let ptr = self.0.lookup_intern(db);
15133        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
15134            FunctionDeclarationGreen(key_fields[0])
15135        } else {
15136            panic!("Unexpected key field query on root.");
15137        }
15138    }
15139}
15140impl TypedStablePtr for ItemExternFunctionPtr {
15141    type SyntaxNode = ItemExternFunction;
15142    fn untyped(&self) -> SyntaxStablePtrId {
15143        self.0
15144    }
15145    fn lookup(&self, db: &dyn SyntaxGroup) -> ItemExternFunction {
15146        ItemExternFunction::from_syntax_node(db, self.0.lookup(db))
15147    }
15148}
15149impl From<ItemExternFunctionPtr> for SyntaxStablePtrId {
15150    fn from(ptr: ItemExternFunctionPtr) -> Self {
15151        ptr.untyped()
15152    }
15153}
15154#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
15155pub struct ItemExternFunctionGreen(pub GreenId);
15156impl TypedSyntaxNode for ItemExternFunction {
15157    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemExternFunction);
15158    type StablePtr = ItemExternFunctionPtr;
15159    type Green = ItemExternFunctionGreen;
15160    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
15161        ItemExternFunctionGreen(
15162            Arc::new(GreenNode {
15163                kind: SyntaxKind::ItemExternFunction,
15164                details: GreenNodeDetails::Node {
15165                    children: vec![
15166                        AttributeList::missing(db).0,
15167                        Visibility::missing(db).0,
15168                        TerminalExtern::missing(db).0,
15169                        FunctionDeclaration::missing(db).0,
15170                        TerminalSemicolon::missing(db).0,
15171                    ],
15172                    width: TextWidth::default(),
15173                },
15174            })
15175            .intern(db),
15176        )
15177    }
15178    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
15179        let kind = node.kind(db);
15180        assert_eq!(
15181            kind,
15182            SyntaxKind::ItemExternFunction,
15183            "Unexpected SyntaxKind {:?}. Expected {:?}.",
15184            kind,
15185            SyntaxKind::ItemExternFunction
15186        );
15187        let children = db.get_children(node.clone());
15188        Self { node, children }
15189    }
15190    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
15191        let kind = node.kind(db);
15192        if kind == SyntaxKind::ItemExternFunction {
15193            Some(Self::from_syntax_node(db, node))
15194        } else {
15195            None
15196        }
15197    }
15198    fn as_syntax_node(&self) -> SyntaxNode {
15199        self.node.clone()
15200    }
15201    fn stable_ptr(&self) -> Self::StablePtr {
15202        ItemExternFunctionPtr(self.node.0.stable_ptr)
15203    }
15204}
15205impl From<&ItemExternFunction> for SyntaxStablePtrId {
15206    fn from(node: &ItemExternFunction) -> Self {
15207        node.stable_ptr().untyped()
15208    }
15209}
15210#[derive(Clone, Debug, Eq, Hash, PartialEq)]
15211pub struct ItemExternType {
15212    node: SyntaxNode,
15213    children: Arc<[SyntaxNode]>,
15214}
15215impl ItemExternType {
15216    pub const INDEX_ATTRIBUTES: usize = 0;
15217    pub const INDEX_VISIBILITY: usize = 1;
15218    pub const INDEX_EXTERN_KW: usize = 2;
15219    pub const INDEX_TYPE_KW: usize = 3;
15220    pub const INDEX_NAME: usize = 4;
15221    pub const INDEX_GENERIC_PARAMS: usize = 5;
15222    pub const INDEX_SEMICOLON: usize = 6;
15223    pub fn new_green(
15224        db: &dyn SyntaxGroup,
15225        attributes: AttributeListGreen,
15226        visibility: VisibilityGreen,
15227        extern_kw: TerminalExternGreen,
15228        type_kw: TerminalTypeGreen,
15229        name: TerminalIdentifierGreen,
15230        generic_params: OptionWrappedGenericParamListGreen,
15231        semicolon: TerminalSemicolonGreen,
15232    ) -> ItemExternTypeGreen {
15233        let children: Vec<GreenId> = vec![
15234            attributes.0,
15235            visibility.0,
15236            extern_kw.0,
15237            type_kw.0,
15238            name.0,
15239            generic_params.0,
15240            semicolon.0,
15241        ];
15242        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
15243        ItemExternTypeGreen(
15244            Arc::new(GreenNode {
15245                kind: SyntaxKind::ItemExternType,
15246                details: GreenNodeDetails::Node { children, width },
15247            })
15248            .intern(db),
15249        )
15250    }
15251}
15252impl ItemExternType {
15253    pub fn attributes(&self, db: &dyn SyntaxGroup) -> AttributeList {
15254        AttributeList::from_syntax_node(db, self.children[0].clone())
15255    }
15256    pub fn visibility(&self, db: &dyn SyntaxGroup) -> Visibility {
15257        Visibility::from_syntax_node(db, self.children[1].clone())
15258    }
15259    pub fn extern_kw(&self, db: &dyn SyntaxGroup) -> TerminalExtern {
15260        TerminalExtern::from_syntax_node(db, self.children[2].clone())
15261    }
15262    pub fn type_kw(&self, db: &dyn SyntaxGroup) -> TerminalType {
15263        TerminalType::from_syntax_node(db, self.children[3].clone())
15264    }
15265    pub fn name(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier {
15266        TerminalIdentifier::from_syntax_node(db, self.children[4].clone())
15267    }
15268    pub fn generic_params(&self, db: &dyn SyntaxGroup) -> OptionWrappedGenericParamList {
15269        OptionWrappedGenericParamList::from_syntax_node(db, self.children[5].clone())
15270    }
15271    pub fn semicolon(&self, db: &dyn SyntaxGroup) -> TerminalSemicolon {
15272        TerminalSemicolon::from_syntax_node(db, self.children[6].clone())
15273    }
15274}
15275#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
15276pub struct ItemExternTypePtr(pub SyntaxStablePtrId);
15277impl ItemExternTypePtr {
15278    pub fn name_green(self, db: &dyn SyntaxGroup) -> TerminalIdentifierGreen {
15279        let ptr = self.0.lookup_intern(db);
15280        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
15281            TerminalIdentifierGreen(key_fields[0])
15282        } else {
15283            panic!("Unexpected key field query on root.");
15284        }
15285    }
15286}
15287impl TypedStablePtr for ItemExternTypePtr {
15288    type SyntaxNode = ItemExternType;
15289    fn untyped(&self) -> SyntaxStablePtrId {
15290        self.0
15291    }
15292    fn lookup(&self, db: &dyn SyntaxGroup) -> ItemExternType {
15293        ItemExternType::from_syntax_node(db, self.0.lookup(db))
15294    }
15295}
15296impl From<ItemExternTypePtr> for SyntaxStablePtrId {
15297    fn from(ptr: ItemExternTypePtr) -> Self {
15298        ptr.untyped()
15299    }
15300}
15301#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
15302pub struct ItemExternTypeGreen(pub GreenId);
15303impl TypedSyntaxNode for ItemExternType {
15304    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemExternType);
15305    type StablePtr = ItemExternTypePtr;
15306    type Green = ItemExternTypeGreen;
15307    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
15308        ItemExternTypeGreen(
15309            Arc::new(GreenNode {
15310                kind: SyntaxKind::ItemExternType,
15311                details: GreenNodeDetails::Node {
15312                    children: vec![
15313                        AttributeList::missing(db).0,
15314                        Visibility::missing(db).0,
15315                        TerminalExtern::missing(db).0,
15316                        TerminalType::missing(db).0,
15317                        TerminalIdentifier::missing(db).0,
15318                        OptionWrappedGenericParamList::missing(db).0,
15319                        TerminalSemicolon::missing(db).0,
15320                    ],
15321                    width: TextWidth::default(),
15322                },
15323            })
15324            .intern(db),
15325        )
15326    }
15327    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
15328        let kind = node.kind(db);
15329        assert_eq!(
15330            kind,
15331            SyntaxKind::ItemExternType,
15332            "Unexpected SyntaxKind {:?}. Expected {:?}.",
15333            kind,
15334            SyntaxKind::ItemExternType
15335        );
15336        let children = db.get_children(node.clone());
15337        Self { node, children }
15338    }
15339    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
15340        let kind = node.kind(db);
15341        if kind == SyntaxKind::ItemExternType {
15342            Some(Self::from_syntax_node(db, node))
15343        } else {
15344            None
15345        }
15346    }
15347    fn as_syntax_node(&self) -> SyntaxNode {
15348        self.node.clone()
15349    }
15350    fn stable_ptr(&self) -> Self::StablePtr {
15351        ItemExternTypePtr(self.node.0.stable_ptr)
15352    }
15353}
15354impl From<&ItemExternType> for SyntaxStablePtrId {
15355    fn from(node: &ItemExternType) -> Self {
15356        node.stable_ptr().untyped()
15357    }
15358}
15359#[derive(Clone, Debug, Eq, Hash, PartialEq)]
15360pub struct ItemTrait {
15361    node: SyntaxNode,
15362    children: Arc<[SyntaxNode]>,
15363}
15364impl ItemTrait {
15365    pub const INDEX_ATTRIBUTES: usize = 0;
15366    pub const INDEX_VISIBILITY: usize = 1;
15367    pub const INDEX_TRAIT_KW: usize = 2;
15368    pub const INDEX_NAME: usize = 3;
15369    pub const INDEX_GENERIC_PARAMS: usize = 4;
15370    pub const INDEX_BODY: usize = 5;
15371    pub fn new_green(
15372        db: &dyn SyntaxGroup,
15373        attributes: AttributeListGreen,
15374        visibility: VisibilityGreen,
15375        trait_kw: TerminalTraitGreen,
15376        name: TerminalIdentifierGreen,
15377        generic_params: OptionWrappedGenericParamListGreen,
15378        body: MaybeTraitBodyGreen,
15379    ) -> ItemTraitGreen {
15380        let children: Vec<GreenId> =
15381            vec![attributes.0, visibility.0, trait_kw.0, name.0, generic_params.0, body.0];
15382        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
15383        ItemTraitGreen(
15384            Arc::new(GreenNode {
15385                kind: SyntaxKind::ItemTrait,
15386                details: GreenNodeDetails::Node { children, width },
15387            })
15388            .intern(db),
15389        )
15390    }
15391}
15392impl ItemTrait {
15393    pub fn attributes(&self, db: &dyn SyntaxGroup) -> AttributeList {
15394        AttributeList::from_syntax_node(db, self.children[0].clone())
15395    }
15396    pub fn visibility(&self, db: &dyn SyntaxGroup) -> Visibility {
15397        Visibility::from_syntax_node(db, self.children[1].clone())
15398    }
15399    pub fn trait_kw(&self, db: &dyn SyntaxGroup) -> TerminalTrait {
15400        TerminalTrait::from_syntax_node(db, self.children[2].clone())
15401    }
15402    pub fn name(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier {
15403        TerminalIdentifier::from_syntax_node(db, self.children[3].clone())
15404    }
15405    pub fn generic_params(&self, db: &dyn SyntaxGroup) -> OptionWrappedGenericParamList {
15406        OptionWrappedGenericParamList::from_syntax_node(db, self.children[4].clone())
15407    }
15408    pub fn body(&self, db: &dyn SyntaxGroup) -> MaybeTraitBody {
15409        MaybeTraitBody::from_syntax_node(db, self.children[5].clone())
15410    }
15411}
15412#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
15413pub struct ItemTraitPtr(pub SyntaxStablePtrId);
15414impl ItemTraitPtr {
15415    pub fn name_green(self, db: &dyn SyntaxGroup) -> TerminalIdentifierGreen {
15416        let ptr = self.0.lookup_intern(db);
15417        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
15418            TerminalIdentifierGreen(key_fields[0])
15419        } else {
15420            panic!("Unexpected key field query on root.");
15421        }
15422    }
15423}
15424impl TypedStablePtr for ItemTraitPtr {
15425    type SyntaxNode = ItemTrait;
15426    fn untyped(&self) -> SyntaxStablePtrId {
15427        self.0
15428    }
15429    fn lookup(&self, db: &dyn SyntaxGroup) -> ItemTrait {
15430        ItemTrait::from_syntax_node(db, self.0.lookup(db))
15431    }
15432}
15433impl From<ItemTraitPtr> for SyntaxStablePtrId {
15434    fn from(ptr: ItemTraitPtr) -> Self {
15435        ptr.untyped()
15436    }
15437}
15438#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
15439pub struct ItemTraitGreen(pub GreenId);
15440impl TypedSyntaxNode for ItemTrait {
15441    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemTrait);
15442    type StablePtr = ItemTraitPtr;
15443    type Green = ItemTraitGreen;
15444    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
15445        ItemTraitGreen(
15446            Arc::new(GreenNode {
15447                kind: SyntaxKind::ItemTrait,
15448                details: GreenNodeDetails::Node {
15449                    children: vec![
15450                        AttributeList::missing(db).0,
15451                        Visibility::missing(db).0,
15452                        TerminalTrait::missing(db).0,
15453                        TerminalIdentifier::missing(db).0,
15454                        OptionWrappedGenericParamList::missing(db).0,
15455                        MaybeTraitBody::missing(db).0,
15456                    ],
15457                    width: TextWidth::default(),
15458                },
15459            })
15460            .intern(db),
15461        )
15462    }
15463    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
15464        let kind = node.kind(db);
15465        assert_eq!(
15466            kind,
15467            SyntaxKind::ItemTrait,
15468            "Unexpected SyntaxKind {:?}. Expected {:?}.",
15469            kind,
15470            SyntaxKind::ItemTrait
15471        );
15472        let children = db.get_children(node.clone());
15473        Self { node, children }
15474    }
15475    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
15476        let kind = node.kind(db);
15477        if kind == SyntaxKind::ItemTrait { Some(Self::from_syntax_node(db, node)) } else { None }
15478    }
15479    fn as_syntax_node(&self) -> SyntaxNode {
15480        self.node.clone()
15481    }
15482    fn stable_ptr(&self) -> Self::StablePtr {
15483        ItemTraitPtr(self.node.0.stable_ptr)
15484    }
15485}
15486impl From<&ItemTrait> for SyntaxStablePtrId {
15487    fn from(node: &ItemTrait) -> Self {
15488        node.stable_ptr().untyped()
15489    }
15490}
15491#[derive(Clone, Debug, Eq, Hash, PartialEq)]
15492pub enum MaybeTraitBody {
15493    Some(TraitBody),
15494    None(TerminalSemicolon),
15495}
15496#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
15497pub struct MaybeTraitBodyPtr(pub SyntaxStablePtrId);
15498impl TypedStablePtr for MaybeTraitBodyPtr {
15499    type SyntaxNode = MaybeTraitBody;
15500    fn untyped(&self) -> SyntaxStablePtrId {
15501        self.0
15502    }
15503    fn lookup(&self, db: &dyn SyntaxGroup) -> MaybeTraitBody {
15504        MaybeTraitBody::from_syntax_node(db, self.0.lookup(db))
15505    }
15506}
15507impl From<MaybeTraitBodyPtr> for SyntaxStablePtrId {
15508    fn from(ptr: MaybeTraitBodyPtr) -> Self {
15509        ptr.untyped()
15510    }
15511}
15512impl From<TraitBodyPtr> for MaybeTraitBodyPtr {
15513    fn from(value: TraitBodyPtr) -> Self {
15514        Self(value.0)
15515    }
15516}
15517impl From<TerminalSemicolonPtr> for MaybeTraitBodyPtr {
15518    fn from(value: TerminalSemicolonPtr) -> Self {
15519        Self(value.0)
15520    }
15521}
15522impl From<TraitBodyGreen> for MaybeTraitBodyGreen {
15523    fn from(value: TraitBodyGreen) -> Self {
15524        Self(value.0)
15525    }
15526}
15527impl From<TerminalSemicolonGreen> for MaybeTraitBodyGreen {
15528    fn from(value: TerminalSemicolonGreen) -> Self {
15529        Self(value.0)
15530    }
15531}
15532#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
15533pub struct MaybeTraitBodyGreen(pub GreenId);
15534impl TypedSyntaxNode for MaybeTraitBody {
15535    const OPTIONAL_KIND: Option<SyntaxKind> = None;
15536    type StablePtr = MaybeTraitBodyPtr;
15537    type Green = MaybeTraitBodyGreen;
15538    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
15539        panic!("No missing variant.");
15540    }
15541    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
15542        let kind = node.kind(db);
15543        match kind {
15544            SyntaxKind::TraitBody => MaybeTraitBody::Some(TraitBody::from_syntax_node(db, node)),
15545            SyntaxKind::TerminalSemicolon => {
15546                MaybeTraitBody::None(TerminalSemicolon::from_syntax_node(db, node))
15547            }
15548            _ => {
15549                panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "MaybeTraitBody")
15550            }
15551        }
15552    }
15553    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
15554        let kind = node.kind(db);
15555        match kind {
15556            SyntaxKind::TraitBody => {
15557                Some(MaybeTraitBody::Some(TraitBody::from_syntax_node(db, node)))
15558            }
15559            SyntaxKind::TerminalSemicolon => {
15560                Some(MaybeTraitBody::None(TerminalSemicolon::from_syntax_node(db, node)))
15561            }
15562            _ => None,
15563        }
15564    }
15565    fn as_syntax_node(&self) -> SyntaxNode {
15566        match self {
15567            MaybeTraitBody::Some(x) => x.as_syntax_node(),
15568            MaybeTraitBody::None(x) => x.as_syntax_node(),
15569        }
15570    }
15571    fn stable_ptr(&self) -> Self::StablePtr {
15572        MaybeTraitBodyPtr(self.as_syntax_node().0.stable_ptr)
15573    }
15574}
15575impl From<&MaybeTraitBody> for SyntaxStablePtrId {
15576    fn from(node: &MaybeTraitBody) -> Self {
15577        node.stable_ptr().untyped()
15578    }
15579}
15580impl MaybeTraitBody {
15581    /// Checks if a kind of a variant of [MaybeTraitBody].
15582    pub fn is_variant(kind: SyntaxKind) -> bool {
15583        matches!(kind, SyntaxKind::TraitBody | SyntaxKind::TerminalSemicolon)
15584    }
15585}
15586#[derive(Clone, Debug, Eq, Hash, PartialEq)]
15587pub struct TraitBody {
15588    node: SyntaxNode,
15589    children: Arc<[SyntaxNode]>,
15590}
15591impl TraitBody {
15592    pub const INDEX_LBRACE: usize = 0;
15593    pub const INDEX_ITEMS: usize = 1;
15594    pub const INDEX_RBRACE: usize = 2;
15595    pub fn new_green(
15596        db: &dyn SyntaxGroup,
15597        lbrace: TerminalLBraceGreen,
15598        items: TraitItemListGreen,
15599        rbrace: TerminalRBraceGreen,
15600    ) -> TraitBodyGreen {
15601        let children: Vec<GreenId> = vec![lbrace.0, items.0, rbrace.0];
15602        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
15603        TraitBodyGreen(
15604            Arc::new(GreenNode {
15605                kind: SyntaxKind::TraitBody,
15606                details: GreenNodeDetails::Node { children, width },
15607            })
15608            .intern(db),
15609        )
15610    }
15611}
15612impl TraitBody {
15613    pub fn lbrace(&self, db: &dyn SyntaxGroup) -> TerminalLBrace {
15614        TerminalLBrace::from_syntax_node(db, self.children[0].clone())
15615    }
15616    pub fn items(&self, db: &dyn SyntaxGroup) -> TraitItemList {
15617        TraitItemList::from_syntax_node(db, self.children[1].clone())
15618    }
15619    pub fn rbrace(&self, db: &dyn SyntaxGroup) -> TerminalRBrace {
15620        TerminalRBrace::from_syntax_node(db, self.children[2].clone())
15621    }
15622}
15623#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
15624pub struct TraitBodyPtr(pub SyntaxStablePtrId);
15625impl TraitBodyPtr {}
15626impl TypedStablePtr for TraitBodyPtr {
15627    type SyntaxNode = TraitBody;
15628    fn untyped(&self) -> SyntaxStablePtrId {
15629        self.0
15630    }
15631    fn lookup(&self, db: &dyn SyntaxGroup) -> TraitBody {
15632        TraitBody::from_syntax_node(db, self.0.lookup(db))
15633    }
15634}
15635impl From<TraitBodyPtr> for SyntaxStablePtrId {
15636    fn from(ptr: TraitBodyPtr) -> Self {
15637        ptr.untyped()
15638    }
15639}
15640#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
15641pub struct TraitBodyGreen(pub GreenId);
15642impl TypedSyntaxNode for TraitBody {
15643    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TraitBody);
15644    type StablePtr = TraitBodyPtr;
15645    type Green = TraitBodyGreen;
15646    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
15647        TraitBodyGreen(
15648            Arc::new(GreenNode {
15649                kind: SyntaxKind::TraitBody,
15650                details: GreenNodeDetails::Node {
15651                    children: vec![
15652                        TerminalLBrace::missing(db).0,
15653                        TraitItemList::missing(db).0,
15654                        TerminalRBrace::missing(db).0,
15655                    ],
15656                    width: TextWidth::default(),
15657                },
15658            })
15659            .intern(db),
15660        )
15661    }
15662    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
15663        let kind = node.kind(db);
15664        assert_eq!(
15665            kind,
15666            SyntaxKind::TraitBody,
15667            "Unexpected SyntaxKind {:?}. Expected {:?}.",
15668            kind,
15669            SyntaxKind::TraitBody
15670        );
15671        let children = db.get_children(node.clone());
15672        Self { node, children }
15673    }
15674    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
15675        let kind = node.kind(db);
15676        if kind == SyntaxKind::TraitBody { Some(Self::from_syntax_node(db, node)) } else { None }
15677    }
15678    fn as_syntax_node(&self) -> SyntaxNode {
15679        self.node.clone()
15680    }
15681    fn stable_ptr(&self) -> Self::StablePtr {
15682        TraitBodyPtr(self.node.0.stable_ptr)
15683    }
15684}
15685impl From<&TraitBody> for SyntaxStablePtrId {
15686    fn from(node: &TraitBody) -> Self {
15687        node.stable_ptr().untyped()
15688    }
15689}
15690#[derive(Clone, Debug, Eq, Hash, PartialEq)]
15691pub struct TraitItemList(ElementList<TraitItem, 1>);
15692impl Deref for TraitItemList {
15693    type Target = ElementList<TraitItem, 1>;
15694    fn deref(&self) -> &Self::Target {
15695        &self.0
15696    }
15697}
15698impl TraitItemList {
15699    pub fn new_green(db: &dyn SyntaxGroup, children: Vec<TraitItemGreen>) -> TraitItemListGreen {
15700        let width = children.iter().map(|id| id.0.lookup_intern(db).width()).sum();
15701        TraitItemListGreen(
15702            Arc::new(GreenNode {
15703                kind: SyntaxKind::TraitItemList,
15704                details: GreenNodeDetails::Node {
15705                    children: children.iter().map(|x| x.0).collect(),
15706                    width,
15707                },
15708            })
15709            .intern(db),
15710        )
15711    }
15712}
15713#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
15714pub struct TraitItemListPtr(pub SyntaxStablePtrId);
15715impl TypedStablePtr for TraitItemListPtr {
15716    type SyntaxNode = TraitItemList;
15717    fn untyped(&self) -> SyntaxStablePtrId {
15718        self.0
15719    }
15720    fn lookup(&self, db: &dyn SyntaxGroup) -> TraitItemList {
15721        TraitItemList::from_syntax_node(db, self.0.lookup(db))
15722    }
15723}
15724impl From<TraitItemListPtr> for SyntaxStablePtrId {
15725    fn from(ptr: TraitItemListPtr) -> Self {
15726        ptr.untyped()
15727    }
15728}
15729#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
15730pub struct TraitItemListGreen(pub GreenId);
15731impl TypedSyntaxNode for TraitItemList {
15732    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TraitItemList);
15733    type StablePtr = TraitItemListPtr;
15734    type Green = TraitItemListGreen;
15735    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
15736        TraitItemListGreen(
15737            Arc::new(GreenNode {
15738                kind: SyntaxKind::TraitItemList,
15739                details: GreenNodeDetails::Node { children: vec![], width: TextWidth::default() },
15740            })
15741            .intern(db),
15742        )
15743    }
15744    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
15745        Self(ElementList::new(node))
15746    }
15747    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
15748        if node.kind(db) == SyntaxKind::TraitItemList {
15749            Some(Self(ElementList::new(node)))
15750        } else {
15751            None
15752        }
15753    }
15754    fn as_syntax_node(&self) -> SyntaxNode {
15755        self.node.clone()
15756    }
15757    fn stable_ptr(&self) -> Self::StablePtr {
15758        TraitItemListPtr(self.node.0.stable_ptr)
15759    }
15760}
15761impl From<&TraitItemList> for SyntaxStablePtrId {
15762    fn from(node: &TraitItemList) -> Self {
15763        node.stable_ptr().untyped()
15764    }
15765}
15766#[derive(Clone, Debug, Eq, Hash, PartialEq)]
15767pub enum TraitItem {
15768    Function(TraitItemFunction),
15769    Type(TraitItemType),
15770    Constant(TraitItemConstant),
15771    Impl(TraitItemImpl),
15772    Missing(TraitItemMissing),
15773}
15774#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
15775pub struct TraitItemPtr(pub SyntaxStablePtrId);
15776impl TypedStablePtr for TraitItemPtr {
15777    type SyntaxNode = TraitItem;
15778    fn untyped(&self) -> SyntaxStablePtrId {
15779        self.0
15780    }
15781    fn lookup(&self, db: &dyn SyntaxGroup) -> TraitItem {
15782        TraitItem::from_syntax_node(db, self.0.lookup(db))
15783    }
15784}
15785impl From<TraitItemPtr> for SyntaxStablePtrId {
15786    fn from(ptr: TraitItemPtr) -> Self {
15787        ptr.untyped()
15788    }
15789}
15790impl From<TraitItemFunctionPtr> for TraitItemPtr {
15791    fn from(value: TraitItemFunctionPtr) -> Self {
15792        Self(value.0)
15793    }
15794}
15795impl From<TraitItemTypePtr> for TraitItemPtr {
15796    fn from(value: TraitItemTypePtr) -> Self {
15797        Self(value.0)
15798    }
15799}
15800impl From<TraitItemConstantPtr> for TraitItemPtr {
15801    fn from(value: TraitItemConstantPtr) -> Self {
15802        Self(value.0)
15803    }
15804}
15805impl From<TraitItemImplPtr> for TraitItemPtr {
15806    fn from(value: TraitItemImplPtr) -> Self {
15807        Self(value.0)
15808    }
15809}
15810impl From<TraitItemMissingPtr> for TraitItemPtr {
15811    fn from(value: TraitItemMissingPtr) -> Self {
15812        Self(value.0)
15813    }
15814}
15815impl From<TraitItemFunctionGreen> for TraitItemGreen {
15816    fn from(value: TraitItemFunctionGreen) -> Self {
15817        Self(value.0)
15818    }
15819}
15820impl From<TraitItemTypeGreen> for TraitItemGreen {
15821    fn from(value: TraitItemTypeGreen) -> Self {
15822        Self(value.0)
15823    }
15824}
15825impl From<TraitItemConstantGreen> for TraitItemGreen {
15826    fn from(value: TraitItemConstantGreen) -> Self {
15827        Self(value.0)
15828    }
15829}
15830impl From<TraitItemImplGreen> for TraitItemGreen {
15831    fn from(value: TraitItemImplGreen) -> Self {
15832        Self(value.0)
15833    }
15834}
15835impl From<TraitItemMissingGreen> for TraitItemGreen {
15836    fn from(value: TraitItemMissingGreen) -> Self {
15837        Self(value.0)
15838    }
15839}
15840#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
15841pub struct TraitItemGreen(pub GreenId);
15842impl TypedSyntaxNode for TraitItem {
15843    const OPTIONAL_KIND: Option<SyntaxKind> = None;
15844    type StablePtr = TraitItemPtr;
15845    type Green = TraitItemGreen;
15846    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
15847        TraitItemGreen(TraitItemMissing::missing(db).0)
15848    }
15849    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
15850        let kind = node.kind(db);
15851        match kind {
15852            SyntaxKind::TraitItemFunction => {
15853                TraitItem::Function(TraitItemFunction::from_syntax_node(db, node))
15854            }
15855            SyntaxKind::TraitItemType => TraitItem::Type(TraitItemType::from_syntax_node(db, node)),
15856            SyntaxKind::TraitItemConstant => {
15857                TraitItem::Constant(TraitItemConstant::from_syntax_node(db, node))
15858            }
15859            SyntaxKind::TraitItemImpl => TraitItem::Impl(TraitItemImpl::from_syntax_node(db, node)),
15860            SyntaxKind::TraitItemMissing => {
15861                TraitItem::Missing(TraitItemMissing::from_syntax_node(db, node))
15862            }
15863            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "TraitItem"),
15864        }
15865    }
15866    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
15867        let kind = node.kind(db);
15868        match kind {
15869            SyntaxKind::TraitItemFunction => {
15870                Some(TraitItem::Function(TraitItemFunction::from_syntax_node(db, node)))
15871            }
15872            SyntaxKind::TraitItemType => {
15873                Some(TraitItem::Type(TraitItemType::from_syntax_node(db, node)))
15874            }
15875            SyntaxKind::TraitItemConstant => {
15876                Some(TraitItem::Constant(TraitItemConstant::from_syntax_node(db, node)))
15877            }
15878            SyntaxKind::TraitItemImpl => {
15879                Some(TraitItem::Impl(TraitItemImpl::from_syntax_node(db, node)))
15880            }
15881            SyntaxKind::TraitItemMissing => {
15882                Some(TraitItem::Missing(TraitItemMissing::from_syntax_node(db, node)))
15883            }
15884            _ => None,
15885        }
15886    }
15887    fn as_syntax_node(&self) -> SyntaxNode {
15888        match self {
15889            TraitItem::Function(x) => x.as_syntax_node(),
15890            TraitItem::Type(x) => x.as_syntax_node(),
15891            TraitItem::Constant(x) => x.as_syntax_node(),
15892            TraitItem::Impl(x) => x.as_syntax_node(),
15893            TraitItem::Missing(x) => x.as_syntax_node(),
15894        }
15895    }
15896    fn stable_ptr(&self) -> Self::StablePtr {
15897        TraitItemPtr(self.as_syntax_node().0.stable_ptr)
15898    }
15899}
15900impl From<&TraitItem> for SyntaxStablePtrId {
15901    fn from(node: &TraitItem) -> Self {
15902        node.stable_ptr().untyped()
15903    }
15904}
15905impl TraitItem {
15906    /// Checks if a kind of a variant of [TraitItem].
15907    pub fn is_variant(kind: SyntaxKind) -> bool {
15908        matches!(
15909            kind,
15910            SyntaxKind::TraitItemFunction
15911                | SyntaxKind::TraitItemType
15912                | SyntaxKind::TraitItemConstant
15913                | SyntaxKind::TraitItemImpl
15914                | SyntaxKind::TraitItemMissing
15915        )
15916    }
15917}
15918#[derive(Clone, Debug, Eq, Hash, PartialEq)]
15919pub struct TraitItemMissing {
15920    node: SyntaxNode,
15921    children: Arc<[SyntaxNode]>,
15922}
15923impl TraitItemMissing {
15924    pub fn new_green(db: &dyn SyntaxGroup) -> TraitItemMissingGreen {
15925        let children: Vec<GreenId> = vec![];
15926        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
15927        TraitItemMissingGreen(
15928            Arc::new(GreenNode {
15929                kind: SyntaxKind::TraitItemMissing,
15930                details: GreenNodeDetails::Node { children, width },
15931            })
15932            .intern(db),
15933        )
15934    }
15935}
15936impl TraitItemMissing {}
15937#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
15938pub struct TraitItemMissingPtr(pub SyntaxStablePtrId);
15939impl TraitItemMissingPtr {}
15940impl TypedStablePtr for TraitItemMissingPtr {
15941    type SyntaxNode = TraitItemMissing;
15942    fn untyped(&self) -> SyntaxStablePtrId {
15943        self.0
15944    }
15945    fn lookup(&self, db: &dyn SyntaxGroup) -> TraitItemMissing {
15946        TraitItemMissing::from_syntax_node(db, self.0.lookup(db))
15947    }
15948}
15949impl From<TraitItemMissingPtr> for SyntaxStablePtrId {
15950    fn from(ptr: TraitItemMissingPtr) -> Self {
15951        ptr.untyped()
15952    }
15953}
15954#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
15955pub struct TraitItemMissingGreen(pub GreenId);
15956impl TypedSyntaxNode for TraitItemMissing {
15957    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TraitItemMissing);
15958    type StablePtr = TraitItemMissingPtr;
15959    type Green = TraitItemMissingGreen;
15960    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
15961        TraitItemMissingGreen(
15962            Arc::new(GreenNode {
15963                kind: SyntaxKind::TraitItemMissing,
15964                details: GreenNodeDetails::Node { children: vec![], width: TextWidth::default() },
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::TraitItemMissing,
15974            "Unexpected SyntaxKind {:?}. Expected {:?}.",
15975            kind,
15976            SyntaxKind::TraitItemMissing
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::TraitItemMissing {
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        TraitItemMissingPtr(self.node.0.stable_ptr)
15994    }
15995}
15996impl From<&TraitItemMissing> for SyntaxStablePtrId {
15997    fn from(node: &TraitItemMissing) -> Self {
15998        node.stable_ptr().untyped()
15999    }
16000}
16001#[derive(Clone, Debug, Eq, Hash, PartialEq)]
16002pub struct TraitItemFunction {
16003    node: SyntaxNode,
16004    children: Arc<[SyntaxNode]>,
16005}
16006impl TraitItemFunction {
16007    pub const INDEX_ATTRIBUTES: usize = 0;
16008    pub const INDEX_DECLARATION: usize = 1;
16009    pub const INDEX_BODY: usize = 2;
16010    pub fn new_green(
16011        db: &dyn SyntaxGroup,
16012        attributes: AttributeListGreen,
16013        declaration: FunctionDeclarationGreen,
16014        body: MaybeTraitFunctionBodyGreen,
16015    ) -> TraitItemFunctionGreen {
16016        let children: Vec<GreenId> = vec![attributes.0, declaration.0, body.0];
16017        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
16018        TraitItemFunctionGreen(
16019            Arc::new(GreenNode {
16020                kind: SyntaxKind::TraitItemFunction,
16021                details: GreenNodeDetails::Node { children, width },
16022            })
16023            .intern(db),
16024        )
16025    }
16026}
16027impl TraitItemFunction {
16028    pub fn attributes(&self, db: &dyn SyntaxGroup) -> AttributeList {
16029        AttributeList::from_syntax_node(db, self.children[0].clone())
16030    }
16031    pub fn declaration(&self, db: &dyn SyntaxGroup) -> FunctionDeclaration {
16032        FunctionDeclaration::from_syntax_node(db, self.children[1].clone())
16033    }
16034    pub fn body(&self, db: &dyn SyntaxGroup) -> MaybeTraitFunctionBody {
16035        MaybeTraitFunctionBody::from_syntax_node(db, self.children[2].clone())
16036    }
16037}
16038#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
16039pub struct TraitItemFunctionPtr(pub SyntaxStablePtrId);
16040impl TraitItemFunctionPtr {
16041    pub fn declaration_green(self, db: &dyn SyntaxGroup) -> FunctionDeclarationGreen {
16042        let ptr = self.0.lookup_intern(db);
16043        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
16044            FunctionDeclarationGreen(key_fields[0])
16045        } else {
16046            panic!("Unexpected key field query on root.");
16047        }
16048    }
16049}
16050impl TypedStablePtr for TraitItemFunctionPtr {
16051    type SyntaxNode = TraitItemFunction;
16052    fn untyped(&self) -> SyntaxStablePtrId {
16053        self.0
16054    }
16055    fn lookup(&self, db: &dyn SyntaxGroup) -> TraitItemFunction {
16056        TraitItemFunction::from_syntax_node(db, self.0.lookup(db))
16057    }
16058}
16059impl From<TraitItemFunctionPtr> for SyntaxStablePtrId {
16060    fn from(ptr: TraitItemFunctionPtr) -> Self {
16061        ptr.untyped()
16062    }
16063}
16064#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
16065pub struct TraitItemFunctionGreen(pub GreenId);
16066impl TypedSyntaxNode for TraitItemFunction {
16067    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TraitItemFunction);
16068    type StablePtr = TraitItemFunctionPtr;
16069    type Green = TraitItemFunctionGreen;
16070    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
16071        TraitItemFunctionGreen(
16072            Arc::new(GreenNode {
16073                kind: SyntaxKind::TraitItemFunction,
16074                details: GreenNodeDetails::Node {
16075                    children: vec![
16076                        AttributeList::missing(db).0,
16077                        FunctionDeclaration::missing(db).0,
16078                        MaybeTraitFunctionBody::missing(db).0,
16079                    ],
16080                    width: TextWidth::default(),
16081                },
16082            })
16083            .intern(db),
16084        )
16085    }
16086    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
16087        let kind = node.kind(db);
16088        assert_eq!(
16089            kind,
16090            SyntaxKind::TraitItemFunction,
16091            "Unexpected SyntaxKind {:?}. Expected {:?}.",
16092            kind,
16093            SyntaxKind::TraitItemFunction
16094        );
16095        let children = db.get_children(node.clone());
16096        Self { node, children }
16097    }
16098    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
16099        let kind = node.kind(db);
16100        if kind == SyntaxKind::TraitItemFunction {
16101            Some(Self::from_syntax_node(db, node))
16102        } else {
16103            None
16104        }
16105    }
16106    fn as_syntax_node(&self) -> SyntaxNode {
16107        self.node.clone()
16108    }
16109    fn stable_ptr(&self) -> Self::StablePtr {
16110        TraitItemFunctionPtr(self.node.0.stable_ptr)
16111    }
16112}
16113impl From<&TraitItemFunction> for SyntaxStablePtrId {
16114    fn from(node: &TraitItemFunction) -> Self {
16115        node.stable_ptr().untyped()
16116    }
16117}
16118#[derive(Clone, Debug, Eq, Hash, PartialEq)]
16119pub struct TraitItemType {
16120    node: SyntaxNode,
16121    children: Arc<[SyntaxNode]>,
16122}
16123impl TraitItemType {
16124    pub const INDEX_ATTRIBUTES: usize = 0;
16125    pub const INDEX_TYPE_KW: usize = 1;
16126    pub const INDEX_NAME: usize = 2;
16127    pub const INDEX_GENERIC_PARAMS: usize = 3;
16128    pub const INDEX_SEMICOLON: usize = 4;
16129    pub fn new_green(
16130        db: &dyn SyntaxGroup,
16131        attributes: AttributeListGreen,
16132        type_kw: TerminalTypeGreen,
16133        name: TerminalIdentifierGreen,
16134        generic_params: OptionWrappedGenericParamListGreen,
16135        semicolon: TerminalSemicolonGreen,
16136    ) -> TraitItemTypeGreen {
16137        let children: Vec<GreenId> =
16138            vec![attributes.0, type_kw.0, name.0, generic_params.0, semicolon.0];
16139        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
16140        TraitItemTypeGreen(
16141            Arc::new(GreenNode {
16142                kind: SyntaxKind::TraitItemType,
16143                details: GreenNodeDetails::Node { children, width },
16144            })
16145            .intern(db),
16146        )
16147    }
16148}
16149impl TraitItemType {
16150    pub fn attributes(&self, db: &dyn SyntaxGroup) -> AttributeList {
16151        AttributeList::from_syntax_node(db, self.children[0].clone())
16152    }
16153    pub fn type_kw(&self, db: &dyn SyntaxGroup) -> TerminalType {
16154        TerminalType::from_syntax_node(db, self.children[1].clone())
16155    }
16156    pub fn name(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier {
16157        TerminalIdentifier::from_syntax_node(db, self.children[2].clone())
16158    }
16159    pub fn generic_params(&self, db: &dyn SyntaxGroup) -> OptionWrappedGenericParamList {
16160        OptionWrappedGenericParamList::from_syntax_node(db, self.children[3].clone())
16161    }
16162    pub fn semicolon(&self, db: &dyn SyntaxGroup) -> TerminalSemicolon {
16163        TerminalSemicolon::from_syntax_node(db, self.children[4].clone())
16164    }
16165}
16166#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
16167pub struct TraitItemTypePtr(pub SyntaxStablePtrId);
16168impl TraitItemTypePtr {
16169    pub fn name_green(self, db: &dyn SyntaxGroup) -> TerminalIdentifierGreen {
16170        let ptr = self.0.lookup_intern(db);
16171        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
16172            TerminalIdentifierGreen(key_fields[0])
16173        } else {
16174            panic!("Unexpected key field query on root.");
16175        }
16176    }
16177}
16178impl TypedStablePtr for TraitItemTypePtr {
16179    type SyntaxNode = TraitItemType;
16180    fn untyped(&self) -> SyntaxStablePtrId {
16181        self.0
16182    }
16183    fn lookup(&self, db: &dyn SyntaxGroup) -> TraitItemType {
16184        TraitItemType::from_syntax_node(db, self.0.lookup(db))
16185    }
16186}
16187impl From<TraitItemTypePtr> for SyntaxStablePtrId {
16188    fn from(ptr: TraitItemTypePtr) -> Self {
16189        ptr.untyped()
16190    }
16191}
16192#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
16193pub struct TraitItemTypeGreen(pub GreenId);
16194impl TypedSyntaxNode for TraitItemType {
16195    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TraitItemType);
16196    type StablePtr = TraitItemTypePtr;
16197    type Green = TraitItemTypeGreen;
16198    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
16199        TraitItemTypeGreen(
16200            Arc::new(GreenNode {
16201                kind: SyntaxKind::TraitItemType,
16202                details: GreenNodeDetails::Node {
16203                    children: vec![
16204                        AttributeList::missing(db).0,
16205                        TerminalType::missing(db).0,
16206                        TerminalIdentifier::missing(db).0,
16207                        OptionWrappedGenericParamList::missing(db).0,
16208                        TerminalSemicolon::missing(db).0,
16209                    ],
16210                    width: TextWidth::default(),
16211                },
16212            })
16213            .intern(db),
16214        )
16215    }
16216    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
16217        let kind = node.kind(db);
16218        assert_eq!(
16219            kind,
16220            SyntaxKind::TraitItemType,
16221            "Unexpected SyntaxKind {:?}. Expected {:?}.",
16222            kind,
16223            SyntaxKind::TraitItemType
16224        );
16225        let children = db.get_children(node.clone());
16226        Self { node, children }
16227    }
16228    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
16229        let kind = node.kind(db);
16230        if kind == SyntaxKind::TraitItemType {
16231            Some(Self::from_syntax_node(db, node))
16232        } else {
16233            None
16234        }
16235    }
16236    fn as_syntax_node(&self) -> SyntaxNode {
16237        self.node.clone()
16238    }
16239    fn stable_ptr(&self) -> Self::StablePtr {
16240        TraitItemTypePtr(self.node.0.stable_ptr)
16241    }
16242}
16243impl From<&TraitItemType> for SyntaxStablePtrId {
16244    fn from(node: &TraitItemType) -> Self {
16245        node.stable_ptr().untyped()
16246    }
16247}
16248#[derive(Clone, Debug, Eq, Hash, PartialEq)]
16249pub struct TraitItemConstant {
16250    node: SyntaxNode,
16251    children: Arc<[SyntaxNode]>,
16252}
16253impl TraitItemConstant {
16254    pub const INDEX_ATTRIBUTES: usize = 0;
16255    pub const INDEX_CONST_KW: usize = 1;
16256    pub const INDEX_NAME: usize = 2;
16257    pub const INDEX_TYPE_CLAUSE: usize = 3;
16258    pub const INDEX_SEMICOLON: usize = 4;
16259    pub fn new_green(
16260        db: &dyn SyntaxGroup,
16261        attributes: AttributeListGreen,
16262        const_kw: TerminalConstGreen,
16263        name: TerminalIdentifierGreen,
16264        type_clause: TypeClauseGreen,
16265        semicolon: TerminalSemicolonGreen,
16266    ) -> TraitItemConstantGreen {
16267        let children: Vec<GreenId> =
16268            vec![attributes.0, const_kw.0, name.0, type_clause.0, semicolon.0];
16269        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
16270        TraitItemConstantGreen(
16271            Arc::new(GreenNode {
16272                kind: SyntaxKind::TraitItemConstant,
16273                details: GreenNodeDetails::Node { children, width },
16274            })
16275            .intern(db),
16276        )
16277    }
16278}
16279impl TraitItemConstant {
16280    pub fn attributes(&self, db: &dyn SyntaxGroup) -> AttributeList {
16281        AttributeList::from_syntax_node(db, self.children[0].clone())
16282    }
16283    pub fn const_kw(&self, db: &dyn SyntaxGroup) -> TerminalConst {
16284        TerminalConst::from_syntax_node(db, self.children[1].clone())
16285    }
16286    pub fn name(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier {
16287        TerminalIdentifier::from_syntax_node(db, self.children[2].clone())
16288    }
16289    pub fn type_clause(&self, db: &dyn SyntaxGroup) -> TypeClause {
16290        TypeClause::from_syntax_node(db, self.children[3].clone())
16291    }
16292    pub fn semicolon(&self, db: &dyn SyntaxGroup) -> TerminalSemicolon {
16293        TerminalSemicolon::from_syntax_node(db, self.children[4].clone())
16294    }
16295}
16296#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
16297pub struct TraitItemConstantPtr(pub SyntaxStablePtrId);
16298impl TraitItemConstantPtr {
16299    pub fn name_green(self, db: &dyn SyntaxGroup) -> TerminalIdentifierGreen {
16300        let ptr = self.0.lookup_intern(db);
16301        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
16302            TerminalIdentifierGreen(key_fields[0])
16303        } else {
16304            panic!("Unexpected key field query on root.");
16305        }
16306    }
16307}
16308impl TypedStablePtr for TraitItemConstantPtr {
16309    type SyntaxNode = TraitItemConstant;
16310    fn untyped(&self) -> SyntaxStablePtrId {
16311        self.0
16312    }
16313    fn lookup(&self, db: &dyn SyntaxGroup) -> TraitItemConstant {
16314        TraitItemConstant::from_syntax_node(db, self.0.lookup(db))
16315    }
16316}
16317impl From<TraitItemConstantPtr> for SyntaxStablePtrId {
16318    fn from(ptr: TraitItemConstantPtr) -> Self {
16319        ptr.untyped()
16320    }
16321}
16322#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
16323pub struct TraitItemConstantGreen(pub GreenId);
16324impl TypedSyntaxNode for TraitItemConstant {
16325    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TraitItemConstant);
16326    type StablePtr = TraitItemConstantPtr;
16327    type Green = TraitItemConstantGreen;
16328    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
16329        TraitItemConstantGreen(
16330            Arc::new(GreenNode {
16331                kind: SyntaxKind::TraitItemConstant,
16332                details: GreenNodeDetails::Node {
16333                    children: vec![
16334                        AttributeList::missing(db).0,
16335                        TerminalConst::missing(db).0,
16336                        TerminalIdentifier::missing(db).0,
16337                        TypeClause::missing(db).0,
16338                        TerminalSemicolon::missing(db).0,
16339                    ],
16340                    width: TextWidth::default(),
16341                },
16342            })
16343            .intern(db),
16344        )
16345    }
16346    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
16347        let kind = node.kind(db);
16348        assert_eq!(
16349            kind,
16350            SyntaxKind::TraitItemConstant,
16351            "Unexpected SyntaxKind {:?}. Expected {:?}.",
16352            kind,
16353            SyntaxKind::TraitItemConstant
16354        );
16355        let children = db.get_children(node.clone());
16356        Self { node, children }
16357    }
16358    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
16359        let kind = node.kind(db);
16360        if kind == SyntaxKind::TraitItemConstant {
16361            Some(Self::from_syntax_node(db, node))
16362        } else {
16363            None
16364        }
16365    }
16366    fn as_syntax_node(&self) -> SyntaxNode {
16367        self.node.clone()
16368    }
16369    fn stable_ptr(&self) -> Self::StablePtr {
16370        TraitItemConstantPtr(self.node.0.stable_ptr)
16371    }
16372}
16373impl From<&TraitItemConstant> for SyntaxStablePtrId {
16374    fn from(node: &TraitItemConstant) -> Self {
16375        node.stable_ptr().untyped()
16376    }
16377}
16378#[derive(Clone, Debug, Eq, Hash, PartialEq)]
16379pub struct TraitItemImpl {
16380    node: SyntaxNode,
16381    children: Arc<[SyntaxNode]>,
16382}
16383impl TraitItemImpl {
16384    pub const INDEX_ATTRIBUTES: usize = 0;
16385    pub const INDEX_IMPL_KW: usize = 1;
16386    pub const INDEX_NAME: usize = 2;
16387    pub const INDEX_COLON: usize = 3;
16388    pub const INDEX_TRAIT_PATH: usize = 4;
16389    pub const INDEX_SEMICOLON: usize = 5;
16390    pub fn new_green(
16391        db: &dyn SyntaxGroup,
16392        attributes: AttributeListGreen,
16393        impl_kw: TerminalImplGreen,
16394        name: TerminalIdentifierGreen,
16395        colon: TerminalColonGreen,
16396        trait_path: ExprPathGreen,
16397        semicolon: TerminalSemicolonGreen,
16398    ) -> TraitItemImplGreen {
16399        let children: Vec<GreenId> =
16400            vec![attributes.0, impl_kw.0, name.0, colon.0, trait_path.0, semicolon.0];
16401        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
16402        TraitItemImplGreen(
16403            Arc::new(GreenNode {
16404                kind: SyntaxKind::TraitItemImpl,
16405                details: GreenNodeDetails::Node { children, width },
16406            })
16407            .intern(db),
16408        )
16409    }
16410}
16411impl TraitItemImpl {
16412    pub fn attributes(&self, db: &dyn SyntaxGroup) -> AttributeList {
16413        AttributeList::from_syntax_node(db, self.children[0].clone())
16414    }
16415    pub fn impl_kw(&self, db: &dyn SyntaxGroup) -> TerminalImpl {
16416        TerminalImpl::from_syntax_node(db, self.children[1].clone())
16417    }
16418    pub fn name(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier {
16419        TerminalIdentifier::from_syntax_node(db, self.children[2].clone())
16420    }
16421    pub fn colon(&self, db: &dyn SyntaxGroup) -> TerminalColon {
16422        TerminalColon::from_syntax_node(db, self.children[3].clone())
16423    }
16424    pub fn trait_path(&self, db: &dyn SyntaxGroup) -> ExprPath {
16425        ExprPath::from_syntax_node(db, self.children[4].clone())
16426    }
16427    pub fn semicolon(&self, db: &dyn SyntaxGroup) -> TerminalSemicolon {
16428        TerminalSemicolon::from_syntax_node(db, self.children[5].clone())
16429    }
16430}
16431#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
16432pub struct TraitItemImplPtr(pub SyntaxStablePtrId);
16433impl TraitItemImplPtr {
16434    pub fn name_green(self, db: &dyn SyntaxGroup) -> TerminalIdentifierGreen {
16435        let ptr = self.0.lookup_intern(db);
16436        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
16437            TerminalIdentifierGreen(key_fields[0])
16438        } else {
16439            panic!("Unexpected key field query on root.");
16440        }
16441    }
16442}
16443impl TypedStablePtr for TraitItemImplPtr {
16444    type SyntaxNode = TraitItemImpl;
16445    fn untyped(&self) -> SyntaxStablePtrId {
16446        self.0
16447    }
16448    fn lookup(&self, db: &dyn SyntaxGroup) -> TraitItemImpl {
16449        TraitItemImpl::from_syntax_node(db, self.0.lookup(db))
16450    }
16451}
16452impl From<TraitItemImplPtr> for SyntaxStablePtrId {
16453    fn from(ptr: TraitItemImplPtr) -> Self {
16454        ptr.untyped()
16455    }
16456}
16457#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
16458pub struct TraitItemImplGreen(pub GreenId);
16459impl TypedSyntaxNode for TraitItemImpl {
16460    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TraitItemImpl);
16461    type StablePtr = TraitItemImplPtr;
16462    type Green = TraitItemImplGreen;
16463    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
16464        TraitItemImplGreen(
16465            Arc::new(GreenNode {
16466                kind: SyntaxKind::TraitItemImpl,
16467                details: GreenNodeDetails::Node {
16468                    children: vec![
16469                        AttributeList::missing(db).0,
16470                        TerminalImpl::missing(db).0,
16471                        TerminalIdentifier::missing(db).0,
16472                        TerminalColon::missing(db).0,
16473                        ExprPath::missing(db).0,
16474                        TerminalSemicolon::missing(db).0,
16475                    ],
16476                    width: TextWidth::default(),
16477                },
16478            })
16479            .intern(db),
16480        )
16481    }
16482    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
16483        let kind = node.kind(db);
16484        assert_eq!(
16485            kind,
16486            SyntaxKind::TraitItemImpl,
16487            "Unexpected SyntaxKind {:?}. Expected {:?}.",
16488            kind,
16489            SyntaxKind::TraitItemImpl
16490        );
16491        let children = db.get_children(node.clone());
16492        Self { node, children }
16493    }
16494    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
16495        let kind = node.kind(db);
16496        if kind == SyntaxKind::TraitItemImpl {
16497            Some(Self::from_syntax_node(db, node))
16498        } else {
16499            None
16500        }
16501    }
16502    fn as_syntax_node(&self) -> SyntaxNode {
16503        self.node.clone()
16504    }
16505    fn stable_ptr(&self) -> Self::StablePtr {
16506        TraitItemImplPtr(self.node.0.stable_ptr)
16507    }
16508}
16509impl From<&TraitItemImpl> for SyntaxStablePtrId {
16510    fn from(node: &TraitItemImpl) -> Self {
16511        node.stable_ptr().untyped()
16512    }
16513}
16514#[derive(Clone, Debug, Eq, Hash, PartialEq)]
16515pub enum MaybeTraitFunctionBody {
16516    Some(ExprBlock),
16517    None(TerminalSemicolon),
16518}
16519#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
16520pub struct MaybeTraitFunctionBodyPtr(pub SyntaxStablePtrId);
16521impl TypedStablePtr for MaybeTraitFunctionBodyPtr {
16522    type SyntaxNode = MaybeTraitFunctionBody;
16523    fn untyped(&self) -> SyntaxStablePtrId {
16524        self.0
16525    }
16526    fn lookup(&self, db: &dyn SyntaxGroup) -> MaybeTraitFunctionBody {
16527        MaybeTraitFunctionBody::from_syntax_node(db, self.0.lookup(db))
16528    }
16529}
16530impl From<MaybeTraitFunctionBodyPtr> for SyntaxStablePtrId {
16531    fn from(ptr: MaybeTraitFunctionBodyPtr) -> Self {
16532        ptr.untyped()
16533    }
16534}
16535impl From<ExprBlockPtr> for MaybeTraitFunctionBodyPtr {
16536    fn from(value: ExprBlockPtr) -> Self {
16537        Self(value.0)
16538    }
16539}
16540impl From<TerminalSemicolonPtr> for MaybeTraitFunctionBodyPtr {
16541    fn from(value: TerminalSemicolonPtr) -> Self {
16542        Self(value.0)
16543    }
16544}
16545impl From<ExprBlockGreen> for MaybeTraitFunctionBodyGreen {
16546    fn from(value: ExprBlockGreen) -> Self {
16547        Self(value.0)
16548    }
16549}
16550impl From<TerminalSemicolonGreen> for MaybeTraitFunctionBodyGreen {
16551    fn from(value: TerminalSemicolonGreen) -> Self {
16552        Self(value.0)
16553    }
16554}
16555#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
16556pub struct MaybeTraitFunctionBodyGreen(pub GreenId);
16557impl TypedSyntaxNode for MaybeTraitFunctionBody {
16558    const OPTIONAL_KIND: Option<SyntaxKind> = None;
16559    type StablePtr = MaybeTraitFunctionBodyPtr;
16560    type Green = MaybeTraitFunctionBodyGreen;
16561    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
16562        panic!("No missing variant.");
16563    }
16564    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
16565        let kind = node.kind(db);
16566        match kind {
16567            SyntaxKind::ExprBlock => {
16568                MaybeTraitFunctionBody::Some(ExprBlock::from_syntax_node(db, node))
16569            }
16570            SyntaxKind::TerminalSemicolon => {
16571                MaybeTraitFunctionBody::None(TerminalSemicolon::from_syntax_node(db, node))
16572            }
16573            _ => panic!(
16574                "Unexpected syntax kind {:?} when constructing {}.",
16575                kind, "MaybeTraitFunctionBody"
16576            ),
16577        }
16578    }
16579    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
16580        let kind = node.kind(db);
16581        match kind {
16582            SyntaxKind::ExprBlock => {
16583                Some(MaybeTraitFunctionBody::Some(ExprBlock::from_syntax_node(db, node)))
16584            }
16585            SyntaxKind::TerminalSemicolon => {
16586                Some(MaybeTraitFunctionBody::None(TerminalSemicolon::from_syntax_node(db, node)))
16587            }
16588            _ => None,
16589        }
16590    }
16591    fn as_syntax_node(&self) -> SyntaxNode {
16592        match self {
16593            MaybeTraitFunctionBody::Some(x) => x.as_syntax_node(),
16594            MaybeTraitFunctionBody::None(x) => x.as_syntax_node(),
16595        }
16596    }
16597    fn stable_ptr(&self) -> Self::StablePtr {
16598        MaybeTraitFunctionBodyPtr(self.as_syntax_node().0.stable_ptr)
16599    }
16600}
16601impl From<&MaybeTraitFunctionBody> for SyntaxStablePtrId {
16602    fn from(node: &MaybeTraitFunctionBody) -> Self {
16603        node.stable_ptr().untyped()
16604    }
16605}
16606impl MaybeTraitFunctionBody {
16607    /// Checks if a kind of a variant of [MaybeTraitFunctionBody].
16608    pub fn is_variant(kind: SyntaxKind) -> bool {
16609        matches!(kind, SyntaxKind::ExprBlock | SyntaxKind::TerminalSemicolon)
16610    }
16611}
16612#[derive(Clone, Debug, Eq, Hash, PartialEq)]
16613pub struct ItemImpl {
16614    node: SyntaxNode,
16615    children: Arc<[SyntaxNode]>,
16616}
16617impl ItemImpl {
16618    pub const INDEX_ATTRIBUTES: usize = 0;
16619    pub const INDEX_VISIBILITY: usize = 1;
16620    pub const INDEX_IMPL_KW: usize = 2;
16621    pub const INDEX_NAME: usize = 3;
16622    pub const INDEX_GENERIC_PARAMS: usize = 4;
16623    pub const INDEX_OF_KW: usize = 5;
16624    pub const INDEX_TRAIT_PATH: usize = 6;
16625    pub const INDEX_BODY: usize = 7;
16626    pub fn new_green(
16627        db: &dyn SyntaxGroup,
16628        attributes: AttributeListGreen,
16629        visibility: VisibilityGreen,
16630        impl_kw: TerminalImplGreen,
16631        name: TerminalIdentifierGreen,
16632        generic_params: OptionWrappedGenericParamListGreen,
16633        of_kw: TerminalOfGreen,
16634        trait_path: ExprPathGreen,
16635        body: MaybeImplBodyGreen,
16636    ) -> ItemImplGreen {
16637        let children: Vec<GreenId> = vec![
16638            attributes.0,
16639            visibility.0,
16640            impl_kw.0,
16641            name.0,
16642            generic_params.0,
16643            of_kw.0,
16644            trait_path.0,
16645            body.0,
16646        ];
16647        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
16648        ItemImplGreen(
16649            Arc::new(GreenNode {
16650                kind: SyntaxKind::ItemImpl,
16651                details: GreenNodeDetails::Node { children, width },
16652            })
16653            .intern(db),
16654        )
16655    }
16656}
16657impl ItemImpl {
16658    pub fn attributes(&self, db: &dyn SyntaxGroup) -> AttributeList {
16659        AttributeList::from_syntax_node(db, self.children[0].clone())
16660    }
16661    pub fn visibility(&self, db: &dyn SyntaxGroup) -> Visibility {
16662        Visibility::from_syntax_node(db, self.children[1].clone())
16663    }
16664    pub fn impl_kw(&self, db: &dyn SyntaxGroup) -> TerminalImpl {
16665        TerminalImpl::from_syntax_node(db, self.children[2].clone())
16666    }
16667    pub fn name(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier {
16668        TerminalIdentifier::from_syntax_node(db, self.children[3].clone())
16669    }
16670    pub fn generic_params(&self, db: &dyn SyntaxGroup) -> OptionWrappedGenericParamList {
16671        OptionWrappedGenericParamList::from_syntax_node(db, self.children[4].clone())
16672    }
16673    pub fn of_kw(&self, db: &dyn SyntaxGroup) -> TerminalOf {
16674        TerminalOf::from_syntax_node(db, self.children[5].clone())
16675    }
16676    pub fn trait_path(&self, db: &dyn SyntaxGroup) -> ExprPath {
16677        ExprPath::from_syntax_node(db, self.children[6].clone())
16678    }
16679    pub fn body(&self, db: &dyn SyntaxGroup) -> MaybeImplBody {
16680        MaybeImplBody::from_syntax_node(db, self.children[7].clone())
16681    }
16682}
16683#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
16684pub struct ItemImplPtr(pub SyntaxStablePtrId);
16685impl ItemImplPtr {
16686    pub fn name_green(self, db: &dyn SyntaxGroup) -> TerminalIdentifierGreen {
16687        let ptr = self.0.lookup_intern(db);
16688        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
16689            TerminalIdentifierGreen(key_fields[0])
16690        } else {
16691            panic!("Unexpected key field query on root.");
16692        }
16693    }
16694}
16695impl TypedStablePtr for ItemImplPtr {
16696    type SyntaxNode = ItemImpl;
16697    fn untyped(&self) -> SyntaxStablePtrId {
16698        self.0
16699    }
16700    fn lookup(&self, db: &dyn SyntaxGroup) -> ItemImpl {
16701        ItemImpl::from_syntax_node(db, self.0.lookup(db))
16702    }
16703}
16704impl From<ItemImplPtr> for SyntaxStablePtrId {
16705    fn from(ptr: ItemImplPtr) -> Self {
16706        ptr.untyped()
16707    }
16708}
16709#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
16710pub struct ItemImplGreen(pub GreenId);
16711impl TypedSyntaxNode for ItemImpl {
16712    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemImpl);
16713    type StablePtr = ItemImplPtr;
16714    type Green = ItemImplGreen;
16715    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
16716        ItemImplGreen(
16717            Arc::new(GreenNode {
16718                kind: SyntaxKind::ItemImpl,
16719                details: GreenNodeDetails::Node {
16720                    children: vec![
16721                        AttributeList::missing(db).0,
16722                        Visibility::missing(db).0,
16723                        TerminalImpl::missing(db).0,
16724                        TerminalIdentifier::missing(db).0,
16725                        OptionWrappedGenericParamList::missing(db).0,
16726                        TerminalOf::missing(db).0,
16727                        ExprPath::missing(db).0,
16728                        MaybeImplBody::missing(db).0,
16729                    ],
16730                    width: TextWidth::default(),
16731                },
16732            })
16733            .intern(db),
16734        )
16735    }
16736    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
16737        let kind = node.kind(db);
16738        assert_eq!(
16739            kind,
16740            SyntaxKind::ItemImpl,
16741            "Unexpected SyntaxKind {:?}. Expected {:?}.",
16742            kind,
16743            SyntaxKind::ItemImpl
16744        );
16745        let children = db.get_children(node.clone());
16746        Self { node, children }
16747    }
16748    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
16749        let kind = node.kind(db);
16750        if kind == SyntaxKind::ItemImpl { Some(Self::from_syntax_node(db, node)) } else { None }
16751    }
16752    fn as_syntax_node(&self) -> SyntaxNode {
16753        self.node.clone()
16754    }
16755    fn stable_ptr(&self) -> Self::StablePtr {
16756        ItemImplPtr(self.node.0.stable_ptr)
16757    }
16758}
16759impl From<&ItemImpl> for SyntaxStablePtrId {
16760    fn from(node: &ItemImpl) -> Self {
16761        node.stable_ptr().untyped()
16762    }
16763}
16764#[derive(Clone, Debug, Eq, Hash, PartialEq)]
16765pub struct ItemInlineMacro {
16766    node: SyntaxNode,
16767    children: Arc<[SyntaxNode]>,
16768}
16769impl ItemInlineMacro {
16770    pub const INDEX_ATTRIBUTES: usize = 0;
16771    pub const INDEX_NAME: usize = 1;
16772    pub const INDEX_BANG: usize = 2;
16773    pub const INDEX_ARGUMENTS: usize = 3;
16774    pub const INDEX_SEMICOLON: usize = 4;
16775    pub fn new_green(
16776        db: &dyn SyntaxGroup,
16777        attributes: AttributeListGreen,
16778        name: TerminalIdentifierGreen,
16779        bang: TerminalNotGreen,
16780        arguments: WrappedArgListGreen,
16781        semicolon: TerminalSemicolonGreen,
16782    ) -> ItemInlineMacroGreen {
16783        let children: Vec<GreenId> = vec![attributes.0, name.0, bang.0, arguments.0, semicolon.0];
16784        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
16785        ItemInlineMacroGreen(
16786            Arc::new(GreenNode {
16787                kind: SyntaxKind::ItemInlineMacro,
16788                details: GreenNodeDetails::Node { children, width },
16789            })
16790            .intern(db),
16791        )
16792    }
16793}
16794impl ItemInlineMacro {
16795    pub fn attributes(&self, db: &dyn SyntaxGroup) -> AttributeList {
16796        AttributeList::from_syntax_node(db, self.children[0].clone())
16797    }
16798    pub fn name(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier {
16799        TerminalIdentifier::from_syntax_node(db, self.children[1].clone())
16800    }
16801    pub fn bang(&self, db: &dyn SyntaxGroup) -> TerminalNot {
16802        TerminalNot::from_syntax_node(db, self.children[2].clone())
16803    }
16804    pub fn arguments(&self, db: &dyn SyntaxGroup) -> WrappedArgList {
16805        WrappedArgList::from_syntax_node(db, self.children[3].clone())
16806    }
16807    pub fn semicolon(&self, db: &dyn SyntaxGroup) -> TerminalSemicolon {
16808        TerminalSemicolon::from_syntax_node(db, self.children[4].clone())
16809    }
16810}
16811#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
16812pub struct ItemInlineMacroPtr(pub SyntaxStablePtrId);
16813impl ItemInlineMacroPtr {}
16814impl TypedStablePtr for ItemInlineMacroPtr {
16815    type SyntaxNode = ItemInlineMacro;
16816    fn untyped(&self) -> SyntaxStablePtrId {
16817        self.0
16818    }
16819    fn lookup(&self, db: &dyn SyntaxGroup) -> ItemInlineMacro {
16820        ItemInlineMacro::from_syntax_node(db, self.0.lookup(db))
16821    }
16822}
16823impl From<ItemInlineMacroPtr> for SyntaxStablePtrId {
16824    fn from(ptr: ItemInlineMacroPtr) -> Self {
16825        ptr.untyped()
16826    }
16827}
16828#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
16829pub struct ItemInlineMacroGreen(pub GreenId);
16830impl TypedSyntaxNode for ItemInlineMacro {
16831    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemInlineMacro);
16832    type StablePtr = ItemInlineMacroPtr;
16833    type Green = ItemInlineMacroGreen;
16834    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
16835        ItemInlineMacroGreen(
16836            Arc::new(GreenNode {
16837                kind: SyntaxKind::ItemInlineMacro,
16838                details: GreenNodeDetails::Node {
16839                    children: vec![
16840                        AttributeList::missing(db).0,
16841                        TerminalIdentifier::missing(db).0,
16842                        TerminalNot::missing(db).0,
16843                        WrappedArgList::missing(db).0,
16844                        TerminalSemicolon::missing(db).0,
16845                    ],
16846                    width: TextWidth::default(),
16847                },
16848            })
16849            .intern(db),
16850        )
16851    }
16852    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
16853        let kind = node.kind(db);
16854        assert_eq!(
16855            kind,
16856            SyntaxKind::ItemInlineMacro,
16857            "Unexpected SyntaxKind {:?}. Expected {:?}.",
16858            kind,
16859            SyntaxKind::ItemInlineMacro
16860        );
16861        let children = db.get_children(node.clone());
16862        Self { node, children }
16863    }
16864    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
16865        let kind = node.kind(db);
16866        if kind == SyntaxKind::ItemInlineMacro {
16867            Some(Self::from_syntax_node(db, node))
16868        } else {
16869            None
16870        }
16871    }
16872    fn as_syntax_node(&self) -> SyntaxNode {
16873        self.node.clone()
16874    }
16875    fn stable_ptr(&self) -> Self::StablePtr {
16876        ItemInlineMacroPtr(self.node.0.stable_ptr)
16877    }
16878}
16879impl From<&ItemInlineMacro> for SyntaxStablePtrId {
16880    fn from(node: &ItemInlineMacro) -> Self {
16881        node.stable_ptr().untyped()
16882    }
16883}
16884#[derive(Clone, Debug, Eq, Hash, PartialEq)]
16885pub struct ItemHeaderDoc {
16886    node: SyntaxNode,
16887    children: Arc<[SyntaxNode]>,
16888}
16889impl ItemHeaderDoc {
16890    pub const INDEX_EMPTY: usize = 0;
16891    pub fn new_green(db: &dyn SyntaxGroup, empty: TerminalEmptyGreen) -> ItemHeaderDocGreen {
16892        let children: Vec<GreenId> = vec![empty.0];
16893        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
16894        ItemHeaderDocGreen(
16895            Arc::new(GreenNode {
16896                kind: SyntaxKind::ItemHeaderDoc,
16897                details: GreenNodeDetails::Node { children, width },
16898            })
16899            .intern(db),
16900        )
16901    }
16902}
16903impl ItemHeaderDoc {
16904    pub fn empty(&self, db: &dyn SyntaxGroup) -> TerminalEmpty {
16905        TerminalEmpty::from_syntax_node(db, self.children[0].clone())
16906    }
16907}
16908#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
16909pub struct ItemHeaderDocPtr(pub SyntaxStablePtrId);
16910impl ItemHeaderDocPtr {}
16911impl TypedStablePtr for ItemHeaderDocPtr {
16912    type SyntaxNode = ItemHeaderDoc;
16913    fn untyped(&self) -> SyntaxStablePtrId {
16914        self.0
16915    }
16916    fn lookup(&self, db: &dyn SyntaxGroup) -> ItemHeaderDoc {
16917        ItemHeaderDoc::from_syntax_node(db, self.0.lookup(db))
16918    }
16919}
16920impl From<ItemHeaderDocPtr> for SyntaxStablePtrId {
16921    fn from(ptr: ItemHeaderDocPtr) -> Self {
16922        ptr.untyped()
16923    }
16924}
16925#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
16926pub struct ItemHeaderDocGreen(pub GreenId);
16927impl TypedSyntaxNode for ItemHeaderDoc {
16928    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemHeaderDoc);
16929    type StablePtr = ItemHeaderDocPtr;
16930    type Green = ItemHeaderDocGreen;
16931    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
16932        ItemHeaderDocGreen(
16933            Arc::new(GreenNode {
16934                kind: SyntaxKind::ItemHeaderDoc,
16935                details: GreenNodeDetails::Node {
16936                    children: vec![TerminalEmpty::missing(db).0],
16937                    width: TextWidth::default(),
16938                },
16939            })
16940            .intern(db),
16941        )
16942    }
16943    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
16944        let kind = node.kind(db);
16945        assert_eq!(
16946            kind,
16947            SyntaxKind::ItemHeaderDoc,
16948            "Unexpected SyntaxKind {:?}. Expected {:?}.",
16949            kind,
16950            SyntaxKind::ItemHeaderDoc
16951        );
16952        let children = db.get_children(node.clone());
16953        Self { node, children }
16954    }
16955    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
16956        let kind = node.kind(db);
16957        if kind == SyntaxKind::ItemHeaderDoc {
16958            Some(Self::from_syntax_node(db, node))
16959        } else {
16960            None
16961        }
16962    }
16963    fn as_syntax_node(&self) -> SyntaxNode {
16964        self.node.clone()
16965    }
16966    fn stable_ptr(&self) -> Self::StablePtr {
16967        ItemHeaderDocPtr(self.node.0.stable_ptr)
16968    }
16969}
16970impl From<&ItemHeaderDoc> for SyntaxStablePtrId {
16971    fn from(node: &ItemHeaderDoc) -> Self {
16972        node.stable_ptr().untyped()
16973    }
16974}
16975#[derive(Clone, Debug, Eq, Hash, PartialEq)]
16976pub enum MaybeImplBody {
16977    Some(ImplBody),
16978    None(TerminalSemicolon),
16979}
16980#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
16981pub struct MaybeImplBodyPtr(pub SyntaxStablePtrId);
16982impl TypedStablePtr for MaybeImplBodyPtr {
16983    type SyntaxNode = MaybeImplBody;
16984    fn untyped(&self) -> SyntaxStablePtrId {
16985        self.0
16986    }
16987    fn lookup(&self, db: &dyn SyntaxGroup) -> MaybeImplBody {
16988        MaybeImplBody::from_syntax_node(db, self.0.lookup(db))
16989    }
16990}
16991impl From<MaybeImplBodyPtr> for SyntaxStablePtrId {
16992    fn from(ptr: MaybeImplBodyPtr) -> Self {
16993        ptr.untyped()
16994    }
16995}
16996impl From<ImplBodyPtr> for MaybeImplBodyPtr {
16997    fn from(value: ImplBodyPtr) -> Self {
16998        Self(value.0)
16999    }
17000}
17001impl From<TerminalSemicolonPtr> for MaybeImplBodyPtr {
17002    fn from(value: TerminalSemicolonPtr) -> Self {
17003        Self(value.0)
17004    }
17005}
17006impl From<ImplBodyGreen> for MaybeImplBodyGreen {
17007    fn from(value: ImplBodyGreen) -> Self {
17008        Self(value.0)
17009    }
17010}
17011impl From<TerminalSemicolonGreen> for MaybeImplBodyGreen {
17012    fn from(value: TerminalSemicolonGreen) -> Self {
17013        Self(value.0)
17014    }
17015}
17016#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
17017pub struct MaybeImplBodyGreen(pub GreenId);
17018impl TypedSyntaxNode for MaybeImplBody {
17019    const OPTIONAL_KIND: Option<SyntaxKind> = None;
17020    type StablePtr = MaybeImplBodyPtr;
17021    type Green = MaybeImplBodyGreen;
17022    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
17023        panic!("No missing variant.");
17024    }
17025    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
17026        let kind = node.kind(db);
17027        match kind {
17028            SyntaxKind::ImplBody => MaybeImplBody::Some(ImplBody::from_syntax_node(db, node)),
17029            SyntaxKind::TerminalSemicolon => {
17030                MaybeImplBody::None(TerminalSemicolon::from_syntax_node(db, node))
17031            }
17032            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "MaybeImplBody"),
17033        }
17034    }
17035    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
17036        let kind = node.kind(db);
17037        match kind {
17038            SyntaxKind::ImplBody => Some(MaybeImplBody::Some(ImplBody::from_syntax_node(db, node))),
17039            SyntaxKind::TerminalSemicolon => {
17040                Some(MaybeImplBody::None(TerminalSemicolon::from_syntax_node(db, node)))
17041            }
17042            _ => None,
17043        }
17044    }
17045    fn as_syntax_node(&self) -> SyntaxNode {
17046        match self {
17047            MaybeImplBody::Some(x) => x.as_syntax_node(),
17048            MaybeImplBody::None(x) => x.as_syntax_node(),
17049        }
17050    }
17051    fn stable_ptr(&self) -> Self::StablePtr {
17052        MaybeImplBodyPtr(self.as_syntax_node().0.stable_ptr)
17053    }
17054}
17055impl From<&MaybeImplBody> for SyntaxStablePtrId {
17056    fn from(node: &MaybeImplBody) -> Self {
17057        node.stable_ptr().untyped()
17058    }
17059}
17060impl MaybeImplBody {
17061    /// Checks if a kind of a variant of [MaybeImplBody].
17062    pub fn is_variant(kind: SyntaxKind) -> bool {
17063        matches!(kind, SyntaxKind::ImplBody | SyntaxKind::TerminalSemicolon)
17064    }
17065}
17066#[derive(Clone, Debug, Eq, Hash, PartialEq)]
17067pub struct ImplBody {
17068    node: SyntaxNode,
17069    children: Arc<[SyntaxNode]>,
17070}
17071impl ImplBody {
17072    pub const INDEX_LBRACE: usize = 0;
17073    pub const INDEX_ITEMS: usize = 1;
17074    pub const INDEX_RBRACE: usize = 2;
17075    pub fn new_green(
17076        db: &dyn SyntaxGroup,
17077        lbrace: TerminalLBraceGreen,
17078        items: ImplItemListGreen,
17079        rbrace: TerminalRBraceGreen,
17080    ) -> ImplBodyGreen {
17081        let children: Vec<GreenId> = vec![lbrace.0, items.0, rbrace.0];
17082        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
17083        ImplBodyGreen(
17084            Arc::new(GreenNode {
17085                kind: SyntaxKind::ImplBody,
17086                details: GreenNodeDetails::Node { children, width },
17087            })
17088            .intern(db),
17089        )
17090    }
17091}
17092impl ImplBody {
17093    pub fn lbrace(&self, db: &dyn SyntaxGroup) -> TerminalLBrace {
17094        TerminalLBrace::from_syntax_node(db, self.children[0].clone())
17095    }
17096    pub fn items(&self, db: &dyn SyntaxGroup) -> ImplItemList {
17097        ImplItemList::from_syntax_node(db, self.children[1].clone())
17098    }
17099    pub fn rbrace(&self, db: &dyn SyntaxGroup) -> TerminalRBrace {
17100        TerminalRBrace::from_syntax_node(db, self.children[2].clone())
17101    }
17102}
17103#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
17104pub struct ImplBodyPtr(pub SyntaxStablePtrId);
17105impl ImplBodyPtr {}
17106impl TypedStablePtr for ImplBodyPtr {
17107    type SyntaxNode = ImplBody;
17108    fn untyped(&self) -> SyntaxStablePtrId {
17109        self.0
17110    }
17111    fn lookup(&self, db: &dyn SyntaxGroup) -> ImplBody {
17112        ImplBody::from_syntax_node(db, self.0.lookup(db))
17113    }
17114}
17115impl From<ImplBodyPtr> for SyntaxStablePtrId {
17116    fn from(ptr: ImplBodyPtr) -> Self {
17117        ptr.untyped()
17118    }
17119}
17120#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
17121pub struct ImplBodyGreen(pub GreenId);
17122impl TypedSyntaxNode for ImplBody {
17123    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ImplBody);
17124    type StablePtr = ImplBodyPtr;
17125    type Green = ImplBodyGreen;
17126    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
17127        ImplBodyGreen(
17128            Arc::new(GreenNode {
17129                kind: SyntaxKind::ImplBody,
17130                details: GreenNodeDetails::Node {
17131                    children: vec![
17132                        TerminalLBrace::missing(db).0,
17133                        ImplItemList::missing(db).0,
17134                        TerminalRBrace::missing(db).0,
17135                    ],
17136                    width: TextWidth::default(),
17137                },
17138            })
17139            .intern(db),
17140        )
17141    }
17142    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
17143        let kind = node.kind(db);
17144        assert_eq!(
17145            kind,
17146            SyntaxKind::ImplBody,
17147            "Unexpected SyntaxKind {:?}. Expected {:?}.",
17148            kind,
17149            SyntaxKind::ImplBody
17150        );
17151        let children = db.get_children(node.clone());
17152        Self { node, children }
17153    }
17154    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
17155        let kind = node.kind(db);
17156        if kind == SyntaxKind::ImplBody { Some(Self::from_syntax_node(db, node)) } else { None }
17157    }
17158    fn as_syntax_node(&self) -> SyntaxNode {
17159        self.node.clone()
17160    }
17161    fn stable_ptr(&self) -> Self::StablePtr {
17162        ImplBodyPtr(self.node.0.stable_ptr)
17163    }
17164}
17165impl From<&ImplBody> for SyntaxStablePtrId {
17166    fn from(node: &ImplBody) -> Self {
17167        node.stable_ptr().untyped()
17168    }
17169}
17170#[derive(Clone, Debug, Eq, Hash, PartialEq)]
17171pub struct ImplItemList(ElementList<ImplItem, 1>);
17172impl Deref for ImplItemList {
17173    type Target = ElementList<ImplItem, 1>;
17174    fn deref(&self) -> &Self::Target {
17175        &self.0
17176    }
17177}
17178impl ImplItemList {
17179    pub fn new_green(db: &dyn SyntaxGroup, children: Vec<ImplItemGreen>) -> ImplItemListGreen {
17180        let width = children.iter().map(|id| id.0.lookup_intern(db).width()).sum();
17181        ImplItemListGreen(
17182            Arc::new(GreenNode {
17183                kind: SyntaxKind::ImplItemList,
17184                details: GreenNodeDetails::Node {
17185                    children: children.iter().map(|x| x.0).collect(),
17186                    width,
17187                },
17188            })
17189            .intern(db),
17190        )
17191    }
17192}
17193#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
17194pub struct ImplItemListPtr(pub SyntaxStablePtrId);
17195impl TypedStablePtr for ImplItemListPtr {
17196    type SyntaxNode = ImplItemList;
17197    fn untyped(&self) -> SyntaxStablePtrId {
17198        self.0
17199    }
17200    fn lookup(&self, db: &dyn SyntaxGroup) -> ImplItemList {
17201        ImplItemList::from_syntax_node(db, self.0.lookup(db))
17202    }
17203}
17204impl From<ImplItemListPtr> for SyntaxStablePtrId {
17205    fn from(ptr: ImplItemListPtr) -> Self {
17206        ptr.untyped()
17207    }
17208}
17209#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
17210pub struct ImplItemListGreen(pub GreenId);
17211impl TypedSyntaxNode for ImplItemList {
17212    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ImplItemList);
17213    type StablePtr = ImplItemListPtr;
17214    type Green = ImplItemListGreen;
17215    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
17216        ImplItemListGreen(
17217            Arc::new(GreenNode {
17218                kind: SyntaxKind::ImplItemList,
17219                details: GreenNodeDetails::Node { children: vec![], width: TextWidth::default() },
17220            })
17221            .intern(db),
17222        )
17223    }
17224    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
17225        Self(ElementList::new(node))
17226    }
17227    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
17228        if node.kind(db) == SyntaxKind::ImplItemList {
17229            Some(Self(ElementList::new(node)))
17230        } else {
17231            None
17232        }
17233    }
17234    fn as_syntax_node(&self) -> SyntaxNode {
17235        self.node.clone()
17236    }
17237    fn stable_ptr(&self) -> Self::StablePtr {
17238        ImplItemListPtr(self.node.0.stable_ptr)
17239    }
17240}
17241impl From<&ImplItemList> for SyntaxStablePtrId {
17242    fn from(node: &ImplItemList) -> Self {
17243        node.stable_ptr().untyped()
17244    }
17245}
17246#[derive(Clone, Debug, Eq, Hash, PartialEq)]
17247pub enum ImplItem {
17248    Function(FunctionWithBody),
17249    Type(ItemTypeAlias),
17250    Constant(ItemConstant),
17251    Impl(ItemImplAlias),
17252    Module(ItemModule),
17253    Use(ItemUse),
17254    ExternFunction(ItemExternFunction),
17255    ExternType(ItemExternType),
17256    Trait(ItemTrait),
17257    Struct(ItemStruct),
17258    Enum(ItemEnum),
17259    Missing(ImplItemMissing),
17260}
17261#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
17262pub struct ImplItemPtr(pub SyntaxStablePtrId);
17263impl TypedStablePtr for ImplItemPtr {
17264    type SyntaxNode = ImplItem;
17265    fn untyped(&self) -> SyntaxStablePtrId {
17266        self.0
17267    }
17268    fn lookup(&self, db: &dyn SyntaxGroup) -> ImplItem {
17269        ImplItem::from_syntax_node(db, self.0.lookup(db))
17270    }
17271}
17272impl From<ImplItemPtr> for SyntaxStablePtrId {
17273    fn from(ptr: ImplItemPtr) -> Self {
17274        ptr.untyped()
17275    }
17276}
17277impl From<FunctionWithBodyPtr> for ImplItemPtr {
17278    fn from(value: FunctionWithBodyPtr) -> Self {
17279        Self(value.0)
17280    }
17281}
17282impl From<ItemTypeAliasPtr> for ImplItemPtr {
17283    fn from(value: ItemTypeAliasPtr) -> Self {
17284        Self(value.0)
17285    }
17286}
17287impl From<ItemConstantPtr> for ImplItemPtr {
17288    fn from(value: ItemConstantPtr) -> Self {
17289        Self(value.0)
17290    }
17291}
17292impl From<ItemImplAliasPtr> for ImplItemPtr {
17293    fn from(value: ItemImplAliasPtr) -> Self {
17294        Self(value.0)
17295    }
17296}
17297impl From<ItemModulePtr> for ImplItemPtr {
17298    fn from(value: ItemModulePtr) -> Self {
17299        Self(value.0)
17300    }
17301}
17302impl From<ItemUsePtr> for ImplItemPtr {
17303    fn from(value: ItemUsePtr) -> Self {
17304        Self(value.0)
17305    }
17306}
17307impl From<ItemExternFunctionPtr> for ImplItemPtr {
17308    fn from(value: ItemExternFunctionPtr) -> Self {
17309        Self(value.0)
17310    }
17311}
17312impl From<ItemExternTypePtr> for ImplItemPtr {
17313    fn from(value: ItemExternTypePtr) -> Self {
17314        Self(value.0)
17315    }
17316}
17317impl From<ItemTraitPtr> for ImplItemPtr {
17318    fn from(value: ItemTraitPtr) -> Self {
17319        Self(value.0)
17320    }
17321}
17322impl From<ItemStructPtr> for ImplItemPtr {
17323    fn from(value: ItemStructPtr) -> Self {
17324        Self(value.0)
17325    }
17326}
17327impl From<ItemEnumPtr> for ImplItemPtr {
17328    fn from(value: ItemEnumPtr) -> Self {
17329        Self(value.0)
17330    }
17331}
17332impl From<ImplItemMissingPtr> for ImplItemPtr {
17333    fn from(value: ImplItemMissingPtr) -> Self {
17334        Self(value.0)
17335    }
17336}
17337impl From<FunctionWithBodyGreen> for ImplItemGreen {
17338    fn from(value: FunctionWithBodyGreen) -> Self {
17339        Self(value.0)
17340    }
17341}
17342impl From<ItemTypeAliasGreen> for ImplItemGreen {
17343    fn from(value: ItemTypeAliasGreen) -> Self {
17344        Self(value.0)
17345    }
17346}
17347impl From<ItemConstantGreen> for ImplItemGreen {
17348    fn from(value: ItemConstantGreen) -> Self {
17349        Self(value.0)
17350    }
17351}
17352impl From<ItemImplAliasGreen> for ImplItemGreen {
17353    fn from(value: ItemImplAliasGreen) -> Self {
17354        Self(value.0)
17355    }
17356}
17357impl From<ItemModuleGreen> for ImplItemGreen {
17358    fn from(value: ItemModuleGreen) -> Self {
17359        Self(value.0)
17360    }
17361}
17362impl From<ItemUseGreen> for ImplItemGreen {
17363    fn from(value: ItemUseGreen) -> Self {
17364        Self(value.0)
17365    }
17366}
17367impl From<ItemExternFunctionGreen> for ImplItemGreen {
17368    fn from(value: ItemExternFunctionGreen) -> Self {
17369        Self(value.0)
17370    }
17371}
17372impl From<ItemExternTypeGreen> for ImplItemGreen {
17373    fn from(value: ItemExternTypeGreen) -> Self {
17374        Self(value.0)
17375    }
17376}
17377impl From<ItemTraitGreen> for ImplItemGreen {
17378    fn from(value: ItemTraitGreen) -> Self {
17379        Self(value.0)
17380    }
17381}
17382impl From<ItemStructGreen> for ImplItemGreen {
17383    fn from(value: ItemStructGreen) -> Self {
17384        Self(value.0)
17385    }
17386}
17387impl From<ItemEnumGreen> for ImplItemGreen {
17388    fn from(value: ItemEnumGreen) -> Self {
17389        Self(value.0)
17390    }
17391}
17392impl From<ImplItemMissingGreen> for ImplItemGreen {
17393    fn from(value: ImplItemMissingGreen) -> Self {
17394        Self(value.0)
17395    }
17396}
17397#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
17398pub struct ImplItemGreen(pub GreenId);
17399impl TypedSyntaxNode for ImplItem {
17400    const OPTIONAL_KIND: Option<SyntaxKind> = None;
17401    type StablePtr = ImplItemPtr;
17402    type Green = ImplItemGreen;
17403    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
17404        ImplItemGreen(ImplItemMissing::missing(db).0)
17405    }
17406    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
17407        let kind = node.kind(db);
17408        match kind {
17409            SyntaxKind::FunctionWithBody => {
17410                ImplItem::Function(FunctionWithBody::from_syntax_node(db, node))
17411            }
17412            SyntaxKind::ItemTypeAlias => ImplItem::Type(ItemTypeAlias::from_syntax_node(db, node)),
17413            SyntaxKind::ItemConstant => {
17414                ImplItem::Constant(ItemConstant::from_syntax_node(db, node))
17415            }
17416            SyntaxKind::ItemImplAlias => ImplItem::Impl(ItemImplAlias::from_syntax_node(db, node)),
17417            SyntaxKind::ItemModule => ImplItem::Module(ItemModule::from_syntax_node(db, node)),
17418            SyntaxKind::ItemUse => ImplItem::Use(ItemUse::from_syntax_node(db, node)),
17419            SyntaxKind::ItemExternFunction => {
17420                ImplItem::ExternFunction(ItemExternFunction::from_syntax_node(db, node))
17421            }
17422            SyntaxKind::ItemExternType => {
17423                ImplItem::ExternType(ItemExternType::from_syntax_node(db, node))
17424            }
17425            SyntaxKind::ItemTrait => ImplItem::Trait(ItemTrait::from_syntax_node(db, node)),
17426            SyntaxKind::ItemStruct => ImplItem::Struct(ItemStruct::from_syntax_node(db, node)),
17427            SyntaxKind::ItemEnum => ImplItem::Enum(ItemEnum::from_syntax_node(db, node)),
17428            SyntaxKind::ImplItemMissing => {
17429                ImplItem::Missing(ImplItemMissing::from_syntax_node(db, node))
17430            }
17431            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "ImplItem"),
17432        }
17433    }
17434    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
17435        let kind = node.kind(db);
17436        match kind {
17437            SyntaxKind::FunctionWithBody => {
17438                Some(ImplItem::Function(FunctionWithBody::from_syntax_node(db, node)))
17439            }
17440            SyntaxKind::ItemTypeAlias => {
17441                Some(ImplItem::Type(ItemTypeAlias::from_syntax_node(db, node)))
17442            }
17443            SyntaxKind::ItemConstant => {
17444                Some(ImplItem::Constant(ItemConstant::from_syntax_node(db, node)))
17445            }
17446            SyntaxKind::ItemImplAlias => {
17447                Some(ImplItem::Impl(ItemImplAlias::from_syntax_node(db, node)))
17448            }
17449            SyntaxKind::ItemModule => {
17450                Some(ImplItem::Module(ItemModule::from_syntax_node(db, node)))
17451            }
17452            SyntaxKind::ItemUse => Some(ImplItem::Use(ItemUse::from_syntax_node(db, node))),
17453            SyntaxKind::ItemExternFunction => {
17454                Some(ImplItem::ExternFunction(ItemExternFunction::from_syntax_node(db, node)))
17455            }
17456            SyntaxKind::ItemExternType => {
17457                Some(ImplItem::ExternType(ItemExternType::from_syntax_node(db, node)))
17458            }
17459            SyntaxKind::ItemTrait => Some(ImplItem::Trait(ItemTrait::from_syntax_node(db, node))),
17460            SyntaxKind::ItemStruct => {
17461                Some(ImplItem::Struct(ItemStruct::from_syntax_node(db, node)))
17462            }
17463            SyntaxKind::ItemEnum => Some(ImplItem::Enum(ItemEnum::from_syntax_node(db, node))),
17464            SyntaxKind::ImplItemMissing => {
17465                Some(ImplItem::Missing(ImplItemMissing::from_syntax_node(db, node)))
17466            }
17467            _ => None,
17468        }
17469    }
17470    fn as_syntax_node(&self) -> SyntaxNode {
17471        match self {
17472            ImplItem::Function(x) => x.as_syntax_node(),
17473            ImplItem::Type(x) => x.as_syntax_node(),
17474            ImplItem::Constant(x) => x.as_syntax_node(),
17475            ImplItem::Impl(x) => x.as_syntax_node(),
17476            ImplItem::Module(x) => x.as_syntax_node(),
17477            ImplItem::Use(x) => x.as_syntax_node(),
17478            ImplItem::ExternFunction(x) => x.as_syntax_node(),
17479            ImplItem::ExternType(x) => x.as_syntax_node(),
17480            ImplItem::Trait(x) => x.as_syntax_node(),
17481            ImplItem::Struct(x) => x.as_syntax_node(),
17482            ImplItem::Enum(x) => x.as_syntax_node(),
17483            ImplItem::Missing(x) => x.as_syntax_node(),
17484        }
17485    }
17486    fn stable_ptr(&self) -> Self::StablePtr {
17487        ImplItemPtr(self.as_syntax_node().0.stable_ptr)
17488    }
17489}
17490impl From<&ImplItem> for SyntaxStablePtrId {
17491    fn from(node: &ImplItem) -> Self {
17492        node.stable_ptr().untyped()
17493    }
17494}
17495impl ImplItem {
17496    /// Checks if a kind of a variant of [ImplItem].
17497    pub fn is_variant(kind: SyntaxKind) -> bool {
17498        matches!(
17499            kind,
17500            SyntaxKind::FunctionWithBody
17501                | SyntaxKind::ItemTypeAlias
17502                | SyntaxKind::ItemConstant
17503                | SyntaxKind::ItemImplAlias
17504                | SyntaxKind::ItemModule
17505                | SyntaxKind::ItemUse
17506                | SyntaxKind::ItemExternFunction
17507                | SyntaxKind::ItemExternType
17508                | SyntaxKind::ItemTrait
17509                | SyntaxKind::ItemStruct
17510                | SyntaxKind::ItemEnum
17511                | SyntaxKind::ImplItemMissing
17512        )
17513    }
17514}
17515#[derive(Clone, Debug, Eq, Hash, PartialEq)]
17516pub struct ImplItemMissing {
17517    node: SyntaxNode,
17518    children: Arc<[SyntaxNode]>,
17519}
17520impl ImplItemMissing {
17521    pub fn new_green(db: &dyn SyntaxGroup) -> ImplItemMissingGreen {
17522        let children: Vec<GreenId> = vec![];
17523        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
17524        ImplItemMissingGreen(
17525            Arc::new(GreenNode {
17526                kind: SyntaxKind::ImplItemMissing,
17527                details: GreenNodeDetails::Node { children, width },
17528            })
17529            .intern(db),
17530        )
17531    }
17532}
17533impl ImplItemMissing {}
17534#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
17535pub struct ImplItemMissingPtr(pub SyntaxStablePtrId);
17536impl ImplItemMissingPtr {}
17537impl TypedStablePtr for ImplItemMissingPtr {
17538    type SyntaxNode = ImplItemMissing;
17539    fn untyped(&self) -> SyntaxStablePtrId {
17540        self.0
17541    }
17542    fn lookup(&self, db: &dyn SyntaxGroup) -> ImplItemMissing {
17543        ImplItemMissing::from_syntax_node(db, self.0.lookup(db))
17544    }
17545}
17546impl From<ImplItemMissingPtr> for SyntaxStablePtrId {
17547    fn from(ptr: ImplItemMissingPtr) -> Self {
17548        ptr.untyped()
17549    }
17550}
17551#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
17552pub struct ImplItemMissingGreen(pub GreenId);
17553impl TypedSyntaxNode for ImplItemMissing {
17554    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ImplItemMissing);
17555    type StablePtr = ImplItemMissingPtr;
17556    type Green = ImplItemMissingGreen;
17557    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
17558        ImplItemMissingGreen(
17559            Arc::new(GreenNode {
17560                kind: SyntaxKind::ImplItemMissing,
17561                details: GreenNodeDetails::Node { children: vec![], width: TextWidth::default() },
17562            })
17563            .intern(db),
17564        )
17565    }
17566    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
17567        let kind = node.kind(db);
17568        assert_eq!(
17569            kind,
17570            SyntaxKind::ImplItemMissing,
17571            "Unexpected SyntaxKind {:?}. Expected {:?}.",
17572            kind,
17573            SyntaxKind::ImplItemMissing
17574        );
17575        let children = db.get_children(node.clone());
17576        Self { node, children }
17577    }
17578    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
17579        let kind = node.kind(db);
17580        if kind == SyntaxKind::ImplItemMissing {
17581            Some(Self::from_syntax_node(db, node))
17582        } else {
17583            None
17584        }
17585    }
17586    fn as_syntax_node(&self) -> SyntaxNode {
17587        self.node.clone()
17588    }
17589    fn stable_ptr(&self) -> Self::StablePtr {
17590        ImplItemMissingPtr(self.node.0.stable_ptr)
17591    }
17592}
17593impl From<&ImplItemMissing> for SyntaxStablePtrId {
17594    fn from(node: &ImplItemMissing) -> Self {
17595        node.stable_ptr().untyped()
17596    }
17597}
17598#[derive(Clone, Debug, Eq, Hash, PartialEq)]
17599pub struct ItemImplAlias {
17600    node: SyntaxNode,
17601    children: Arc<[SyntaxNode]>,
17602}
17603impl ItemImplAlias {
17604    pub const INDEX_ATTRIBUTES: usize = 0;
17605    pub const INDEX_VISIBILITY: usize = 1;
17606    pub const INDEX_IMPL_KW: usize = 2;
17607    pub const INDEX_NAME: usize = 3;
17608    pub const INDEX_GENERIC_PARAMS: usize = 4;
17609    pub const INDEX_EQ: usize = 5;
17610    pub const INDEX_IMPL_PATH: usize = 6;
17611    pub const INDEX_SEMICOLON: usize = 7;
17612    pub fn new_green(
17613        db: &dyn SyntaxGroup,
17614        attributes: AttributeListGreen,
17615        visibility: VisibilityGreen,
17616        impl_kw: TerminalImplGreen,
17617        name: TerminalIdentifierGreen,
17618        generic_params: OptionWrappedGenericParamListGreen,
17619        eq: TerminalEqGreen,
17620        impl_path: ExprPathGreen,
17621        semicolon: TerminalSemicolonGreen,
17622    ) -> ItemImplAliasGreen {
17623        let children: Vec<GreenId> = vec![
17624            attributes.0,
17625            visibility.0,
17626            impl_kw.0,
17627            name.0,
17628            generic_params.0,
17629            eq.0,
17630            impl_path.0,
17631            semicolon.0,
17632        ];
17633        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
17634        ItemImplAliasGreen(
17635            Arc::new(GreenNode {
17636                kind: SyntaxKind::ItemImplAlias,
17637                details: GreenNodeDetails::Node { children, width },
17638            })
17639            .intern(db),
17640        )
17641    }
17642}
17643impl ItemImplAlias {
17644    pub fn attributes(&self, db: &dyn SyntaxGroup) -> AttributeList {
17645        AttributeList::from_syntax_node(db, self.children[0].clone())
17646    }
17647    pub fn visibility(&self, db: &dyn SyntaxGroup) -> Visibility {
17648        Visibility::from_syntax_node(db, self.children[1].clone())
17649    }
17650    pub fn impl_kw(&self, db: &dyn SyntaxGroup) -> TerminalImpl {
17651        TerminalImpl::from_syntax_node(db, self.children[2].clone())
17652    }
17653    pub fn name(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier {
17654        TerminalIdentifier::from_syntax_node(db, self.children[3].clone())
17655    }
17656    pub fn generic_params(&self, db: &dyn SyntaxGroup) -> OptionWrappedGenericParamList {
17657        OptionWrappedGenericParamList::from_syntax_node(db, self.children[4].clone())
17658    }
17659    pub fn eq(&self, db: &dyn SyntaxGroup) -> TerminalEq {
17660        TerminalEq::from_syntax_node(db, self.children[5].clone())
17661    }
17662    pub fn impl_path(&self, db: &dyn SyntaxGroup) -> ExprPath {
17663        ExprPath::from_syntax_node(db, self.children[6].clone())
17664    }
17665    pub fn semicolon(&self, db: &dyn SyntaxGroup) -> TerminalSemicolon {
17666        TerminalSemicolon::from_syntax_node(db, self.children[7].clone())
17667    }
17668}
17669#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
17670pub struct ItemImplAliasPtr(pub SyntaxStablePtrId);
17671impl ItemImplAliasPtr {
17672    pub fn name_green(self, db: &dyn SyntaxGroup) -> TerminalIdentifierGreen {
17673        let ptr = self.0.lookup_intern(db);
17674        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
17675            TerminalIdentifierGreen(key_fields[0])
17676        } else {
17677            panic!("Unexpected key field query on root.");
17678        }
17679    }
17680}
17681impl TypedStablePtr for ItemImplAliasPtr {
17682    type SyntaxNode = ItemImplAlias;
17683    fn untyped(&self) -> SyntaxStablePtrId {
17684        self.0
17685    }
17686    fn lookup(&self, db: &dyn SyntaxGroup) -> ItemImplAlias {
17687        ItemImplAlias::from_syntax_node(db, self.0.lookup(db))
17688    }
17689}
17690impl From<ItemImplAliasPtr> for SyntaxStablePtrId {
17691    fn from(ptr: ItemImplAliasPtr) -> Self {
17692        ptr.untyped()
17693    }
17694}
17695#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
17696pub struct ItemImplAliasGreen(pub GreenId);
17697impl TypedSyntaxNode for ItemImplAlias {
17698    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemImplAlias);
17699    type StablePtr = ItemImplAliasPtr;
17700    type Green = ItemImplAliasGreen;
17701    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
17702        ItemImplAliasGreen(
17703            Arc::new(GreenNode {
17704                kind: SyntaxKind::ItemImplAlias,
17705                details: GreenNodeDetails::Node {
17706                    children: vec![
17707                        AttributeList::missing(db).0,
17708                        Visibility::missing(db).0,
17709                        TerminalImpl::missing(db).0,
17710                        TerminalIdentifier::missing(db).0,
17711                        OptionWrappedGenericParamList::missing(db).0,
17712                        TerminalEq::missing(db).0,
17713                        ExprPath::missing(db).0,
17714                        TerminalSemicolon::missing(db).0,
17715                    ],
17716                    width: TextWidth::default(),
17717                },
17718            })
17719            .intern(db),
17720        )
17721    }
17722    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
17723        let kind = node.kind(db);
17724        assert_eq!(
17725            kind,
17726            SyntaxKind::ItemImplAlias,
17727            "Unexpected SyntaxKind {:?}. Expected {:?}.",
17728            kind,
17729            SyntaxKind::ItemImplAlias
17730        );
17731        let children = db.get_children(node.clone());
17732        Self { node, children }
17733    }
17734    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
17735        let kind = node.kind(db);
17736        if kind == SyntaxKind::ItemImplAlias {
17737            Some(Self::from_syntax_node(db, node))
17738        } else {
17739            None
17740        }
17741    }
17742    fn as_syntax_node(&self) -> SyntaxNode {
17743        self.node.clone()
17744    }
17745    fn stable_ptr(&self) -> Self::StablePtr {
17746        ItemImplAliasPtr(self.node.0.stable_ptr)
17747    }
17748}
17749impl From<&ItemImplAlias> for SyntaxStablePtrId {
17750    fn from(node: &ItemImplAlias) -> Self {
17751        node.stable_ptr().untyped()
17752    }
17753}
17754#[derive(Clone, Debug, Eq, Hash, PartialEq)]
17755pub struct ItemStruct {
17756    node: SyntaxNode,
17757    children: Arc<[SyntaxNode]>,
17758}
17759impl ItemStruct {
17760    pub const INDEX_ATTRIBUTES: usize = 0;
17761    pub const INDEX_VISIBILITY: usize = 1;
17762    pub const INDEX_STRUCT_KW: usize = 2;
17763    pub const INDEX_NAME: usize = 3;
17764    pub const INDEX_GENERIC_PARAMS: usize = 4;
17765    pub const INDEX_LBRACE: usize = 5;
17766    pub const INDEX_MEMBERS: usize = 6;
17767    pub const INDEX_RBRACE: usize = 7;
17768    pub fn new_green(
17769        db: &dyn SyntaxGroup,
17770        attributes: AttributeListGreen,
17771        visibility: VisibilityGreen,
17772        struct_kw: TerminalStructGreen,
17773        name: TerminalIdentifierGreen,
17774        generic_params: OptionWrappedGenericParamListGreen,
17775        lbrace: TerminalLBraceGreen,
17776        members: MemberListGreen,
17777        rbrace: TerminalRBraceGreen,
17778    ) -> ItemStructGreen {
17779        let children: Vec<GreenId> = vec![
17780            attributes.0,
17781            visibility.0,
17782            struct_kw.0,
17783            name.0,
17784            generic_params.0,
17785            lbrace.0,
17786            members.0,
17787            rbrace.0,
17788        ];
17789        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
17790        ItemStructGreen(
17791            Arc::new(GreenNode {
17792                kind: SyntaxKind::ItemStruct,
17793                details: GreenNodeDetails::Node { children, width },
17794            })
17795            .intern(db),
17796        )
17797    }
17798}
17799impl ItemStruct {
17800    pub fn attributes(&self, db: &dyn SyntaxGroup) -> AttributeList {
17801        AttributeList::from_syntax_node(db, self.children[0].clone())
17802    }
17803    pub fn visibility(&self, db: &dyn SyntaxGroup) -> Visibility {
17804        Visibility::from_syntax_node(db, self.children[1].clone())
17805    }
17806    pub fn struct_kw(&self, db: &dyn SyntaxGroup) -> TerminalStruct {
17807        TerminalStruct::from_syntax_node(db, self.children[2].clone())
17808    }
17809    pub fn name(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier {
17810        TerminalIdentifier::from_syntax_node(db, self.children[3].clone())
17811    }
17812    pub fn generic_params(&self, db: &dyn SyntaxGroup) -> OptionWrappedGenericParamList {
17813        OptionWrappedGenericParamList::from_syntax_node(db, self.children[4].clone())
17814    }
17815    pub fn lbrace(&self, db: &dyn SyntaxGroup) -> TerminalLBrace {
17816        TerminalLBrace::from_syntax_node(db, self.children[5].clone())
17817    }
17818    pub fn members(&self, db: &dyn SyntaxGroup) -> MemberList {
17819        MemberList::from_syntax_node(db, self.children[6].clone())
17820    }
17821    pub fn rbrace(&self, db: &dyn SyntaxGroup) -> TerminalRBrace {
17822        TerminalRBrace::from_syntax_node(db, self.children[7].clone())
17823    }
17824}
17825#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
17826pub struct ItemStructPtr(pub SyntaxStablePtrId);
17827impl ItemStructPtr {
17828    pub fn name_green(self, db: &dyn SyntaxGroup) -> TerminalIdentifierGreen {
17829        let ptr = self.0.lookup_intern(db);
17830        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
17831            TerminalIdentifierGreen(key_fields[0])
17832        } else {
17833            panic!("Unexpected key field query on root.");
17834        }
17835    }
17836}
17837impl TypedStablePtr for ItemStructPtr {
17838    type SyntaxNode = ItemStruct;
17839    fn untyped(&self) -> SyntaxStablePtrId {
17840        self.0
17841    }
17842    fn lookup(&self, db: &dyn SyntaxGroup) -> ItemStruct {
17843        ItemStruct::from_syntax_node(db, self.0.lookup(db))
17844    }
17845}
17846impl From<ItemStructPtr> for SyntaxStablePtrId {
17847    fn from(ptr: ItemStructPtr) -> Self {
17848        ptr.untyped()
17849    }
17850}
17851#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
17852pub struct ItemStructGreen(pub GreenId);
17853impl TypedSyntaxNode for ItemStruct {
17854    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemStruct);
17855    type StablePtr = ItemStructPtr;
17856    type Green = ItemStructGreen;
17857    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
17858        ItemStructGreen(
17859            Arc::new(GreenNode {
17860                kind: SyntaxKind::ItemStruct,
17861                details: GreenNodeDetails::Node {
17862                    children: vec![
17863                        AttributeList::missing(db).0,
17864                        Visibility::missing(db).0,
17865                        TerminalStruct::missing(db).0,
17866                        TerminalIdentifier::missing(db).0,
17867                        OptionWrappedGenericParamList::missing(db).0,
17868                        TerminalLBrace::missing(db).0,
17869                        MemberList::missing(db).0,
17870                        TerminalRBrace::missing(db).0,
17871                    ],
17872                    width: TextWidth::default(),
17873                },
17874            })
17875            .intern(db),
17876        )
17877    }
17878    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
17879        let kind = node.kind(db);
17880        assert_eq!(
17881            kind,
17882            SyntaxKind::ItemStruct,
17883            "Unexpected SyntaxKind {:?}. Expected {:?}.",
17884            kind,
17885            SyntaxKind::ItemStruct
17886        );
17887        let children = db.get_children(node.clone());
17888        Self { node, children }
17889    }
17890    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
17891        let kind = node.kind(db);
17892        if kind == SyntaxKind::ItemStruct { Some(Self::from_syntax_node(db, node)) } else { None }
17893    }
17894    fn as_syntax_node(&self) -> SyntaxNode {
17895        self.node.clone()
17896    }
17897    fn stable_ptr(&self) -> Self::StablePtr {
17898        ItemStructPtr(self.node.0.stable_ptr)
17899    }
17900}
17901impl From<&ItemStruct> for SyntaxStablePtrId {
17902    fn from(node: &ItemStruct) -> Self {
17903        node.stable_ptr().untyped()
17904    }
17905}
17906#[derive(Clone, Debug, Eq, Hash, PartialEq)]
17907pub struct ItemEnum {
17908    node: SyntaxNode,
17909    children: Arc<[SyntaxNode]>,
17910}
17911impl ItemEnum {
17912    pub const INDEX_ATTRIBUTES: usize = 0;
17913    pub const INDEX_VISIBILITY: usize = 1;
17914    pub const INDEX_ENUM_KW: usize = 2;
17915    pub const INDEX_NAME: usize = 3;
17916    pub const INDEX_GENERIC_PARAMS: usize = 4;
17917    pub const INDEX_LBRACE: usize = 5;
17918    pub const INDEX_VARIANTS: usize = 6;
17919    pub const INDEX_RBRACE: usize = 7;
17920    pub fn new_green(
17921        db: &dyn SyntaxGroup,
17922        attributes: AttributeListGreen,
17923        visibility: VisibilityGreen,
17924        enum_kw: TerminalEnumGreen,
17925        name: TerminalIdentifierGreen,
17926        generic_params: OptionWrappedGenericParamListGreen,
17927        lbrace: TerminalLBraceGreen,
17928        variants: VariantListGreen,
17929        rbrace: TerminalRBraceGreen,
17930    ) -> ItemEnumGreen {
17931        let children: Vec<GreenId> = vec![
17932            attributes.0,
17933            visibility.0,
17934            enum_kw.0,
17935            name.0,
17936            generic_params.0,
17937            lbrace.0,
17938            variants.0,
17939            rbrace.0,
17940        ];
17941        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
17942        ItemEnumGreen(
17943            Arc::new(GreenNode {
17944                kind: SyntaxKind::ItemEnum,
17945                details: GreenNodeDetails::Node { children, width },
17946            })
17947            .intern(db),
17948        )
17949    }
17950}
17951impl ItemEnum {
17952    pub fn attributes(&self, db: &dyn SyntaxGroup) -> AttributeList {
17953        AttributeList::from_syntax_node(db, self.children[0].clone())
17954    }
17955    pub fn visibility(&self, db: &dyn SyntaxGroup) -> Visibility {
17956        Visibility::from_syntax_node(db, self.children[1].clone())
17957    }
17958    pub fn enum_kw(&self, db: &dyn SyntaxGroup) -> TerminalEnum {
17959        TerminalEnum::from_syntax_node(db, self.children[2].clone())
17960    }
17961    pub fn name(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier {
17962        TerminalIdentifier::from_syntax_node(db, self.children[3].clone())
17963    }
17964    pub fn generic_params(&self, db: &dyn SyntaxGroup) -> OptionWrappedGenericParamList {
17965        OptionWrappedGenericParamList::from_syntax_node(db, self.children[4].clone())
17966    }
17967    pub fn lbrace(&self, db: &dyn SyntaxGroup) -> TerminalLBrace {
17968        TerminalLBrace::from_syntax_node(db, self.children[5].clone())
17969    }
17970    pub fn variants(&self, db: &dyn SyntaxGroup) -> VariantList {
17971        VariantList::from_syntax_node(db, self.children[6].clone())
17972    }
17973    pub fn rbrace(&self, db: &dyn SyntaxGroup) -> TerminalRBrace {
17974        TerminalRBrace::from_syntax_node(db, self.children[7].clone())
17975    }
17976}
17977#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
17978pub struct ItemEnumPtr(pub SyntaxStablePtrId);
17979impl ItemEnumPtr {
17980    pub fn name_green(self, db: &dyn SyntaxGroup) -> TerminalIdentifierGreen {
17981        let ptr = self.0.lookup_intern(db);
17982        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
17983            TerminalIdentifierGreen(key_fields[0])
17984        } else {
17985            panic!("Unexpected key field query on root.");
17986        }
17987    }
17988}
17989impl TypedStablePtr for ItemEnumPtr {
17990    type SyntaxNode = ItemEnum;
17991    fn untyped(&self) -> SyntaxStablePtrId {
17992        self.0
17993    }
17994    fn lookup(&self, db: &dyn SyntaxGroup) -> ItemEnum {
17995        ItemEnum::from_syntax_node(db, self.0.lookup(db))
17996    }
17997}
17998impl From<ItemEnumPtr> for SyntaxStablePtrId {
17999    fn from(ptr: ItemEnumPtr) -> Self {
18000        ptr.untyped()
18001    }
18002}
18003#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
18004pub struct ItemEnumGreen(pub GreenId);
18005impl TypedSyntaxNode for ItemEnum {
18006    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemEnum);
18007    type StablePtr = ItemEnumPtr;
18008    type Green = ItemEnumGreen;
18009    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
18010        ItemEnumGreen(
18011            Arc::new(GreenNode {
18012                kind: SyntaxKind::ItemEnum,
18013                details: GreenNodeDetails::Node {
18014                    children: vec![
18015                        AttributeList::missing(db).0,
18016                        Visibility::missing(db).0,
18017                        TerminalEnum::missing(db).0,
18018                        TerminalIdentifier::missing(db).0,
18019                        OptionWrappedGenericParamList::missing(db).0,
18020                        TerminalLBrace::missing(db).0,
18021                        VariantList::missing(db).0,
18022                        TerminalRBrace::missing(db).0,
18023                    ],
18024                    width: TextWidth::default(),
18025                },
18026            })
18027            .intern(db),
18028        )
18029    }
18030    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
18031        let kind = node.kind(db);
18032        assert_eq!(
18033            kind,
18034            SyntaxKind::ItemEnum,
18035            "Unexpected SyntaxKind {:?}. Expected {:?}.",
18036            kind,
18037            SyntaxKind::ItemEnum
18038        );
18039        let children = db.get_children(node.clone());
18040        Self { node, children }
18041    }
18042    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
18043        let kind = node.kind(db);
18044        if kind == SyntaxKind::ItemEnum { Some(Self::from_syntax_node(db, node)) } else { None }
18045    }
18046    fn as_syntax_node(&self) -> SyntaxNode {
18047        self.node.clone()
18048    }
18049    fn stable_ptr(&self) -> Self::StablePtr {
18050        ItemEnumPtr(self.node.0.stable_ptr)
18051    }
18052}
18053impl From<&ItemEnum> for SyntaxStablePtrId {
18054    fn from(node: &ItemEnum) -> Self {
18055        node.stable_ptr().untyped()
18056    }
18057}
18058#[derive(Clone, Debug, Eq, Hash, PartialEq)]
18059pub struct ItemTypeAlias {
18060    node: SyntaxNode,
18061    children: Arc<[SyntaxNode]>,
18062}
18063impl ItemTypeAlias {
18064    pub const INDEX_ATTRIBUTES: usize = 0;
18065    pub const INDEX_VISIBILITY: usize = 1;
18066    pub const INDEX_TYPE_KW: usize = 2;
18067    pub const INDEX_NAME: usize = 3;
18068    pub const INDEX_GENERIC_PARAMS: usize = 4;
18069    pub const INDEX_EQ: usize = 5;
18070    pub const INDEX_TY: usize = 6;
18071    pub const INDEX_SEMICOLON: usize = 7;
18072    pub fn new_green(
18073        db: &dyn SyntaxGroup,
18074        attributes: AttributeListGreen,
18075        visibility: VisibilityGreen,
18076        type_kw: TerminalTypeGreen,
18077        name: TerminalIdentifierGreen,
18078        generic_params: OptionWrappedGenericParamListGreen,
18079        eq: TerminalEqGreen,
18080        ty: ExprGreen,
18081        semicolon: TerminalSemicolonGreen,
18082    ) -> ItemTypeAliasGreen {
18083        let children: Vec<GreenId> = vec![
18084            attributes.0,
18085            visibility.0,
18086            type_kw.0,
18087            name.0,
18088            generic_params.0,
18089            eq.0,
18090            ty.0,
18091            semicolon.0,
18092        ];
18093        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
18094        ItemTypeAliasGreen(
18095            Arc::new(GreenNode {
18096                kind: SyntaxKind::ItemTypeAlias,
18097                details: GreenNodeDetails::Node { children, width },
18098            })
18099            .intern(db),
18100        )
18101    }
18102}
18103impl ItemTypeAlias {
18104    pub fn attributes(&self, db: &dyn SyntaxGroup) -> AttributeList {
18105        AttributeList::from_syntax_node(db, self.children[0].clone())
18106    }
18107    pub fn visibility(&self, db: &dyn SyntaxGroup) -> Visibility {
18108        Visibility::from_syntax_node(db, self.children[1].clone())
18109    }
18110    pub fn type_kw(&self, db: &dyn SyntaxGroup) -> TerminalType {
18111        TerminalType::from_syntax_node(db, self.children[2].clone())
18112    }
18113    pub fn name(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier {
18114        TerminalIdentifier::from_syntax_node(db, self.children[3].clone())
18115    }
18116    pub fn generic_params(&self, db: &dyn SyntaxGroup) -> OptionWrappedGenericParamList {
18117        OptionWrappedGenericParamList::from_syntax_node(db, self.children[4].clone())
18118    }
18119    pub fn eq(&self, db: &dyn SyntaxGroup) -> TerminalEq {
18120        TerminalEq::from_syntax_node(db, self.children[5].clone())
18121    }
18122    pub fn ty(&self, db: &dyn SyntaxGroup) -> Expr {
18123        Expr::from_syntax_node(db, self.children[6].clone())
18124    }
18125    pub fn semicolon(&self, db: &dyn SyntaxGroup) -> TerminalSemicolon {
18126        TerminalSemicolon::from_syntax_node(db, self.children[7].clone())
18127    }
18128}
18129#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
18130pub struct ItemTypeAliasPtr(pub SyntaxStablePtrId);
18131impl ItemTypeAliasPtr {
18132    pub fn name_green(self, db: &dyn SyntaxGroup) -> TerminalIdentifierGreen {
18133        let ptr = self.0.lookup_intern(db);
18134        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
18135            TerminalIdentifierGreen(key_fields[0])
18136        } else {
18137            panic!("Unexpected key field query on root.");
18138        }
18139    }
18140}
18141impl TypedStablePtr for ItemTypeAliasPtr {
18142    type SyntaxNode = ItemTypeAlias;
18143    fn untyped(&self) -> SyntaxStablePtrId {
18144        self.0
18145    }
18146    fn lookup(&self, db: &dyn SyntaxGroup) -> ItemTypeAlias {
18147        ItemTypeAlias::from_syntax_node(db, self.0.lookup(db))
18148    }
18149}
18150impl From<ItemTypeAliasPtr> for SyntaxStablePtrId {
18151    fn from(ptr: ItemTypeAliasPtr) -> Self {
18152        ptr.untyped()
18153    }
18154}
18155#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
18156pub struct ItemTypeAliasGreen(pub GreenId);
18157impl TypedSyntaxNode for ItemTypeAlias {
18158    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemTypeAlias);
18159    type StablePtr = ItemTypeAliasPtr;
18160    type Green = ItemTypeAliasGreen;
18161    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
18162        ItemTypeAliasGreen(
18163            Arc::new(GreenNode {
18164                kind: SyntaxKind::ItemTypeAlias,
18165                details: GreenNodeDetails::Node {
18166                    children: vec![
18167                        AttributeList::missing(db).0,
18168                        Visibility::missing(db).0,
18169                        TerminalType::missing(db).0,
18170                        TerminalIdentifier::missing(db).0,
18171                        OptionWrappedGenericParamList::missing(db).0,
18172                        TerminalEq::missing(db).0,
18173                        Expr::missing(db).0,
18174                        TerminalSemicolon::missing(db).0,
18175                    ],
18176                    width: TextWidth::default(),
18177                },
18178            })
18179            .intern(db),
18180        )
18181    }
18182    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
18183        let kind = node.kind(db);
18184        assert_eq!(
18185            kind,
18186            SyntaxKind::ItemTypeAlias,
18187            "Unexpected SyntaxKind {:?}. Expected {:?}.",
18188            kind,
18189            SyntaxKind::ItemTypeAlias
18190        );
18191        let children = db.get_children(node.clone());
18192        Self { node, children }
18193    }
18194    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
18195        let kind = node.kind(db);
18196        if kind == SyntaxKind::ItemTypeAlias {
18197            Some(Self::from_syntax_node(db, node))
18198        } else {
18199            None
18200        }
18201    }
18202    fn as_syntax_node(&self) -> SyntaxNode {
18203        self.node.clone()
18204    }
18205    fn stable_ptr(&self) -> Self::StablePtr {
18206        ItemTypeAliasPtr(self.node.0.stable_ptr)
18207    }
18208}
18209impl From<&ItemTypeAlias> for SyntaxStablePtrId {
18210    fn from(node: &ItemTypeAlias) -> Self {
18211        node.stable_ptr().untyped()
18212    }
18213}
18214#[derive(Clone, Debug, Eq, Hash, PartialEq)]
18215pub struct ItemUse {
18216    node: SyntaxNode,
18217    children: Arc<[SyntaxNode]>,
18218}
18219impl ItemUse {
18220    pub const INDEX_ATTRIBUTES: usize = 0;
18221    pub const INDEX_VISIBILITY: usize = 1;
18222    pub const INDEX_USE_KW: usize = 2;
18223    pub const INDEX_USE_PATH: usize = 3;
18224    pub const INDEX_SEMICOLON: usize = 4;
18225    pub fn new_green(
18226        db: &dyn SyntaxGroup,
18227        attributes: AttributeListGreen,
18228        visibility: VisibilityGreen,
18229        use_kw: TerminalUseGreen,
18230        use_path: UsePathGreen,
18231        semicolon: TerminalSemicolonGreen,
18232    ) -> ItemUseGreen {
18233        let children: Vec<GreenId> =
18234            vec![attributes.0, visibility.0, use_kw.0, use_path.0, semicolon.0];
18235        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
18236        ItemUseGreen(
18237            Arc::new(GreenNode {
18238                kind: SyntaxKind::ItemUse,
18239                details: GreenNodeDetails::Node { children, width },
18240            })
18241            .intern(db),
18242        )
18243    }
18244}
18245impl ItemUse {
18246    pub fn attributes(&self, db: &dyn SyntaxGroup) -> AttributeList {
18247        AttributeList::from_syntax_node(db, self.children[0].clone())
18248    }
18249    pub fn visibility(&self, db: &dyn SyntaxGroup) -> Visibility {
18250        Visibility::from_syntax_node(db, self.children[1].clone())
18251    }
18252    pub fn use_kw(&self, db: &dyn SyntaxGroup) -> TerminalUse {
18253        TerminalUse::from_syntax_node(db, self.children[2].clone())
18254    }
18255    pub fn use_path(&self, db: &dyn SyntaxGroup) -> UsePath {
18256        UsePath::from_syntax_node(db, self.children[3].clone())
18257    }
18258    pub fn semicolon(&self, db: &dyn SyntaxGroup) -> TerminalSemicolon {
18259        TerminalSemicolon::from_syntax_node(db, self.children[4].clone())
18260    }
18261}
18262#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
18263pub struct ItemUsePtr(pub SyntaxStablePtrId);
18264impl ItemUsePtr {
18265    pub fn use_path_green(self, db: &dyn SyntaxGroup) -> UsePathGreen {
18266        let ptr = self.0.lookup_intern(db);
18267        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
18268            UsePathGreen(key_fields[0])
18269        } else {
18270            panic!("Unexpected key field query on root.");
18271        }
18272    }
18273}
18274impl TypedStablePtr for ItemUsePtr {
18275    type SyntaxNode = ItemUse;
18276    fn untyped(&self) -> SyntaxStablePtrId {
18277        self.0
18278    }
18279    fn lookup(&self, db: &dyn SyntaxGroup) -> ItemUse {
18280        ItemUse::from_syntax_node(db, self.0.lookup(db))
18281    }
18282}
18283impl From<ItemUsePtr> for SyntaxStablePtrId {
18284    fn from(ptr: ItemUsePtr) -> Self {
18285        ptr.untyped()
18286    }
18287}
18288#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
18289pub struct ItemUseGreen(pub GreenId);
18290impl TypedSyntaxNode for ItemUse {
18291    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemUse);
18292    type StablePtr = ItemUsePtr;
18293    type Green = ItemUseGreen;
18294    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
18295        ItemUseGreen(
18296            Arc::new(GreenNode {
18297                kind: SyntaxKind::ItemUse,
18298                details: GreenNodeDetails::Node {
18299                    children: vec![
18300                        AttributeList::missing(db).0,
18301                        Visibility::missing(db).0,
18302                        TerminalUse::missing(db).0,
18303                        UsePath::missing(db).0,
18304                        TerminalSemicolon::missing(db).0,
18305                    ],
18306                    width: TextWidth::default(),
18307                },
18308            })
18309            .intern(db),
18310        )
18311    }
18312    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
18313        let kind = node.kind(db);
18314        assert_eq!(
18315            kind,
18316            SyntaxKind::ItemUse,
18317            "Unexpected SyntaxKind {:?}. Expected {:?}.",
18318            kind,
18319            SyntaxKind::ItemUse
18320        );
18321        let children = db.get_children(node.clone());
18322        Self { node, children }
18323    }
18324    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
18325        let kind = node.kind(db);
18326        if kind == SyntaxKind::ItemUse { Some(Self::from_syntax_node(db, node)) } else { None }
18327    }
18328    fn as_syntax_node(&self) -> SyntaxNode {
18329        self.node.clone()
18330    }
18331    fn stable_ptr(&self) -> Self::StablePtr {
18332        ItemUsePtr(self.node.0.stable_ptr)
18333    }
18334}
18335impl From<&ItemUse> for SyntaxStablePtrId {
18336    fn from(node: &ItemUse) -> Self {
18337        node.stable_ptr().untyped()
18338    }
18339}
18340#[derive(Clone, Debug, Eq, Hash, PartialEq)]
18341pub enum UsePath {
18342    Leaf(UsePathLeaf),
18343    Single(UsePathSingle),
18344    Multi(UsePathMulti),
18345    Star(UsePathStar),
18346}
18347#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
18348pub struct UsePathPtr(pub SyntaxStablePtrId);
18349impl TypedStablePtr for UsePathPtr {
18350    type SyntaxNode = UsePath;
18351    fn untyped(&self) -> SyntaxStablePtrId {
18352        self.0
18353    }
18354    fn lookup(&self, db: &dyn SyntaxGroup) -> UsePath {
18355        UsePath::from_syntax_node(db, self.0.lookup(db))
18356    }
18357}
18358impl From<UsePathPtr> for SyntaxStablePtrId {
18359    fn from(ptr: UsePathPtr) -> Self {
18360        ptr.untyped()
18361    }
18362}
18363impl From<UsePathLeafPtr> for UsePathPtr {
18364    fn from(value: UsePathLeafPtr) -> Self {
18365        Self(value.0)
18366    }
18367}
18368impl From<UsePathSinglePtr> for UsePathPtr {
18369    fn from(value: UsePathSinglePtr) -> Self {
18370        Self(value.0)
18371    }
18372}
18373impl From<UsePathMultiPtr> for UsePathPtr {
18374    fn from(value: UsePathMultiPtr) -> Self {
18375        Self(value.0)
18376    }
18377}
18378impl From<UsePathStarPtr> for UsePathPtr {
18379    fn from(value: UsePathStarPtr) -> Self {
18380        Self(value.0)
18381    }
18382}
18383impl From<UsePathLeafGreen> for UsePathGreen {
18384    fn from(value: UsePathLeafGreen) -> Self {
18385        Self(value.0)
18386    }
18387}
18388impl From<UsePathSingleGreen> for UsePathGreen {
18389    fn from(value: UsePathSingleGreen) -> Self {
18390        Self(value.0)
18391    }
18392}
18393impl From<UsePathMultiGreen> for UsePathGreen {
18394    fn from(value: UsePathMultiGreen) -> Self {
18395        Self(value.0)
18396    }
18397}
18398impl From<UsePathStarGreen> for UsePathGreen {
18399    fn from(value: UsePathStarGreen) -> Self {
18400        Self(value.0)
18401    }
18402}
18403#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
18404pub struct UsePathGreen(pub GreenId);
18405impl TypedSyntaxNode for UsePath {
18406    const OPTIONAL_KIND: Option<SyntaxKind> = None;
18407    type StablePtr = UsePathPtr;
18408    type Green = UsePathGreen;
18409    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
18410        panic!("No missing variant.");
18411    }
18412    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
18413        let kind = node.kind(db);
18414        match kind {
18415            SyntaxKind::UsePathLeaf => UsePath::Leaf(UsePathLeaf::from_syntax_node(db, node)),
18416            SyntaxKind::UsePathSingle => UsePath::Single(UsePathSingle::from_syntax_node(db, node)),
18417            SyntaxKind::UsePathMulti => UsePath::Multi(UsePathMulti::from_syntax_node(db, node)),
18418            SyntaxKind::UsePathStar => UsePath::Star(UsePathStar::from_syntax_node(db, node)),
18419            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "UsePath"),
18420        }
18421    }
18422    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
18423        let kind = node.kind(db);
18424        match kind {
18425            SyntaxKind::UsePathLeaf => Some(UsePath::Leaf(UsePathLeaf::from_syntax_node(db, node))),
18426            SyntaxKind::UsePathSingle => {
18427                Some(UsePath::Single(UsePathSingle::from_syntax_node(db, node)))
18428            }
18429            SyntaxKind::UsePathMulti => {
18430                Some(UsePath::Multi(UsePathMulti::from_syntax_node(db, node)))
18431            }
18432            SyntaxKind::UsePathStar => Some(UsePath::Star(UsePathStar::from_syntax_node(db, node))),
18433            _ => None,
18434        }
18435    }
18436    fn as_syntax_node(&self) -> SyntaxNode {
18437        match self {
18438            UsePath::Leaf(x) => x.as_syntax_node(),
18439            UsePath::Single(x) => x.as_syntax_node(),
18440            UsePath::Multi(x) => x.as_syntax_node(),
18441            UsePath::Star(x) => x.as_syntax_node(),
18442        }
18443    }
18444    fn stable_ptr(&self) -> Self::StablePtr {
18445        UsePathPtr(self.as_syntax_node().0.stable_ptr)
18446    }
18447}
18448impl From<&UsePath> for SyntaxStablePtrId {
18449    fn from(node: &UsePath) -> Self {
18450        node.stable_ptr().untyped()
18451    }
18452}
18453impl UsePath {
18454    /// Checks if a kind of a variant of [UsePath].
18455    pub fn is_variant(kind: SyntaxKind) -> bool {
18456        matches!(
18457            kind,
18458            SyntaxKind::UsePathLeaf
18459                | SyntaxKind::UsePathSingle
18460                | SyntaxKind::UsePathMulti
18461                | SyntaxKind::UsePathStar
18462        )
18463    }
18464}
18465#[derive(Clone, Debug, Eq, Hash, PartialEq)]
18466pub struct UsePathLeaf {
18467    node: SyntaxNode,
18468    children: Arc<[SyntaxNode]>,
18469}
18470impl UsePathLeaf {
18471    pub const INDEX_IDENT: usize = 0;
18472    pub const INDEX_ALIAS_CLAUSE: usize = 1;
18473    pub fn new_green(
18474        db: &dyn SyntaxGroup,
18475        ident: PathSegmentGreen,
18476        alias_clause: OptionAliasClauseGreen,
18477    ) -> UsePathLeafGreen {
18478        let children: Vec<GreenId> = vec![ident.0, alias_clause.0];
18479        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
18480        UsePathLeafGreen(
18481            Arc::new(GreenNode {
18482                kind: SyntaxKind::UsePathLeaf,
18483                details: GreenNodeDetails::Node { children, width },
18484            })
18485            .intern(db),
18486        )
18487    }
18488}
18489impl UsePathLeaf {
18490    pub fn ident(&self, db: &dyn SyntaxGroup) -> PathSegment {
18491        PathSegment::from_syntax_node(db, self.children[0].clone())
18492    }
18493    pub fn alias_clause(&self, db: &dyn SyntaxGroup) -> OptionAliasClause {
18494        OptionAliasClause::from_syntax_node(db, self.children[1].clone())
18495    }
18496}
18497#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
18498pub struct UsePathLeafPtr(pub SyntaxStablePtrId);
18499impl UsePathLeafPtr {
18500    pub fn ident_green(self, db: &dyn SyntaxGroup) -> PathSegmentGreen {
18501        let ptr = self.0.lookup_intern(db);
18502        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
18503            PathSegmentGreen(key_fields[0])
18504        } else {
18505            panic!("Unexpected key field query on root.");
18506        }
18507    }
18508    pub fn alias_clause_green(self, db: &dyn SyntaxGroup) -> OptionAliasClauseGreen {
18509        let ptr = self.0.lookup_intern(db);
18510        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
18511            OptionAliasClauseGreen(key_fields[1])
18512        } else {
18513            panic!("Unexpected key field query on root.");
18514        }
18515    }
18516}
18517impl TypedStablePtr for UsePathLeafPtr {
18518    type SyntaxNode = UsePathLeaf;
18519    fn untyped(&self) -> SyntaxStablePtrId {
18520        self.0
18521    }
18522    fn lookup(&self, db: &dyn SyntaxGroup) -> UsePathLeaf {
18523        UsePathLeaf::from_syntax_node(db, self.0.lookup(db))
18524    }
18525}
18526impl From<UsePathLeafPtr> for SyntaxStablePtrId {
18527    fn from(ptr: UsePathLeafPtr) -> Self {
18528        ptr.untyped()
18529    }
18530}
18531#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
18532pub struct UsePathLeafGreen(pub GreenId);
18533impl TypedSyntaxNode for UsePathLeaf {
18534    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::UsePathLeaf);
18535    type StablePtr = UsePathLeafPtr;
18536    type Green = UsePathLeafGreen;
18537    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
18538        UsePathLeafGreen(
18539            Arc::new(GreenNode {
18540                kind: SyntaxKind::UsePathLeaf,
18541                details: GreenNodeDetails::Node {
18542                    children: vec![PathSegment::missing(db).0, OptionAliasClause::missing(db).0],
18543                    width: TextWidth::default(),
18544                },
18545            })
18546            .intern(db),
18547        )
18548    }
18549    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
18550        let kind = node.kind(db);
18551        assert_eq!(
18552            kind,
18553            SyntaxKind::UsePathLeaf,
18554            "Unexpected SyntaxKind {:?}. Expected {:?}.",
18555            kind,
18556            SyntaxKind::UsePathLeaf
18557        );
18558        let children = db.get_children(node.clone());
18559        Self { node, children }
18560    }
18561    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
18562        let kind = node.kind(db);
18563        if kind == SyntaxKind::UsePathLeaf { Some(Self::from_syntax_node(db, node)) } else { None }
18564    }
18565    fn as_syntax_node(&self) -> SyntaxNode {
18566        self.node.clone()
18567    }
18568    fn stable_ptr(&self) -> Self::StablePtr {
18569        UsePathLeafPtr(self.node.0.stable_ptr)
18570    }
18571}
18572impl From<&UsePathLeaf> for SyntaxStablePtrId {
18573    fn from(node: &UsePathLeaf) -> Self {
18574        node.stable_ptr().untyped()
18575    }
18576}
18577#[derive(Clone, Debug, Eq, Hash, PartialEq)]
18578pub struct UsePathSingle {
18579    node: SyntaxNode,
18580    children: Arc<[SyntaxNode]>,
18581}
18582impl UsePathSingle {
18583    pub const INDEX_IDENT: usize = 0;
18584    pub const INDEX_COLON_COLON: usize = 1;
18585    pub const INDEX_USE_PATH: usize = 2;
18586    pub fn new_green(
18587        db: &dyn SyntaxGroup,
18588        ident: PathSegmentGreen,
18589        colon_colon: TerminalColonColonGreen,
18590        use_path: UsePathGreen,
18591    ) -> UsePathSingleGreen {
18592        let children: Vec<GreenId> = vec![ident.0, colon_colon.0, use_path.0];
18593        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
18594        UsePathSingleGreen(
18595            Arc::new(GreenNode {
18596                kind: SyntaxKind::UsePathSingle,
18597                details: GreenNodeDetails::Node { children, width },
18598            })
18599            .intern(db),
18600        )
18601    }
18602}
18603impl UsePathSingle {
18604    pub fn ident(&self, db: &dyn SyntaxGroup) -> PathSegment {
18605        PathSegment::from_syntax_node(db, self.children[0].clone())
18606    }
18607    pub fn colon_colon(&self, db: &dyn SyntaxGroup) -> TerminalColonColon {
18608        TerminalColonColon::from_syntax_node(db, self.children[1].clone())
18609    }
18610    pub fn use_path(&self, db: &dyn SyntaxGroup) -> UsePath {
18611        UsePath::from_syntax_node(db, self.children[2].clone())
18612    }
18613}
18614#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
18615pub struct UsePathSinglePtr(pub SyntaxStablePtrId);
18616impl UsePathSinglePtr {}
18617impl TypedStablePtr for UsePathSinglePtr {
18618    type SyntaxNode = UsePathSingle;
18619    fn untyped(&self) -> SyntaxStablePtrId {
18620        self.0
18621    }
18622    fn lookup(&self, db: &dyn SyntaxGroup) -> UsePathSingle {
18623        UsePathSingle::from_syntax_node(db, self.0.lookup(db))
18624    }
18625}
18626impl From<UsePathSinglePtr> for SyntaxStablePtrId {
18627    fn from(ptr: UsePathSinglePtr) -> Self {
18628        ptr.untyped()
18629    }
18630}
18631#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
18632pub struct UsePathSingleGreen(pub GreenId);
18633impl TypedSyntaxNode for UsePathSingle {
18634    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::UsePathSingle);
18635    type StablePtr = UsePathSinglePtr;
18636    type Green = UsePathSingleGreen;
18637    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
18638        UsePathSingleGreen(
18639            Arc::new(GreenNode {
18640                kind: SyntaxKind::UsePathSingle,
18641                details: GreenNodeDetails::Node {
18642                    children: vec![
18643                        PathSegment::missing(db).0,
18644                        TerminalColonColon::missing(db).0,
18645                        UsePath::missing(db).0,
18646                    ],
18647                    width: TextWidth::default(),
18648                },
18649            })
18650            .intern(db),
18651        )
18652    }
18653    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
18654        let kind = node.kind(db);
18655        assert_eq!(
18656            kind,
18657            SyntaxKind::UsePathSingle,
18658            "Unexpected SyntaxKind {:?}. Expected {:?}.",
18659            kind,
18660            SyntaxKind::UsePathSingle
18661        );
18662        let children = db.get_children(node.clone());
18663        Self { node, children }
18664    }
18665    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
18666        let kind = node.kind(db);
18667        if kind == SyntaxKind::UsePathSingle {
18668            Some(Self::from_syntax_node(db, node))
18669        } else {
18670            None
18671        }
18672    }
18673    fn as_syntax_node(&self) -> SyntaxNode {
18674        self.node.clone()
18675    }
18676    fn stable_ptr(&self) -> Self::StablePtr {
18677        UsePathSinglePtr(self.node.0.stable_ptr)
18678    }
18679}
18680impl From<&UsePathSingle> for SyntaxStablePtrId {
18681    fn from(node: &UsePathSingle) -> Self {
18682        node.stable_ptr().untyped()
18683    }
18684}
18685#[derive(Clone, Debug, Eq, Hash, PartialEq)]
18686pub struct UsePathMulti {
18687    node: SyntaxNode,
18688    children: Arc<[SyntaxNode]>,
18689}
18690impl UsePathMulti {
18691    pub const INDEX_LBRACE: usize = 0;
18692    pub const INDEX_USE_PATHS: usize = 1;
18693    pub const INDEX_RBRACE: usize = 2;
18694    pub fn new_green(
18695        db: &dyn SyntaxGroup,
18696        lbrace: TerminalLBraceGreen,
18697        use_paths: UsePathListGreen,
18698        rbrace: TerminalRBraceGreen,
18699    ) -> UsePathMultiGreen {
18700        let children: Vec<GreenId> = vec![lbrace.0, use_paths.0, rbrace.0];
18701        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
18702        UsePathMultiGreen(
18703            Arc::new(GreenNode {
18704                kind: SyntaxKind::UsePathMulti,
18705                details: GreenNodeDetails::Node { children, width },
18706            })
18707            .intern(db),
18708        )
18709    }
18710}
18711impl UsePathMulti {
18712    pub fn lbrace(&self, db: &dyn SyntaxGroup) -> TerminalLBrace {
18713        TerminalLBrace::from_syntax_node(db, self.children[0].clone())
18714    }
18715    pub fn use_paths(&self, db: &dyn SyntaxGroup) -> UsePathList {
18716        UsePathList::from_syntax_node(db, self.children[1].clone())
18717    }
18718    pub fn rbrace(&self, db: &dyn SyntaxGroup) -> TerminalRBrace {
18719        TerminalRBrace::from_syntax_node(db, self.children[2].clone())
18720    }
18721}
18722#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
18723pub struct UsePathMultiPtr(pub SyntaxStablePtrId);
18724impl UsePathMultiPtr {}
18725impl TypedStablePtr for UsePathMultiPtr {
18726    type SyntaxNode = UsePathMulti;
18727    fn untyped(&self) -> SyntaxStablePtrId {
18728        self.0
18729    }
18730    fn lookup(&self, db: &dyn SyntaxGroup) -> UsePathMulti {
18731        UsePathMulti::from_syntax_node(db, self.0.lookup(db))
18732    }
18733}
18734impl From<UsePathMultiPtr> for SyntaxStablePtrId {
18735    fn from(ptr: UsePathMultiPtr) -> Self {
18736        ptr.untyped()
18737    }
18738}
18739#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
18740pub struct UsePathMultiGreen(pub GreenId);
18741impl TypedSyntaxNode for UsePathMulti {
18742    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::UsePathMulti);
18743    type StablePtr = UsePathMultiPtr;
18744    type Green = UsePathMultiGreen;
18745    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
18746        UsePathMultiGreen(
18747            Arc::new(GreenNode {
18748                kind: SyntaxKind::UsePathMulti,
18749                details: GreenNodeDetails::Node {
18750                    children: vec![
18751                        TerminalLBrace::missing(db).0,
18752                        UsePathList::missing(db).0,
18753                        TerminalRBrace::missing(db).0,
18754                    ],
18755                    width: TextWidth::default(),
18756                },
18757            })
18758            .intern(db),
18759        )
18760    }
18761    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
18762        let kind = node.kind(db);
18763        assert_eq!(
18764            kind,
18765            SyntaxKind::UsePathMulti,
18766            "Unexpected SyntaxKind {:?}. Expected {:?}.",
18767            kind,
18768            SyntaxKind::UsePathMulti
18769        );
18770        let children = db.get_children(node.clone());
18771        Self { node, children }
18772    }
18773    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
18774        let kind = node.kind(db);
18775        if kind == SyntaxKind::UsePathMulti { Some(Self::from_syntax_node(db, node)) } else { None }
18776    }
18777    fn as_syntax_node(&self) -> SyntaxNode {
18778        self.node.clone()
18779    }
18780    fn stable_ptr(&self) -> Self::StablePtr {
18781        UsePathMultiPtr(self.node.0.stable_ptr)
18782    }
18783}
18784impl From<&UsePathMulti> for SyntaxStablePtrId {
18785    fn from(node: &UsePathMulti) -> Self {
18786        node.stable_ptr().untyped()
18787    }
18788}
18789#[derive(Clone, Debug, Eq, Hash, PartialEq)]
18790pub struct UsePathStar {
18791    node: SyntaxNode,
18792    children: Arc<[SyntaxNode]>,
18793}
18794impl UsePathStar {
18795    pub const INDEX_STAR: usize = 0;
18796    pub fn new_green(db: &dyn SyntaxGroup, star: TerminalMulGreen) -> UsePathStarGreen {
18797        let children: Vec<GreenId> = vec![star.0];
18798        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
18799        UsePathStarGreen(
18800            Arc::new(GreenNode {
18801                kind: SyntaxKind::UsePathStar,
18802                details: GreenNodeDetails::Node { children, width },
18803            })
18804            .intern(db),
18805        )
18806    }
18807}
18808impl UsePathStar {
18809    pub fn star(&self, db: &dyn SyntaxGroup) -> TerminalMul {
18810        TerminalMul::from_syntax_node(db, self.children[0].clone())
18811    }
18812}
18813#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
18814pub struct UsePathStarPtr(pub SyntaxStablePtrId);
18815impl UsePathStarPtr {}
18816impl TypedStablePtr for UsePathStarPtr {
18817    type SyntaxNode = UsePathStar;
18818    fn untyped(&self) -> SyntaxStablePtrId {
18819        self.0
18820    }
18821    fn lookup(&self, db: &dyn SyntaxGroup) -> UsePathStar {
18822        UsePathStar::from_syntax_node(db, self.0.lookup(db))
18823    }
18824}
18825impl From<UsePathStarPtr> for SyntaxStablePtrId {
18826    fn from(ptr: UsePathStarPtr) -> Self {
18827        ptr.untyped()
18828    }
18829}
18830#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
18831pub struct UsePathStarGreen(pub GreenId);
18832impl TypedSyntaxNode for UsePathStar {
18833    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::UsePathStar);
18834    type StablePtr = UsePathStarPtr;
18835    type Green = UsePathStarGreen;
18836    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
18837        UsePathStarGreen(
18838            Arc::new(GreenNode {
18839                kind: SyntaxKind::UsePathStar,
18840                details: GreenNodeDetails::Node {
18841                    children: vec![TerminalMul::missing(db).0],
18842                    width: TextWidth::default(),
18843                },
18844            })
18845            .intern(db),
18846        )
18847    }
18848    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
18849        let kind = node.kind(db);
18850        assert_eq!(
18851            kind,
18852            SyntaxKind::UsePathStar,
18853            "Unexpected SyntaxKind {:?}. Expected {:?}.",
18854            kind,
18855            SyntaxKind::UsePathStar
18856        );
18857        let children = db.get_children(node.clone());
18858        Self { node, children }
18859    }
18860    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
18861        let kind = node.kind(db);
18862        if kind == SyntaxKind::UsePathStar { Some(Self::from_syntax_node(db, node)) } else { None }
18863    }
18864    fn as_syntax_node(&self) -> SyntaxNode {
18865        self.node.clone()
18866    }
18867    fn stable_ptr(&self) -> Self::StablePtr {
18868        UsePathStarPtr(self.node.0.stable_ptr)
18869    }
18870}
18871impl From<&UsePathStar> for SyntaxStablePtrId {
18872    fn from(node: &UsePathStar) -> Self {
18873        node.stable_ptr().untyped()
18874    }
18875}
18876#[derive(Clone, Debug, Eq, Hash, PartialEq)]
18877pub struct UsePathList(ElementList<UsePath, 2>);
18878impl Deref for UsePathList {
18879    type Target = ElementList<UsePath, 2>;
18880    fn deref(&self) -> &Self::Target {
18881        &self.0
18882    }
18883}
18884impl UsePathList {
18885    pub fn new_green(
18886        db: &dyn SyntaxGroup,
18887        children: Vec<UsePathListElementOrSeparatorGreen>,
18888    ) -> UsePathListGreen {
18889        let width = children.iter().map(|id| id.id().lookup_intern(db).width()).sum();
18890        UsePathListGreen(
18891            Arc::new(GreenNode {
18892                kind: SyntaxKind::UsePathList,
18893                details: GreenNodeDetails::Node {
18894                    children: children.iter().map(|x| x.id()).collect(),
18895                    width,
18896                },
18897            })
18898            .intern(db),
18899        )
18900    }
18901}
18902#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
18903pub struct UsePathListPtr(pub SyntaxStablePtrId);
18904impl TypedStablePtr for UsePathListPtr {
18905    type SyntaxNode = UsePathList;
18906    fn untyped(&self) -> SyntaxStablePtrId {
18907        self.0
18908    }
18909    fn lookup(&self, db: &dyn SyntaxGroup) -> UsePathList {
18910        UsePathList::from_syntax_node(db, self.0.lookup(db))
18911    }
18912}
18913impl From<UsePathListPtr> for SyntaxStablePtrId {
18914    fn from(ptr: UsePathListPtr) -> Self {
18915        ptr.untyped()
18916    }
18917}
18918#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
18919pub enum UsePathListElementOrSeparatorGreen {
18920    Separator(TerminalCommaGreen),
18921    Element(UsePathGreen),
18922}
18923impl From<TerminalCommaGreen> for UsePathListElementOrSeparatorGreen {
18924    fn from(value: TerminalCommaGreen) -> Self {
18925        UsePathListElementOrSeparatorGreen::Separator(value)
18926    }
18927}
18928impl From<UsePathGreen> for UsePathListElementOrSeparatorGreen {
18929    fn from(value: UsePathGreen) -> Self {
18930        UsePathListElementOrSeparatorGreen::Element(value)
18931    }
18932}
18933impl UsePathListElementOrSeparatorGreen {
18934    fn id(&self) -> GreenId {
18935        match self {
18936            UsePathListElementOrSeparatorGreen::Separator(green) => green.0,
18937            UsePathListElementOrSeparatorGreen::Element(green) => green.0,
18938        }
18939    }
18940}
18941#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
18942pub struct UsePathListGreen(pub GreenId);
18943impl TypedSyntaxNode for UsePathList {
18944    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::UsePathList);
18945    type StablePtr = UsePathListPtr;
18946    type Green = UsePathListGreen;
18947    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
18948        UsePathListGreen(
18949            Arc::new(GreenNode {
18950                kind: SyntaxKind::UsePathList,
18951                details: GreenNodeDetails::Node { children: vec![], width: TextWidth::default() },
18952            })
18953            .intern(db),
18954        )
18955    }
18956    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
18957        Self(ElementList::new(node))
18958    }
18959    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
18960        if node.kind(db) == SyntaxKind::UsePathList {
18961            Some(Self(ElementList::new(node)))
18962        } else {
18963            None
18964        }
18965    }
18966    fn as_syntax_node(&self) -> SyntaxNode {
18967        self.node.clone()
18968    }
18969    fn stable_ptr(&self) -> Self::StablePtr {
18970        UsePathListPtr(self.node.0.stable_ptr)
18971    }
18972}
18973impl From<&UsePathList> for SyntaxStablePtrId {
18974    fn from(node: &UsePathList) -> Self {
18975        node.stable_ptr().untyped()
18976    }
18977}
18978#[derive(Clone, Debug, Eq, Hash, PartialEq)]
18979pub struct AliasClause {
18980    node: SyntaxNode,
18981    children: Arc<[SyntaxNode]>,
18982}
18983impl AliasClause {
18984    pub const INDEX_AS_KW: usize = 0;
18985    pub const INDEX_ALIAS: usize = 1;
18986    pub fn new_green(
18987        db: &dyn SyntaxGroup,
18988        as_kw: TerminalAsGreen,
18989        alias: TerminalIdentifierGreen,
18990    ) -> AliasClauseGreen {
18991        let children: Vec<GreenId> = vec![as_kw.0, alias.0];
18992        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
18993        AliasClauseGreen(
18994            Arc::new(GreenNode {
18995                kind: SyntaxKind::AliasClause,
18996                details: GreenNodeDetails::Node { children, width },
18997            })
18998            .intern(db),
18999        )
19000    }
19001}
19002impl AliasClause {
19003    pub fn as_kw(&self, db: &dyn SyntaxGroup) -> TerminalAs {
19004        TerminalAs::from_syntax_node(db, self.children[0].clone())
19005    }
19006    pub fn alias(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier {
19007        TerminalIdentifier::from_syntax_node(db, self.children[1].clone())
19008    }
19009}
19010#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
19011pub struct AliasClausePtr(pub SyntaxStablePtrId);
19012impl AliasClausePtr {
19013    pub fn alias_green(self, db: &dyn SyntaxGroup) -> TerminalIdentifierGreen {
19014        let ptr = self.0.lookup_intern(db);
19015        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
19016            TerminalIdentifierGreen(key_fields[0])
19017        } else {
19018            panic!("Unexpected key field query on root.");
19019        }
19020    }
19021}
19022impl TypedStablePtr for AliasClausePtr {
19023    type SyntaxNode = AliasClause;
19024    fn untyped(&self) -> SyntaxStablePtrId {
19025        self.0
19026    }
19027    fn lookup(&self, db: &dyn SyntaxGroup) -> AliasClause {
19028        AliasClause::from_syntax_node(db, self.0.lookup(db))
19029    }
19030}
19031impl From<AliasClausePtr> for SyntaxStablePtrId {
19032    fn from(ptr: AliasClausePtr) -> Self {
19033        ptr.untyped()
19034    }
19035}
19036#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
19037pub struct AliasClauseGreen(pub GreenId);
19038impl TypedSyntaxNode for AliasClause {
19039    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::AliasClause);
19040    type StablePtr = AliasClausePtr;
19041    type Green = AliasClauseGreen;
19042    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
19043        AliasClauseGreen(
19044            Arc::new(GreenNode {
19045                kind: SyntaxKind::AliasClause,
19046                details: GreenNodeDetails::Node {
19047                    children: vec![TerminalAs::missing(db).0, TerminalIdentifier::missing(db).0],
19048                    width: TextWidth::default(),
19049                },
19050            })
19051            .intern(db),
19052        )
19053    }
19054    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
19055        let kind = node.kind(db);
19056        assert_eq!(
19057            kind,
19058            SyntaxKind::AliasClause,
19059            "Unexpected SyntaxKind {:?}. Expected {:?}.",
19060            kind,
19061            SyntaxKind::AliasClause
19062        );
19063        let children = db.get_children(node.clone());
19064        Self { node, children }
19065    }
19066    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
19067        let kind = node.kind(db);
19068        if kind == SyntaxKind::AliasClause { Some(Self::from_syntax_node(db, node)) } else { None }
19069    }
19070    fn as_syntax_node(&self) -> SyntaxNode {
19071        self.node.clone()
19072    }
19073    fn stable_ptr(&self) -> Self::StablePtr {
19074        AliasClausePtr(self.node.0.stable_ptr)
19075    }
19076}
19077impl From<&AliasClause> for SyntaxStablePtrId {
19078    fn from(node: &AliasClause) -> Self {
19079        node.stable_ptr().untyped()
19080    }
19081}
19082#[derive(Clone, Debug, Eq, Hash, PartialEq)]
19083pub enum OptionAliasClause {
19084    Empty(OptionAliasClauseEmpty),
19085    AliasClause(AliasClause),
19086}
19087#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
19088pub struct OptionAliasClausePtr(pub SyntaxStablePtrId);
19089impl TypedStablePtr for OptionAliasClausePtr {
19090    type SyntaxNode = OptionAliasClause;
19091    fn untyped(&self) -> SyntaxStablePtrId {
19092        self.0
19093    }
19094    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionAliasClause {
19095        OptionAliasClause::from_syntax_node(db, self.0.lookup(db))
19096    }
19097}
19098impl From<OptionAliasClausePtr> for SyntaxStablePtrId {
19099    fn from(ptr: OptionAliasClausePtr) -> Self {
19100        ptr.untyped()
19101    }
19102}
19103impl From<OptionAliasClauseEmptyPtr> for OptionAliasClausePtr {
19104    fn from(value: OptionAliasClauseEmptyPtr) -> Self {
19105        Self(value.0)
19106    }
19107}
19108impl From<AliasClausePtr> for OptionAliasClausePtr {
19109    fn from(value: AliasClausePtr) -> Self {
19110        Self(value.0)
19111    }
19112}
19113impl From<OptionAliasClauseEmptyGreen> for OptionAliasClauseGreen {
19114    fn from(value: OptionAliasClauseEmptyGreen) -> Self {
19115        Self(value.0)
19116    }
19117}
19118impl From<AliasClauseGreen> for OptionAliasClauseGreen {
19119    fn from(value: AliasClauseGreen) -> Self {
19120        Self(value.0)
19121    }
19122}
19123#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
19124pub struct OptionAliasClauseGreen(pub GreenId);
19125impl TypedSyntaxNode for OptionAliasClause {
19126    const OPTIONAL_KIND: Option<SyntaxKind> = None;
19127    type StablePtr = OptionAliasClausePtr;
19128    type Green = OptionAliasClauseGreen;
19129    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
19130        panic!("No missing variant.");
19131    }
19132    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
19133        let kind = node.kind(db);
19134        match kind {
19135            SyntaxKind::OptionAliasClauseEmpty => {
19136                OptionAliasClause::Empty(OptionAliasClauseEmpty::from_syntax_node(db, node))
19137            }
19138            SyntaxKind::AliasClause => {
19139                OptionAliasClause::AliasClause(AliasClause::from_syntax_node(db, node))
19140            }
19141            _ => panic!(
19142                "Unexpected syntax kind {:?} when constructing {}.",
19143                kind, "OptionAliasClause"
19144            ),
19145        }
19146    }
19147    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
19148        let kind = node.kind(db);
19149        match kind {
19150            SyntaxKind::OptionAliasClauseEmpty => {
19151                Some(OptionAliasClause::Empty(OptionAliasClauseEmpty::from_syntax_node(db, node)))
19152            }
19153            SyntaxKind::AliasClause => {
19154                Some(OptionAliasClause::AliasClause(AliasClause::from_syntax_node(db, node)))
19155            }
19156            _ => None,
19157        }
19158    }
19159    fn as_syntax_node(&self) -> SyntaxNode {
19160        match self {
19161            OptionAliasClause::Empty(x) => x.as_syntax_node(),
19162            OptionAliasClause::AliasClause(x) => x.as_syntax_node(),
19163        }
19164    }
19165    fn stable_ptr(&self) -> Self::StablePtr {
19166        OptionAliasClausePtr(self.as_syntax_node().0.stable_ptr)
19167    }
19168}
19169impl From<&OptionAliasClause> for SyntaxStablePtrId {
19170    fn from(node: &OptionAliasClause) -> Self {
19171        node.stable_ptr().untyped()
19172    }
19173}
19174impl OptionAliasClause {
19175    /// Checks if a kind of a variant of [OptionAliasClause].
19176    pub fn is_variant(kind: SyntaxKind) -> bool {
19177        matches!(kind, SyntaxKind::OptionAliasClauseEmpty | SyntaxKind::AliasClause)
19178    }
19179}
19180#[derive(Clone, Debug, Eq, Hash, PartialEq)]
19181pub struct OptionAliasClauseEmpty {
19182    node: SyntaxNode,
19183    children: Arc<[SyntaxNode]>,
19184}
19185impl OptionAliasClauseEmpty {
19186    pub fn new_green(db: &dyn SyntaxGroup) -> OptionAliasClauseEmptyGreen {
19187        let children: Vec<GreenId> = vec![];
19188        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
19189        OptionAliasClauseEmptyGreen(
19190            Arc::new(GreenNode {
19191                kind: SyntaxKind::OptionAliasClauseEmpty,
19192                details: GreenNodeDetails::Node { children, width },
19193            })
19194            .intern(db),
19195        )
19196    }
19197}
19198impl OptionAliasClauseEmpty {}
19199#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
19200pub struct OptionAliasClauseEmptyPtr(pub SyntaxStablePtrId);
19201impl OptionAliasClauseEmptyPtr {}
19202impl TypedStablePtr for OptionAliasClauseEmptyPtr {
19203    type SyntaxNode = OptionAliasClauseEmpty;
19204    fn untyped(&self) -> SyntaxStablePtrId {
19205        self.0
19206    }
19207    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionAliasClauseEmpty {
19208        OptionAliasClauseEmpty::from_syntax_node(db, self.0.lookup(db))
19209    }
19210}
19211impl From<OptionAliasClauseEmptyPtr> for SyntaxStablePtrId {
19212    fn from(ptr: OptionAliasClauseEmptyPtr) -> Self {
19213        ptr.untyped()
19214    }
19215}
19216#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
19217pub struct OptionAliasClauseEmptyGreen(pub GreenId);
19218impl TypedSyntaxNode for OptionAliasClauseEmpty {
19219    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionAliasClauseEmpty);
19220    type StablePtr = OptionAliasClauseEmptyPtr;
19221    type Green = OptionAliasClauseEmptyGreen;
19222    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
19223        OptionAliasClauseEmptyGreen(
19224            Arc::new(GreenNode {
19225                kind: SyntaxKind::OptionAliasClauseEmpty,
19226                details: GreenNodeDetails::Node { children: vec![], width: TextWidth::default() },
19227            })
19228            .intern(db),
19229        )
19230    }
19231    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
19232        let kind = node.kind(db);
19233        assert_eq!(
19234            kind,
19235            SyntaxKind::OptionAliasClauseEmpty,
19236            "Unexpected SyntaxKind {:?}. Expected {:?}.",
19237            kind,
19238            SyntaxKind::OptionAliasClauseEmpty
19239        );
19240        let children = db.get_children(node.clone());
19241        Self { node, children }
19242    }
19243    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
19244        let kind = node.kind(db);
19245        if kind == SyntaxKind::OptionAliasClauseEmpty {
19246            Some(Self::from_syntax_node(db, node))
19247        } else {
19248            None
19249        }
19250    }
19251    fn as_syntax_node(&self) -> SyntaxNode {
19252        self.node.clone()
19253    }
19254    fn stable_ptr(&self) -> Self::StablePtr {
19255        OptionAliasClauseEmptyPtr(self.node.0.stable_ptr)
19256    }
19257}
19258impl From<&OptionAliasClauseEmpty> for SyntaxStablePtrId {
19259    fn from(node: &OptionAliasClauseEmpty) -> Self {
19260        node.stable_ptr().untyped()
19261    }
19262}
19263#[derive(Clone, Debug, Eq, Hash, PartialEq)]
19264pub enum GenericArg {
19265    Unnamed(GenericArgUnnamed),
19266    Named(GenericArgNamed),
19267}
19268#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
19269pub struct GenericArgPtr(pub SyntaxStablePtrId);
19270impl TypedStablePtr for GenericArgPtr {
19271    type SyntaxNode = GenericArg;
19272    fn untyped(&self) -> SyntaxStablePtrId {
19273        self.0
19274    }
19275    fn lookup(&self, db: &dyn SyntaxGroup) -> GenericArg {
19276        GenericArg::from_syntax_node(db, self.0.lookup(db))
19277    }
19278}
19279impl From<GenericArgPtr> for SyntaxStablePtrId {
19280    fn from(ptr: GenericArgPtr) -> Self {
19281        ptr.untyped()
19282    }
19283}
19284impl From<GenericArgUnnamedPtr> for GenericArgPtr {
19285    fn from(value: GenericArgUnnamedPtr) -> Self {
19286        Self(value.0)
19287    }
19288}
19289impl From<GenericArgNamedPtr> for GenericArgPtr {
19290    fn from(value: GenericArgNamedPtr) -> Self {
19291        Self(value.0)
19292    }
19293}
19294impl From<GenericArgUnnamedGreen> for GenericArgGreen {
19295    fn from(value: GenericArgUnnamedGreen) -> Self {
19296        Self(value.0)
19297    }
19298}
19299impl From<GenericArgNamedGreen> for GenericArgGreen {
19300    fn from(value: GenericArgNamedGreen) -> Self {
19301        Self(value.0)
19302    }
19303}
19304#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
19305pub struct GenericArgGreen(pub GreenId);
19306impl TypedSyntaxNode for GenericArg {
19307    const OPTIONAL_KIND: Option<SyntaxKind> = None;
19308    type StablePtr = GenericArgPtr;
19309    type Green = GenericArgGreen;
19310    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
19311        panic!("No missing variant.");
19312    }
19313    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
19314        let kind = node.kind(db);
19315        match kind {
19316            SyntaxKind::GenericArgUnnamed => {
19317                GenericArg::Unnamed(GenericArgUnnamed::from_syntax_node(db, node))
19318            }
19319            SyntaxKind::GenericArgNamed => {
19320                GenericArg::Named(GenericArgNamed::from_syntax_node(db, node))
19321            }
19322            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "GenericArg"),
19323        }
19324    }
19325    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
19326        let kind = node.kind(db);
19327        match kind {
19328            SyntaxKind::GenericArgUnnamed => {
19329                Some(GenericArg::Unnamed(GenericArgUnnamed::from_syntax_node(db, node)))
19330            }
19331            SyntaxKind::GenericArgNamed => {
19332                Some(GenericArg::Named(GenericArgNamed::from_syntax_node(db, node)))
19333            }
19334            _ => None,
19335        }
19336    }
19337    fn as_syntax_node(&self) -> SyntaxNode {
19338        match self {
19339            GenericArg::Unnamed(x) => x.as_syntax_node(),
19340            GenericArg::Named(x) => x.as_syntax_node(),
19341        }
19342    }
19343    fn stable_ptr(&self) -> Self::StablePtr {
19344        GenericArgPtr(self.as_syntax_node().0.stable_ptr)
19345    }
19346}
19347impl From<&GenericArg> for SyntaxStablePtrId {
19348    fn from(node: &GenericArg) -> Self {
19349        node.stable_ptr().untyped()
19350    }
19351}
19352impl GenericArg {
19353    /// Checks if a kind of a variant of [GenericArg].
19354    pub fn is_variant(kind: SyntaxKind) -> bool {
19355        matches!(kind, SyntaxKind::GenericArgUnnamed | SyntaxKind::GenericArgNamed)
19356    }
19357}
19358#[derive(Clone, Debug, Eq, Hash, PartialEq)]
19359pub struct GenericArgNamed {
19360    node: SyntaxNode,
19361    children: Arc<[SyntaxNode]>,
19362}
19363impl GenericArgNamed {
19364    pub const INDEX_NAME: usize = 0;
19365    pub const INDEX_COLON: usize = 1;
19366    pub const INDEX_VALUE: usize = 2;
19367    pub fn new_green(
19368        db: &dyn SyntaxGroup,
19369        name: TerminalIdentifierGreen,
19370        colon: TerminalColonGreen,
19371        value: GenericArgValueGreen,
19372    ) -> GenericArgNamedGreen {
19373        let children: Vec<GreenId> = vec![name.0, colon.0, value.0];
19374        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
19375        GenericArgNamedGreen(
19376            Arc::new(GreenNode {
19377                kind: SyntaxKind::GenericArgNamed,
19378                details: GreenNodeDetails::Node { children, width },
19379            })
19380            .intern(db),
19381        )
19382    }
19383}
19384impl GenericArgNamed {
19385    pub fn name(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier {
19386        TerminalIdentifier::from_syntax_node(db, self.children[0].clone())
19387    }
19388    pub fn colon(&self, db: &dyn SyntaxGroup) -> TerminalColon {
19389        TerminalColon::from_syntax_node(db, self.children[1].clone())
19390    }
19391    pub fn value(&self, db: &dyn SyntaxGroup) -> GenericArgValue {
19392        GenericArgValue::from_syntax_node(db, self.children[2].clone())
19393    }
19394}
19395#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
19396pub struct GenericArgNamedPtr(pub SyntaxStablePtrId);
19397impl GenericArgNamedPtr {}
19398impl TypedStablePtr for GenericArgNamedPtr {
19399    type SyntaxNode = GenericArgNamed;
19400    fn untyped(&self) -> SyntaxStablePtrId {
19401        self.0
19402    }
19403    fn lookup(&self, db: &dyn SyntaxGroup) -> GenericArgNamed {
19404        GenericArgNamed::from_syntax_node(db, self.0.lookup(db))
19405    }
19406}
19407impl From<GenericArgNamedPtr> for SyntaxStablePtrId {
19408    fn from(ptr: GenericArgNamedPtr) -> Self {
19409        ptr.untyped()
19410    }
19411}
19412#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
19413pub struct GenericArgNamedGreen(pub GreenId);
19414impl TypedSyntaxNode for GenericArgNamed {
19415    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::GenericArgNamed);
19416    type StablePtr = GenericArgNamedPtr;
19417    type Green = GenericArgNamedGreen;
19418    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
19419        GenericArgNamedGreen(
19420            Arc::new(GreenNode {
19421                kind: SyntaxKind::GenericArgNamed,
19422                details: GreenNodeDetails::Node {
19423                    children: vec![
19424                        TerminalIdentifier::missing(db).0,
19425                        TerminalColon::missing(db).0,
19426                        GenericArgValue::missing(db).0,
19427                    ],
19428                    width: TextWidth::default(),
19429                },
19430            })
19431            .intern(db),
19432        )
19433    }
19434    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
19435        let kind = node.kind(db);
19436        assert_eq!(
19437            kind,
19438            SyntaxKind::GenericArgNamed,
19439            "Unexpected SyntaxKind {:?}. Expected {:?}.",
19440            kind,
19441            SyntaxKind::GenericArgNamed
19442        );
19443        let children = db.get_children(node.clone());
19444        Self { node, children }
19445    }
19446    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
19447        let kind = node.kind(db);
19448        if kind == SyntaxKind::GenericArgNamed {
19449            Some(Self::from_syntax_node(db, node))
19450        } else {
19451            None
19452        }
19453    }
19454    fn as_syntax_node(&self) -> SyntaxNode {
19455        self.node.clone()
19456    }
19457    fn stable_ptr(&self) -> Self::StablePtr {
19458        GenericArgNamedPtr(self.node.0.stable_ptr)
19459    }
19460}
19461impl From<&GenericArgNamed> for SyntaxStablePtrId {
19462    fn from(node: &GenericArgNamed) -> Self {
19463        node.stable_ptr().untyped()
19464    }
19465}
19466#[derive(Clone, Debug, Eq, Hash, PartialEq)]
19467pub struct GenericArgUnnamed {
19468    node: SyntaxNode,
19469    children: Arc<[SyntaxNode]>,
19470}
19471impl GenericArgUnnamed {
19472    pub const INDEX_VALUE: usize = 0;
19473    pub fn new_green(db: &dyn SyntaxGroup, value: GenericArgValueGreen) -> GenericArgUnnamedGreen {
19474        let children: Vec<GreenId> = vec![value.0];
19475        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
19476        GenericArgUnnamedGreen(
19477            Arc::new(GreenNode {
19478                kind: SyntaxKind::GenericArgUnnamed,
19479                details: GreenNodeDetails::Node { children, width },
19480            })
19481            .intern(db),
19482        )
19483    }
19484}
19485impl GenericArgUnnamed {
19486    pub fn value(&self, db: &dyn SyntaxGroup) -> GenericArgValue {
19487        GenericArgValue::from_syntax_node(db, self.children[0].clone())
19488    }
19489}
19490#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
19491pub struct GenericArgUnnamedPtr(pub SyntaxStablePtrId);
19492impl GenericArgUnnamedPtr {}
19493impl TypedStablePtr for GenericArgUnnamedPtr {
19494    type SyntaxNode = GenericArgUnnamed;
19495    fn untyped(&self) -> SyntaxStablePtrId {
19496        self.0
19497    }
19498    fn lookup(&self, db: &dyn SyntaxGroup) -> GenericArgUnnamed {
19499        GenericArgUnnamed::from_syntax_node(db, self.0.lookup(db))
19500    }
19501}
19502impl From<GenericArgUnnamedPtr> for SyntaxStablePtrId {
19503    fn from(ptr: GenericArgUnnamedPtr) -> Self {
19504        ptr.untyped()
19505    }
19506}
19507#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
19508pub struct GenericArgUnnamedGreen(pub GreenId);
19509impl TypedSyntaxNode for GenericArgUnnamed {
19510    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::GenericArgUnnamed);
19511    type StablePtr = GenericArgUnnamedPtr;
19512    type Green = GenericArgUnnamedGreen;
19513    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
19514        GenericArgUnnamedGreen(
19515            Arc::new(GreenNode {
19516                kind: SyntaxKind::GenericArgUnnamed,
19517                details: GreenNodeDetails::Node {
19518                    children: vec![GenericArgValue::missing(db).0],
19519                    width: TextWidth::default(),
19520                },
19521            })
19522            .intern(db),
19523        )
19524    }
19525    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
19526        let kind = node.kind(db);
19527        assert_eq!(
19528            kind,
19529            SyntaxKind::GenericArgUnnamed,
19530            "Unexpected SyntaxKind {:?}. Expected {:?}.",
19531            kind,
19532            SyntaxKind::GenericArgUnnamed
19533        );
19534        let children = db.get_children(node.clone());
19535        Self { node, children }
19536    }
19537    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
19538        let kind = node.kind(db);
19539        if kind == SyntaxKind::GenericArgUnnamed {
19540            Some(Self::from_syntax_node(db, node))
19541        } else {
19542            None
19543        }
19544    }
19545    fn as_syntax_node(&self) -> SyntaxNode {
19546        self.node.clone()
19547    }
19548    fn stable_ptr(&self) -> Self::StablePtr {
19549        GenericArgUnnamedPtr(self.node.0.stable_ptr)
19550    }
19551}
19552impl From<&GenericArgUnnamed> for SyntaxStablePtrId {
19553    fn from(node: &GenericArgUnnamed) -> Self {
19554        node.stable_ptr().untyped()
19555    }
19556}
19557#[derive(Clone, Debug, Eq, Hash, PartialEq)]
19558pub enum GenericArgValue {
19559    Expr(GenericArgValueExpr),
19560    Underscore(TerminalUnderscore),
19561}
19562#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
19563pub struct GenericArgValuePtr(pub SyntaxStablePtrId);
19564impl TypedStablePtr for GenericArgValuePtr {
19565    type SyntaxNode = GenericArgValue;
19566    fn untyped(&self) -> SyntaxStablePtrId {
19567        self.0
19568    }
19569    fn lookup(&self, db: &dyn SyntaxGroup) -> GenericArgValue {
19570        GenericArgValue::from_syntax_node(db, self.0.lookup(db))
19571    }
19572}
19573impl From<GenericArgValuePtr> for SyntaxStablePtrId {
19574    fn from(ptr: GenericArgValuePtr) -> Self {
19575        ptr.untyped()
19576    }
19577}
19578impl From<GenericArgValueExprPtr> for GenericArgValuePtr {
19579    fn from(value: GenericArgValueExprPtr) -> Self {
19580        Self(value.0)
19581    }
19582}
19583impl From<TerminalUnderscorePtr> for GenericArgValuePtr {
19584    fn from(value: TerminalUnderscorePtr) -> Self {
19585        Self(value.0)
19586    }
19587}
19588impl From<GenericArgValueExprGreen> for GenericArgValueGreen {
19589    fn from(value: GenericArgValueExprGreen) -> Self {
19590        Self(value.0)
19591    }
19592}
19593impl From<TerminalUnderscoreGreen> for GenericArgValueGreen {
19594    fn from(value: TerminalUnderscoreGreen) -> Self {
19595        Self(value.0)
19596    }
19597}
19598#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
19599pub struct GenericArgValueGreen(pub GreenId);
19600impl TypedSyntaxNode for GenericArgValue {
19601    const OPTIONAL_KIND: Option<SyntaxKind> = None;
19602    type StablePtr = GenericArgValuePtr;
19603    type Green = GenericArgValueGreen;
19604    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
19605        panic!("No missing variant.");
19606    }
19607    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
19608        let kind = node.kind(db);
19609        match kind {
19610            SyntaxKind::GenericArgValueExpr => {
19611                GenericArgValue::Expr(GenericArgValueExpr::from_syntax_node(db, node))
19612            }
19613            SyntaxKind::TerminalUnderscore => {
19614                GenericArgValue::Underscore(TerminalUnderscore::from_syntax_node(db, node))
19615            }
19616            _ => {
19617                panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "GenericArgValue")
19618            }
19619        }
19620    }
19621    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
19622        let kind = node.kind(db);
19623        match kind {
19624            SyntaxKind::GenericArgValueExpr => {
19625                Some(GenericArgValue::Expr(GenericArgValueExpr::from_syntax_node(db, node)))
19626            }
19627            SyntaxKind::TerminalUnderscore => {
19628                Some(GenericArgValue::Underscore(TerminalUnderscore::from_syntax_node(db, node)))
19629            }
19630            _ => None,
19631        }
19632    }
19633    fn as_syntax_node(&self) -> SyntaxNode {
19634        match self {
19635            GenericArgValue::Expr(x) => x.as_syntax_node(),
19636            GenericArgValue::Underscore(x) => x.as_syntax_node(),
19637        }
19638    }
19639    fn stable_ptr(&self) -> Self::StablePtr {
19640        GenericArgValuePtr(self.as_syntax_node().0.stable_ptr)
19641    }
19642}
19643impl From<&GenericArgValue> for SyntaxStablePtrId {
19644    fn from(node: &GenericArgValue) -> Self {
19645        node.stable_ptr().untyped()
19646    }
19647}
19648impl GenericArgValue {
19649    /// Checks if a kind of a variant of [GenericArgValue].
19650    pub fn is_variant(kind: SyntaxKind) -> bool {
19651        matches!(kind, SyntaxKind::GenericArgValueExpr | SyntaxKind::TerminalUnderscore)
19652    }
19653}
19654#[derive(Clone, Debug, Eq, Hash, PartialEq)]
19655pub struct GenericArgValueExpr {
19656    node: SyntaxNode,
19657    children: Arc<[SyntaxNode]>,
19658}
19659impl GenericArgValueExpr {
19660    pub const INDEX_EXPR: usize = 0;
19661    pub fn new_green(db: &dyn SyntaxGroup, expr: ExprGreen) -> GenericArgValueExprGreen {
19662        let children: Vec<GreenId> = vec![expr.0];
19663        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
19664        GenericArgValueExprGreen(
19665            Arc::new(GreenNode {
19666                kind: SyntaxKind::GenericArgValueExpr,
19667                details: GreenNodeDetails::Node { children, width },
19668            })
19669            .intern(db),
19670        )
19671    }
19672}
19673impl GenericArgValueExpr {
19674    pub fn expr(&self, db: &dyn SyntaxGroup) -> Expr {
19675        Expr::from_syntax_node(db, self.children[0].clone())
19676    }
19677}
19678#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
19679pub struct GenericArgValueExprPtr(pub SyntaxStablePtrId);
19680impl GenericArgValueExprPtr {}
19681impl TypedStablePtr for GenericArgValueExprPtr {
19682    type SyntaxNode = GenericArgValueExpr;
19683    fn untyped(&self) -> SyntaxStablePtrId {
19684        self.0
19685    }
19686    fn lookup(&self, db: &dyn SyntaxGroup) -> GenericArgValueExpr {
19687        GenericArgValueExpr::from_syntax_node(db, self.0.lookup(db))
19688    }
19689}
19690impl From<GenericArgValueExprPtr> for SyntaxStablePtrId {
19691    fn from(ptr: GenericArgValueExprPtr) -> Self {
19692        ptr.untyped()
19693    }
19694}
19695#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
19696pub struct GenericArgValueExprGreen(pub GreenId);
19697impl TypedSyntaxNode for GenericArgValueExpr {
19698    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::GenericArgValueExpr);
19699    type StablePtr = GenericArgValueExprPtr;
19700    type Green = GenericArgValueExprGreen;
19701    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
19702        GenericArgValueExprGreen(
19703            Arc::new(GreenNode {
19704                kind: SyntaxKind::GenericArgValueExpr,
19705                details: GreenNodeDetails::Node {
19706                    children: vec![Expr::missing(db).0],
19707                    width: TextWidth::default(),
19708                },
19709            })
19710            .intern(db),
19711        )
19712    }
19713    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
19714        let kind = node.kind(db);
19715        assert_eq!(
19716            kind,
19717            SyntaxKind::GenericArgValueExpr,
19718            "Unexpected SyntaxKind {:?}. Expected {:?}.",
19719            kind,
19720            SyntaxKind::GenericArgValueExpr
19721        );
19722        let children = db.get_children(node.clone());
19723        Self { node, children }
19724    }
19725    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
19726        let kind = node.kind(db);
19727        if kind == SyntaxKind::GenericArgValueExpr {
19728            Some(Self::from_syntax_node(db, node))
19729        } else {
19730            None
19731        }
19732    }
19733    fn as_syntax_node(&self) -> SyntaxNode {
19734        self.node.clone()
19735    }
19736    fn stable_ptr(&self) -> Self::StablePtr {
19737        GenericArgValueExprPtr(self.node.0.stable_ptr)
19738    }
19739}
19740impl From<&GenericArgValueExpr> for SyntaxStablePtrId {
19741    fn from(node: &GenericArgValueExpr) -> Self {
19742        node.stable_ptr().untyped()
19743    }
19744}
19745#[derive(Clone, Debug, Eq, Hash, PartialEq)]
19746pub struct GenericArgs {
19747    node: SyntaxNode,
19748    children: Arc<[SyntaxNode]>,
19749}
19750impl GenericArgs {
19751    pub const INDEX_LANGLE: usize = 0;
19752    pub const INDEX_GENERIC_ARGS: usize = 1;
19753    pub const INDEX_RANGLE: usize = 2;
19754    pub fn new_green(
19755        db: &dyn SyntaxGroup,
19756        langle: TerminalLTGreen,
19757        generic_args: GenericArgListGreen,
19758        rangle: TerminalGTGreen,
19759    ) -> GenericArgsGreen {
19760        let children: Vec<GreenId> = vec![langle.0, generic_args.0, rangle.0];
19761        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
19762        GenericArgsGreen(
19763            Arc::new(GreenNode {
19764                kind: SyntaxKind::GenericArgs,
19765                details: GreenNodeDetails::Node { children, width },
19766            })
19767            .intern(db),
19768        )
19769    }
19770}
19771impl GenericArgs {
19772    pub fn langle(&self, db: &dyn SyntaxGroup) -> TerminalLT {
19773        TerminalLT::from_syntax_node(db, self.children[0].clone())
19774    }
19775    pub fn generic_args(&self, db: &dyn SyntaxGroup) -> GenericArgList {
19776        GenericArgList::from_syntax_node(db, self.children[1].clone())
19777    }
19778    pub fn rangle(&self, db: &dyn SyntaxGroup) -> TerminalGT {
19779        TerminalGT::from_syntax_node(db, self.children[2].clone())
19780    }
19781}
19782#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
19783pub struct GenericArgsPtr(pub SyntaxStablePtrId);
19784impl GenericArgsPtr {}
19785impl TypedStablePtr for GenericArgsPtr {
19786    type SyntaxNode = GenericArgs;
19787    fn untyped(&self) -> SyntaxStablePtrId {
19788        self.0
19789    }
19790    fn lookup(&self, db: &dyn SyntaxGroup) -> GenericArgs {
19791        GenericArgs::from_syntax_node(db, self.0.lookup(db))
19792    }
19793}
19794impl From<GenericArgsPtr> for SyntaxStablePtrId {
19795    fn from(ptr: GenericArgsPtr) -> Self {
19796        ptr.untyped()
19797    }
19798}
19799#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
19800pub struct GenericArgsGreen(pub GreenId);
19801impl TypedSyntaxNode for GenericArgs {
19802    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::GenericArgs);
19803    type StablePtr = GenericArgsPtr;
19804    type Green = GenericArgsGreen;
19805    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
19806        GenericArgsGreen(
19807            Arc::new(GreenNode {
19808                kind: SyntaxKind::GenericArgs,
19809                details: GreenNodeDetails::Node {
19810                    children: vec![
19811                        TerminalLT::missing(db).0,
19812                        GenericArgList::missing(db).0,
19813                        TerminalGT::missing(db).0,
19814                    ],
19815                    width: TextWidth::default(),
19816                },
19817            })
19818            .intern(db),
19819        )
19820    }
19821    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
19822        let kind = node.kind(db);
19823        assert_eq!(
19824            kind,
19825            SyntaxKind::GenericArgs,
19826            "Unexpected SyntaxKind {:?}. Expected {:?}.",
19827            kind,
19828            SyntaxKind::GenericArgs
19829        );
19830        let children = db.get_children(node.clone());
19831        Self { node, children }
19832    }
19833    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
19834        let kind = node.kind(db);
19835        if kind == SyntaxKind::GenericArgs { Some(Self::from_syntax_node(db, node)) } else { None }
19836    }
19837    fn as_syntax_node(&self) -> SyntaxNode {
19838        self.node.clone()
19839    }
19840    fn stable_ptr(&self) -> Self::StablePtr {
19841        GenericArgsPtr(self.node.0.stable_ptr)
19842    }
19843}
19844impl From<&GenericArgs> for SyntaxStablePtrId {
19845    fn from(node: &GenericArgs) -> Self {
19846        node.stable_ptr().untyped()
19847    }
19848}
19849#[derive(Clone, Debug, Eq, Hash, PartialEq)]
19850pub struct GenericArgList(ElementList<GenericArg, 2>);
19851impl Deref for GenericArgList {
19852    type Target = ElementList<GenericArg, 2>;
19853    fn deref(&self) -> &Self::Target {
19854        &self.0
19855    }
19856}
19857impl GenericArgList {
19858    pub fn new_green(
19859        db: &dyn SyntaxGroup,
19860        children: Vec<GenericArgListElementOrSeparatorGreen>,
19861    ) -> GenericArgListGreen {
19862        let width = children.iter().map(|id| id.id().lookup_intern(db).width()).sum();
19863        GenericArgListGreen(
19864            Arc::new(GreenNode {
19865                kind: SyntaxKind::GenericArgList,
19866                details: GreenNodeDetails::Node {
19867                    children: children.iter().map(|x| x.id()).collect(),
19868                    width,
19869                },
19870            })
19871            .intern(db),
19872        )
19873    }
19874}
19875#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
19876pub struct GenericArgListPtr(pub SyntaxStablePtrId);
19877impl TypedStablePtr for GenericArgListPtr {
19878    type SyntaxNode = GenericArgList;
19879    fn untyped(&self) -> SyntaxStablePtrId {
19880        self.0
19881    }
19882    fn lookup(&self, db: &dyn SyntaxGroup) -> GenericArgList {
19883        GenericArgList::from_syntax_node(db, self.0.lookup(db))
19884    }
19885}
19886impl From<GenericArgListPtr> for SyntaxStablePtrId {
19887    fn from(ptr: GenericArgListPtr) -> Self {
19888        ptr.untyped()
19889    }
19890}
19891#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
19892pub enum GenericArgListElementOrSeparatorGreen {
19893    Separator(TerminalCommaGreen),
19894    Element(GenericArgGreen),
19895}
19896impl From<TerminalCommaGreen> for GenericArgListElementOrSeparatorGreen {
19897    fn from(value: TerminalCommaGreen) -> Self {
19898        GenericArgListElementOrSeparatorGreen::Separator(value)
19899    }
19900}
19901impl From<GenericArgGreen> for GenericArgListElementOrSeparatorGreen {
19902    fn from(value: GenericArgGreen) -> Self {
19903        GenericArgListElementOrSeparatorGreen::Element(value)
19904    }
19905}
19906impl GenericArgListElementOrSeparatorGreen {
19907    fn id(&self) -> GreenId {
19908        match self {
19909            GenericArgListElementOrSeparatorGreen::Separator(green) => green.0,
19910            GenericArgListElementOrSeparatorGreen::Element(green) => green.0,
19911        }
19912    }
19913}
19914#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
19915pub struct GenericArgListGreen(pub GreenId);
19916impl TypedSyntaxNode for GenericArgList {
19917    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::GenericArgList);
19918    type StablePtr = GenericArgListPtr;
19919    type Green = GenericArgListGreen;
19920    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
19921        GenericArgListGreen(
19922            Arc::new(GreenNode {
19923                kind: SyntaxKind::GenericArgList,
19924                details: GreenNodeDetails::Node { children: vec![], width: TextWidth::default() },
19925            })
19926            .intern(db),
19927        )
19928    }
19929    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
19930        Self(ElementList::new(node))
19931    }
19932    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
19933        if node.kind(db) == SyntaxKind::GenericArgList {
19934            Some(Self(ElementList::new(node)))
19935        } else {
19936            None
19937        }
19938    }
19939    fn as_syntax_node(&self) -> SyntaxNode {
19940        self.node.clone()
19941    }
19942    fn stable_ptr(&self) -> Self::StablePtr {
19943        GenericArgListPtr(self.node.0.stable_ptr)
19944    }
19945}
19946impl From<&GenericArgList> for SyntaxStablePtrId {
19947    fn from(node: &GenericArgList) -> Self {
19948        node.stable_ptr().untyped()
19949    }
19950}
19951#[derive(Clone, Debug, Eq, Hash, PartialEq)]
19952pub struct AssociatedItemConstraint {
19953    node: SyntaxNode,
19954    children: Arc<[SyntaxNode]>,
19955}
19956impl AssociatedItemConstraint {
19957    pub const INDEX_ITEM: usize = 0;
19958    pub const INDEX_COLON: usize = 1;
19959    pub const INDEX_VALUE: usize = 2;
19960    pub fn new_green(
19961        db: &dyn SyntaxGroup,
19962        item: TerminalIdentifierGreen,
19963        colon: TerminalColonGreen,
19964        value: ExprGreen,
19965    ) -> AssociatedItemConstraintGreen {
19966        let children: Vec<GreenId> = vec![item.0, colon.0, value.0];
19967        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
19968        AssociatedItemConstraintGreen(
19969            Arc::new(GreenNode {
19970                kind: SyntaxKind::AssociatedItemConstraint,
19971                details: GreenNodeDetails::Node { children, width },
19972            })
19973            .intern(db),
19974        )
19975    }
19976}
19977impl AssociatedItemConstraint {
19978    pub fn item(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier {
19979        TerminalIdentifier::from_syntax_node(db, self.children[0].clone())
19980    }
19981    pub fn colon(&self, db: &dyn SyntaxGroup) -> TerminalColon {
19982        TerminalColon::from_syntax_node(db, self.children[1].clone())
19983    }
19984    pub fn value(&self, db: &dyn SyntaxGroup) -> Expr {
19985        Expr::from_syntax_node(db, self.children[2].clone())
19986    }
19987}
19988#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
19989pub struct AssociatedItemConstraintPtr(pub SyntaxStablePtrId);
19990impl AssociatedItemConstraintPtr {}
19991impl TypedStablePtr for AssociatedItemConstraintPtr {
19992    type SyntaxNode = AssociatedItemConstraint;
19993    fn untyped(&self) -> SyntaxStablePtrId {
19994        self.0
19995    }
19996    fn lookup(&self, db: &dyn SyntaxGroup) -> AssociatedItemConstraint {
19997        AssociatedItemConstraint::from_syntax_node(db, self.0.lookup(db))
19998    }
19999}
20000impl From<AssociatedItemConstraintPtr> for SyntaxStablePtrId {
20001    fn from(ptr: AssociatedItemConstraintPtr) -> Self {
20002        ptr.untyped()
20003    }
20004}
20005#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
20006pub struct AssociatedItemConstraintGreen(pub GreenId);
20007impl TypedSyntaxNode for AssociatedItemConstraint {
20008    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::AssociatedItemConstraint);
20009    type StablePtr = AssociatedItemConstraintPtr;
20010    type Green = AssociatedItemConstraintGreen;
20011    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
20012        AssociatedItemConstraintGreen(
20013            Arc::new(GreenNode {
20014                kind: SyntaxKind::AssociatedItemConstraint,
20015                details: GreenNodeDetails::Node {
20016                    children: vec![
20017                        TerminalIdentifier::missing(db).0,
20018                        TerminalColon::missing(db).0,
20019                        Expr::missing(db).0,
20020                    ],
20021                    width: TextWidth::default(),
20022                },
20023            })
20024            .intern(db),
20025        )
20026    }
20027    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
20028        let kind = node.kind(db);
20029        assert_eq!(
20030            kind,
20031            SyntaxKind::AssociatedItemConstraint,
20032            "Unexpected SyntaxKind {:?}. Expected {:?}.",
20033            kind,
20034            SyntaxKind::AssociatedItemConstraint
20035        );
20036        let children = db.get_children(node.clone());
20037        Self { node, children }
20038    }
20039    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
20040        let kind = node.kind(db);
20041        if kind == SyntaxKind::AssociatedItemConstraint {
20042            Some(Self::from_syntax_node(db, node))
20043        } else {
20044            None
20045        }
20046    }
20047    fn as_syntax_node(&self) -> SyntaxNode {
20048        self.node.clone()
20049    }
20050    fn stable_ptr(&self) -> Self::StablePtr {
20051        AssociatedItemConstraintPtr(self.node.0.stable_ptr)
20052    }
20053}
20054impl From<&AssociatedItemConstraint> for SyntaxStablePtrId {
20055    fn from(node: &AssociatedItemConstraint) -> Self {
20056        node.stable_ptr().untyped()
20057    }
20058}
20059#[derive(Clone, Debug, Eq, Hash, PartialEq)]
20060pub struct AssociatedItemConstraints {
20061    node: SyntaxNode,
20062    children: Arc<[SyntaxNode]>,
20063}
20064impl AssociatedItemConstraints {
20065    pub const INDEX_LBRACK: usize = 0;
20066    pub const INDEX_ASSOCIATED_ITEM_CONSTRAINTS: usize = 1;
20067    pub const INDEX_RBRACK: usize = 2;
20068    pub fn new_green(
20069        db: &dyn SyntaxGroup,
20070        lbrack: TerminalLBrackGreen,
20071        associated_item_constraints: AssociatedItemConstraintListGreen,
20072        rbrack: TerminalRBrackGreen,
20073    ) -> AssociatedItemConstraintsGreen {
20074        let children: Vec<GreenId> = vec![lbrack.0, associated_item_constraints.0, rbrack.0];
20075        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
20076        AssociatedItemConstraintsGreen(
20077            Arc::new(GreenNode {
20078                kind: SyntaxKind::AssociatedItemConstraints,
20079                details: GreenNodeDetails::Node { children, width },
20080            })
20081            .intern(db),
20082        )
20083    }
20084}
20085impl AssociatedItemConstraints {
20086    pub fn lbrack(&self, db: &dyn SyntaxGroup) -> TerminalLBrack {
20087        TerminalLBrack::from_syntax_node(db, self.children[0].clone())
20088    }
20089    pub fn associated_item_constraints(
20090        &self,
20091        db: &dyn SyntaxGroup,
20092    ) -> AssociatedItemConstraintList {
20093        AssociatedItemConstraintList::from_syntax_node(db, self.children[1].clone())
20094    }
20095    pub fn rbrack(&self, db: &dyn SyntaxGroup) -> TerminalRBrack {
20096        TerminalRBrack::from_syntax_node(db, self.children[2].clone())
20097    }
20098}
20099#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
20100pub struct AssociatedItemConstraintsPtr(pub SyntaxStablePtrId);
20101impl AssociatedItemConstraintsPtr {}
20102impl TypedStablePtr for AssociatedItemConstraintsPtr {
20103    type SyntaxNode = AssociatedItemConstraints;
20104    fn untyped(&self) -> SyntaxStablePtrId {
20105        self.0
20106    }
20107    fn lookup(&self, db: &dyn SyntaxGroup) -> AssociatedItemConstraints {
20108        AssociatedItemConstraints::from_syntax_node(db, self.0.lookup(db))
20109    }
20110}
20111impl From<AssociatedItemConstraintsPtr> for SyntaxStablePtrId {
20112    fn from(ptr: AssociatedItemConstraintsPtr) -> Self {
20113        ptr.untyped()
20114    }
20115}
20116#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
20117pub struct AssociatedItemConstraintsGreen(pub GreenId);
20118impl TypedSyntaxNode for AssociatedItemConstraints {
20119    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::AssociatedItemConstraints);
20120    type StablePtr = AssociatedItemConstraintsPtr;
20121    type Green = AssociatedItemConstraintsGreen;
20122    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
20123        AssociatedItemConstraintsGreen(
20124            Arc::new(GreenNode {
20125                kind: SyntaxKind::AssociatedItemConstraints,
20126                details: GreenNodeDetails::Node {
20127                    children: vec![
20128                        TerminalLBrack::missing(db).0,
20129                        AssociatedItemConstraintList::missing(db).0,
20130                        TerminalRBrack::missing(db).0,
20131                    ],
20132                    width: TextWidth::default(),
20133                },
20134            })
20135            .intern(db),
20136        )
20137    }
20138    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
20139        let kind = node.kind(db);
20140        assert_eq!(
20141            kind,
20142            SyntaxKind::AssociatedItemConstraints,
20143            "Unexpected SyntaxKind {:?}. Expected {:?}.",
20144            kind,
20145            SyntaxKind::AssociatedItemConstraints
20146        );
20147        let children = db.get_children(node.clone());
20148        Self { node, children }
20149    }
20150    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
20151        let kind = node.kind(db);
20152        if kind == SyntaxKind::AssociatedItemConstraints {
20153            Some(Self::from_syntax_node(db, node))
20154        } else {
20155            None
20156        }
20157    }
20158    fn as_syntax_node(&self) -> SyntaxNode {
20159        self.node.clone()
20160    }
20161    fn stable_ptr(&self) -> Self::StablePtr {
20162        AssociatedItemConstraintsPtr(self.node.0.stable_ptr)
20163    }
20164}
20165impl From<&AssociatedItemConstraints> for SyntaxStablePtrId {
20166    fn from(node: &AssociatedItemConstraints) -> Self {
20167        node.stable_ptr().untyped()
20168    }
20169}
20170#[derive(Clone, Debug, Eq, Hash, PartialEq)]
20171pub struct AssociatedItemConstraintList(ElementList<AssociatedItemConstraint, 2>);
20172impl Deref for AssociatedItemConstraintList {
20173    type Target = ElementList<AssociatedItemConstraint, 2>;
20174    fn deref(&self) -> &Self::Target {
20175        &self.0
20176    }
20177}
20178impl AssociatedItemConstraintList {
20179    pub fn new_green(
20180        db: &dyn SyntaxGroup,
20181        children: Vec<AssociatedItemConstraintListElementOrSeparatorGreen>,
20182    ) -> AssociatedItemConstraintListGreen {
20183        let width = children.iter().map(|id| id.id().lookup_intern(db).width()).sum();
20184        AssociatedItemConstraintListGreen(
20185            Arc::new(GreenNode {
20186                kind: SyntaxKind::AssociatedItemConstraintList,
20187                details: GreenNodeDetails::Node {
20188                    children: children.iter().map(|x| x.id()).collect(),
20189                    width,
20190                },
20191            })
20192            .intern(db),
20193        )
20194    }
20195}
20196#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
20197pub struct AssociatedItemConstraintListPtr(pub SyntaxStablePtrId);
20198impl TypedStablePtr for AssociatedItemConstraintListPtr {
20199    type SyntaxNode = AssociatedItemConstraintList;
20200    fn untyped(&self) -> SyntaxStablePtrId {
20201        self.0
20202    }
20203    fn lookup(&self, db: &dyn SyntaxGroup) -> AssociatedItemConstraintList {
20204        AssociatedItemConstraintList::from_syntax_node(db, self.0.lookup(db))
20205    }
20206}
20207impl From<AssociatedItemConstraintListPtr> for SyntaxStablePtrId {
20208    fn from(ptr: AssociatedItemConstraintListPtr) -> Self {
20209        ptr.untyped()
20210    }
20211}
20212#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
20213pub enum AssociatedItemConstraintListElementOrSeparatorGreen {
20214    Separator(TerminalCommaGreen),
20215    Element(AssociatedItemConstraintGreen),
20216}
20217impl From<TerminalCommaGreen> for AssociatedItemConstraintListElementOrSeparatorGreen {
20218    fn from(value: TerminalCommaGreen) -> Self {
20219        AssociatedItemConstraintListElementOrSeparatorGreen::Separator(value)
20220    }
20221}
20222impl From<AssociatedItemConstraintGreen> for AssociatedItemConstraintListElementOrSeparatorGreen {
20223    fn from(value: AssociatedItemConstraintGreen) -> Self {
20224        AssociatedItemConstraintListElementOrSeparatorGreen::Element(value)
20225    }
20226}
20227impl AssociatedItemConstraintListElementOrSeparatorGreen {
20228    fn id(&self) -> GreenId {
20229        match self {
20230            AssociatedItemConstraintListElementOrSeparatorGreen::Separator(green) => green.0,
20231            AssociatedItemConstraintListElementOrSeparatorGreen::Element(green) => green.0,
20232        }
20233    }
20234}
20235#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
20236pub struct AssociatedItemConstraintListGreen(pub GreenId);
20237impl TypedSyntaxNode for AssociatedItemConstraintList {
20238    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::AssociatedItemConstraintList);
20239    type StablePtr = AssociatedItemConstraintListPtr;
20240    type Green = AssociatedItemConstraintListGreen;
20241    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
20242        AssociatedItemConstraintListGreen(
20243            Arc::new(GreenNode {
20244                kind: SyntaxKind::AssociatedItemConstraintList,
20245                details: GreenNodeDetails::Node { children: vec![], width: TextWidth::default() },
20246            })
20247            .intern(db),
20248        )
20249    }
20250    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
20251        Self(ElementList::new(node))
20252    }
20253    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
20254        if node.kind(db) == SyntaxKind::AssociatedItemConstraintList {
20255            Some(Self(ElementList::new(node)))
20256        } else {
20257            None
20258        }
20259    }
20260    fn as_syntax_node(&self) -> SyntaxNode {
20261        self.node.clone()
20262    }
20263    fn stable_ptr(&self) -> Self::StablePtr {
20264        AssociatedItemConstraintListPtr(self.node.0.stable_ptr)
20265    }
20266}
20267impl From<&AssociatedItemConstraintList> for SyntaxStablePtrId {
20268    fn from(node: &AssociatedItemConstraintList) -> Self {
20269        node.stable_ptr().untyped()
20270    }
20271}
20272#[derive(Clone, Debug, Eq, Hash, PartialEq)]
20273pub enum OptionAssociatedItemConstraints {
20274    Empty(OptionAssociatedItemConstraintsEmpty),
20275    AssociatedItemConstraints(AssociatedItemConstraints),
20276}
20277#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
20278pub struct OptionAssociatedItemConstraintsPtr(pub SyntaxStablePtrId);
20279impl TypedStablePtr for OptionAssociatedItemConstraintsPtr {
20280    type SyntaxNode = OptionAssociatedItemConstraints;
20281    fn untyped(&self) -> SyntaxStablePtrId {
20282        self.0
20283    }
20284    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionAssociatedItemConstraints {
20285        OptionAssociatedItemConstraints::from_syntax_node(db, self.0.lookup(db))
20286    }
20287}
20288impl From<OptionAssociatedItemConstraintsPtr> for SyntaxStablePtrId {
20289    fn from(ptr: OptionAssociatedItemConstraintsPtr) -> Self {
20290        ptr.untyped()
20291    }
20292}
20293impl From<OptionAssociatedItemConstraintsEmptyPtr> for OptionAssociatedItemConstraintsPtr {
20294    fn from(value: OptionAssociatedItemConstraintsEmptyPtr) -> Self {
20295        Self(value.0)
20296    }
20297}
20298impl From<AssociatedItemConstraintsPtr> for OptionAssociatedItemConstraintsPtr {
20299    fn from(value: AssociatedItemConstraintsPtr) -> Self {
20300        Self(value.0)
20301    }
20302}
20303impl From<OptionAssociatedItemConstraintsEmptyGreen> for OptionAssociatedItemConstraintsGreen {
20304    fn from(value: OptionAssociatedItemConstraintsEmptyGreen) -> Self {
20305        Self(value.0)
20306    }
20307}
20308impl From<AssociatedItemConstraintsGreen> for OptionAssociatedItemConstraintsGreen {
20309    fn from(value: AssociatedItemConstraintsGreen) -> Self {
20310        Self(value.0)
20311    }
20312}
20313#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
20314pub struct OptionAssociatedItemConstraintsGreen(pub GreenId);
20315impl TypedSyntaxNode for OptionAssociatedItemConstraints {
20316    const OPTIONAL_KIND: Option<SyntaxKind> = None;
20317    type StablePtr = OptionAssociatedItemConstraintsPtr;
20318    type Green = OptionAssociatedItemConstraintsGreen;
20319    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
20320        panic!("No missing variant.");
20321    }
20322    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
20323        let kind = node.kind(db);
20324        match kind {
20325            SyntaxKind::OptionAssociatedItemConstraintsEmpty => {
20326                OptionAssociatedItemConstraints::Empty(
20327                    OptionAssociatedItemConstraintsEmpty::from_syntax_node(db, node),
20328                )
20329            }
20330            SyntaxKind::AssociatedItemConstraints => {
20331                OptionAssociatedItemConstraints::AssociatedItemConstraints(
20332                    AssociatedItemConstraints::from_syntax_node(db, node),
20333                )
20334            }
20335            _ => panic!(
20336                "Unexpected syntax kind {:?} when constructing {}.",
20337                kind, "OptionAssociatedItemConstraints"
20338            ),
20339        }
20340    }
20341    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
20342        let kind = node.kind(db);
20343        match kind {
20344            SyntaxKind::OptionAssociatedItemConstraintsEmpty => {
20345                Some(OptionAssociatedItemConstraints::Empty(
20346                    OptionAssociatedItemConstraintsEmpty::from_syntax_node(db, node),
20347                ))
20348            }
20349            SyntaxKind::AssociatedItemConstraints => {
20350                Some(OptionAssociatedItemConstraints::AssociatedItemConstraints(
20351                    AssociatedItemConstraints::from_syntax_node(db, node),
20352                ))
20353            }
20354            _ => None,
20355        }
20356    }
20357    fn as_syntax_node(&self) -> SyntaxNode {
20358        match self {
20359            OptionAssociatedItemConstraints::Empty(x) => x.as_syntax_node(),
20360            OptionAssociatedItemConstraints::AssociatedItemConstraints(x) => x.as_syntax_node(),
20361        }
20362    }
20363    fn stable_ptr(&self) -> Self::StablePtr {
20364        OptionAssociatedItemConstraintsPtr(self.as_syntax_node().0.stable_ptr)
20365    }
20366}
20367impl From<&OptionAssociatedItemConstraints> for SyntaxStablePtrId {
20368    fn from(node: &OptionAssociatedItemConstraints) -> Self {
20369        node.stable_ptr().untyped()
20370    }
20371}
20372impl OptionAssociatedItemConstraints {
20373    /// Checks if a kind of a variant of [OptionAssociatedItemConstraints].
20374    pub fn is_variant(kind: SyntaxKind) -> bool {
20375        matches!(
20376            kind,
20377            SyntaxKind::OptionAssociatedItemConstraintsEmpty
20378                | SyntaxKind::AssociatedItemConstraints
20379        )
20380    }
20381}
20382#[derive(Clone, Debug, Eq, Hash, PartialEq)]
20383pub struct OptionAssociatedItemConstraintsEmpty {
20384    node: SyntaxNode,
20385    children: Arc<[SyntaxNode]>,
20386}
20387impl OptionAssociatedItemConstraintsEmpty {
20388    pub fn new_green(db: &dyn SyntaxGroup) -> OptionAssociatedItemConstraintsEmptyGreen {
20389        let children: Vec<GreenId> = vec![];
20390        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
20391        OptionAssociatedItemConstraintsEmptyGreen(
20392            Arc::new(GreenNode {
20393                kind: SyntaxKind::OptionAssociatedItemConstraintsEmpty,
20394                details: GreenNodeDetails::Node { children, width },
20395            })
20396            .intern(db),
20397        )
20398    }
20399}
20400impl OptionAssociatedItemConstraintsEmpty {}
20401#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
20402pub struct OptionAssociatedItemConstraintsEmptyPtr(pub SyntaxStablePtrId);
20403impl OptionAssociatedItemConstraintsEmptyPtr {}
20404impl TypedStablePtr for OptionAssociatedItemConstraintsEmptyPtr {
20405    type SyntaxNode = OptionAssociatedItemConstraintsEmpty;
20406    fn untyped(&self) -> SyntaxStablePtrId {
20407        self.0
20408    }
20409    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionAssociatedItemConstraintsEmpty {
20410        OptionAssociatedItemConstraintsEmpty::from_syntax_node(db, self.0.lookup(db))
20411    }
20412}
20413impl From<OptionAssociatedItemConstraintsEmptyPtr> for SyntaxStablePtrId {
20414    fn from(ptr: OptionAssociatedItemConstraintsEmptyPtr) -> Self {
20415        ptr.untyped()
20416    }
20417}
20418#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
20419pub struct OptionAssociatedItemConstraintsEmptyGreen(pub GreenId);
20420impl TypedSyntaxNode for OptionAssociatedItemConstraintsEmpty {
20421    const OPTIONAL_KIND: Option<SyntaxKind> =
20422        Some(SyntaxKind::OptionAssociatedItemConstraintsEmpty);
20423    type StablePtr = OptionAssociatedItemConstraintsEmptyPtr;
20424    type Green = OptionAssociatedItemConstraintsEmptyGreen;
20425    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
20426        OptionAssociatedItemConstraintsEmptyGreen(
20427            Arc::new(GreenNode {
20428                kind: SyntaxKind::OptionAssociatedItemConstraintsEmpty,
20429                details: GreenNodeDetails::Node { children: vec![], width: TextWidth::default() },
20430            })
20431            .intern(db),
20432        )
20433    }
20434    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
20435        let kind = node.kind(db);
20436        assert_eq!(
20437            kind,
20438            SyntaxKind::OptionAssociatedItemConstraintsEmpty,
20439            "Unexpected SyntaxKind {:?}. Expected {:?}.",
20440            kind,
20441            SyntaxKind::OptionAssociatedItemConstraintsEmpty
20442        );
20443        let children = db.get_children(node.clone());
20444        Self { node, children }
20445    }
20446    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
20447        let kind = node.kind(db);
20448        if kind == SyntaxKind::OptionAssociatedItemConstraintsEmpty {
20449            Some(Self::from_syntax_node(db, node))
20450        } else {
20451            None
20452        }
20453    }
20454    fn as_syntax_node(&self) -> SyntaxNode {
20455        self.node.clone()
20456    }
20457    fn stable_ptr(&self) -> Self::StablePtr {
20458        OptionAssociatedItemConstraintsEmptyPtr(self.node.0.stable_ptr)
20459    }
20460}
20461impl From<&OptionAssociatedItemConstraintsEmpty> for SyntaxStablePtrId {
20462    fn from(node: &OptionAssociatedItemConstraintsEmpty) -> Self {
20463        node.stable_ptr().untyped()
20464    }
20465}
20466#[derive(Clone, Debug, Eq, Hash, PartialEq)]
20467pub enum OptionWrappedGenericParamList {
20468    Empty(OptionWrappedGenericParamListEmpty),
20469    WrappedGenericParamList(WrappedGenericParamList),
20470}
20471#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
20472pub struct OptionWrappedGenericParamListPtr(pub SyntaxStablePtrId);
20473impl TypedStablePtr for OptionWrappedGenericParamListPtr {
20474    type SyntaxNode = OptionWrappedGenericParamList;
20475    fn untyped(&self) -> SyntaxStablePtrId {
20476        self.0
20477    }
20478    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionWrappedGenericParamList {
20479        OptionWrappedGenericParamList::from_syntax_node(db, self.0.lookup(db))
20480    }
20481}
20482impl From<OptionWrappedGenericParamListPtr> for SyntaxStablePtrId {
20483    fn from(ptr: OptionWrappedGenericParamListPtr) -> Self {
20484        ptr.untyped()
20485    }
20486}
20487impl From<OptionWrappedGenericParamListEmptyPtr> for OptionWrappedGenericParamListPtr {
20488    fn from(value: OptionWrappedGenericParamListEmptyPtr) -> Self {
20489        Self(value.0)
20490    }
20491}
20492impl From<WrappedGenericParamListPtr> for OptionWrappedGenericParamListPtr {
20493    fn from(value: WrappedGenericParamListPtr) -> Self {
20494        Self(value.0)
20495    }
20496}
20497impl From<OptionWrappedGenericParamListEmptyGreen> for OptionWrappedGenericParamListGreen {
20498    fn from(value: OptionWrappedGenericParamListEmptyGreen) -> Self {
20499        Self(value.0)
20500    }
20501}
20502impl From<WrappedGenericParamListGreen> for OptionWrappedGenericParamListGreen {
20503    fn from(value: WrappedGenericParamListGreen) -> Self {
20504        Self(value.0)
20505    }
20506}
20507#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
20508pub struct OptionWrappedGenericParamListGreen(pub GreenId);
20509impl TypedSyntaxNode for OptionWrappedGenericParamList {
20510    const OPTIONAL_KIND: Option<SyntaxKind> = None;
20511    type StablePtr = OptionWrappedGenericParamListPtr;
20512    type Green = OptionWrappedGenericParamListGreen;
20513    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
20514        panic!("No missing variant.");
20515    }
20516    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
20517        let kind = node.kind(db);
20518        match kind {
20519            SyntaxKind::OptionWrappedGenericParamListEmpty => OptionWrappedGenericParamList::Empty(
20520                OptionWrappedGenericParamListEmpty::from_syntax_node(db, node),
20521            ),
20522            SyntaxKind::WrappedGenericParamList => {
20523                OptionWrappedGenericParamList::WrappedGenericParamList(
20524                    WrappedGenericParamList::from_syntax_node(db, node),
20525                )
20526            }
20527            _ => panic!(
20528                "Unexpected syntax kind {:?} when constructing {}.",
20529                kind, "OptionWrappedGenericParamList"
20530            ),
20531        }
20532    }
20533    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
20534        let kind = node.kind(db);
20535        match kind {
20536            SyntaxKind::OptionWrappedGenericParamListEmpty => {
20537                Some(OptionWrappedGenericParamList::Empty(
20538                    OptionWrappedGenericParamListEmpty::from_syntax_node(db, node),
20539                ))
20540            }
20541            SyntaxKind::WrappedGenericParamList => {
20542                Some(OptionWrappedGenericParamList::WrappedGenericParamList(
20543                    WrappedGenericParamList::from_syntax_node(db, node),
20544                ))
20545            }
20546            _ => None,
20547        }
20548    }
20549    fn as_syntax_node(&self) -> SyntaxNode {
20550        match self {
20551            OptionWrappedGenericParamList::Empty(x) => x.as_syntax_node(),
20552            OptionWrappedGenericParamList::WrappedGenericParamList(x) => x.as_syntax_node(),
20553        }
20554    }
20555    fn stable_ptr(&self) -> Self::StablePtr {
20556        OptionWrappedGenericParamListPtr(self.as_syntax_node().0.stable_ptr)
20557    }
20558}
20559impl From<&OptionWrappedGenericParamList> for SyntaxStablePtrId {
20560    fn from(node: &OptionWrappedGenericParamList) -> Self {
20561        node.stable_ptr().untyped()
20562    }
20563}
20564impl OptionWrappedGenericParamList {
20565    /// Checks if a kind of a variant of [OptionWrappedGenericParamList].
20566    pub fn is_variant(kind: SyntaxKind) -> bool {
20567        matches!(
20568            kind,
20569            SyntaxKind::OptionWrappedGenericParamListEmpty | SyntaxKind::WrappedGenericParamList
20570        )
20571    }
20572}
20573#[derive(Clone, Debug, Eq, Hash, PartialEq)]
20574pub struct OptionWrappedGenericParamListEmpty {
20575    node: SyntaxNode,
20576    children: Arc<[SyntaxNode]>,
20577}
20578impl OptionWrappedGenericParamListEmpty {
20579    pub fn new_green(db: &dyn SyntaxGroup) -> OptionWrappedGenericParamListEmptyGreen {
20580        let children: Vec<GreenId> = vec![];
20581        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
20582        OptionWrappedGenericParamListEmptyGreen(
20583            Arc::new(GreenNode {
20584                kind: SyntaxKind::OptionWrappedGenericParamListEmpty,
20585                details: GreenNodeDetails::Node { children, width },
20586            })
20587            .intern(db),
20588        )
20589    }
20590}
20591impl OptionWrappedGenericParamListEmpty {}
20592#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
20593pub struct OptionWrappedGenericParamListEmptyPtr(pub SyntaxStablePtrId);
20594impl OptionWrappedGenericParamListEmptyPtr {}
20595impl TypedStablePtr for OptionWrappedGenericParamListEmptyPtr {
20596    type SyntaxNode = OptionWrappedGenericParamListEmpty;
20597    fn untyped(&self) -> SyntaxStablePtrId {
20598        self.0
20599    }
20600    fn lookup(&self, db: &dyn SyntaxGroup) -> OptionWrappedGenericParamListEmpty {
20601        OptionWrappedGenericParamListEmpty::from_syntax_node(db, self.0.lookup(db))
20602    }
20603}
20604impl From<OptionWrappedGenericParamListEmptyPtr> for SyntaxStablePtrId {
20605    fn from(ptr: OptionWrappedGenericParamListEmptyPtr) -> Self {
20606        ptr.untyped()
20607    }
20608}
20609#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
20610pub struct OptionWrappedGenericParamListEmptyGreen(pub GreenId);
20611impl TypedSyntaxNode for OptionWrappedGenericParamListEmpty {
20612    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionWrappedGenericParamListEmpty);
20613    type StablePtr = OptionWrappedGenericParamListEmptyPtr;
20614    type Green = OptionWrappedGenericParamListEmptyGreen;
20615    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
20616        OptionWrappedGenericParamListEmptyGreen(
20617            Arc::new(GreenNode {
20618                kind: SyntaxKind::OptionWrappedGenericParamListEmpty,
20619                details: GreenNodeDetails::Node { children: vec![], width: TextWidth::default() },
20620            })
20621            .intern(db),
20622        )
20623    }
20624    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
20625        let kind = node.kind(db);
20626        assert_eq!(
20627            kind,
20628            SyntaxKind::OptionWrappedGenericParamListEmpty,
20629            "Unexpected SyntaxKind {:?}. Expected {:?}.",
20630            kind,
20631            SyntaxKind::OptionWrappedGenericParamListEmpty
20632        );
20633        let children = db.get_children(node.clone());
20634        Self { node, children }
20635    }
20636    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
20637        let kind = node.kind(db);
20638        if kind == SyntaxKind::OptionWrappedGenericParamListEmpty {
20639            Some(Self::from_syntax_node(db, node))
20640        } else {
20641            None
20642        }
20643    }
20644    fn as_syntax_node(&self) -> SyntaxNode {
20645        self.node.clone()
20646    }
20647    fn stable_ptr(&self) -> Self::StablePtr {
20648        OptionWrappedGenericParamListEmptyPtr(self.node.0.stable_ptr)
20649    }
20650}
20651impl From<&OptionWrappedGenericParamListEmpty> for SyntaxStablePtrId {
20652    fn from(node: &OptionWrappedGenericParamListEmpty) -> Self {
20653        node.stable_ptr().untyped()
20654    }
20655}
20656#[derive(Clone, Debug, Eq, Hash, PartialEq)]
20657pub struct WrappedGenericParamList {
20658    node: SyntaxNode,
20659    children: Arc<[SyntaxNode]>,
20660}
20661impl WrappedGenericParamList {
20662    pub const INDEX_LANGLE: usize = 0;
20663    pub const INDEX_GENERIC_PARAMS: usize = 1;
20664    pub const INDEX_RANGLE: usize = 2;
20665    pub fn new_green(
20666        db: &dyn SyntaxGroup,
20667        langle: TerminalLTGreen,
20668        generic_params: GenericParamListGreen,
20669        rangle: TerminalGTGreen,
20670    ) -> WrappedGenericParamListGreen {
20671        let children: Vec<GreenId> = vec![langle.0, generic_params.0, rangle.0];
20672        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
20673        WrappedGenericParamListGreen(
20674            Arc::new(GreenNode {
20675                kind: SyntaxKind::WrappedGenericParamList,
20676                details: GreenNodeDetails::Node { children, width },
20677            })
20678            .intern(db),
20679        )
20680    }
20681}
20682impl WrappedGenericParamList {
20683    pub fn langle(&self, db: &dyn SyntaxGroup) -> TerminalLT {
20684        TerminalLT::from_syntax_node(db, self.children[0].clone())
20685    }
20686    pub fn generic_params(&self, db: &dyn SyntaxGroup) -> GenericParamList {
20687        GenericParamList::from_syntax_node(db, self.children[1].clone())
20688    }
20689    pub fn rangle(&self, db: &dyn SyntaxGroup) -> TerminalGT {
20690        TerminalGT::from_syntax_node(db, self.children[2].clone())
20691    }
20692}
20693#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
20694pub struct WrappedGenericParamListPtr(pub SyntaxStablePtrId);
20695impl WrappedGenericParamListPtr {}
20696impl TypedStablePtr for WrappedGenericParamListPtr {
20697    type SyntaxNode = WrappedGenericParamList;
20698    fn untyped(&self) -> SyntaxStablePtrId {
20699        self.0
20700    }
20701    fn lookup(&self, db: &dyn SyntaxGroup) -> WrappedGenericParamList {
20702        WrappedGenericParamList::from_syntax_node(db, self.0.lookup(db))
20703    }
20704}
20705impl From<WrappedGenericParamListPtr> for SyntaxStablePtrId {
20706    fn from(ptr: WrappedGenericParamListPtr) -> Self {
20707        ptr.untyped()
20708    }
20709}
20710#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
20711pub struct WrappedGenericParamListGreen(pub GreenId);
20712impl TypedSyntaxNode for WrappedGenericParamList {
20713    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::WrappedGenericParamList);
20714    type StablePtr = WrappedGenericParamListPtr;
20715    type Green = WrappedGenericParamListGreen;
20716    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
20717        WrappedGenericParamListGreen(
20718            Arc::new(GreenNode {
20719                kind: SyntaxKind::WrappedGenericParamList,
20720                details: GreenNodeDetails::Node {
20721                    children: vec![
20722                        TerminalLT::missing(db).0,
20723                        GenericParamList::missing(db).0,
20724                        TerminalGT::missing(db).0,
20725                    ],
20726                    width: TextWidth::default(),
20727                },
20728            })
20729            .intern(db),
20730        )
20731    }
20732    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
20733        let kind = node.kind(db);
20734        assert_eq!(
20735            kind,
20736            SyntaxKind::WrappedGenericParamList,
20737            "Unexpected SyntaxKind {:?}. Expected {:?}.",
20738            kind,
20739            SyntaxKind::WrappedGenericParamList
20740        );
20741        let children = db.get_children(node.clone());
20742        Self { node, children }
20743    }
20744    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
20745        let kind = node.kind(db);
20746        if kind == SyntaxKind::WrappedGenericParamList {
20747            Some(Self::from_syntax_node(db, node))
20748        } else {
20749            None
20750        }
20751    }
20752    fn as_syntax_node(&self) -> SyntaxNode {
20753        self.node.clone()
20754    }
20755    fn stable_ptr(&self) -> Self::StablePtr {
20756        WrappedGenericParamListPtr(self.node.0.stable_ptr)
20757    }
20758}
20759impl From<&WrappedGenericParamList> for SyntaxStablePtrId {
20760    fn from(node: &WrappedGenericParamList) -> Self {
20761        node.stable_ptr().untyped()
20762    }
20763}
20764#[derive(Clone, Debug, Eq, Hash, PartialEq)]
20765pub struct GenericParamList(ElementList<GenericParam, 2>);
20766impl Deref for GenericParamList {
20767    type Target = ElementList<GenericParam, 2>;
20768    fn deref(&self) -> &Self::Target {
20769        &self.0
20770    }
20771}
20772impl GenericParamList {
20773    pub fn new_green(
20774        db: &dyn SyntaxGroup,
20775        children: Vec<GenericParamListElementOrSeparatorGreen>,
20776    ) -> GenericParamListGreen {
20777        let width = children.iter().map(|id| id.id().lookup_intern(db).width()).sum();
20778        GenericParamListGreen(
20779            Arc::new(GreenNode {
20780                kind: SyntaxKind::GenericParamList,
20781                details: GreenNodeDetails::Node {
20782                    children: children.iter().map(|x| x.id()).collect(),
20783                    width,
20784                },
20785            })
20786            .intern(db),
20787        )
20788    }
20789}
20790#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
20791pub struct GenericParamListPtr(pub SyntaxStablePtrId);
20792impl TypedStablePtr for GenericParamListPtr {
20793    type SyntaxNode = GenericParamList;
20794    fn untyped(&self) -> SyntaxStablePtrId {
20795        self.0
20796    }
20797    fn lookup(&self, db: &dyn SyntaxGroup) -> GenericParamList {
20798        GenericParamList::from_syntax_node(db, self.0.lookup(db))
20799    }
20800}
20801impl From<GenericParamListPtr> for SyntaxStablePtrId {
20802    fn from(ptr: GenericParamListPtr) -> Self {
20803        ptr.untyped()
20804    }
20805}
20806#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
20807pub enum GenericParamListElementOrSeparatorGreen {
20808    Separator(TerminalCommaGreen),
20809    Element(GenericParamGreen),
20810}
20811impl From<TerminalCommaGreen> for GenericParamListElementOrSeparatorGreen {
20812    fn from(value: TerminalCommaGreen) -> Self {
20813        GenericParamListElementOrSeparatorGreen::Separator(value)
20814    }
20815}
20816impl From<GenericParamGreen> for GenericParamListElementOrSeparatorGreen {
20817    fn from(value: GenericParamGreen) -> Self {
20818        GenericParamListElementOrSeparatorGreen::Element(value)
20819    }
20820}
20821impl GenericParamListElementOrSeparatorGreen {
20822    fn id(&self) -> GreenId {
20823        match self {
20824            GenericParamListElementOrSeparatorGreen::Separator(green) => green.0,
20825            GenericParamListElementOrSeparatorGreen::Element(green) => green.0,
20826        }
20827    }
20828}
20829#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
20830pub struct GenericParamListGreen(pub GreenId);
20831impl TypedSyntaxNode for GenericParamList {
20832    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::GenericParamList);
20833    type StablePtr = GenericParamListPtr;
20834    type Green = GenericParamListGreen;
20835    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
20836        GenericParamListGreen(
20837            Arc::new(GreenNode {
20838                kind: SyntaxKind::GenericParamList,
20839                details: GreenNodeDetails::Node { children: vec![], width: TextWidth::default() },
20840            })
20841            .intern(db),
20842        )
20843    }
20844    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
20845        Self(ElementList::new(node))
20846    }
20847    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
20848        if node.kind(db) == SyntaxKind::GenericParamList {
20849            Some(Self(ElementList::new(node)))
20850        } else {
20851            None
20852        }
20853    }
20854    fn as_syntax_node(&self) -> SyntaxNode {
20855        self.node.clone()
20856    }
20857    fn stable_ptr(&self) -> Self::StablePtr {
20858        GenericParamListPtr(self.node.0.stable_ptr)
20859    }
20860}
20861impl From<&GenericParamList> for SyntaxStablePtrId {
20862    fn from(node: &GenericParamList) -> Self {
20863        node.stable_ptr().untyped()
20864    }
20865}
20866#[derive(Clone, Debug, Eq, Hash, PartialEq)]
20867pub enum GenericParam {
20868    Type(GenericParamType),
20869    Const(GenericParamConst),
20870    ImplNamed(GenericParamImplNamed),
20871    ImplAnonymous(GenericParamImplAnonymous),
20872    NegativeImpl(GenericParamNegativeImpl),
20873}
20874#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
20875pub struct GenericParamPtr(pub SyntaxStablePtrId);
20876impl TypedStablePtr for GenericParamPtr {
20877    type SyntaxNode = GenericParam;
20878    fn untyped(&self) -> SyntaxStablePtrId {
20879        self.0
20880    }
20881    fn lookup(&self, db: &dyn SyntaxGroup) -> GenericParam {
20882        GenericParam::from_syntax_node(db, self.0.lookup(db))
20883    }
20884}
20885impl From<GenericParamPtr> for SyntaxStablePtrId {
20886    fn from(ptr: GenericParamPtr) -> Self {
20887        ptr.untyped()
20888    }
20889}
20890impl From<GenericParamTypePtr> for GenericParamPtr {
20891    fn from(value: GenericParamTypePtr) -> Self {
20892        Self(value.0)
20893    }
20894}
20895impl From<GenericParamConstPtr> for GenericParamPtr {
20896    fn from(value: GenericParamConstPtr) -> Self {
20897        Self(value.0)
20898    }
20899}
20900impl From<GenericParamImplNamedPtr> for GenericParamPtr {
20901    fn from(value: GenericParamImplNamedPtr) -> Self {
20902        Self(value.0)
20903    }
20904}
20905impl From<GenericParamImplAnonymousPtr> for GenericParamPtr {
20906    fn from(value: GenericParamImplAnonymousPtr) -> Self {
20907        Self(value.0)
20908    }
20909}
20910impl From<GenericParamNegativeImplPtr> for GenericParamPtr {
20911    fn from(value: GenericParamNegativeImplPtr) -> Self {
20912        Self(value.0)
20913    }
20914}
20915impl From<GenericParamTypeGreen> for GenericParamGreen {
20916    fn from(value: GenericParamTypeGreen) -> Self {
20917        Self(value.0)
20918    }
20919}
20920impl From<GenericParamConstGreen> for GenericParamGreen {
20921    fn from(value: GenericParamConstGreen) -> Self {
20922        Self(value.0)
20923    }
20924}
20925impl From<GenericParamImplNamedGreen> for GenericParamGreen {
20926    fn from(value: GenericParamImplNamedGreen) -> Self {
20927        Self(value.0)
20928    }
20929}
20930impl From<GenericParamImplAnonymousGreen> for GenericParamGreen {
20931    fn from(value: GenericParamImplAnonymousGreen) -> Self {
20932        Self(value.0)
20933    }
20934}
20935impl From<GenericParamNegativeImplGreen> for GenericParamGreen {
20936    fn from(value: GenericParamNegativeImplGreen) -> Self {
20937        Self(value.0)
20938    }
20939}
20940#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
20941pub struct GenericParamGreen(pub GreenId);
20942impl TypedSyntaxNode for GenericParam {
20943    const OPTIONAL_KIND: Option<SyntaxKind> = None;
20944    type StablePtr = GenericParamPtr;
20945    type Green = GenericParamGreen;
20946    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
20947        panic!("No missing variant.");
20948    }
20949    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
20950        let kind = node.kind(db);
20951        match kind {
20952            SyntaxKind::GenericParamType => {
20953                GenericParam::Type(GenericParamType::from_syntax_node(db, node))
20954            }
20955            SyntaxKind::GenericParamConst => {
20956                GenericParam::Const(GenericParamConst::from_syntax_node(db, node))
20957            }
20958            SyntaxKind::GenericParamImplNamed => {
20959                GenericParam::ImplNamed(GenericParamImplNamed::from_syntax_node(db, node))
20960            }
20961            SyntaxKind::GenericParamImplAnonymous => {
20962                GenericParam::ImplAnonymous(GenericParamImplAnonymous::from_syntax_node(db, node))
20963            }
20964            SyntaxKind::GenericParamNegativeImpl => {
20965                GenericParam::NegativeImpl(GenericParamNegativeImpl::from_syntax_node(db, node))
20966            }
20967            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "GenericParam"),
20968        }
20969    }
20970    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
20971        let kind = node.kind(db);
20972        match kind {
20973            SyntaxKind::GenericParamType => {
20974                Some(GenericParam::Type(GenericParamType::from_syntax_node(db, node)))
20975            }
20976            SyntaxKind::GenericParamConst => {
20977                Some(GenericParam::Const(GenericParamConst::from_syntax_node(db, node)))
20978            }
20979            SyntaxKind::GenericParamImplNamed => {
20980                Some(GenericParam::ImplNamed(GenericParamImplNamed::from_syntax_node(db, node)))
20981            }
20982            SyntaxKind::GenericParamImplAnonymous => Some(GenericParam::ImplAnonymous(
20983                GenericParamImplAnonymous::from_syntax_node(db, node),
20984            )),
20985            SyntaxKind::GenericParamNegativeImpl => Some(GenericParam::NegativeImpl(
20986                GenericParamNegativeImpl::from_syntax_node(db, node),
20987            )),
20988            _ => None,
20989        }
20990    }
20991    fn as_syntax_node(&self) -> SyntaxNode {
20992        match self {
20993            GenericParam::Type(x) => x.as_syntax_node(),
20994            GenericParam::Const(x) => x.as_syntax_node(),
20995            GenericParam::ImplNamed(x) => x.as_syntax_node(),
20996            GenericParam::ImplAnonymous(x) => x.as_syntax_node(),
20997            GenericParam::NegativeImpl(x) => x.as_syntax_node(),
20998        }
20999    }
21000    fn stable_ptr(&self) -> Self::StablePtr {
21001        GenericParamPtr(self.as_syntax_node().0.stable_ptr)
21002    }
21003}
21004impl From<&GenericParam> for SyntaxStablePtrId {
21005    fn from(node: &GenericParam) -> Self {
21006        node.stable_ptr().untyped()
21007    }
21008}
21009impl GenericParam {
21010    /// Checks if a kind of a variant of [GenericParam].
21011    pub fn is_variant(kind: SyntaxKind) -> bool {
21012        matches!(
21013            kind,
21014            SyntaxKind::GenericParamType
21015                | SyntaxKind::GenericParamConst
21016                | SyntaxKind::GenericParamImplNamed
21017                | SyntaxKind::GenericParamImplAnonymous
21018                | SyntaxKind::GenericParamNegativeImpl
21019        )
21020    }
21021}
21022#[derive(Clone, Debug, Eq, Hash, PartialEq)]
21023pub struct GenericParamType {
21024    node: SyntaxNode,
21025    children: Arc<[SyntaxNode]>,
21026}
21027impl GenericParamType {
21028    pub const INDEX_NAME: usize = 0;
21029    pub fn new_green(db: &dyn SyntaxGroup, name: TerminalIdentifierGreen) -> GenericParamTypeGreen {
21030        let children: Vec<GreenId> = vec![name.0];
21031        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
21032        GenericParamTypeGreen(
21033            Arc::new(GreenNode {
21034                kind: SyntaxKind::GenericParamType,
21035                details: GreenNodeDetails::Node { children, width },
21036            })
21037            .intern(db),
21038        )
21039    }
21040}
21041impl GenericParamType {
21042    pub fn name(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier {
21043        TerminalIdentifier::from_syntax_node(db, self.children[0].clone())
21044    }
21045}
21046#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
21047pub struct GenericParamTypePtr(pub SyntaxStablePtrId);
21048impl GenericParamTypePtr {
21049    pub fn name_green(self, db: &dyn SyntaxGroup) -> TerminalIdentifierGreen {
21050        let ptr = self.0.lookup_intern(db);
21051        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
21052            TerminalIdentifierGreen(key_fields[0])
21053        } else {
21054            panic!("Unexpected key field query on root.");
21055        }
21056    }
21057}
21058impl TypedStablePtr for GenericParamTypePtr {
21059    type SyntaxNode = GenericParamType;
21060    fn untyped(&self) -> SyntaxStablePtrId {
21061        self.0
21062    }
21063    fn lookup(&self, db: &dyn SyntaxGroup) -> GenericParamType {
21064        GenericParamType::from_syntax_node(db, self.0.lookup(db))
21065    }
21066}
21067impl From<GenericParamTypePtr> for SyntaxStablePtrId {
21068    fn from(ptr: GenericParamTypePtr) -> Self {
21069        ptr.untyped()
21070    }
21071}
21072#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
21073pub struct GenericParamTypeGreen(pub GreenId);
21074impl TypedSyntaxNode for GenericParamType {
21075    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::GenericParamType);
21076    type StablePtr = GenericParamTypePtr;
21077    type Green = GenericParamTypeGreen;
21078    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
21079        GenericParamTypeGreen(
21080            Arc::new(GreenNode {
21081                kind: SyntaxKind::GenericParamType,
21082                details: GreenNodeDetails::Node {
21083                    children: vec![TerminalIdentifier::missing(db).0],
21084                    width: TextWidth::default(),
21085                },
21086            })
21087            .intern(db),
21088        )
21089    }
21090    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
21091        let kind = node.kind(db);
21092        assert_eq!(
21093            kind,
21094            SyntaxKind::GenericParamType,
21095            "Unexpected SyntaxKind {:?}. Expected {:?}.",
21096            kind,
21097            SyntaxKind::GenericParamType
21098        );
21099        let children = db.get_children(node.clone());
21100        Self { node, children }
21101    }
21102    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
21103        let kind = node.kind(db);
21104        if kind == SyntaxKind::GenericParamType {
21105            Some(Self::from_syntax_node(db, node))
21106        } else {
21107            None
21108        }
21109    }
21110    fn as_syntax_node(&self) -> SyntaxNode {
21111        self.node.clone()
21112    }
21113    fn stable_ptr(&self) -> Self::StablePtr {
21114        GenericParamTypePtr(self.node.0.stable_ptr)
21115    }
21116}
21117impl From<&GenericParamType> for SyntaxStablePtrId {
21118    fn from(node: &GenericParamType) -> Self {
21119        node.stable_ptr().untyped()
21120    }
21121}
21122#[derive(Clone, Debug, Eq, Hash, PartialEq)]
21123pub struct GenericParamConst {
21124    node: SyntaxNode,
21125    children: Arc<[SyntaxNode]>,
21126}
21127impl GenericParamConst {
21128    pub const INDEX_CONST_KW: usize = 0;
21129    pub const INDEX_NAME: usize = 1;
21130    pub const INDEX_COLON: usize = 2;
21131    pub const INDEX_TY: usize = 3;
21132    pub fn new_green(
21133        db: &dyn SyntaxGroup,
21134        const_kw: TerminalConstGreen,
21135        name: TerminalIdentifierGreen,
21136        colon: TerminalColonGreen,
21137        ty: ExprGreen,
21138    ) -> GenericParamConstGreen {
21139        let children: Vec<GreenId> = vec![const_kw.0, name.0, colon.0, ty.0];
21140        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
21141        GenericParamConstGreen(
21142            Arc::new(GreenNode {
21143                kind: SyntaxKind::GenericParamConst,
21144                details: GreenNodeDetails::Node { children, width },
21145            })
21146            .intern(db),
21147        )
21148    }
21149}
21150impl GenericParamConst {
21151    pub fn const_kw(&self, db: &dyn SyntaxGroup) -> TerminalConst {
21152        TerminalConst::from_syntax_node(db, self.children[0].clone())
21153    }
21154    pub fn name(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier {
21155        TerminalIdentifier::from_syntax_node(db, self.children[1].clone())
21156    }
21157    pub fn colon(&self, db: &dyn SyntaxGroup) -> TerminalColon {
21158        TerminalColon::from_syntax_node(db, self.children[2].clone())
21159    }
21160    pub fn ty(&self, db: &dyn SyntaxGroup) -> Expr {
21161        Expr::from_syntax_node(db, self.children[3].clone())
21162    }
21163}
21164#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
21165pub struct GenericParamConstPtr(pub SyntaxStablePtrId);
21166impl GenericParamConstPtr {
21167    pub fn name_green(self, db: &dyn SyntaxGroup) -> TerminalIdentifierGreen {
21168        let ptr = self.0.lookup_intern(db);
21169        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
21170            TerminalIdentifierGreen(key_fields[0])
21171        } else {
21172            panic!("Unexpected key field query on root.");
21173        }
21174    }
21175}
21176impl TypedStablePtr for GenericParamConstPtr {
21177    type SyntaxNode = GenericParamConst;
21178    fn untyped(&self) -> SyntaxStablePtrId {
21179        self.0
21180    }
21181    fn lookup(&self, db: &dyn SyntaxGroup) -> GenericParamConst {
21182        GenericParamConst::from_syntax_node(db, self.0.lookup(db))
21183    }
21184}
21185impl From<GenericParamConstPtr> for SyntaxStablePtrId {
21186    fn from(ptr: GenericParamConstPtr) -> Self {
21187        ptr.untyped()
21188    }
21189}
21190#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
21191pub struct GenericParamConstGreen(pub GreenId);
21192impl TypedSyntaxNode for GenericParamConst {
21193    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::GenericParamConst);
21194    type StablePtr = GenericParamConstPtr;
21195    type Green = GenericParamConstGreen;
21196    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
21197        GenericParamConstGreen(
21198            Arc::new(GreenNode {
21199                kind: SyntaxKind::GenericParamConst,
21200                details: GreenNodeDetails::Node {
21201                    children: vec![
21202                        TerminalConst::missing(db).0,
21203                        TerminalIdentifier::missing(db).0,
21204                        TerminalColon::missing(db).0,
21205                        Expr::missing(db).0,
21206                    ],
21207                    width: TextWidth::default(),
21208                },
21209            })
21210            .intern(db),
21211        )
21212    }
21213    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
21214        let kind = node.kind(db);
21215        assert_eq!(
21216            kind,
21217            SyntaxKind::GenericParamConst,
21218            "Unexpected SyntaxKind {:?}. Expected {:?}.",
21219            kind,
21220            SyntaxKind::GenericParamConst
21221        );
21222        let children = db.get_children(node.clone());
21223        Self { node, children }
21224    }
21225    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
21226        let kind = node.kind(db);
21227        if kind == SyntaxKind::GenericParamConst {
21228            Some(Self::from_syntax_node(db, node))
21229        } else {
21230            None
21231        }
21232    }
21233    fn as_syntax_node(&self) -> SyntaxNode {
21234        self.node.clone()
21235    }
21236    fn stable_ptr(&self) -> Self::StablePtr {
21237        GenericParamConstPtr(self.node.0.stable_ptr)
21238    }
21239}
21240impl From<&GenericParamConst> for SyntaxStablePtrId {
21241    fn from(node: &GenericParamConst) -> Self {
21242        node.stable_ptr().untyped()
21243    }
21244}
21245#[derive(Clone, Debug, Eq, Hash, PartialEq)]
21246pub struct GenericParamImplNamed {
21247    node: SyntaxNode,
21248    children: Arc<[SyntaxNode]>,
21249}
21250impl GenericParamImplNamed {
21251    pub const INDEX_IMPL_KW: usize = 0;
21252    pub const INDEX_NAME: usize = 1;
21253    pub const INDEX_COLON: usize = 2;
21254    pub const INDEX_TRAIT_PATH: usize = 3;
21255    pub const INDEX_TYPE_CONSTRAINS: usize = 4;
21256    pub fn new_green(
21257        db: &dyn SyntaxGroup,
21258        impl_kw: TerminalImplGreen,
21259        name: TerminalIdentifierGreen,
21260        colon: TerminalColonGreen,
21261        trait_path: ExprPathGreen,
21262        type_constrains: OptionAssociatedItemConstraintsGreen,
21263    ) -> GenericParamImplNamedGreen {
21264        let children: Vec<GreenId> =
21265            vec![impl_kw.0, name.0, colon.0, trait_path.0, type_constrains.0];
21266        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
21267        GenericParamImplNamedGreen(
21268            Arc::new(GreenNode {
21269                kind: SyntaxKind::GenericParamImplNamed,
21270                details: GreenNodeDetails::Node { children, width },
21271            })
21272            .intern(db),
21273        )
21274    }
21275}
21276impl GenericParamImplNamed {
21277    pub fn impl_kw(&self, db: &dyn SyntaxGroup) -> TerminalImpl {
21278        TerminalImpl::from_syntax_node(db, self.children[0].clone())
21279    }
21280    pub fn name(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier {
21281        TerminalIdentifier::from_syntax_node(db, self.children[1].clone())
21282    }
21283    pub fn colon(&self, db: &dyn SyntaxGroup) -> TerminalColon {
21284        TerminalColon::from_syntax_node(db, self.children[2].clone())
21285    }
21286    pub fn trait_path(&self, db: &dyn SyntaxGroup) -> ExprPath {
21287        ExprPath::from_syntax_node(db, self.children[3].clone())
21288    }
21289    pub fn type_constrains(&self, db: &dyn SyntaxGroup) -> OptionAssociatedItemConstraints {
21290        OptionAssociatedItemConstraints::from_syntax_node(db, self.children[4].clone())
21291    }
21292}
21293#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
21294pub struct GenericParamImplNamedPtr(pub SyntaxStablePtrId);
21295impl GenericParamImplNamedPtr {
21296    pub fn name_green(self, db: &dyn SyntaxGroup) -> TerminalIdentifierGreen {
21297        let ptr = self.0.lookup_intern(db);
21298        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
21299            TerminalIdentifierGreen(key_fields[0])
21300        } else {
21301            panic!("Unexpected key field query on root.");
21302        }
21303    }
21304}
21305impl TypedStablePtr for GenericParamImplNamedPtr {
21306    type SyntaxNode = GenericParamImplNamed;
21307    fn untyped(&self) -> SyntaxStablePtrId {
21308        self.0
21309    }
21310    fn lookup(&self, db: &dyn SyntaxGroup) -> GenericParamImplNamed {
21311        GenericParamImplNamed::from_syntax_node(db, self.0.lookup(db))
21312    }
21313}
21314impl From<GenericParamImplNamedPtr> for SyntaxStablePtrId {
21315    fn from(ptr: GenericParamImplNamedPtr) -> Self {
21316        ptr.untyped()
21317    }
21318}
21319#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
21320pub struct GenericParamImplNamedGreen(pub GreenId);
21321impl TypedSyntaxNode for GenericParamImplNamed {
21322    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::GenericParamImplNamed);
21323    type StablePtr = GenericParamImplNamedPtr;
21324    type Green = GenericParamImplNamedGreen;
21325    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
21326        GenericParamImplNamedGreen(
21327            Arc::new(GreenNode {
21328                kind: SyntaxKind::GenericParamImplNamed,
21329                details: GreenNodeDetails::Node {
21330                    children: vec![
21331                        TerminalImpl::missing(db).0,
21332                        TerminalIdentifier::missing(db).0,
21333                        TerminalColon::missing(db).0,
21334                        ExprPath::missing(db).0,
21335                        OptionAssociatedItemConstraints::missing(db).0,
21336                    ],
21337                    width: TextWidth::default(),
21338                },
21339            })
21340            .intern(db),
21341        )
21342    }
21343    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
21344        let kind = node.kind(db);
21345        assert_eq!(
21346            kind,
21347            SyntaxKind::GenericParamImplNamed,
21348            "Unexpected SyntaxKind {:?}. Expected {:?}.",
21349            kind,
21350            SyntaxKind::GenericParamImplNamed
21351        );
21352        let children = db.get_children(node.clone());
21353        Self { node, children }
21354    }
21355    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
21356        let kind = node.kind(db);
21357        if kind == SyntaxKind::GenericParamImplNamed {
21358            Some(Self::from_syntax_node(db, node))
21359        } else {
21360            None
21361        }
21362    }
21363    fn as_syntax_node(&self) -> SyntaxNode {
21364        self.node.clone()
21365    }
21366    fn stable_ptr(&self) -> Self::StablePtr {
21367        GenericParamImplNamedPtr(self.node.0.stable_ptr)
21368    }
21369}
21370impl From<&GenericParamImplNamed> for SyntaxStablePtrId {
21371    fn from(node: &GenericParamImplNamed) -> Self {
21372        node.stable_ptr().untyped()
21373    }
21374}
21375#[derive(Clone, Debug, Eq, Hash, PartialEq)]
21376pub struct GenericParamImplAnonymous {
21377    node: SyntaxNode,
21378    children: Arc<[SyntaxNode]>,
21379}
21380impl GenericParamImplAnonymous {
21381    pub const INDEX_PLUS: usize = 0;
21382    pub const INDEX_TRAIT_PATH: usize = 1;
21383    pub const INDEX_TYPE_CONSTRAINS: usize = 2;
21384    pub fn new_green(
21385        db: &dyn SyntaxGroup,
21386        plus: TerminalPlusGreen,
21387        trait_path: ExprPathGreen,
21388        type_constrains: OptionAssociatedItemConstraintsGreen,
21389    ) -> GenericParamImplAnonymousGreen {
21390        let children: Vec<GreenId> = vec![plus.0, trait_path.0, type_constrains.0];
21391        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
21392        GenericParamImplAnonymousGreen(
21393            Arc::new(GreenNode {
21394                kind: SyntaxKind::GenericParamImplAnonymous,
21395                details: GreenNodeDetails::Node { children, width },
21396            })
21397            .intern(db),
21398        )
21399    }
21400}
21401impl GenericParamImplAnonymous {
21402    pub fn plus(&self, db: &dyn SyntaxGroup) -> TerminalPlus {
21403        TerminalPlus::from_syntax_node(db, self.children[0].clone())
21404    }
21405    pub fn trait_path(&self, db: &dyn SyntaxGroup) -> ExprPath {
21406        ExprPath::from_syntax_node(db, self.children[1].clone())
21407    }
21408    pub fn type_constrains(&self, db: &dyn SyntaxGroup) -> OptionAssociatedItemConstraints {
21409        OptionAssociatedItemConstraints::from_syntax_node(db, self.children[2].clone())
21410    }
21411}
21412#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
21413pub struct GenericParamImplAnonymousPtr(pub SyntaxStablePtrId);
21414impl GenericParamImplAnonymousPtr {}
21415impl TypedStablePtr for GenericParamImplAnonymousPtr {
21416    type SyntaxNode = GenericParamImplAnonymous;
21417    fn untyped(&self) -> SyntaxStablePtrId {
21418        self.0
21419    }
21420    fn lookup(&self, db: &dyn SyntaxGroup) -> GenericParamImplAnonymous {
21421        GenericParamImplAnonymous::from_syntax_node(db, self.0.lookup(db))
21422    }
21423}
21424impl From<GenericParamImplAnonymousPtr> for SyntaxStablePtrId {
21425    fn from(ptr: GenericParamImplAnonymousPtr) -> Self {
21426        ptr.untyped()
21427    }
21428}
21429#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
21430pub struct GenericParamImplAnonymousGreen(pub GreenId);
21431impl TypedSyntaxNode for GenericParamImplAnonymous {
21432    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::GenericParamImplAnonymous);
21433    type StablePtr = GenericParamImplAnonymousPtr;
21434    type Green = GenericParamImplAnonymousGreen;
21435    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
21436        GenericParamImplAnonymousGreen(
21437            Arc::new(GreenNode {
21438                kind: SyntaxKind::GenericParamImplAnonymous,
21439                details: GreenNodeDetails::Node {
21440                    children: vec![
21441                        TerminalPlus::missing(db).0,
21442                        ExprPath::missing(db).0,
21443                        OptionAssociatedItemConstraints::missing(db).0,
21444                    ],
21445                    width: TextWidth::default(),
21446                },
21447            })
21448            .intern(db),
21449        )
21450    }
21451    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
21452        let kind = node.kind(db);
21453        assert_eq!(
21454            kind,
21455            SyntaxKind::GenericParamImplAnonymous,
21456            "Unexpected SyntaxKind {:?}. Expected {:?}.",
21457            kind,
21458            SyntaxKind::GenericParamImplAnonymous
21459        );
21460        let children = db.get_children(node.clone());
21461        Self { node, children }
21462    }
21463    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
21464        let kind = node.kind(db);
21465        if kind == SyntaxKind::GenericParamImplAnonymous {
21466            Some(Self::from_syntax_node(db, node))
21467        } else {
21468            None
21469        }
21470    }
21471    fn as_syntax_node(&self) -> SyntaxNode {
21472        self.node.clone()
21473    }
21474    fn stable_ptr(&self) -> Self::StablePtr {
21475        GenericParamImplAnonymousPtr(self.node.0.stable_ptr)
21476    }
21477}
21478impl From<&GenericParamImplAnonymous> for SyntaxStablePtrId {
21479    fn from(node: &GenericParamImplAnonymous) -> Self {
21480        node.stable_ptr().untyped()
21481    }
21482}
21483#[derive(Clone, Debug, Eq, Hash, PartialEq)]
21484pub struct GenericParamNegativeImpl {
21485    node: SyntaxNode,
21486    children: Arc<[SyntaxNode]>,
21487}
21488impl GenericParamNegativeImpl {
21489    pub const INDEX_MINUS: usize = 0;
21490    pub const INDEX_TRAIT_PATH: usize = 1;
21491    pub fn new_green(
21492        db: &dyn SyntaxGroup,
21493        minus: TerminalMinusGreen,
21494        trait_path: ExprPathGreen,
21495    ) -> GenericParamNegativeImplGreen {
21496        let children: Vec<GreenId> = vec![minus.0, trait_path.0];
21497        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
21498        GenericParamNegativeImplGreen(
21499            Arc::new(GreenNode {
21500                kind: SyntaxKind::GenericParamNegativeImpl,
21501                details: GreenNodeDetails::Node { children, width },
21502            })
21503            .intern(db),
21504        )
21505    }
21506}
21507impl GenericParamNegativeImpl {
21508    pub fn minus(&self, db: &dyn SyntaxGroup) -> TerminalMinus {
21509        TerminalMinus::from_syntax_node(db, self.children[0].clone())
21510    }
21511    pub fn trait_path(&self, db: &dyn SyntaxGroup) -> ExprPath {
21512        ExprPath::from_syntax_node(db, self.children[1].clone())
21513    }
21514}
21515#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
21516pub struct GenericParamNegativeImplPtr(pub SyntaxStablePtrId);
21517impl GenericParamNegativeImplPtr {}
21518impl TypedStablePtr for GenericParamNegativeImplPtr {
21519    type SyntaxNode = GenericParamNegativeImpl;
21520    fn untyped(&self) -> SyntaxStablePtrId {
21521        self.0
21522    }
21523    fn lookup(&self, db: &dyn SyntaxGroup) -> GenericParamNegativeImpl {
21524        GenericParamNegativeImpl::from_syntax_node(db, self.0.lookup(db))
21525    }
21526}
21527impl From<GenericParamNegativeImplPtr> for SyntaxStablePtrId {
21528    fn from(ptr: GenericParamNegativeImplPtr) -> Self {
21529        ptr.untyped()
21530    }
21531}
21532#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
21533pub struct GenericParamNegativeImplGreen(pub GreenId);
21534impl TypedSyntaxNode for GenericParamNegativeImpl {
21535    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::GenericParamNegativeImpl);
21536    type StablePtr = GenericParamNegativeImplPtr;
21537    type Green = GenericParamNegativeImplGreen;
21538    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
21539        GenericParamNegativeImplGreen(
21540            Arc::new(GreenNode {
21541                kind: SyntaxKind::GenericParamNegativeImpl,
21542                details: GreenNodeDetails::Node {
21543                    children: vec![TerminalMinus::missing(db).0, ExprPath::missing(db).0],
21544                    width: TextWidth::default(),
21545                },
21546            })
21547            .intern(db),
21548        )
21549    }
21550    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
21551        let kind = node.kind(db);
21552        assert_eq!(
21553            kind,
21554            SyntaxKind::GenericParamNegativeImpl,
21555            "Unexpected SyntaxKind {:?}. Expected {:?}.",
21556            kind,
21557            SyntaxKind::GenericParamNegativeImpl
21558        );
21559        let children = db.get_children(node.clone());
21560        Self { node, children }
21561    }
21562    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
21563        let kind = node.kind(db);
21564        if kind == SyntaxKind::GenericParamNegativeImpl {
21565            Some(Self::from_syntax_node(db, node))
21566        } else {
21567            None
21568        }
21569    }
21570    fn as_syntax_node(&self) -> SyntaxNode {
21571        self.node.clone()
21572    }
21573    fn stable_ptr(&self) -> Self::StablePtr {
21574        GenericParamNegativeImplPtr(self.node.0.stable_ptr)
21575    }
21576}
21577impl From<&GenericParamNegativeImpl> for SyntaxStablePtrId {
21578    fn from(node: &GenericParamNegativeImpl) -> Self {
21579        node.stable_ptr().untyped()
21580    }
21581}
21582#[derive(Clone, Debug, Eq, Hash, PartialEq)]
21583pub struct TriviumSkippedNode {
21584    node: SyntaxNode,
21585    children: Arc<[SyntaxNode]>,
21586}
21587impl TriviumSkippedNode {
21588    pub const INDEX_NODE: usize = 0;
21589    pub fn new_green(db: &dyn SyntaxGroup, node: SkippedNodeGreen) -> TriviumSkippedNodeGreen {
21590        let children: Vec<GreenId> = vec![node.0];
21591        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
21592        TriviumSkippedNodeGreen(
21593            Arc::new(GreenNode {
21594                kind: SyntaxKind::TriviumSkippedNode,
21595                details: GreenNodeDetails::Node { children, width },
21596            })
21597            .intern(db),
21598        )
21599    }
21600}
21601impl TriviumSkippedNode {
21602    pub fn node(&self, db: &dyn SyntaxGroup) -> SkippedNode {
21603        SkippedNode::from_syntax_node(db, self.children[0].clone())
21604    }
21605}
21606#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
21607pub struct TriviumSkippedNodePtr(pub SyntaxStablePtrId);
21608impl TriviumSkippedNodePtr {}
21609impl TypedStablePtr for TriviumSkippedNodePtr {
21610    type SyntaxNode = TriviumSkippedNode;
21611    fn untyped(&self) -> SyntaxStablePtrId {
21612        self.0
21613    }
21614    fn lookup(&self, db: &dyn SyntaxGroup) -> TriviumSkippedNode {
21615        TriviumSkippedNode::from_syntax_node(db, self.0.lookup(db))
21616    }
21617}
21618impl From<TriviumSkippedNodePtr> for SyntaxStablePtrId {
21619    fn from(ptr: TriviumSkippedNodePtr) -> Self {
21620        ptr.untyped()
21621    }
21622}
21623#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
21624pub struct TriviumSkippedNodeGreen(pub GreenId);
21625impl TypedSyntaxNode for TriviumSkippedNode {
21626    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TriviumSkippedNode);
21627    type StablePtr = TriviumSkippedNodePtr;
21628    type Green = TriviumSkippedNodeGreen;
21629    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
21630        TriviumSkippedNodeGreen(
21631            Arc::new(GreenNode {
21632                kind: SyntaxKind::TriviumSkippedNode,
21633                details: GreenNodeDetails::Node {
21634                    children: vec![SkippedNode::missing(db).0],
21635                    width: TextWidth::default(),
21636                },
21637            })
21638            .intern(db),
21639        )
21640    }
21641    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
21642        let kind = node.kind(db);
21643        assert_eq!(
21644            kind,
21645            SyntaxKind::TriviumSkippedNode,
21646            "Unexpected SyntaxKind {:?}. Expected {:?}.",
21647            kind,
21648            SyntaxKind::TriviumSkippedNode
21649        );
21650        let children = db.get_children(node.clone());
21651        Self { node, children }
21652    }
21653    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
21654        let kind = node.kind(db);
21655        if kind == SyntaxKind::TriviumSkippedNode {
21656            Some(Self::from_syntax_node(db, node))
21657        } else {
21658            None
21659        }
21660    }
21661    fn as_syntax_node(&self) -> SyntaxNode {
21662        self.node.clone()
21663    }
21664    fn stable_ptr(&self) -> Self::StablePtr {
21665        TriviumSkippedNodePtr(self.node.0.stable_ptr)
21666    }
21667}
21668impl From<&TriviumSkippedNode> for SyntaxStablePtrId {
21669    fn from(node: &TriviumSkippedNode) -> Self {
21670        node.stable_ptr().untyped()
21671    }
21672}
21673#[derive(Clone, Debug, Eq, Hash, PartialEq)]
21674pub enum SkippedNode {
21675    AttributeList(AttributeList),
21676    VisibilityPub(VisibilityPub),
21677}
21678#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
21679pub struct SkippedNodePtr(pub SyntaxStablePtrId);
21680impl TypedStablePtr for SkippedNodePtr {
21681    type SyntaxNode = SkippedNode;
21682    fn untyped(&self) -> SyntaxStablePtrId {
21683        self.0
21684    }
21685    fn lookup(&self, db: &dyn SyntaxGroup) -> SkippedNode {
21686        SkippedNode::from_syntax_node(db, self.0.lookup(db))
21687    }
21688}
21689impl From<SkippedNodePtr> for SyntaxStablePtrId {
21690    fn from(ptr: SkippedNodePtr) -> Self {
21691        ptr.untyped()
21692    }
21693}
21694impl From<AttributeListPtr> for SkippedNodePtr {
21695    fn from(value: AttributeListPtr) -> Self {
21696        Self(value.0)
21697    }
21698}
21699impl From<VisibilityPubPtr> for SkippedNodePtr {
21700    fn from(value: VisibilityPubPtr) -> Self {
21701        Self(value.0)
21702    }
21703}
21704impl From<AttributeListGreen> for SkippedNodeGreen {
21705    fn from(value: AttributeListGreen) -> Self {
21706        Self(value.0)
21707    }
21708}
21709impl From<VisibilityPubGreen> for SkippedNodeGreen {
21710    fn from(value: VisibilityPubGreen) -> Self {
21711        Self(value.0)
21712    }
21713}
21714#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
21715pub struct SkippedNodeGreen(pub GreenId);
21716impl TypedSyntaxNode for SkippedNode {
21717    const OPTIONAL_KIND: Option<SyntaxKind> = None;
21718    type StablePtr = SkippedNodePtr;
21719    type Green = SkippedNodeGreen;
21720    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
21721        panic!("No missing variant.");
21722    }
21723    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
21724        let kind = node.kind(db);
21725        match kind {
21726            SyntaxKind::AttributeList => {
21727                SkippedNode::AttributeList(AttributeList::from_syntax_node(db, node))
21728            }
21729            SyntaxKind::VisibilityPub => {
21730                SkippedNode::VisibilityPub(VisibilityPub::from_syntax_node(db, node))
21731            }
21732            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "SkippedNode"),
21733        }
21734    }
21735    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
21736        let kind = node.kind(db);
21737        match kind {
21738            SyntaxKind::AttributeList => {
21739                Some(SkippedNode::AttributeList(AttributeList::from_syntax_node(db, node)))
21740            }
21741            SyntaxKind::VisibilityPub => {
21742                Some(SkippedNode::VisibilityPub(VisibilityPub::from_syntax_node(db, node)))
21743            }
21744            _ => None,
21745        }
21746    }
21747    fn as_syntax_node(&self) -> SyntaxNode {
21748        match self {
21749            SkippedNode::AttributeList(x) => x.as_syntax_node(),
21750            SkippedNode::VisibilityPub(x) => x.as_syntax_node(),
21751        }
21752    }
21753    fn stable_ptr(&self) -> Self::StablePtr {
21754        SkippedNodePtr(self.as_syntax_node().0.stable_ptr)
21755    }
21756}
21757impl From<&SkippedNode> for SyntaxStablePtrId {
21758    fn from(node: &SkippedNode) -> Self {
21759        node.stable_ptr().untyped()
21760    }
21761}
21762impl SkippedNode {
21763    /// Checks if a kind of a variant of [SkippedNode].
21764    pub fn is_variant(kind: SyntaxKind) -> bool {
21765        matches!(kind, SyntaxKind::AttributeList | SyntaxKind::VisibilityPub)
21766    }
21767}
21768#[derive(Clone, Debug, Eq, Hash, PartialEq)]
21769pub struct TokenIdentifier {
21770    node: SyntaxNode,
21771}
21772impl Token for TokenIdentifier {
21773    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
21774        TokenIdentifierGreen(
21775            Arc::new(GreenNode {
21776                kind: SyntaxKind::TokenIdentifier,
21777                details: GreenNodeDetails::Token(text),
21778            })
21779            .intern(db),
21780        )
21781    }
21782    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
21783        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
21784            .clone()
21785    }
21786}
21787#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
21788pub struct TokenIdentifierPtr(pub SyntaxStablePtrId);
21789impl TypedStablePtr for TokenIdentifierPtr {
21790    type SyntaxNode = TokenIdentifier;
21791    fn untyped(&self) -> SyntaxStablePtrId {
21792        self.0
21793    }
21794    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenIdentifier {
21795        TokenIdentifier::from_syntax_node(db, self.0.lookup(db))
21796    }
21797}
21798impl From<TokenIdentifierPtr> for SyntaxStablePtrId {
21799    fn from(ptr: TokenIdentifierPtr) -> Self {
21800        ptr.untyped()
21801    }
21802}
21803#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
21804pub struct TokenIdentifierGreen(pub GreenId);
21805impl TokenIdentifierGreen {
21806    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
21807        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
21808    }
21809}
21810impl TypedSyntaxNode for TokenIdentifier {
21811    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenIdentifier);
21812    type StablePtr = TokenIdentifierPtr;
21813    type Green = TokenIdentifierGreen;
21814    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
21815        TokenIdentifierGreen(
21816            Arc::new(GreenNode {
21817                kind: SyntaxKind::TokenMissing,
21818                details: GreenNodeDetails::Token("".into()),
21819            })
21820            .intern(db),
21821        )
21822    }
21823    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
21824        match node.0.green.lookup_intern(db).details {
21825            GreenNodeDetails::Token(_) => Self { node },
21826            GreenNodeDetails::Node { .. } => {
21827                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenIdentifier)
21828            }
21829        }
21830    }
21831    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
21832        match node.0.green.lookup_intern(db).details {
21833            GreenNodeDetails::Token(_) => Some(Self { node }),
21834            GreenNodeDetails::Node { .. } => None,
21835        }
21836    }
21837    fn as_syntax_node(&self) -> SyntaxNode {
21838        self.node.clone()
21839    }
21840    fn stable_ptr(&self) -> Self::StablePtr {
21841        TokenIdentifierPtr(self.node.0.stable_ptr)
21842    }
21843}
21844impl From<&TokenIdentifier> for SyntaxStablePtrId {
21845    fn from(node: &TokenIdentifier) -> Self {
21846        node.stable_ptr().untyped()
21847    }
21848}
21849#[derive(Clone, Debug, Eq, Hash, PartialEq)]
21850pub struct TerminalIdentifier {
21851    node: SyntaxNode,
21852    children: Arc<[SyntaxNode]>,
21853}
21854impl Terminal for TerminalIdentifier {
21855    const KIND: SyntaxKind = SyntaxKind::TerminalIdentifier;
21856    type TokenType = TokenIdentifier;
21857    fn new_green(
21858        db: &dyn SyntaxGroup,
21859        leading_trivia: TriviaGreen,
21860        token: <<TerminalIdentifier as Terminal>::TokenType as TypedSyntaxNode>::Green,
21861        trailing_trivia: TriviaGreen,
21862    ) -> Self::Green {
21863        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
21864        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
21865        TerminalIdentifierGreen(
21866            Arc::new(GreenNode {
21867                kind: SyntaxKind::TerminalIdentifier,
21868                details: GreenNodeDetails::Node { children, width },
21869            })
21870            .intern(db),
21871        )
21872    }
21873    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
21874        self.token(db).text(db)
21875    }
21876}
21877impl TerminalIdentifier {
21878    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
21879        Trivia::from_syntax_node(db, self.children[0].clone())
21880    }
21881    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenIdentifier {
21882        TokenIdentifier::from_syntax_node(db, self.children[1].clone())
21883    }
21884    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
21885        Trivia::from_syntax_node(db, self.children[2].clone())
21886    }
21887}
21888#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
21889pub struct TerminalIdentifierPtr(pub SyntaxStablePtrId);
21890impl TerminalIdentifierPtr {}
21891impl TypedStablePtr for TerminalIdentifierPtr {
21892    type SyntaxNode = TerminalIdentifier;
21893    fn untyped(&self) -> SyntaxStablePtrId {
21894        self.0
21895    }
21896    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier {
21897        TerminalIdentifier::from_syntax_node(db, self.0.lookup(db))
21898    }
21899}
21900impl From<TerminalIdentifierPtr> for SyntaxStablePtrId {
21901    fn from(ptr: TerminalIdentifierPtr) -> Self {
21902        ptr.untyped()
21903    }
21904}
21905#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
21906pub struct TerminalIdentifierGreen(pub GreenId);
21907impl TypedSyntaxNode for TerminalIdentifier {
21908    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalIdentifier);
21909    type StablePtr = TerminalIdentifierPtr;
21910    type Green = TerminalIdentifierGreen;
21911    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
21912        TerminalIdentifierGreen(
21913            Arc::new(GreenNode {
21914                kind: SyntaxKind::TerminalIdentifier,
21915                details: GreenNodeDetails::Node {
21916                    children: vec![
21917                        Trivia::missing(db).0,
21918                        TokenIdentifier::missing(db).0,
21919                        Trivia::missing(db).0,
21920                    ],
21921                    width: TextWidth::default(),
21922                },
21923            })
21924            .intern(db),
21925        )
21926    }
21927    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
21928        let kind = node.kind(db);
21929        assert_eq!(
21930            kind,
21931            SyntaxKind::TerminalIdentifier,
21932            "Unexpected SyntaxKind {:?}. Expected {:?}.",
21933            kind,
21934            SyntaxKind::TerminalIdentifier
21935        );
21936        let children = db.get_children(node.clone());
21937        Self { node, children }
21938    }
21939    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
21940        let kind = node.kind(db);
21941        if kind == SyntaxKind::TerminalIdentifier {
21942            Some(Self::from_syntax_node(db, node))
21943        } else {
21944            None
21945        }
21946    }
21947    fn as_syntax_node(&self) -> SyntaxNode {
21948        self.node.clone()
21949    }
21950    fn stable_ptr(&self) -> Self::StablePtr {
21951        TerminalIdentifierPtr(self.node.0.stable_ptr)
21952    }
21953}
21954impl From<&TerminalIdentifier> for SyntaxStablePtrId {
21955    fn from(node: &TerminalIdentifier) -> Self {
21956        node.stable_ptr().untyped()
21957    }
21958}
21959#[derive(Clone, Debug, Eq, Hash, PartialEq)]
21960pub struct TokenLiteralNumber {
21961    node: SyntaxNode,
21962}
21963impl Token for TokenLiteralNumber {
21964    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
21965        TokenLiteralNumberGreen(
21966            Arc::new(GreenNode {
21967                kind: SyntaxKind::TokenLiteralNumber,
21968                details: GreenNodeDetails::Token(text),
21969            })
21970            .intern(db),
21971        )
21972    }
21973    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
21974        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
21975            .clone()
21976    }
21977}
21978#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
21979pub struct TokenLiteralNumberPtr(pub SyntaxStablePtrId);
21980impl TypedStablePtr for TokenLiteralNumberPtr {
21981    type SyntaxNode = TokenLiteralNumber;
21982    fn untyped(&self) -> SyntaxStablePtrId {
21983        self.0
21984    }
21985    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenLiteralNumber {
21986        TokenLiteralNumber::from_syntax_node(db, self.0.lookup(db))
21987    }
21988}
21989impl From<TokenLiteralNumberPtr> for SyntaxStablePtrId {
21990    fn from(ptr: TokenLiteralNumberPtr) -> Self {
21991        ptr.untyped()
21992    }
21993}
21994#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
21995pub struct TokenLiteralNumberGreen(pub GreenId);
21996impl TokenLiteralNumberGreen {
21997    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
21998        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
21999    }
22000}
22001impl TypedSyntaxNode for TokenLiteralNumber {
22002    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenLiteralNumber);
22003    type StablePtr = TokenLiteralNumberPtr;
22004    type Green = TokenLiteralNumberGreen;
22005    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
22006        TokenLiteralNumberGreen(
22007            Arc::new(GreenNode {
22008                kind: SyntaxKind::TokenMissing,
22009                details: GreenNodeDetails::Token("".into()),
22010            })
22011            .intern(db),
22012        )
22013    }
22014    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
22015        match node.0.green.lookup_intern(db).details {
22016            GreenNodeDetails::Token(_) => Self { node },
22017            GreenNodeDetails::Node { .. } => panic!(
22018                "Expected a token {:?}, not an internal node",
22019                SyntaxKind::TokenLiteralNumber
22020            ),
22021        }
22022    }
22023    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
22024        match node.0.green.lookup_intern(db).details {
22025            GreenNodeDetails::Token(_) => Some(Self { node }),
22026            GreenNodeDetails::Node { .. } => None,
22027        }
22028    }
22029    fn as_syntax_node(&self) -> SyntaxNode {
22030        self.node.clone()
22031    }
22032    fn stable_ptr(&self) -> Self::StablePtr {
22033        TokenLiteralNumberPtr(self.node.0.stable_ptr)
22034    }
22035}
22036impl From<&TokenLiteralNumber> for SyntaxStablePtrId {
22037    fn from(node: &TokenLiteralNumber) -> Self {
22038        node.stable_ptr().untyped()
22039    }
22040}
22041#[derive(Clone, Debug, Eq, Hash, PartialEq)]
22042pub struct TerminalLiteralNumber {
22043    node: SyntaxNode,
22044    children: Arc<[SyntaxNode]>,
22045}
22046impl Terminal for TerminalLiteralNumber {
22047    const KIND: SyntaxKind = SyntaxKind::TerminalLiteralNumber;
22048    type TokenType = TokenLiteralNumber;
22049    fn new_green(
22050        db: &dyn SyntaxGroup,
22051        leading_trivia: TriviaGreen,
22052        token: <<TerminalLiteralNumber as Terminal>::TokenType as TypedSyntaxNode>::Green,
22053        trailing_trivia: TriviaGreen,
22054    ) -> Self::Green {
22055        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
22056        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
22057        TerminalLiteralNumberGreen(
22058            Arc::new(GreenNode {
22059                kind: SyntaxKind::TerminalLiteralNumber,
22060                details: GreenNodeDetails::Node { children, width },
22061            })
22062            .intern(db),
22063        )
22064    }
22065    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
22066        self.token(db).text(db)
22067    }
22068}
22069impl TerminalLiteralNumber {
22070    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
22071        Trivia::from_syntax_node(db, self.children[0].clone())
22072    }
22073    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenLiteralNumber {
22074        TokenLiteralNumber::from_syntax_node(db, self.children[1].clone())
22075    }
22076    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
22077        Trivia::from_syntax_node(db, self.children[2].clone())
22078    }
22079}
22080#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
22081pub struct TerminalLiteralNumberPtr(pub SyntaxStablePtrId);
22082impl TerminalLiteralNumberPtr {}
22083impl TypedStablePtr for TerminalLiteralNumberPtr {
22084    type SyntaxNode = TerminalLiteralNumber;
22085    fn untyped(&self) -> SyntaxStablePtrId {
22086        self.0
22087    }
22088    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalLiteralNumber {
22089        TerminalLiteralNumber::from_syntax_node(db, self.0.lookup(db))
22090    }
22091}
22092impl From<TerminalLiteralNumberPtr> for SyntaxStablePtrId {
22093    fn from(ptr: TerminalLiteralNumberPtr) -> Self {
22094        ptr.untyped()
22095    }
22096}
22097#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
22098pub struct TerminalLiteralNumberGreen(pub GreenId);
22099impl TypedSyntaxNode for TerminalLiteralNumber {
22100    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalLiteralNumber);
22101    type StablePtr = TerminalLiteralNumberPtr;
22102    type Green = TerminalLiteralNumberGreen;
22103    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
22104        TerminalLiteralNumberGreen(
22105            Arc::new(GreenNode {
22106                kind: SyntaxKind::TerminalLiteralNumber,
22107                details: GreenNodeDetails::Node {
22108                    children: vec![
22109                        Trivia::missing(db).0,
22110                        TokenLiteralNumber::missing(db).0,
22111                        Trivia::missing(db).0,
22112                    ],
22113                    width: TextWidth::default(),
22114                },
22115            })
22116            .intern(db),
22117        )
22118    }
22119    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
22120        let kind = node.kind(db);
22121        assert_eq!(
22122            kind,
22123            SyntaxKind::TerminalLiteralNumber,
22124            "Unexpected SyntaxKind {:?}. Expected {:?}.",
22125            kind,
22126            SyntaxKind::TerminalLiteralNumber
22127        );
22128        let children = db.get_children(node.clone());
22129        Self { node, children }
22130    }
22131    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
22132        let kind = node.kind(db);
22133        if kind == SyntaxKind::TerminalLiteralNumber {
22134            Some(Self::from_syntax_node(db, node))
22135        } else {
22136            None
22137        }
22138    }
22139    fn as_syntax_node(&self) -> SyntaxNode {
22140        self.node.clone()
22141    }
22142    fn stable_ptr(&self) -> Self::StablePtr {
22143        TerminalLiteralNumberPtr(self.node.0.stable_ptr)
22144    }
22145}
22146impl From<&TerminalLiteralNumber> for SyntaxStablePtrId {
22147    fn from(node: &TerminalLiteralNumber) -> Self {
22148        node.stable_ptr().untyped()
22149    }
22150}
22151#[derive(Clone, Debug, Eq, Hash, PartialEq)]
22152pub struct TokenShortString {
22153    node: SyntaxNode,
22154}
22155impl Token for TokenShortString {
22156    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
22157        TokenShortStringGreen(
22158            Arc::new(GreenNode {
22159                kind: SyntaxKind::TokenShortString,
22160                details: GreenNodeDetails::Token(text),
22161            })
22162            .intern(db),
22163        )
22164    }
22165    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
22166        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
22167            .clone()
22168    }
22169}
22170#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
22171pub struct TokenShortStringPtr(pub SyntaxStablePtrId);
22172impl TypedStablePtr for TokenShortStringPtr {
22173    type SyntaxNode = TokenShortString;
22174    fn untyped(&self) -> SyntaxStablePtrId {
22175        self.0
22176    }
22177    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenShortString {
22178        TokenShortString::from_syntax_node(db, self.0.lookup(db))
22179    }
22180}
22181impl From<TokenShortStringPtr> for SyntaxStablePtrId {
22182    fn from(ptr: TokenShortStringPtr) -> Self {
22183        ptr.untyped()
22184    }
22185}
22186#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
22187pub struct TokenShortStringGreen(pub GreenId);
22188impl TokenShortStringGreen {
22189    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
22190        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
22191    }
22192}
22193impl TypedSyntaxNode for TokenShortString {
22194    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenShortString);
22195    type StablePtr = TokenShortStringPtr;
22196    type Green = TokenShortStringGreen;
22197    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
22198        TokenShortStringGreen(
22199            Arc::new(GreenNode {
22200                kind: SyntaxKind::TokenMissing,
22201                details: GreenNodeDetails::Token("".into()),
22202            })
22203            .intern(db),
22204        )
22205    }
22206    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
22207        match node.0.green.lookup_intern(db).details {
22208            GreenNodeDetails::Token(_) => Self { node },
22209            GreenNodeDetails::Node { .. } => {
22210                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenShortString)
22211            }
22212        }
22213    }
22214    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
22215        match node.0.green.lookup_intern(db).details {
22216            GreenNodeDetails::Token(_) => Some(Self { node }),
22217            GreenNodeDetails::Node { .. } => None,
22218        }
22219    }
22220    fn as_syntax_node(&self) -> SyntaxNode {
22221        self.node.clone()
22222    }
22223    fn stable_ptr(&self) -> Self::StablePtr {
22224        TokenShortStringPtr(self.node.0.stable_ptr)
22225    }
22226}
22227impl From<&TokenShortString> for SyntaxStablePtrId {
22228    fn from(node: &TokenShortString) -> Self {
22229        node.stable_ptr().untyped()
22230    }
22231}
22232#[derive(Clone, Debug, Eq, Hash, PartialEq)]
22233pub struct TerminalShortString {
22234    node: SyntaxNode,
22235    children: Arc<[SyntaxNode]>,
22236}
22237impl Terminal for TerminalShortString {
22238    const KIND: SyntaxKind = SyntaxKind::TerminalShortString;
22239    type TokenType = TokenShortString;
22240    fn new_green(
22241        db: &dyn SyntaxGroup,
22242        leading_trivia: TriviaGreen,
22243        token: <<TerminalShortString as Terminal>::TokenType as TypedSyntaxNode>::Green,
22244        trailing_trivia: TriviaGreen,
22245    ) -> Self::Green {
22246        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
22247        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
22248        TerminalShortStringGreen(
22249            Arc::new(GreenNode {
22250                kind: SyntaxKind::TerminalShortString,
22251                details: GreenNodeDetails::Node { children, width },
22252            })
22253            .intern(db),
22254        )
22255    }
22256    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
22257        self.token(db).text(db)
22258    }
22259}
22260impl TerminalShortString {
22261    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
22262        Trivia::from_syntax_node(db, self.children[0].clone())
22263    }
22264    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenShortString {
22265        TokenShortString::from_syntax_node(db, self.children[1].clone())
22266    }
22267    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
22268        Trivia::from_syntax_node(db, self.children[2].clone())
22269    }
22270}
22271#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
22272pub struct TerminalShortStringPtr(pub SyntaxStablePtrId);
22273impl TerminalShortStringPtr {}
22274impl TypedStablePtr for TerminalShortStringPtr {
22275    type SyntaxNode = TerminalShortString;
22276    fn untyped(&self) -> SyntaxStablePtrId {
22277        self.0
22278    }
22279    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalShortString {
22280        TerminalShortString::from_syntax_node(db, self.0.lookup(db))
22281    }
22282}
22283impl From<TerminalShortStringPtr> for SyntaxStablePtrId {
22284    fn from(ptr: TerminalShortStringPtr) -> Self {
22285        ptr.untyped()
22286    }
22287}
22288#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
22289pub struct TerminalShortStringGreen(pub GreenId);
22290impl TypedSyntaxNode for TerminalShortString {
22291    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalShortString);
22292    type StablePtr = TerminalShortStringPtr;
22293    type Green = TerminalShortStringGreen;
22294    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
22295        TerminalShortStringGreen(
22296            Arc::new(GreenNode {
22297                kind: SyntaxKind::TerminalShortString,
22298                details: GreenNodeDetails::Node {
22299                    children: vec![
22300                        Trivia::missing(db).0,
22301                        TokenShortString::missing(db).0,
22302                        Trivia::missing(db).0,
22303                    ],
22304                    width: TextWidth::default(),
22305                },
22306            })
22307            .intern(db),
22308        )
22309    }
22310    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
22311        let kind = node.kind(db);
22312        assert_eq!(
22313            kind,
22314            SyntaxKind::TerminalShortString,
22315            "Unexpected SyntaxKind {:?}. Expected {:?}.",
22316            kind,
22317            SyntaxKind::TerminalShortString
22318        );
22319        let children = db.get_children(node.clone());
22320        Self { node, children }
22321    }
22322    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
22323        let kind = node.kind(db);
22324        if kind == SyntaxKind::TerminalShortString {
22325            Some(Self::from_syntax_node(db, node))
22326        } else {
22327            None
22328        }
22329    }
22330    fn as_syntax_node(&self) -> SyntaxNode {
22331        self.node.clone()
22332    }
22333    fn stable_ptr(&self) -> Self::StablePtr {
22334        TerminalShortStringPtr(self.node.0.stable_ptr)
22335    }
22336}
22337impl From<&TerminalShortString> for SyntaxStablePtrId {
22338    fn from(node: &TerminalShortString) -> Self {
22339        node.stable_ptr().untyped()
22340    }
22341}
22342#[derive(Clone, Debug, Eq, Hash, PartialEq)]
22343pub struct TokenString {
22344    node: SyntaxNode,
22345}
22346impl Token for TokenString {
22347    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
22348        TokenStringGreen(
22349            Arc::new(GreenNode {
22350                kind: SyntaxKind::TokenString,
22351                details: GreenNodeDetails::Token(text),
22352            })
22353            .intern(db),
22354        )
22355    }
22356    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
22357        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
22358            .clone()
22359    }
22360}
22361#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
22362pub struct TokenStringPtr(pub SyntaxStablePtrId);
22363impl TypedStablePtr for TokenStringPtr {
22364    type SyntaxNode = TokenString;
22365    fn untyped(&self) -> SyntaxStablePtrId {
22366        self.0
22367    }
22368    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenString {
22369        TokenString::from_syntax_node(db, self.0.lookup(db))
22370    }
22371}
22372impl From<TokenStringPtr> for SyntaxStablePtrId {
22373    fn from(ptr: TokenStringPtr) -> Self {
22374        ptr.untyped()
22375    }
22376}
22377#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
22378pub struct TokenStringGreen(pub GreenId);
22379impl TokenStringGreen {
22380    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
22381        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
22382    }
22383}
22384impl TypedSyntaxNode for TokenString {
22385    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenString);
22386    type StablePtr = TokenStringPtr;
22387    type Green = TokenStringGreen;
22388    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
22389        TokenStringGreen(
22390            Arc::new(GreenNode {
22391                kind: SyntaxKind::TokenMissing,
22392                details: GreenNodeDetails::Token("".into()),
22393            })
22394            .intern(db),
22395        )
22396    }
22397    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
22398        match node.0.green.lookup_intern(db).details {
22399            GreenNodeDetails::Token(_) => Self { node },
22400            GreenNodeDetails::Node { .. } => {
22401                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenString)
22402            }
22403        }
22404    }
22405    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
22406        match node.0.green.lookup_intern(db).details {
22407            GreenNodeDetails::Token(_) => Some(Self { node }),
22408            GreenNodeDetails::Node { .. } => None,
22409        }
22410    }
22411    fn as_syntax_node(&self) -> SyntaxNode {
22412        self.node.clone()
22413    }
22414    fn stable_ptr(&self) -> Self::StablePtr {
22415        TokenStringPtr(self.node.0.stable_ptr)
22416    }
22417}
22418impl From<&TokenString> for SyntaxStablePtrId {
22419    fn from(node: &TokenString) -> Self {
22420        node.stable_ptr().untyped()
22421    }
22422}
22423#[derive(Clone, Debug, Eq, Hash, PartialEq)]
22424pub struct TerminalString {
22425    node: SyntaxNode,
22426    children: Arc<[SyntaxNode]>,
22427}
22428impl Terminal for TerminalString {
22429    const KIND: SyntaxKind = SyntaxKind::TerminalString;
22430    type TokenType = TokenString;
22431    fn new_green(
22432        db: &dyn SyntaxGroup,
22433        leading_trivia: TriviaGreen,
22434        token: <<TerminalString as Terminal>::TokenType as TypedSyntaxNode>::Green,
22435        trailing_trivia: TriviaGreen,
22436    ) -> Self::Green {
22437        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
22438        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
22439        TerminalStringGreen(
22440            Arc::new(GreenNode {
22441                kind: SyntaxKind::TerminalString,
22442                details: GreenNodeDetails::Node { children, width },
22443            })
22444            .intern(db),
22445        )
22446    }
22447    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
22448        self.token(db).text(db)
22449    }
22450}
22451impl TerminalString {
22452    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
22453        Trivia::from_syntax_node(db, self.children[0].clone())
22454    }
22455    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenString {
22456        TokenString::from_syntax_node(db, self.children[1].clone())
22457    }
22458    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
22459        Trivia::from_syntax_node(db, self.children[2].clone())
22460    }
22461}
22462#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
22463pub struct TerminalStringPtr(pub SyntaxStablePtrId);
22464impl TerminalStringPtr {}
22465impl TypedStablePtr for TerminalStringPtr {
22466    type SyntaxNode = TerminalString;
22467    fn untyped(&self) -> SyntaxStablePtrId {
22468        self.0
22469    }
22470    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalString {
22471        TerminalString::from_syntax_node(db, self.0.lookup(db))
22472    }
22473}
22474impl From<TerminalStringPtr> for SyntaxStablePtrId {
22475    fn from(ptr: TerminalStringPtr) -> Self {
22476        ptr.untyped()
22477    }
22478}
22479#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
22480pub struct TerminalStringGreen(pub GreenId);
22481impl TypedSyntaxNode for TerminalString {
22482    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalString);
22483    type StablePtr = TerminalStringPtr;
22484    type Green = TerminalStringGreen;
22485    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
22486        TerminalStringGreen(
22487            Arc::new(GreenNode {
22488                kind: SyntaxKind::TerminalString,
22489                details: GreenNodeDetails::Node {
22490                    children: vec![
22491                        Trivia::missing(db).0,
22492                        TokenString::missing(db).0,
22493                        Trivia::missing(db).0,
22494                    ],
22495                    width: TextWidth::default(),
22496                },
22497            })
22498            .intern(db),
22499        )
22500    }
22501    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
22502        let kind = node.kind(db);
22503        assert_eq!(
22504            kind,
22505            SyntaxKind::TerminalString,
22506            "Unexpected SyntaxKind {:?}. Expected {:?}.",
22507            kind,
22508            SyntaxKind::TerminalString
22509        );
22510        let children = db.get_children(node.clone());
22511        Self { node, children }
22512    }
22513    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
22514        let kind = node.kind(db);
22515        if kind == SyntaxKind::TerminalString {
22516            Some(Self::from_syntax_node(db, node))
22517        } else {
22518            None
22519        }
22520    }
22521    fn as_syntax_node(&self) -> SyntaxNode {
22522        self.node.clone()
22523    }
22524    fn stable_ptr(&self) -> Self::StablePtr {
22525        TerminalStringPtr(self.node.0.stable_ptr)
22526    }
22527}
22528impl From<&TerminalString> for SyntaxStablePtrId {
22529    fn from(node: &TerminalString) -> Self {
22530        node.stable_ptr().untyped()
22531    }
22532}
22533#[derive(Clone, Debug, Eq, Hash, PartialEq)]
22534pub struct TokenAs {
22535    node: SyntaxNode,
22536}
22537impl Token for TokenAs {
22538    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
22539        TokenAsGreen(
22540            Arc::new(GreenNode {
22541                kind: SyntaxKind::TokenAs,
22542                details: GreenNodeDetails::Token(text),
22543            })
22544            .intern(db),
22545        )
22546    }
22547    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
22548        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
22549            .clone()
22550    }
22551}
22552#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
22553pub struct TokenAsPtr(pub SyntaxStablePtrId);
22554impl TypedStablePtr for TokenAsPtr {
22555    type SyntaxNode = TokenAs;
22556    fn untyped(&self) -> SyntaxStablePtrId {
22557        self.0
22558    }
22559    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenAs {
22560        TokenAs::from_syntax_node(db, self.0.lookup(db))
22561    }
22562}
22563impl From<TokenAsPtr> for SyntaxStablePtrId {
22564    fn from(ptr: TokenAsPtr) -> Self {
22565        ptr.untyped()
22566    }
22567}
22568#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
22569pub struct TokenAsGreen(pub GreenId);
22570impl TokenAsGreen {
22571    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
22572        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
22573    }
22574}
22575impl TypedSyntaxNode for TokenAs {
22576    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenAs);
22577    type StablePtr = TokenAsPtr;
22578    type Green = TokenAsGreen;
22579    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
22580        TokenAsGreen(
22581            Arc::new(GreenNode {
22582                kind: SyntaxKind::TokenMissing,
22583                details: GreenNodeDetails::Token("".into()),
22584            })
22585            .intern(db),
22586        )
22587    }
22588    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
22589        match node.0.green.lookup_intern(db).details {
22590            GreenNodeDetails::Token(_) => Self { node },
22591            GreenNodeDetails::Node { .. } => {
22592                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenAs)
22593            }
22594        }
22595    }
22596    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
22597        match node.0.green.lookup_intern(db).details {
22598            GreenNodeDetails::Token(_) => Some(Self { node }),
22599            GreenNodeDetails::Node { .. } => None,
22600        }
22601    }
22602    fn as_syntax_node(&self) -> SyntaxNode {
22603        self.node.clone()
22604    }
22605    fn stable_ptr(&self) -> Self::StablePtr {
22606        TokenAsPtr(self.node.0.stable_ptr)
22607    }
22608}
22609impl From<&TokenAs> for SyntaxStablePtrId {
22610    fn from(node: &TokenAs) -> Self {
22611        node.stable_ptr().untyped()
22612    }
22613}
22614#[derive(Clone, Debug, Eq, Hash, PartialEq)]
22615pub struct TerminalAs {
22616    node: SyntaxNode,
22617    children: Arc<[SyntaxNode]>,
22618}
22619impl Terminal for TerminalAs {
22620    const KIND: SyntaxKind = SyntaxKind::TerminalAs;
22621    type TokenType = TokenAs;
22622    fn new_green(
22623        db: &dyn SyntaxGroup,
22624        leading_trivia: TriviaGreen,
22625        token: <<TerminalAs as Terminal>::TokenType as TypedSyntaxNode>::Green,
22626        trailing_trivia: TriviaGreen,
22627    ) -> Self::Green {
22628        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
22629        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
22630        TerminalAsGreen(
22631            Arc::new(GreenNode {
22632                kind: SyntaxKind::TerminalAs,
22633                details: GreenNodeDetails::Node { children, width },
22634            })
22635            .intern(db),
22636        )
22637    }
22638    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
22639        self.token(db).text(db)
22640    }
22641}
22642impl TerminalAs {
22643    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
22644        Trivia::from_syntax_node(db, self.children[0].clone())
22645    }
22646    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenAs {
22647        TokenAs::from_syntax_node(db, self.children[1].clone())
22648    }
22649    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
22650        Trivia::from_syntax_node(db, self.children[2].clone())
22651    }
22652}
22653#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
22654pub struct TerminalAsPtr(pub SyntaxStablePtrId);
22655impl TerminalAsPtr {}
22656impl TypedStablePtr for TerminalAsPtr {
22657    type SyntaxNode = TerminalAs;
22658    fn untyped(&self) -> SyntaxStablePtrId {
22659        self.0
22660    }
22661    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalAs {
22662        TerminalAs::from_syntax_node(db, self.0.lookup(db))
22663    }
22664}
22665impl From<TerminalAsPtr> for SyntaxStablePtrId {
22666    fn from(ptr: TerminalAsPtr) -> Self {
22667        ptr.untyped()
22668    }
22669}
22670#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
22671pub struct TerminalAsGreen(pub GreenId);
22672impl TypedSyntaxNode for TerminalAs {
22673    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalAs);
22674    type StablePtr = TerminalAsPtr;
22675    type Green = TerminalAsGreen;
22676    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
22677        TerminalAsGreen(
22678            Arc::new(GreenNode {
22679                kind: SyntaxKind::TerminalAs,
22680                details: GreenNodeDetails::Node {
22681                    children: vec![
22682                        Trivia::missing(db).0,
22683                        TokenAs::missing(db).0,
22684                        Trivia::missing(db).0,
22685                    ],
22686                    width: TextWidth::default(),
22687                },
22688            })
22689            .intern(db),
22690        )
22691    }
22692    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
22693        let kind = node.kind(db);
22694        assert_eq!(
22695            kind,
22696            SyntaxKind::TerminalAs,
22697            "Unexpected SyntaxKind {:?}. Expected {:?}.",
22698            kind,
22699            SyntaxKind::TerminalAs
22700        );
22701        let children = db.get_children(node.clone());
22702        Self { node, children }
22703    }
22704    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
22705        let kind = node.kind(db);
22706        if kind == SyntaxKind::TerminalAs { Some(Self::from_syntax_node(db, node)) } else { None }
22707    }
22708    fn as_syntax_node(&self) -> SyntaxNode {
22709        self.node.clone()
22710    }
22711    fn stable_ptr(&self) -> Self::StablePtr {
22712        TerminalAsPtr(self.node.0.stable_ptr)
22713    }
22714}
22715impl From<&TerminalAs> for SyntaxStablePtrId {
22716    fn from(node: &TerminalAs) -> Self {
22717        node.stable_ptr().untyped()
22718    }
22719}
22720#[derive(Clone, Debug, Eq, Hash, PartialEq)]
22721pub struct TokenConst {
22722    node: SyntaxNode,
22723}
22724impl Token for TokenConst {
22725    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
22726        TokenConstGreen(
22727            Arc::new(GreenNode {
22728                kind: SyntaxKind::TokenConst,
22729                details: GreenNodeDetails::Token(text),
22730            })
22731            .intern(db),
22732        )
22733    }
22734    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
22735        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
22736            .clone()
22737    }
22738}
22739#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
22740pub struct TokenConstPtr(pub SyntaxStablePtrId);
22741impl TypedStablePtr for TokenConstPtr {
22742    type SyntaxNode = TokenConst;
22743    fn untyped(&self) -> SyntaxStablePtrId {
22744        self.0
22745    }
22746    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenConst {
22747        TokenConst::from_syntax_node(db, self.0.lookup(db))
22748    }
22749}
22750impl From<TokenConstPtr> for SyntaxStablePtrId {
22751    fn from(ptr: TokenConstPtr) -> Self {
22752        ptr.untyped()
22753    }
22754}
22755#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
22756pub struct TokenConstGreen(pub GreenId);
22757impl TokenConstGreen {
22758    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
22759        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
22760    }
22761}
22762impl TypedSyntaxNode for TokenConst {
22763    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenConst);
22764    type StablePtr = TokenConstPtr;
22765    type Green = TokenConstGreen;
22766    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
22767        TokenConstGreen(
22768            Arc::new(GreenNode {
22769                kind: SyntaxKind::TokenMissing,
22770                details: GreenNodeDetails::Token("".into()),
22771            })
22772            .intern(db),
22773        )
22774    }
22775    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
22776        match node.0.green.lookup_intern(db).details {
22777            GreenNodeDetails::Token(_) => Self { node },
22778            GreenNodeDetails::Node { .. } => {
22779                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenConst)
22780            }
22781        }
22782    }
22783    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
22784        match node.0.green.lookup_intern(db).details {
22785            GreenNodeDetails::Token(_) => Some(Self { node }),
22786            GreenNodeDetails::Node { .. } => None,
22787        }
22788    }
22789    fn as_syntax_node(&self) -> SyntaxNode {
22790        self.node.clone()
22791    }
22792    fn stable_ptr(&self) -> Self::StablePtr {
22793        TokenConstPtr(self.node.0.stable_ptr)
22794    }
22795}
22796impl From<&TokenConst> for SyntaxStablePtrId {
22797    fn from(node: &TokenConst) -> Self {
22798        node.stable_ptr().untyped()
22799    }
22800}
22801#[derive(Clone, Debug, Eq, Hash, PartialEq)]
22802pub struct TerminalConst {
22803    node: SyntaxNode,
22804    children: Arc<[SyntaxNode]>,
22805}
22806impl Terminal for TerminalConst {
22807    const KIND: SyntaxKind = SyntaxKind::TerminalConst;
22808    type TokenType = TokenConst;
22809    fn new_green(
22810        db: &dyn SyntaxGroup,
22811        leading_trivia: TriviaGreen,
22812        token: <<TerminalConst as Terminal>::TokenType as TypedSyntaxNode>::Green,
22813        trailing_trivia: TriviaGreen,
22814    ) -> Self::Green {
22815        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
22816        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
22817        TerminalConstGreen(
22818            Arc::new(GreenNode {
22819                kind: SyntaxKind::TerminalConst,
22820                details: GreenNodeDetails::Node { children, width },
22821            })
22822            .intern(db),
22823        )
22824    }
22825    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
22826        self.token(db).text(db)
22827    }
22828}
22829impl TerminalConst {
22830    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
22831        Trivia::from_syntax_node(db, self.children[0].clone())
22832    }
22833    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenConst {
22834        TokenConst::from_syntax_node(db, self.children[1].clone())
22835    }
22836    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
22837        Trivia::from_syntax_node(db, self.children[2].clone())
22838    }
22839}
22840#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
22841pub struct TerminalConstPtr(pub SyntaxStablePtrId);
22842impl TerminalConstPtr {}
22843impl TypedStablePtr for TerminalConstPtr {
22844    type SyntaxNode = TerminalConst;
22845    fn untyped(&self) -> SyntaxStablePtrId {
22846        self.0
22847    }
22848    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalConst {
22849        TerminalConst::from_syntax_node(db, self.0.lookup(db))
22850    }
22851}
22852impl From<TerminalConstPtr> for SyntaxStablePtrId {
22853    fn from(ptr: TerminalConstPtr) -> Self {
22854        ptr.untyped()
22855    }
22856}
22857#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
22858pub struct TerminalConstGreen(pub GreenId);
22859impl TypedSyntaxNode for TerminalConst {
22860    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalConst);
22861    type StablePtr = TerminalConstPtr;
22862    type Green = TerminalConstGreen;
22863    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
22864        TerminalConstGreen(
22865            Arc::new(GreenNode {
22866                kind: SyntaxKind::TerminalConst,
22867                details: GreenNodeDetails::Node {
22868                    children: vec![
22869                        Trivia::missing(db).0,
22870                        TokenConst::missing(db).0,
22871                        Trivia::missing(db).0,
22872                    ],
22873                    width: TextWidth::default(),
22874                },
22875            })
22876            .intern(db),
22877        )
22878    }
22879    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
22880        let kind = node.kind(db);
22881        assert_eq!(
22882            kind,
22883            SyntaxKind::TerminalConst,
22884            "Unexpected SyntaxKind {:?}. Expected {:?}.",
22885            kind,
22886            SyntaxKind::TerminalConst
22887        );
22888        let children = db.get_children(node.clone());
22889        Self { node, children }
22890    }
22891    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
22892        let kind = node.kind(db);
22893        if kind == SyntaxKind::TerminalConst {
22894            Some(Self::from_syntax_node(db, node))
22895        } else {
22896            None
22897        }
22898    }
22899    fn as_syntax_node(&self) -> SyntaxNode {
22900        self.node.clone()
22901    }
22902    fn stable_ptr(&self) -> Self::StablePtr {
22903        TerminalConstPtr(self.node.0.stable_ptr)
22904    }
22905}
22906impl From<&TerminalConst> for SyntaxStablePtrId {
22907    fn from(node: &TerminalConst) -> Self {
22908        node.stable_ptr().untyped()
22909    }
22910}
22911#[derive(Clone, Debug, Eq, Hash, PartialEq)]
22912pub struct TokenElse {
22913    node: SyntaxNode,
22914}
22915impl Token for TokenElse {
22916    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
22917        TokenElseGreen(
22918            Arc::new(GreenNode {
22919                kind: SyntaxKind::TokenElse,
22920                details: GreenNodeDetails::Token(text),
22921            })
22922            .intern(db),
22923        )
22924    }
22925    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
22926        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
22927            .clone()
22928    }
22929}
22930#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
22931pub struct TokenElsePtr(pub SyntaxStablePtrId);
22932impl TypedStablePtr for TokenElsePtr {
22933    type SyntaxNode = TokenElse;
22934    fn untyped(&self) -> SyntaxStablePtrId {
22935        self.0
22936    }
22937    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenElse {
22938        TokenElse::from_syntax_node(db, self.0.lookup(db))
22939    }
22940}
22941impl From<TokenElsePtr> for SyntaxStablePtrId {
22942    fn from(ptr: TokenElsePtr) -> Self {
22943        ptr.untyped()
22944    }
22945}
22946#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
22947pub struct TokenElseGreen(pub GreenId);
22948impl TokenElseGreen {
22949    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
22950        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
22951    }
22952}
22953impl TypedSyntaxNode for TokenElse {
22954    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenElse);
22955    type StablePtr = TokenElsePtr;
22956    type Green = TokenElseGreen;
22957    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
22958        TokenElseGreen(
22959            Arc::new(GreenNode {
22960                kind: SyntaxKind::TokenMissing,
22961                details: GreenNodeDetails::Token("".into()),
22962            })
22963            .intern(db),
22964        )
22965    }
22966    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
22967        match node.0.green.lookup_intern(db).details {
22968            GreenNodeDetails::Token(_) => Self { node },
22969            GreenNodeDetails::Node { .. } => {
22970                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenElse)
22971            }
22972        }
22973    }
22974    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
22975        match node.0.green.lookup_intern(db).details {
22976            GreenNodeDetails::Token(_) => Some(Self { node }),
22977            GreenNodeDetails::Node { .. } => None,
22978        }
22979    }
22980    fn as_syntax_node(&self) -> SyntaxNode {
22981        self.node.clone()
22982    }
22983    fn stable_ptr(&self) -> Self::StablePtr {
22984        TokenElsePtr(self.node.0.stable_ptr)
22985    }
22986}
22987impl From<&TokenElse> for SyntaxStablePtrId {
22988    fn from(node: &TokenElse) -> Self {
22989        node.stable_ptr().untyped()
22990    }
22991}
22992#[derive(Clone, Debug, Eq, Hash, PartialEq)]
22993pub struct TerminalElse {
22994    node: SyntaxNode,
22995    children: Arc<[SyntaxNode]>,
22996}
22997impl Terminal for TerminalElse {
22998    const KIND: SyntaxKind = SyntaxKind::TerminalElse;
22999    type TokenType = TokenElse;
23000    fn new_green(
23001        db: &dyn SyntaxGroup,
23002        leading_trivia: TriviaGreen,
23003        token: <<TerminalElse as Terminal>::TokenType as TypedSyntaxNode>::Green,
23004        trailing_trivia: TriviaGreen,
23005    ) -> Self::Green {
23006        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
23007        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
23008        TerminalElseGreen(
23009            Arc::new(GreenNode {
23010                kind: SyntaxKind::TerminalElse,
23011                details: GreenNodeDetails::Node { children, width },
23012            })
23013            .intern(db),
23014        )
23015    }
23016    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
23017        self.token(db).text(db)
23018    }
23019}
23020impl TerminalElse {
23021    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
23022        Trivia::from_syntax_node(db, self.children[0].clone())
23023    }
23024    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenElse {
23025        TokenElse::from_syntax_node(db, self.children[1].clone())
23026    }
23027    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
23028        Trivia::from_syntax_node(db, self.children[2].clone())
23029    }
23030}
23031#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
23032pub struct TerminalElsePtr(pub SyntaxStablePtrId);
23033impl TerminalElsePtr {}
23034impl TypedStablePtr for TerminalElsePtr {
23035    type SyntaxNode = TerminalElse;
23036    fn untyped(&self) -> SyntaxStablePtrId {
23037        self.0
23038    }
23039    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalElse {
23040        TerminalElse::from_syntax_node(db, self.0.lookup(db))
23041    }
23042}
23043impl From<TerminalElsePtr> for SyntaxStablePtrId {
23044    fn from(ptr: TerminalElsePtr) -> Self {
23045        ptr.untyped()
23046    }
23047}
23048#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
23049pub struct TerminalElseGreen(pub GreenId);
23050impl TypedSyntaxNode for TerminalElse {
23051    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalElse);
23052    type StablePtr = TerminalElsePtr;
23053    type Green = TerminalElseGreen;
23054    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
23055        TerminalElseGreen(
23056            Arc::new(GreenNode {
23057                kind: SyntaxKind::TerminalElse,
23058                details: GreenNodeDetails::Node {
23059                    children: vec![
23060                        Trivia::missing(db).0,
23061                        TokenElse::missing(db).0,
23062                        Trivia::missing(db).0,
23063                    ],
23064                    width: TextWidth::default(),
23065                },
23066            })
23067            .intern(db),
23068        )
23069    }
23070    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
23071        let kind = node.kind(db);
23072        assert_eq!(
23073            kind,
23074            SyntaxKind::TerminalElse,
23075            "Unexpected SyntaxKind {:?}. Expected {:?}.",
23076            kind,
23077            SyntaxKind::TerminalElse
23078        );
23079        let children = db.get_children(node.clone());
23080        Self { node, children }
23081    }
23082    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
23083        let kind = node.kind(db);
23084        if kind == SyntaxKind::TerminalElse { Some(Self::from_syntax_node(db, node)) } else { None }
23085    }
23086    fn as_syntax_node(&self) -> SyntaxNode {
23087        self.node.clone()
23088    }
23089    fn stable_ptr(&self) -> Self::StablePtr {
23090        TerminalElsePtr(self.node.0.stable_ptr)
23091    }
23092}
23093impl From<&TerminalElse> for SyntaxStablePtrId {
23094    fn from(node: &TerminalElse) -> Self {
23095        node.stable_ptr().untyped()
23096    }
23097}
23098#[derive(Clone, Debug, Eq, Hash, PartialEq)]
23099pub struct TokenEnum {
23100    node: SyntaxNode,
23101}
23102impl Token for TokenEnum {
23103    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
23104        TokenEnumGreen(
23105            Arc::new(GreenNode {
23106                kind: SyntaxKind::TokenEnum,
23107                details: GreenNodeDetails::Token(text),
23108            })
23109            .intern(db),
23110        )
23111    }
23112    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
23113        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
23114            .clone()
23115    }
23116}
23117#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
23118pub struct TokenEnumPtr(pub SyntaxStablePtrId);
23119impl TypedStablePtr for TokenEnumPtr {
23120    type SyntaxNode = TokenEnum;
23121    fn untyped(&self) -> SyntaxStablePtrId {
23122        self.0
23123    }
23124    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenEnum {
23125        TokenEnum::from_syntax_node(db, self.0.lookup(db))
23126    }
23127}
23128impl From<TokenEnumPtr> for SyntaxStablePtrId {
23129    fn from(ptr: TokenEnumPtr) -> Self {
23130        ptr.untyped()
23131    }
23132}
23133#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
23134pub struct TokenEnumGreen(pub GreenId);
23135impl TokenEnumGreen {
23136    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
23137        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
23138    }
23139}
23140impl TypedSyntaxNode for TokenEnum {
23141    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenEnum);
23142    type StablePtr = TokenEnumPtr;
23143    type Green = TokenEnumGreen;
23144    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
23145        TokenEnumGreen(
23146            Arc::new(GreenNode {
23147                kind: SyntaxKind::TokenMissing,
23148                details: GreenNodeDetails::Token("".into()),
23149            })
23150            .intern(db),
23151        )
23152    }
23153    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
23154        match node.0.green.lookup_intern(db).details {
23155            GreenNodeDetails::Token(_) => Self { node },
23156            GreenNodeDetails::Node { .. } => {
23157                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenEnum)
23158            }
23159        }
23160    }
23161    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
23162        match node.0.green.lookup_intern(db).details {
23163            GreenNodeDetails::Token(_) => Some(Self { node }),
23164            GreenNodeDetails::Node { .. } => None,
23165        }
23166    }
23167    fn as_syntax_node(&self) -> SyntaxNode {
23168        self.node.clone()
23169    }
23170    fn stable_ptr(&self) -> Self::StablePtr {
23171        TokenEnumPtr(self.node.0.stable_ptr)
23172    }
23173}
23174impl From<&TokenEnum> for SyntaxStablePtrId {
23175    fn from(node: &TokenEnum) -> Self {
23176        node.stable_ptr().untyped()
23177    }
23178}
23179#[derive(Clone, Debug, Eq, Hash, PartialEq)]
23180pub struct TerminalEnum {
23181    node: SyntaxNode,
23182    children: Arc<[SyntaxNode]>,
23183}
23184impl Terminal for TerminalEnum {
23185    const KIND: SyntaxKind = SyntaxKind::TerminalEnum;
23186    type TokenType = TokenEnum;
23187    fn new_green(
23188        db: &dyn SyntaxGroup,
23189        leading_trivia: TriviaGreen,
23190        token: <<TerminalEnum as Terminal>::TokenType as TypedSyntaxNode>::Green,
23191        trailing_trivia: TriviaGreen,
23192    ) -> Self::Green {
23193        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
23194        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
23195        TerminalEnumGreen(
23196            Arc::new(GreenNode {
23197                kind: SyntaxKind::TerminalEnum,
23198                details: GreenNodeDetails::Node { children, width },
23199            })
23200            .intern(db),
23201        )
23202    }
23203    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
23204        self.token(db).text(db)
23205    }
23206}
23207impl TerminalEnum {
23208    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
23209        Trivia::from_syntax_node(db, self.children[0].clone())
23210    }
23211    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenEnum {
23212        TokenEnum::from_syntax_node(db, self.children[1].clone())
23213    }
23214    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
23215        Trivia::from_syntax_node(db, self.children[2].clone())
23216    }
23217}
23218#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
23219pub struct TerminalEnumPtr(pub SyntaxStablePtrId);
23220impl TerminalEnumPtr {}
23221impl TypedStablePtr for TerminalEnumPtr {
23222    type SyntaxNode = TerminalEnum;
23223    fn untyped(&self) -> SyntaxStablePtrId {
23224        self.0
23225    }
23226    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalEnum {
23227        TerminalEnum::from_syntax_node(db, self.0.lookup(db))
23228    }
23229}
23230impl From<TerminalEnumPtr> for SyntaxStablePtrId {
23231    fn from(ptr: TerminalEnumPtr) -> Self {
23232        ptr.untyped()
23233    }
23234}
23235#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
23236pub struct TerminalEnumGreen(pub GreenId);
23237impl TypedSyntaxNode for TerminalEnum {
23238    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalEnum);
23239    type StablePtr = TerminalEnumPtr;
23240    type Green = TerminalEnumGreen;
23241    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
23242        TerminalEnumGreen(
23243            Arc::new(GreenNode {
23244                kind: SyntaxKind::TerminalEnum,
23245                details: GreenNodeDetails::Node {
23246                    children: vec![
23247                        Trivia::missing(db).0,
23248                        TokenEnum::missing(db).0,
23249                        Trivia::missing(db).0,
23250                    ],
23251                    width: TextWidth::default(),
23252                },
23253            })
23254            .intern(db),
23255        )
23256    }
23257    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
23258        let kind = node.kind(db);
23259        assert_eq!(
23260            kind,
23261            SyntaxKind::TerminalEnum,
23262            "Unexpected SyntaxKind {:?}. Expected {:?}.",
23263            kind,
23264            SyntaxKind::TerminalEnum
23265        );
23266        let children = db.get_children(node.clone());
23267        Self { node, children }
23268    }
23269    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
23270        let kind = node.kind(db);
23271        if kind == SyntaxKind::TerminalEnum { Some(Self::from_syntax_node(db, node)) } else { None }
23272    }
23273    fn as_syntax_node(&self) -> SyntaxNode {
23274        self.node.clone()
23275    }
23276    fn stable_ptr(&self) -> Self::StablePtr {
23277        TerminalEnumPtr(self.node.0.stable_ptr)
23278    }
23279}
23280impl From<&TerminalEnum> for SyntaxStablePtrId {
23281    fn from(node: &TerminalEnum) -> Self {
23282        node.stable_ptr().untyped()
23283    }
23284}
23285#[derive(Clone, Debug, Eq, Hash, PartialEq)]
23286pub struct TokenExtern {
23287    node: SyntaxNode,
23288}
23289impl Token for TokenExtern {
23290    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
23291        TokenExternGreen(
23292            Arc::new(GreenNode {
23293                kind: SyntaxKind::TokenExtern,
23294                details: GreenNodeDetails::Token(text),
23295            })
23296            .intern(db),
23297        )
23298    }
23299    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
23300        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
23301            .clone()
23302    }
23303}
23304#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
23305pub struct TokenExternPtr(pub SyntaxStablePtrId);
23306impl TypedStablePtr for TokenExternPtr {
23307    type SyntaxNode = TokenExtern;
23308    fn untyped(&self) -> SyntaxStablePtrId {
23309        self.0
23310    }
23311    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenExtern {
23312        TokenExtern::from_syntax_node(db, self.0.lookup(db))
23313    }
23314}
23315impl From<TokenExternPtr> for SyntaxStablePtrId {
23316    fn from(ptr: TokenExternPtr) -> Self {
23317        ptr.untyped()
23318    }
23319}
23320#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
23321pub struct TokenExternGreen(pub GreenId);
23322impl TokenExternGreen {
23323    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
23324        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
23325    }
23326}
23327impl TypedSyntaxNode for TokenExtern {
23328    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenExtern);
23329    type StablePtr = TokenExternPtr;
23330    type Green = TokenExternGreen;
23331    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
23332        TokenExternGreen(
23333            Arc::new(GreenNode {
23334                kind: SyntaxKind::TokenMissing,
23335                details: GreenNodeDetails::Token("".into()),
23336            })
23337            .intern(db),
23338        )
23339    }
23340    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
23341        match node.0.green.lookup_intern(db).details {
23342            GreenNodeDetails::Token(_) => Self { node },
23343            GreenNodeDetails::Node { .. } => {
23344                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenExtern)
23345            }
23346        }
23347    }
23348    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
23349        match node.0.green.lookup_intern(db).details {
23350            GreenNodeDetails::Token(_) => Some(Self { node }),
23351            GreenNodeDetails::Node { .. } => None,
23352        }
23353    }
23354    fn as_syntax_node(&self) -> SyntaxNode {
23355        self.node.clone()
23356    }
23357    fn stable_ptr(&self) -> Self::StablePtr {
23358        TokenExternPtr(self.node.0.stable_ptr)
23359    }
23360}
23361impl From<&TokenExtern> for SyntaxStablePtrId {
23362    fn from(node: &TokenExtern) -> Self {
23363        node.stable_ptr().untyped()
23364    }
23365}
23366#[derive(Clone, Debug, Eq, Hash, PartialEq)]
23367pub struct TerminalExtern {
23368    node: SyntaxNode,
23369    children: Arc<[SyntaxNode]>,
23370}
23371impl Terminal for TerminalExtern {
23372    const KIND: SyntaxKind = SyntaxKind::TerminalExtern;
23373    type TokenType = TokenExtern;
23374    fn new_green(
23375        db: &dyn SyntaxGroup,
23376        leading_trivia: TriviaGreen,
23377        token: <<TerminalExtern as Terminal>::TokenType as TypedSyntaxNode>::Green,
23378        trailing_trivia: TriviaGreen,
23379    ) -> Self::Green {
23380        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
23381        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
23382        TerminalExternGreen(
23383            Arc::new(GreenNode {
23384                kind: SyntaxKind::TerminalExtern,
23385                details: GreenNodeDetails::Node { children, width },
23386            })
23387            .intern(db),
23388        )
23389    }
23390    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
23391        self.token(db).text(db)
23392    }
23393}
23394impl TerminalExtern {
23395    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
23396        Trivia::from_syntax_node(db, self.children[0].clone())
23397    }
23398    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenExtern {
23399        TokenExtern::from_syntax_node(db, self.children[1].clone())
23400    }
23401    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
23402        Trivia::from_syntax_node(db, self.children[2].clone())
23403    }
23404}
23405#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
23406pub struct TerminalExternPtr(pub SyntaxStablePtrId);
23407impl TerminalExternPtr {}
23408impl TypedStablePtr for TerminalExternPtr {
23409    type SyntaxNode = TerminalExtern;
23410    fn untyped(&self) -> SyntaxStablePtrId {
23411        self.0
23412    }
23413    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalExtern {
23414        TerminalExtern::from_syntax_node(db, self.0.lookup(db))
23415    }
23416}
23417impl From<TerminalExternPtr> for SyntaxStablePtrId {
23418    fn from(ptr: TerminalExternPtr) -> Self {
23419        ptr.untyped()
23420    }
23421}
23422#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
23423pub struct TerminalExternGreen(pub GreenId);
23424impl TypedSyntaxNode for TerminalExtern {
23425    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalExtern);
23426    type StablePtr = TerminalExternPtr;
23427    type Green = TerminalExternGreen;
23428    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
23429        TerminalExternGreen(
23430            Arc::new(GreenNode {
23431                kind: SyntaxKind::TerminalExtern,
23432                details: GreenNodeDetails::Node {
23433                    children: vec![
23434                        Trivia::missing(db).0,
23435                        TokenExtern::missing(db).0,
23436                        Trivia::missing(db).0,
23437                    ],
23438                    width: TextWidth::default(),
23439                },
23440            })
23441            .intern(db),
23442        )
23443    }
23444    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
23445        let kind = node.kind(db);
23446        assert_eq!(
23447            kind,
23448            SyntaxKind::TerminalExtern,
23449            "Unexpected SyntaxKind {:?}. Expected {:?}.",
23450            kind,
23451            SyntaxKind::TerminalExtern
23452        );
23453        let children = db.get_children(node.clone());
23454        Self { node, children }
23455    }
23456    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
23457        let kind = node.kind(db);
23458        if kind == SyntaxKind::TerminalExtern {
23459            Some(Self::from_syntax_node(db, node))
23460        } else {
23461            None
23462        }
23463    }
23464    fn as_syntax_node(&self) -> SyntaxNode {
23465        self.node.clone()
23466    }
23467    fn stable_ptr(&self) -> Self::StablePtr {
23468        TerminalExternPtr(self.node.0.stable_ptr)
23469    }
23470}
23471impl From<&TerminalExtern> for SyntaxStablePtrId {
23472    fn from(node: &TerminalExtern) -> Self {
23473        node.stable_ptr().untyped()
23474    }
23475}
23476#[derive(Clone, Debug, Eq, Hash, PartialEq)]
23477pub struct TokenFalse {
23478    node: SyntaxNode,
23479}
23480impl Token for TokenFalse {
23481    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
23482        TokenFalseGreen(
23483            Arc::new(GreenNode {
23484                kind: SyntaxKind::TokenFalse,
23485                details: GreenNodeDetails::Token(text),
23486            })
23487            .intern(db),
23488        )
23489    }
23490    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
23491        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
23492            .clone()
23493    }
23494}
23495#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
23496pub struct TokenFalsePtr(pub SyntaxStablePtrId);
23497impl TypedStablePtr for TokenFalsePtr {
23498    type SyntaxNode = TokenFalse;
23499    fn untyped(&self) -> SyntaxStablePtrId {
23500        self.0
23501    }
23502    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenFalse {
23503        TokenFalse::from_syntax_node(db, self.0.lookup(db))
23504    }
23505}
23506impl From<TokenFalsePtr> for SyntaxStablePtrId {
23507    fn from(ptr: TokenFalsePtr) -> Self {
23508        ptr.untyped()
23509    }
23510}
23511#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
23512pub struct TokenFalseGreen(pub GreenId);
23513impl TokenFalseGreen {
23514    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
23515        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
23516    }
23517}
23518impl TypedSyntaxNode for TokenFalse {
23519    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenFalse);
23520    type StablePtr = TokenFalsePtr;
23521    type Green = TokenFalseGreen;
23522    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
23523        TokenFalseGreen(
23524            Arc::new(GreenNode {
23525                kind: SyntaxKind::TokenMissing,
23526                details: GreenNodeDetails::Token("".into()),
23527            })
23528            .intern(db),
23529        )
23530    }
23531    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
23532        match node.0.green.lookup_intern(db).details {
23533            GreenNodeDetails::Token(_) => Self { node },
23534            GreenNodeDetails::Node { .. } => {
23535                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenFalse)
23536            }
23537        }
23538    }
23539    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
23540        match node.0.green.lookup_intern(db).details {
23541            GreenNodeDetails::Token(_) => Some(Self { node }),
23542            GreenNodeDetails::Node { .. } => None,
23543        }
23544    }
23545    fn as_syntax_node(&self) -> SyntaxNode {
23546        self.node.clone()
23547    }
23548    fn stable_ptr(&self) -> Self::StablePtr {
23549        TokenFalsePtr(self.node.0.stable_ptr)
23550    }
23551}
23552impl From<&TokenFalse> for SyntaxStablePtrId {
23553    fn from(node: &TokenFalse) -> Self {
23554        node.stable_ptr().untyped()
23555    }
23556}
23557#[derive(Clone, Debug, Eq, Hash, PartialEq)]
23558pub struct TerminalFalse {
23559    node: SyntaxNode,
23560    children: Arc<[SyntaxNode]>,
23561}
23562impl Terminal for TerminalFalse {
23563    const KIND: SyntaxKind = SyntaxKind::TerminalFalse;
23564    type TokenType = TokenFalse;
23565    fn new_green(
23566        db: &dyn SyntaxGroup,
23567        leading_trivia: TriviaGreen,
23568        token: <<TerminalFalse as Terminal>::TokenType as TypedSyntaxNode>::Green,
23569        trailing_trivia: TriviaGreen,
23570    ) -> Self::Green {
23571        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
23572        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
23573        TerminalFalseGreen(
23574            Arc::new(GreenNode {
23575                kind: SyntaxKind::TerminalFalse,
23576                details: GreenNodeDetails::Node { children, width },
23577            })
23578            .intern(db),
23579        )
23580    }
23581    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
23582        self.token(db).text(db)
23583    }
23584}
23585impl TerminalFalse {
23586    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
23587        Trivia::from_syntax_node(db, self.children[0].clone())
23588    }
23589    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenFalse {
23590        TokenFalse::from_syntax_node(db, self.children[1].clone())
23591    }
23592    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
23593        Trivia::from_syntax_node(db, self.children[2].clone())
23594    }
23595}
23596#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
23597pub struct TerminalFalsePtr(pub SyntaxStablePtrId);
23598impl TerminalFalsePtr {}
23599impl TypedStablePtr for TerminalFalsePtr {
23600    type SyntaxNode = TerminalFalse;
23601    fn untyped(&self) -> SyntaxStablePtrId {
23602        self.0
23603    }
23604    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalFalse {
23605        TerminalFalse::from_syntax_node(db, self.0.lookup(db))
23606    }
23607}
23608impl From<TerminalFalsePtr> for SyntaxStablePtrId {
23609    fn from(ptr: TerminalFalsePtr) -> Self {
23610        ptr.untyped()
23611    }
23612}
23613#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
23614pub struct TerminalFalseGreen(pub GreenId);
23615impl TypedSyntaxNode for TerminalFalse {
23616    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalFalse);
23617    type StablePtr = TerminalFalsePtr;
23618    type Green = TerminalFalseGreen;
23619    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
23620        TerminalFalseGreen(
23621            Arc::new(GreenNode {
23622                kind: SyntaxKind::TerminalFalse,
23623                details: GreenNodeDetails::Node {
23624                    children: vec![
23625                        Trivia::missing(db).0,
23626                        TokenFalse::missing(db).0,
23627                        Trivia::missing(db).0,
23628                    ],
23629                    width: TextWidth::default(),
23630                },
23631            })
23632            .intern(db),
23633        )
23634    }
23635    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
23636        let kind = node.kind(db);
23637        assert_eq!(
23638            kind,
23639            SyntaxKind::TerminalFalse,
23640            "Unexpected SyntaxKind {:?}. Expected {:?}.",
23641            kind,
23642            SyntaxKind::TerminalFalse
23643        );
23644        let children = db.get_children(node.clone());
23645        Self { node, children }
23646    }
23647    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
23648        let kind = node.kind(db);
23649        if kind == SyntaxKind::TerminalFalse {
23650            Some(Self::from_syntax_node(db, node))
23651        } else {
23652            None
23653        }
23654    }
23655    fn as_syntax_node(&self) -> SyntaxNode {
23656        self.node.clone()
23657    }
23658    fn stable_ptr(&self) -> Self::StablePtr {
23659        TerminalFalsePtr(self.node.0.stable_ptr)
23660    }
23661}
23662impl From<&TerminalFalse> for SyntaxStablePtrId {
23663    fn from(node: &TerminalFalse) -> Self {
23664        node.stable_ptr().untyped()
23665    }
23666}
23667#[derive(Clone, Debug, Eq, Hash, PartialEq)]
23668pub struct TokenFunction {
23669    node: SyntaxNode,
23670}
23671impl Token for TokenFunction {
23672    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
23673        TokenFunctionGreen(
23674            Arc::new(GreenNode {
23675                kind: SyntaxKind::TokenFunction,
23676                details: GreenNodeDetails::Token(text),
23677            })
23678            .intern(db),
23679        )
23680    }
23681    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
23682        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
23683            .clone()
23684    }
23685}
23686#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
23687pub struct TokenFunctionPtr(pub SyntaxStablePtrId);
23688impl TypedStablePtr for TokenFunctionPtr {
23689    type SyntaxNode = TokenFunction;
23690    fn untyped(&self) -> SyntaxStablePtrId {
23691        self.0
23692    }
23693    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenFunction {
23694        TokenFunction::from_syntax_node(db, self.0.lookup(db))
23695    }
23696}
23697impl From<TokenFunctionPtr> for SyntaxStablePtrId {
23698    fn from(ptr: TokenFunctionPtr) -> Self {
23699        ptr.untyped()
23700    }
23701}
23702#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
23703pub struct TokenFunctionGreen(pub GreenId);
23704impl TokenFunctionGreen {
23705    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
23706        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
23707    }
23708}
23709impl TypedSyntaxNode for TokenFunction {
23710    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenFunction);
23711    type StablePtr = TokenFunctionPtr;
23712    type Green = TokenFunctionGreen;
23713    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
23714        TokenFunctionGreen(
23715            Arc::new(GreenNode {
23716                kind: SyntaxKind::TokenMissing,
23717                details: GreenNodeDetails::Token("".into()),
23718            })
23719            .intern(db),
23720        )
23721    }
23722    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
23723        match node.0.green.lookup_intern(db).details {
23724            GreenNodeDetails::Token(_) => Self { node },
23725            GreenNodeDetails::Node { .. } => {
23726                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenFunction)
23727            }
23728        }
23729    }
23730    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
23731        match node.0.green.lookup_intern(db).details {
23732            GreenNodeDetails::Token(_) => Some(Self { node }),
23733            GreenNodeDetails::Node { .. } => None,
23734        }
23735    }
23736    fn as_syntax_node(&self) -> SyntaxNode {
23737        self.node.clone()
23738    }
23739    fn stable_ptr(&self) -> Self::StablePtr {
23740        TokenFunctionPtr(self.node.0.stable_ptr)
23741    }
23742}
23743impl From<&TokenFunction> for SyntaxStablePtrId {
23744    fn from(node: &TokenFunction) -> Self {
23745        node.stable_ptr().untyped()
23746    }
23747}
23748#[derive(Clone, Debug, Eq, Hash, PartialEq)]
23749pub struct TerminalFunction {
23750    node: SyntaxNode,
23751    children: Arc<[SyntaxNode]>,
23752}
23753impl Terminal for TerminalFunction {
23754    const KIND: SyntaxKind = SyntaxKind::TerminalFunction;
23755    type TokenType = TokenFunction;
23756    fn new_green(
23757        db: &dyn SyntaxGroup,
23758        leading_trivia: TriviaGreen,
23759        token: <<TerminalFunction as Terminal>::TokenType as TypedSyntaxNode>::Green,
23760        trailing_trivia: TriviaGreen,
23761    ) -> Self::Green {
23762        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
23763        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
23764        TerminalFunctionGreen(
23765            Arc::new(GreenNode {
23766                kind: SyntaxKind::TerminalFunction,
23767                details: GreenNodeDetails::Node { children, width },
23768            })
23769            .intern(db),
23770        )
23771    }
23772    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
23773        self.token(db).text(db)
23774    }
23775}
23776impl TerminalFunction {
23777    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
23778        Trivia::from_syntax_node(db, self.children[0].clone())
23779    }
23780    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenFunction {
23781        TokenFunction::from_syntax_node(db, self.children[1].clone())
23782    }
23783    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
23784        Trivia::from_syntax_node(db, self.children[2].clone())
23785    }
23786}
23787#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
23788pub struct TerminalFunctionPtr(pub SyntaxStablePtrId);
23789impl TerminalFunctionPtr {}
23790impl TypedStablePtr for TerminalFunctionPtr {
23791    type SyntaxNode = TerminalFunction;
23792    fn untyped(&self) -> SyntaxStablePtrId {
23793        self.0
23794    }
23795    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalFunction {
23796        TerminalFunction::from_syntax_node(db, self.0.lookup(db))
23797    }
23798}
23799impl From<TerminalFunctionPtr> for SyntaxStablePtrId {
23800    fn from(ptr: TerminalFunctionPtr) -> Self {
23801        ptr.untyped()
23802    }
23803}
23804#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
23805pub struct TerminalFunctionGreen(pub GreenId);
23806impl TypedSyntaxNode for TerminalFunction {
23807    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalFunction);
23808    type StablePtr = TerminalFunctionPtr;
23809    type Green = TerminalFunctionGreen;
23810    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
23811        TerminalFunctionGreen(
23812            Arc::new(GreenNode {
23813                kind: SyntaxKind::TerminalFunction,
23814                details: GreenNodeDetails::Node {
23815                    children: vec![
23816                        Trivia::missing(db).0,
23817                        TokenFunction::missing(db).0,
23818                        Trivia::missing(db).0,
23819                    ],
23820                    width: TextWidth::default(),
23821                },
23822            })
23823            .intern(db),
23824        )
23825    }
23826    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
23827        let kind = node.kind(db);
23828        assert_eq!(
23829            kind,
23830            SyntaxKind::TerminalFunction,
23831            "Unexpected SyntaxKind {:?}. Expected {:?}.",
23832            kind,
23833            SyntaxKind::TerminalFunction
23834        );
23835        let children = db.get_children(node.clone());
23836        Self { node, children }
23837    }
23838    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
23839        let kind = node.kind(db);
23840        if kind == SyntaxKind::TerminalFunction {
23841            Some(Self::from_syntax_node(db, node))
23842        } else {
23843            None
23844        }
23845    }
23846    fn as_syntax_node(&self) -> SyntaxNode {
23847        self.node.clone()
23848    }
23849    fn stable_ptr(&self) -> Self::StablePtr {
23850        TerminalFunctionPtr(self.node.0.stable_ptr)
23851    }
23852}
23853impl From<&TerminalFunction> for SyntaxStablePtrId {
23854    fn from(node: &TerminalFunction) -> Self {
23855        node.stable_ptr().untyped()
23856    }
23857}
23858#[derive(Clone, Debug, Eq, Hash, PartialEq)]
23859pub struct TokenIf {
23860    node: SyntaxNode,
23861}
23862impl Token for TokenIf {
23863    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
23864        TokenIfGreen(
23865            Arc::new(GreenNode {
23866                kind: SyntaxKind::TokenIf,
23867                details: GreenNodeDetails::Token(text),
23868            })
23869            .intern(db),
23870        )
23871    }
23872    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
23873        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
23874            .clone()
23875    }
23876}
23877#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
23878pub struct TokenIfPtr(pub SyntaxStablePtrId);
23879impl TypedStablePtr for TokenIfPtr {
23880    type SyntaxNode = TokenIf;
23881    fn untyped(&self) -> SyntaxStablePtrId {
23882        self.0
23883    }
23884    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenIf {
23885        TokenIf::from_syntax_node(db, self.0.lookup(db))
23886    }
23887}
23888impl From<TokenIfPtr> for SyntaxStablePtrId {
23889    fn from(ptr: TokenIfPtr) -> Self {
23890        ptr.untyped()
23891    }
23892}
23893#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
23894pub struct TokenIfGreen(pub GreenId);
23895impl TokenIfGreen {
23896    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
23897        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
23898    }
23899}
23900impl TypedSyntaxNode for TokenIf {
23901    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenIf);
23902    type StablePtr = TokenIfPtr;
23903    type Green = TokenIfGreen;
23904    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
23905        TokenIfGreen(
23906            Arc::new(GreenNode {
23907                kind: SyntaxKind::TokenMissing,
23908                details: GreenNodeDetails::Token("".into()),
23909            })
23910            .intern(db),
23911        )
23912    }
23913    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
23914        match node.0.green.lookup_intern(db).details {
23915            GreenNodeDetails::Token(_) => Self { node },
23916            GreenNodeDetails::Node { .. } => {
23917                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenIf)
23918            }
23919        }
23920    }
23921    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
23922        match node.0.green.lookup_intern(db).details {
23923            GreenNodeDetails::Token(_) => Some(Self { node }),
23924            GreenNodeDetails::Node { .. } => None,
23925        }
23926    }
23927    fn as_syntax_node(&self) -> SyntaxNode {
23928        self.node.clone()
23929    }
23930    fn stable_ptr(&self) -> Self::StablePtr {
23931        TokenIfPtr(self.node.0.stable_ptr)
23932    }
23933}
23934impl From<&TokenIf> for SyntaxStablePtrId {
23935    fn from(node: &TokenIf) -> Self {
23936        node.stable_ptr().untyped()
23937    }
23938}
23939#[derive(Clone, Debug, Eq, Hash, PartialEq)]
23940pub struct TerminalIf {
23941    node: SyntaxNode,
23942    children: Arc<[SyntaxNode]>,
23943}
23944impl Terminal for TerminalIf {
23945    const KIND: SyntaxKind = SyntaxKind::TerminalIf;
23946    type TokenType = TokenIf;
23947    fn new_green(
23948        db: &dyn SyntaxGroup,
23949        leading_trivia: TriviaGreen,
23950        token: <<TerminalIf as Terminal>::TokenType as TypedSyntaxNode>::Green,
23951        trailing_trivia: TriviaGreen,
23952    ) -> Self::Green {
23953        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
23954        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
23955        TerminalIfGreen(
23956            Arc::new(GreenNode {
23957                kind: SyntaxKind::TerminalIf,
23958                details: GreenNodeDetails::Node { children, width },
23959            })
23960            .intern(db),
23961        )
23962    }
23963    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
23964        self.token(db).text(db)
23965    }
23966}
23967impl TerminalIf {
23968    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
23969        Trivia::from_syntax_node(db, self.children[0].clone())
23970    }
23971    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenIf {
23972        TokenIf::from_syntax_node(db, self.children[1].clone())
23973    }
23974    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
23975        Trivia::from_syntax_node(db, self.children[2].clone())
23976    }
23977}
23978#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
23979pub struct TerminalIfPtr(pub SyntaxStablePtrId);
23980impl TerminalIfPtr {}
23981impl TypedStablePtr for TerminalIfPtr {
23982    type SyntaxNode = TerminalIf;
23983    fn untyped(&self) -> SyntaxStablePtrId {
23984        self.0
23985    }
23986    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalIf {
23987        TerminalIf::from_syntax_node(db, self.0.lookup(db))
23988    }
23989}
23990impl From<TerminalIfPtr> for SyntaxStablePtrId {
23991    fn from(ptr: TerminalIfPtr) -> Self {
23992        ptr.untyped()
23993    }
23994}
23995#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
23996pub struct TerminalIfGreen(pub GreenId);
23997impl TypedSyntaxNode for TerminalIf {
23998    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalIf);
23999    type StablePtr = TerminalIfPtr;
24000    type Green = TerminalIfGreen;
24001    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
24002        TerminalIfGreen(
24003            Arc::new(GreenNode {
24004                kind: SyntaxKind::TerminalIf,
24005                details: GreenNodeDetails::Node {
24006                    children: vec![
24007                        Trivia::missing(db).0,
24008                        TokenIf::missing(db).0,
24009                        Trivia::missing(db).0,
24010                    ],
24011                    width: TextWidth::default(),
24012                },
24013            })
24014            .intern(db),
24015        )
24016    }
24017    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
24018        let kind = node.kind(db);
24019        assert_eq!(
24020            kind,
24021            SyntaxKind::TerminalIf,
24022            "Unexpected SyntaxKind {:?}. Expected {:?}.",
24023            kind,
24024            SyntaxKind::TerminalIf
24025        );
24026        let children = db.get_children(node.clone());
24027        Self { node, children }
24028    }
24029    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
24030        let kind = node.kind(db);
24031        if kind == SyntaxKind::TerminalIf { Some(Self::from_syntax_node(db, node)) } else { None }
24032    }
24033    fn as_syntax_node(&self) -> SyntaxNode {
24034        self.node.clone()
24035    }
24036    fn stable_ptr(&self) -> Self::StablePtr {
24037        TerminalIfPtr(self.node.0.stable_ptr)
24038    }
24039}
24040impl From<&TerminalIf> for SyntaxStablePtrId {
24041    fn from(node: &TerminalIf) -> Self {
24042        node.stable_ptr().untyped()
24043    }
24044}
24045#[derive(Clone, Debug, Eq, Hash, PartialEq)]
24046pub struct TokenWhile {
24047    node: SyntaxNode,
24048}
24049impl Token for TokenWhile {
24050    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
24051        TokenWhileGreen(
24052            Arc::new(GreenNode {
24053                kind: SyntaxKind::TokenWhile,
24054                details: GreenNodeDetails::Token(text),
24055            })
24056            .intern(db),
24057        )
24058    }
24059    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
24060        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
24061            .clone()
24062    }
24063}
24064#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
24065pub struct TokenWhilePtr(pub SyntaxStablePtrId);
24066impl TypedStablePtr for TokenWhilePtr {
24067    type SyntaxNode = TokenWhile;
24068    fn untyped(&self) -> SyntaxStablePtrId {
24069        self.0
24070    }
24071    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenWhile {
24072        TokenWhile::from_syntax_node(db, self.0.lookup(db))
24073    }
24074}
24075impl From<TokenWhilePtr> for SyntaxStablePtrId {
24076    fn from(ptr: TokenWhilePtr) -> Self {
24077        ptr.untyped()
24078    }
24079}
24080#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
24081pub struct TokenWhileGreen(pub GreenId);
24082impl TokenWhileGreen {
24083    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
24084        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
24085    }
24086}
24087impl TypedSyntaxNode for TokenWhile {
24088    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenWhile);
24089    type StablePtr = TokenWhilePtr;
24090    type Green = TokenWhileGreen;
24091    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
24092        TokenWhileGreen(
24093            Arc::new(GreenNode {
24094                kind: SyntaxKind::TokenMissing,
24095                details: GreenNodeDetails::Token("".into()),
24096            })
24097            .intern(db),
24098        )
24099    }
24100    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
24101        match node.0.green.lookup_intern(db).details {
24102            GreenNodeDetails::Token(_) => Self { node },
24103            GreenNodeDetails::Node { .. } => {
24104                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenWhile)
24105            }
24106        }
24107    }
24108    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
24109        match node.0.green.lookup_intern(db).details {
24110            GreenNodeDetails::Token(_) => Some(Self { node }),
24111            GreenNodeDetails::Node { .. } => None,
24112        }
24113    }
24114    fn as_syntax_node(&self) -> SyntaxNode {
24115        self.node.clone()
24116    }
24117    fn stable_ptr(&self) -> Self::StablePtr {
24118        TokenWhilePtr(self.node.0.stable_ptr)
24119    }
24120}
24121impl From<&TokenWhile> for SyntaxStablePtrId {
24122    fn from(node: &TokenWhile) -> Self {
24123        node.stable_ptr().untyped()
24124    }
24125}
24126#[derive(Clone, Debug, Eq, Hash, PartialEq)]
24127pub struct TerminalWhile {
24128    node: SyntaxNode,
24129    children: Arc<[SyntaxNode]>,
24130}
24131impl Terminal for TerminalWhile {
24132    const KIND: SyntaxKind = SyntaxKind::TerminalWhile;
24133    type TokenType = TokenWhile;
24134    fn new_green(
24135        db: &dyn SyntaxGroup,
24136        leading_trivia: TriviaGreen,
24137        token: <<TerminalWhile as Terminal>::TokenType as TypedSyntaxNode>::Green,
24138        trailing_trivia: TriviaGreen,
24139    ) -> Self::Green {
24140        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
24141        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
24142        TerminalWhileGreen(
24143            Arc::new(GreenNode {
24144                kind: SyntaxKind::TerminalWhile,
24145                details: GreenNodeDetails::Node { children, width },
24146            })
24147            .intern(db),
24148        )
24149    }
24150    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
24151        self.token(db).text(db)
24152    }
24153}
24154impl TerminalWhile {
24155    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
24156        Trivia::from_syntax_node(db, self.children[0].clone())
24157    }
24158    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenWhile {
24159        TokenWhile::from_syntax_node(db, self.children[1].clone())
24160    }
24161    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
24162        Trivia::from_syntax_node(db, self.children[2].clone())
24163    }
24164}
24165#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
24166pub struct TerminalWhilePtr(pub SyntaxStablePtrId);
24167impl TerminalWhilePtr {}
24168impl TypedStablePtr for TerminalWhilePtr {
24169    type SyntaxNode = TerminalWhile;
24170    fn untyped(&self) -> SyntaxStablePtrId {
24171        self.0
24172    }
24173    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalWhile {
24174        TerminalWhile::from_syntax_node(db, self.0.lookup(db))
24175    }
24176}
24177impl From<TerminalWhilePtr> for SyntaxStablePtrId {
24178    fn from(ptr: TerminalWhilePtr) -> Self {
24179        ptr.untyped()
24180    }
24181}
24182#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
24183pub struct TerminalWhileGreen(pub GreenId);
24184impl TypedSyntaxNode for TerminalWhile {
24185    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalWhile);
24186    type StablePtr = TerminalWhilePtr;
24187    type Green = TerminalWhileGreen;
24188    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
24189        TerminalWhileGreen(
24190            Arc::new(GreenNode {
24191                kind: SyntaxKind::TerminalWhile,
24192                details: GreenNodeDetails::Node {
24193                    children: vec![
24194                        Trivia::missing(db).0,
24195                        TokenWhile::missing(db).0,
24196                        Trivia::missing(db).0,
24197                    ],
24198                    width: TextWidth::default(),
24199                },
24200            })
24201            .intern(db),
24202        )
24203    }
24204    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
24205        let kind = node.kind(db);
24206        assert_eq!(
24207            kind,
24208            SyntaxKind::TerminalWhile,
24209            "Unexpected SyntaxKind {:?}. Expected {:?}.",
24210            kind,
24211            SyntaxKind::TerminalWhile
24212        );
24213        let children = db.get_children(node.clone());
24214        Self { node, children }
24215    }
24216    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
24217        let kind = node.kind(db);
24218        if kind == SyntaxKind::TerminalWhile {
24219            Some(Self::from_syntax_node(db, node))
24220        } else {
24221            None
24222        }
24223    }
24224    fn as_syntax_node(&self) -> SyntaxNode {
24225        self.node.clone()
24226    }
24227    fn stable_ptr(&self) -> Self::StablePtr {
24228        TerminalWhilePtr(self.node.0.stable_ptr)
24229    }
24230}
24231impl From<&TerminalWhile> for SyntaxStablePtrId {
24232    fn from(node: &TerminalWhile) -> Self {
24233        node.stable_ptr().untyped()
24234    }
24235}
24236#[derive(Clone, Debug, Eq, Hash, PartialEq)]
24237pub struct TokenFor {
24238    node: SyntaxNode,
24239}
24240impl Token for TokenFor {
24241    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
24242        TokenForGreen(
24243            Arc::new(GreenNode {
24244                kind: SyntaxKind::TokenFor,
24245                details: GreenNodeDetails::Token(text),
24246            })
24247            .intern(db),
24248        )
24249    }
24250    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
24251        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
24252            .clone()
24253    }
24254}
24255#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
24256pub struct TokenForPtr(pub SyntaxStablePtrId);
24257impl TypedStablePtr for TokenForPtr {
24258    type SyntaxNode = TokenFor;
24259    fn untyped(&self) -> SyntaxStablePtrId {
24260        self.0
24261    }
24262    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenFor {
24263        TokenFor::from_syntax_node(db, self.0.lookup(db))
24264    }
24265}
24266impl From<TokenForPtr> for SyntaxStablePtrId {
24267    fn from(ptr: TokenForPtr) -> Self {
24268        ptr.untyped()
24269    }
24270}
24271#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
24272pub struct TokenForGreen(pub GreenId);
24273impl TokenForGreen {
24274    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
24275        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
24276    }
24277}
24278impl TypedSyntaxNode for TokenFor {
24279    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenFor);
24280    type StablePtr = TokenForPtr;
24281    type Green = TokenForGreen;
24282    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
24283        TokenForGreen(
24284            Arc::new(GreenNode {
24285                kind: SyntaxKind::TokenMissing,
24286                details: GreenNodeDetails::Token("".into()),
24287            })
24288            .intern(db),
24289        )
24290    }
24291    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
24292        match node.0.green.lookup_intern(db).details {
24293            GreenNodeDetails::Token(_) => Self { node },
24294            GreenNodeDetails::Node { .. } => {
24295                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenFor)
24296            }
24297        }
24298    }
24299    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
24300        match node.0.green.lookup_intern(db).details {
24301            GreenNodeDetails::Token(_) => Some(Self { node }),
24302            GreenNodeDetails::Node { .. } => None,
24303        }
24304    }
24305    fn as_syntax_node(&self) -> SyntaxNode {
24306        self.node.clone()
24307    }
24308    fn stable_ptr(&self) -> Self::StablePtr {
24309        TokenForPtr(self.node.0.stable_ptr)
24310    }
24311}
24312impl From<&TokenFor> for SyntaxStablePtrId {
24313    fn from(node: &TokenFor) -> Self {
24314        node.stable_ptr().untyped()
24315    }
24316}
24317#[derive(Clone, Debug, Eq, Hash, PartialEq)]
24318pub struct TerminalFor {
24319    node: SyntaxNode,
24320    children: Arc<[SyntaxNode]>,
24321}
24322impl Terminal for TerminalFor {
24323    const KIND: SyntaxKind = SyntaxKind::TerminalFor;
24324    type TokenType = TokenFor;
24325    fn new_green(
24326        db: &dyn SyntaxGroup,
24327        leading_trivia: TriviaGreen,
24328        token: <<TerminalFor as Terminal>::TokenType as TypedSyntaxNode>::Green,
24329        trailing_trivia: TriviaGreen,
24330    ) -> Self::Green {
24331        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
24332        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
24333        TerminalForGreen(
24334            Arc::new(GreenNode {
24335                kind: SyntaxKind::TerminalFor,
24336                details: GreenNodeDetails::Node { children, width },
24337            })
24338            .intern(db),
24339        )
24340    }
24341    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
24342        self.token(db).text(db)
24343    }
24344}
24345impl TerminalFor {
24346    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
24347        Trivia::from_syntax_node(db, self.children[0].clone())
24348    }
24349    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenFor {
24350        TokenFor::from_syntax_node(db, self.children[1].clone())
24351    }
24352    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
24353        Trivia::from_syntax_node(db, self.children[2].clone())
24354    }
24355}
24356#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
24357pub struct TerminalForPtr(pub SyntaxStablePtrId);
24358impl TerminalForPtr {}
24359impl TypedStablePtr for TerminalForPtr {
24360    type SyntaxNode = TerminalFor;
24361    fn untyped(&self) -> SyntaxStablePtrId {
24362        self.0
24363    }
24364    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalFor {
24365        TerminalFor::from_syntax_node(db, self.0.lookup(db))
24366    }
24367}
24368impl From<TerminalForPtr> for SyntaxStablePtrId {
24369    fn from(ptr: TerminalForPtr) -> Self {
24370        ptr.untyped()
24371    }
24372}
24373#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
24374pub struct TerminalForGreen(pub GreenId);
24375impl TypedSyntaxNode for TerminalFor {
24376    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalFor);
24377    type StablePtr = TerminalForPtr;
24378    type Green = TerminalForGreen;
24379    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
24380        TerminalForGreen(
24381            Arc::new(GreenNode {
24382                kind: SyntaxKind::TerminalFor,
24383                details: GreenNodeDetails::Node {
24384                    children: vec![
24385                        Trivia::missing(db).0,
24386                        TokenFor::missing(db).0,
24387                        Trivia::missing(db).0,
24388                    ],
24389                    width: TextWidth::default(),
24390                },
24391            })
24392            .intern(db),
24393        )
24394    }
24395    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
24396        let kind = node.kind(db);
24397        assert_eq!(
24398            kind,
24399            SyntaxKind::TerminalFor,
24400            "Unexpected SyntaxKind {:?}. Expected {:?}.",
24401            kind,
24402            SyntaxKind::TerminalFor
24403        );
24404        let children = db.get_children(node.clone());
24405        Self { node, children }
24406    }
24407    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
24408        let kind = node.kind(db);
24409        if kind == SyntaxKind::TerminalFor { Some(Self::from_syntax_node(db, node)) } else { None }
24410    }
24411    fn as_syntax_node(&self) -> SyntaxNode {
24412        self.node.clone()
24413    }
24414    fn stable_ptr(&self) -> Self::StablePtr {
24415        TerminalForPtr(self.node.0.stable_ptr)
24416    }
24417}
24418impl From<&TerminalFor> for SyntaxStablePtrId {
24419    fn from(node: &TerminalFor) -> Self {
24420        node.stable_ptr().untyped()
24421    }
24422}
24423#[derive(Clone, Debug, Eq, Hash, PartialEq)]
24424pub struct TokenLoop {
24425    node: SyntaxNode,
24426}
24427impl Token for TokenLoop {
24428    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
24429        TokenLoopGreen(
24430            Arc::new(GreenNode {
24431                kind: SyntaxKind::TokenLoop,
24432                details: GreenNodeDetails::Token(text),
24433            })
24434            .intern(db),
24435        )
24436    }
24437    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
24438        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
24439            .clone()
24440    }
24441}
24442#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
24443pub struct TokenLoopPtr(pub SyntaxStablePtrId);
24444impl TypedStablePtr for TokenLoopPtr {
24445    type SyntaxNode = TokenLoop;
24446    fn untyped(&self) -> SyntaxStablePtrId {
24447        self.0
24448    }
24449    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenLoop {
24450        TokenLoop::from_syntax_node(db, self.0.lookup(db))
24451    }
24452}
24453impl From<TokenLoopPtr> for SyntaxStablePtrId {
24454    fn from(ptr: TokenLoopPtr) -> Self {
24455        ptr.untyped()
24456    }
24457}
24458#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
24459pub struct TokenLoopGreen(pub GreenId);
24460impl TokenLoopGreen {
24461    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
24462        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
24463    }
24464}
24465impl TypedSyntaxNode for TokenLoop {
24466    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenLoop);
24467    type StablePtr = TokenLoopPtr;
24468    type Green = TokenLoopGreen;
24469    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
24470        TokenLoopGreen(
24471            Arc::new(GreenNode {
24472                kind: SyntaxKind::TokenMissing,
24473                details: GreenNodeDetails::Token("".into()),
24474            })
24475            .intern(db),
24476        )
24477    }
24478    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
24479        match node.0.green.lookup_intern(db).details {
24480            GreenNodeDetails::Token(_) => Self { node },
24481            GreenNodeDetails::Node { .. } => {
24482                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenLoop)
24483            }
24484        }
24485    }
24486    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
24487        match node.0.green.lookup_intern(db).details {
24488            GreenNodeDetails::Token(_) => Some(Self { node }),
24489            GreenNodeDetails::Node { .. } => None,
24490        }
24491    }
24492    fn as_syntax_node(&self) -> SyntaxNode {
24493        self.node.clone()
24494    }
24495    fn stable_ptr(&self) -> Self::StablePtr {
24496        TokenLoopPtr(self.node.0.stable_ptr)
24497    }
24498}
24499impl From<&TokenLoop> for SyntaxStablePtrId {
24500    fn from(node: &TokenLoop) -> Self {
24501        node.stable_ptr().untyped()
24502    }
24503}
24504#[derive(Clone, Debug, Eq, Hash, PartialEq)]
24505pub struct TerminalLoop {
24506    node: SyntaxNode,
24507    children: Arc<[SyntaxNode]>,
24508}
24509impl Terminal for TerminalLoop {
24510    const KIND: SyntaxKind = SyntaxKind::TerminalLoop;
24511    type TokenType = TokenLoop;
24512    fn new_green(
24513        db: &dyn SyntaxGroup,
24514        leading_trivia: TriviaGreen,
24515        token: <<TerminalLoop as Terminal>::TokenType as TypedSyntaxNode>::Green,
24516        trailing_trivia: TriviaGreen,
24517    ) -> Self::Green {
24518        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
24519        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
24520        TerminalLoopGreen(
24521            Arc::new(GreenNode {
24522                kind: SyntaxKind::TerminalLoop,
24523                details: GreenNodeDetails::Node { children, width },
24524            })
24525            .intern(db),
24526        )
24527    }
24528    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
24529        self.token(db).text(db)
24530    }
24531}
24532impl TerminalLoop {
24533    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
24534        Trivia::from_syntax_node(db, self.children[0].clone())
24535    }
24536    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenLoop {
24537        TokenLoop::from_syntax_node(db, self.children[1].clone())
24538    }
24539    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
24540        Trivia::from_syntax_node(db, self.children[2].clone())
24541    }
24542}
24543#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
24544pub struct TerminalLoopPtr(pub SyntaxStablePtrId);
24545impl TerminalLoopPtr {}
24546impl TypedStablePtr for TerminalLoopPtr {
24547    type SyntaxNode = TerminalLoop;
24548    fn untyped(&self) -> SyntaxStablePtrId {
24549        self.0
24550    }
24551    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalLoop {
24552        TerminalLoop::from_syntax_node(db, self.0.lookup(db))
24553    }
24554}
24555impl From<TerminalLoopPtr> for SyntaxStablePtrId {
24556    fn from(ptr: TerminalLoopPtr) -> Self {
24557        ptr.untyped()
24558    }
24559}
24560#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
24561pub struct TerminalLoopGreen(pub GreenId);
24562impl TypedSyntaxNode for TerminalLoop {
24563    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalLoop);
24564    type StablePtr = TerminalLoopPtr;
24565    type Green = TerminalLoopGreen;
24566    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
24567        TerminalLoopGreen(
24568            Arc::new(GreenNode {
24569                kind: SyntaxKind::TerminalLoop,
24570                details: GreenNodeDetails::Node {
24571                    children: vec![
24572                        Trivia::missing(db).0,
24573                        TokenLoop::missing(db).0,
24574                        Trivia::missing(db).0,
24575                    ],
24576                    width: TextWidth::default(),
24577                },
24578            })
24579            .intern(db),
24580        )
24581    }
24582    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
24583        let kind = node.kind(db);
24584        assert_eq!(
24585            kind,
24586            SyntaxKind::TerminalLoop,
24587            "Unexpected SyntaxKind {:?}. Expected {:?}.",
24588            kind,
24589            SyntaxKind::TerminalLoop
24590        );
24591        let children = db.get_children(node.clone());
24592        Self { node, children }
24593    }
24594    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
24595        let kind = node.kind(db);
24596        if kind == SyntaxKind::TerminalLoop { Some(Self::from_syntax_node(db, node)) } else { None }
24597    }
24598    fn as_syntax_node(&self) -> SyntaxNode {
24599        self.node.clone()
24600    }
24601    fn stable_ptr(&self) -> Self::StablePtr {
24602        TerminalLoopPtr(self.node.0.stable_ptr)
24603    }
24604}
24605impl From<&TerminalLoop> for SyntaxStablePtrId {
24606    fn from(node: &TerminalLoop) -> Self {
24607        node.stable_ptr().untyped()
24608    }
24609}
24610#[derive(Clone, Debug, Eq, Hash, PartialEq)]
24611pub struct TokenImpl {
24612    node: SyntaxNode,
24613}
24614impl Token for TokenImpl {
24615    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
24616        TokenImplGreen(
24617            Arc::new(GreenNode {
24618                kind: SyntaxKind::TokenImpl,
24619                details: GreenNodeDetails::Token(text),
24620            })
24621            .intern(db),
24622        )
24623    }
24624    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
24625        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
24626            .clone()
24627    }
24628}
24629#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
24630pub struct TokenImplPtr(pub SyntaxStablePtrId);
24631impl TypedStablePtr for TokenImplPtr {
24632    type SyntaxNode = TokenImpl;
24633    fn untyped(&self) -> SyntaxStablePtrId {
24634        self.0
24635    }
24636    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenImpl {
24637        TokenImpl::from_syntax_node(db, self.0.lookup(db))
24638    }
24639}
24640impl From<TokenImplPtr> for SyntaxStablePtrId {
24641    fn from(ptr: TokenImplPtr) -> Self {
24642        ptr.untyped()
24643    }
24644}
24645#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
24646pub struct TokenImplGreen(pub GreenId);
24647impl TokenImplGreen {
24648    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
24649        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
24650    }
24651}
24652impl TypedSyntaxNode for TokenImpl {
24653    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenImpl);
24654    type StablePtr = TokenImplPtr;
24655    type Green = TokenImplGreen;
24656    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
24657        TokenImplGreen(
24658            Arc::new(GreenNode {
24659                kind: SyntaxKind::TokenMissing,
24660                details: GreenNodeDetails::Token("".into()),
24661            })
24662            .intern(db),
24663        )
24664    }
24665    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
24666        match node.0.green.lookup_intern(db).details {
24667            GreenNodeDetails::Token(_) => Self { node },
24668            GreenNodeDetails::Node { .. } => {
24669                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenImpl)
24670            }
24671        }
24672    }
24673    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
24674        match node.0.green.lookup_intern(db).details {
24675            GreenNodeDetails::Token(_) => Some(Self { node }),
24676            GreenNodeDetails::Node { .. } => None,
24677        }
24678    }
24679    fn as_syntax_node(&self) -> SyntaxNode {
24680        self.node.clone()
24681    }
24682    fn stable_ptr(&self) -> Self::StablePtr {
24683        TokenImplPtr(self.node.0.stable_ptr)
24684    }
24685}
24686impl From<&TokenImpl> for SyntaxStablePtrId {
24687    fn from(node: &TokenImpl) -> Self {
24688        node.stable_ptr().untyped()
24689    }
24690}
24691#[derive(Clone, Debug, Eq, Hash, PartialEq)]
24692pub struct TerminalImpl {
24693    node: SyntaxNode,
24694    children: Arc<[SyntaxNode]>,
24695}
24696impl Terminal for TerminalImpl {
24697    const KIND: SyntaxKind = SyntaxKind::TerminalImpl;
24698    type TokenType = TokenImpl;
24699    fn new_green(
24700        db: &dyn SyntaxGroup,
24701        leading_trivia: TriviaGreen,
24702        token: <<TerminalImpl as Terminal>::TokenType as TypedSyntaxNode>::Green,
24703        trailing_trivia: TriviaGreen,
24704    ) -> Self::Green {
24705        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
24706        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
24707        TerminalImplGreen(
24708            Arc::new(GreenNode {
24709                kind: SyntaxKind::TerminalImpl,
24710                details: GreenNodeDetails::Node { children, width },
24711            })
24712            .intern(db),
24713        )
24714    }
24715    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
24716        self.token(db).text(db)
24717    }
24718}
24719impl TerminalImpl {
24720    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
24721        Trivia::from_syntax_node(db, self.children[0].clone())
24722    }
24723    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenImpl {
24724        TokenImpl::from_syntax_node(db, self.children[1].clone())
24725    }
24726    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
24727        Trivia::from_syntax_node(db, self.children[2].clone())
24728    }
24729}
24730#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
24731pub struct TerminalImplPtr(pub SyntaxStablePtrId);
24732impl TerminalImplPtr {}
24733impl TypedStablePtr for TerminalImplPtr {
24734    type SyntaxNode = TerminalImpl;
24735    fn untyped(&self) -> SyntaxStablePtrId {
24736        self.0
24737    }
24738    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalImpl {
24739        TerminalImpl::from_syntax_node(db, self.0.lookup(db))
24740    }
24741}
24742impl From<TerminalImplPtr> for SyntaxStablePtrId {
24743    fn from(ptr: TerminalImplPtr) -> Self {
24744        ptr.untyped()
24745    }
24746}
24747#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
24748pub struct TerminalImplGreen(pub GreenId);
24749impl TypedSyntaxNode for TerminalImpl {
24750    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalImpl);
24751    type StablePtr = TerminalImplPtr;
24752    type Green = TerminalImplGreen;
24753    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
24754        TerminalImplGreen(
24755            Arc::new(GreenNode {
24756                kind: SyntaxKind::TerminalImpl,
24757                details: GreenNodeDetails::Node {
24758                    children: vec![
24759                        Trivia::missing(db).0,
24760                        TokenImpl::missing(db).0,
24761                        Trivia::missing(db).0,
24762                    ],
24763                    width: TextWidth::default(),
24764                },
24765            })
24766            .intern(db),
24767        )
24768    }
24769    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
24770        let kind = node.kind(db);
24771        assert_eq!(
24772            kind,
24773            SyntaxKind::TerminalImpl,
24774            "Unexpected SyntaxKind {:?}. Expected {:?}.",
24775            kind,
24776            SyntaxKind::TerminalImpl
24777        );
24778        let children = db.get_children(node.clone());
24779        Self { node, children }
24780    }
24781    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
24782        let kind = node.kind(db);
24783        if kind == SyntaxKind::TerminalImpl { Some(Self::from_syntax_node(db, node)) } else { None }
24784    }
24785    fn as_syntax_node(&self) -> SyntaxNode {
24786        self.node.clone()
24787    }
24788    fn stable_ptr(&self) -> Self::StablePtr {
24789        TerminalImplPtr(self.node.0.stable_ptr)
24790    }
24791}
24792impl From<&TerminalImpl> for SyntaxStablePtrId {
24793    fn from(node: &TerminalImpl) -> Self {
24794        node.stable_ptr().untyped()
24795    }
24796}
24797#[derive(Clone, Debug, Eq, Hash, PartialEq)]
24798pub struct TokenImplicits {
24799    node: SyntaxNode,
24800}
24801impl Token for TokenImplicits {
24802    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
24803        TokenImplicitsGreen(
24804            Arc::new(GreenNode {
24805                kind: SyntaxKind::TokenImplicits,
24806                details: GreenNodeDetails::Token(text),
24807            })
24808            .intern(db),
24809        )
24810    }
24811    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
24812        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
24813            .clone()
24814    }
24815}
24816#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
24817pub struct TokenImplicitsPtr(pub SyntaxStablePtrId);
24818impl TypedStablePtr for TokenImplicitsPtr {
24819    type SyntaxNode = TokenImplicits;
24820    fn untyped(&self) -> SyntaxStablePtrId {
24821        self.0
24822    }
24823    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenImplicits {
24824        TokenImplicits::from_syntax_node(db, self.0.lookup(db))
24825    }
24826}
24827impl From<TokenImplicitsPtr> for SyntaxStablePtrId {
24828    fn from(ptr: TokenImplicitsPtr) -> Self {
24829        ptr.untyped()
24830    }
24831}
24832#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
24833pub struct TokenImplicitsGreen(pub GreenId);
24834impl TokenImplicitsGreen {
24835    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
24836        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
24837    }
24838}
24839impl TypedSyntaxNode for TokenImplicits {
24840    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenImplicits);
24841    type StablePtr = TokenImplicitsPtr;
24842    type Green = TokenImplicitsGreen;
24843    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
24844        TokenImplicitsGreen(
24845            Arc::new(GreenNode {
24846                kind: SyntaxKind::TokenMissing,
24847                details: GreenNodeDetails::Token("".into()),
24848            })
24849            .intern(db),
24850        )
24851    }
24852    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
24853        match node.0.green.lookup_intern(db).details {
24854            GreenNodeDetails::Token(_) => Self { node },
24855            GreenNodeDetails::Node { .. } => {
24856                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenImplicits)
24857            }
24858        }
24859    }
24860    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
24861        match node.0.green.lookup_intern(db).details {
24862            GreenNodeDetails::Token(_) => Some(Self { node }),
24863            GreenNodeDetails::Node { .. } => None,
24864        }
24865    }
24866    fn as_syntax_node(&self) -> SyntaxNode {
24867        self.node.clone()
24868    }
24869    fn stable_ptr(&self) -> Self::StablePtr {
24870        TokenImplicitsPtr(self.node.0.stable_ptr)
24871    }
24872}
24873impl From<&TokenImplicits> for SyntaxStablePtrId {
24874    fn from(node: &TokenImplicits) -> Self {
24875        node.stable_ptr().untyped()
24876    }
24877}
24878#[derive(Clone, Debug, Eq, Hash, PartialEq)]
24879pub struct TerminalImplicits {
24880    node: SyntaxNode,
24881    children: Arc<[SyntaxNode]>,
24882}
24883impl Terminal for TerminalImplicits {
24884    const KIND: SyntaxKind = SyntaxKind::TerminalImplicits;
24885    type TokenType = TokenImplicits;
24886    fn new_green(
24887        db: &dyn SyntaxGroup,
24888        leading_trivia: TriviaGreen,
24889        token: <<TerminalImplicits as Terminal>::TokenType as TypedSyntaxNode>::Green,
24890        trailing_trivia: TriviaGreen,
24891    ) -> Self::Green {
24892        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
24893        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
24894        TerminalImplicitsGreen(
24895            Arc::new(GreenNode {
24896                kind: SyntaxKind::TerminalImplicits,
24897                details: GreenNodeDetails::Node { children, width },
24898            })
24899            .intern(db),
24900        )
24901    }
24902    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
24903        self.token(db).text(db)
24904    }
24905}
24906impl TerminalImplicits {
24907    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
24908        Trivia::from_syntax_node(db, self.children[0].clone())
24909    }
24910    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenImplicits {
24911        TokenImplicits::from_syntax_node(db, self.children[1].clone())
24912    }
24913    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
24914        Trivia::from_syntax_node(db, self.children[2].clone())
24915    }
24916}
24917#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
24918pub struct TerminalImplicitsPtr(pub SyntaxStablePtrId);
24919impl TerminalImplicitsPtr {}
24920impl TypedStablePtr for TerminalImplicitsPtr {
24921    type SyntaxNode = TerminalImplicits;
24922    fn untyped(&self) -> SyntaxStablePtrId {
24923        self.0
24924    }
24925    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalImplicits {
24926        TerminalImplicits::from_syntax_node(db, self.0.lookup(db))
24927    }
24928}
24929impl From<TerminalImplicitsPtr> for SyntaxStablePtrId {
24930    fn from(ptr: TerminalImplicitsPtr) -> Self {
24931        ptr.untyped()
24932    }
24933}
24934#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
24935pub struct TerminalImplicitsGreen(pub GreenId);
24936impl TypedSyntaxNode for TerminalImplicits {
24937    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalImplicits);
24938    type StablePtr = TerminalImplicitsPtr;
24939    type Green = TerminalImplicitsGreen;
24940    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
24941        TerminalImplicitsGreen(
24942            Arc::new(GreenNode {
24943                kind: SyntaxKind::TerminalImplicits,
24944                details: GreenNodeDetails::Node {
24945                    children: vec![
24946                        Trivia::missing(db).0,
24947                        TokenImplicits::missing(db).0,
24948                        Trivia::missing(db).0,
24949                    ],
24950                    width: TextWidth::default(),
24951                },
24952            })
24953            .intern(db),
24954        )
24955    }
24956    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
24957        let kind = node.kind(db);
24958        assert_eq!(
24959            kind,
24960            SyntaxKind::TerminalImplicits,
24961            "Unexpected SyntaxKind {:?}. Expected {:?}.",
24962            kind,
24963            SyntaxKind::TerminalImplicits
24964        );
24965        let children = db.get_children(node.clone());
24966        Self { node, children }
24967    }
24968    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
24969        let kind = node.kind(db);
24970        if kind == SyntaxKind::TerminalImplicits {
24971            Some(Self::from_syntax_node(db, node))
24972        } else {
24973            None
24974        }
24975    }
24976    fn as_syntax_node(&self) -> SyntaxNode {
24977        self.node.clone()
24978    }
24979    fn stable_ptr(&self) -> Self::StablePtr {
24980        TerminalImplicitsPtr(self.node.0.stable_ptr)
24981    }
24982}
24983impl From<&TerminalImplicits> for SyntaxStablePtrId {
24984    fn from(node: &TerminalImplicits) -> Self {
24985        node.stable_ptr().untyped()
24986    }
24987}
24988#[derive(Clone, Debug, Eq, Hash, PartialEq)]
24989pub struct TokenLet {
24990    node: SyntaxNode,
24991}
24992impl Token for TokenLet {
24993    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
24994        TokenLetGreen(
24995            Arc::new(GreenNode {
24996                kind: SyntaxKind::TokenLet,
24997                details: GreenNodeDetails::Token(text),
24998            })
24999            .intern(db),
25000        )
25001    }
25002    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
25003        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
25004            .clone()
25005    }
25006}
25007#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
25008pub struct TokenLetPtr(pub SyntaxStablePtrId);
25009impl TypedStablePtr for TokenLetPtr {
25010    type SyntaxNode = TokenLet;
25011    fn untyped(&self) -> SyntaxStablePtrId {
25012        self.0
25013    }
25014    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenLet {
25015        TokenLet::from_syntax_node(db, self.0.lookup(db))
25016    }
25017}
25018impl From<TokenLetPtr> for SyntaxStablePtrId {
25019    fn from(ptr: TokenLetPtr) -> Self {
25020        ptr.untyped()
25021    }
25022}
25023#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
25024pub struct TokenLetGreen(pub GreenId);
25025impl TokenLetGreen {
25026    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
25027        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
25028    }
25029}
25030impl TypedSyntaxNode for TokenLet {
25031    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenLet);
25032    type StablePtr = TokenLetPtr;
25033    type Green = TokenLetGreen;
25034    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
25035        TokenLetGreen(
25036            Arc::new(GreenNode {
25037                kind: SyntaxKind::TokenMissing,
25038                details: GreenNodeDetails::Token("".into()),
25039            })
25040            .intern(db),
25041        )
25042    }
25043    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
25044        match node.0.green.lookup_intern(db).details {
25045            GreenNodeDetails::Token(_) => Self { node },
25046            GreenNodeDetails::Node { .. } => {
25047                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenLet)
25048            }
25049        }
25050    }
25051    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
25052        match node.0.green.lookup_intern(db).details {
25053            GreenNodeDetails::Token(_) => Some(Self { node }),
25054            GreenNodeDetails::Node { .. } => None,
25055        }
25056    }
25057    fn as_syntax_node(&self) -> SyntaxNode {
25058        self.node.clone()
25059    }
25060    fn stable_ptr(&self) -> Self::StablePtr {
25061        TokenLetPtr(self.node.0.stable_ptr)
25062    }
25063}
25064impl From<&TokenLet> for SyntaxStablePtrId {
25065    fn from(node: &TokenLet) -> Self {
25066        node.stable_ptr().untyped()
25067    }
25068}
25069#[derive(Clone, Debug, Eq, Hash, PartialEq)]
25070pub struct TerminalLet {
25071    node: SyntaxNode,
25072    children: Arc<[SyntaxNode]>,
25073}
25074impl Terminal for TerminalLet {
25075    const KIND: SyntaxKind = SyntaxKind::TerminalLet;
25076    type TokenType = TokenLet;
25077    fn new_green(
25078        db: &dyn SyntaxGroup,
25079        leading_trivia: TriviaGreen,
25080        token: <<TerminalLet as Terminal>::TokenType as TypedSyntaxNode>::Green,
25081        trailing_trivia: TriviaGreen,
25082    ) -> Self::Green {
25083        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
25084        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
25085        TerminalLetGreen(
25086            Arc::new(GreenNode {
25087                kind: SyntaxKind::TerminalLet,
25088                details: GreenNodeDetails::Node { children, width },
25089            })
25090            .intern(db),
25091        )
25092    }
25093    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
25094        self.token(db).text(db)
25095    }
25096}
25097impl TerminalLet {
25098    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
25099        Trivia::from_syntax_node(db, self.children[0].clone())
25100    }
25101    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenLet {
25102        TokenLet::from_syntax_node(db, self.children[1].clone())
25103    }
25104    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
25105        Trivia::from_syntax_node(db, self.children[2].clone())
25106    }
25107}
25108#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
25109pub struct TerminalLetPtr(pub SyntaxStablePtrId);
25110impl TerminalLetPtr {}
25111impl TypedStablePtr for TerminalLetPtr {
25112    type SyntaxNode = TerminalLet;
25113    fn untyped(&self) -> SyntaxStablePtrId {
25114        self.0
25115    }
25116    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalLet {
25117        TerminalLet::from_syntax_node(db, self.0.lookup(db))
25118    }
25119}
25120impl From<TerminalLetPtr> for SyntaxStablePtrId {
25121    fn from(ptr: TerminalLetPtr) -> Self {
25122        ptr.untyped()
25123    }
25124}
25125#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
25126pub struct TerminalLetGreen(pub GreenId);
25127impl TypedSyntaxNode for TerminalLet {
25128    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalLet);
25129    type StablePtr = TerminalLetPtr;
25130    type Green = TerminalLetGreen;
25131    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
25132        TerminalLetGreen(
25133            Arc::new(GreenNode {
25134                kind: SyntaxKind::TerminalLet,
25135                details: GreenNodeDetails::Node {
25136                    children: vec![
25137                        Trivia::missing(db).0,
25138                        TokenLet::missing(db).0,
25139                        Trivia::missing(db).0,
25140                    ],
25141                    width: TextWidth::default(),
25142                },
25143            })
25144            .intern(db),
25145        )
25146    }
25147    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
25148        let kind = node.kind(db);
25149        assert_eq!(
25150            kind,
25151            SyntaxKind::TerminalLet,
25152            "Unexpected SyntaxKind {:?}. Expected {:?}.",
25153            kind,
25154            SyntaxKind::TerminalLet
25155        );
25156        let children = db.get_children(node.clone());
25157        Self { node, children }
25158    }
25159    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
25160        let kind = node.kind(db);
25161        if kind == SyntaxKind::TerminalLet { Some(Self::from_syntax_node(db, node)) } else { None }
25162    }
25163    fn as_syntax_node(&self) -> SyntaxNode {
25164        self.node.clone()
25165    }
25166    fn stable_ptr(&self) -> Self::StablePtr {
25167        TerminalLetPtr(self.node.0.stable_ptr)
25168    }
25169}
25170impl From<&TerminalLet> for SyntaxStablePtrId {
25171    fn from(node: &TerminalLet) -> Self {
25172        node.stable_ptr().untyped()
25173    }
25174}
25175#[derive(Clone, Debug, Eq, Hash, PartialEq)]
25176pub struct TokenMatch {
25177    node: SyntaxNode,
25178}
25179impl Token for TokenMatch {
25180    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
25181        TokenMatchGreen(
25182            Arc::new(GreenNode {
25183                kind: SyntaxKind::TokenMatch,
25184                details: GreenNodeDetails::Token(text),
25185            })
25186            .intern(db),
25187        )
25188    }
25189    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
25190        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
25191            .clone()
25192    }
25193}
25194#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
25195pub struct TokenMatchPtr(pub SyntaxStablePtrId);
25196impl TypedStablePtr for TokenMatchPtr {
25197    type SyntaxNode = TokenMatch;
25198    fn untyped(&self) -> SyntaxStablePtrId {
25199        self.0
25200    }
25201    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenMatch {
25202        TokenMatch::from_syntax_node(db, self.0.lookup(db))
25203    }
25204}
25205impl From<TokenMatchPtr> for SyntaxStablePtrId {
25206    fn from(ptr: TokenMatchPtr) -> Self {
25207        ptr.untyped()
25208    }
25209}
25210#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
25211pub struct TokenMatchGreen(pub GreenId);
25212impl TokenMatchGreen {
25213    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
25214        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
25215    }
25216}
25217impl TypedSyntaxNode for TokenMatch {
25218    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenMatch);
25219    type StablePtr = TokenMatchPtr;
25220    type Green = TokenMatchGreen;
25221    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
25222        TokenMatchGreen(
25223            Arc::new(GreenNode {
25224                kind: SyntaxKind::TokenMissing,
25225                details: GreenNodeDetails::Token("".into()),
25226            })
25227            .intern(db),
25228        )
25229    }
25230    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
25231        match node.0.green.lookup_intern(db).details {
25232            GreenNodeDetails::Token(_) => Self { node },
25233            GreenNodeDetails::Node { .. } => {
25234                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenMatch)
25235            }
25236        }
25237    }
25238    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
25239        match node.0.green.lookup_intern(db).details {
25240            GreenNodeDetails::Token(_) => Some(Self { node }),
25241            GreenNodeDetails::Node { .. } => None,
25242        }
25243    }
25244    fn as_syntax_node(&self) -> SyntaxNode {
25245        self.node.clone()
25246    }
25247    fn stable_ptr(&self) -> Self::StablePtr {
25248        TokenMatchPtr(self.node.0.stable_ptr)
25249    }
25250}
25251impl From<&TokenMatch> for SyntaxStablePtrId {
25252    fn from(node: &TokenMatch) -> Self {
25253        node.stable_ptr().untyped()
25254    }
25255}
25256#[derive(Clone, Debug, Eq, Hash, PartialEq)]
25257pub struct TerminalMatch {
25258    node: SyntaxNode,
25259    children: Arc<[SyntaxNode]>,
25260}
25261impl Terminal for TerminalMatch {
25262    const KIND: SyntaxKind = SyntaxKind::TerminalMatch;
25263    type TokenType = TokenMatch;
25264    fn new_green(
25265        db: &dyn SyntaxGroup,
25266        leading_trivia: TriviaGreen,
25267        token: <<TerminalMatch as Terminal>::TokenType as TypedSyntaxNode>::Green,
25268        trailing_trivia: TriviaGreen,
25269    ) -> Self::Green {
25270        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
25271        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
25272        TerminalMatchGreen(
25273            Arc::new(GreenNode {
25274                kind: SyntaxKind::TerminalMatch,
25275                details: GreenNodeDetails::Node { children, width },
25276            })
25277            .intern(db),
25278        )
25279    }
25280    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
25281        self.token(db).text(db)
25282    }
25283}
25284impl TerminalMatch {
25285    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
25286        Trivia::from_syntax_node(db, self.children[0].clone())
25287    }
25288    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenMatch {
25289        TokenMatch::from_syntax_node(db, self.children[1].clone())
25290    }
25291    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
25292        Trivia::from_syntax_node(db, self.children[2].clone())
25293    }
25294}
25295#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
25296pub struct TerminalMatchPtr(pub SyntaxStablePtrId);
25297impl TerminalMatchPtr {}
25298impl TypedStablePtr for TerminalMatchPtr {
25299    type SyntaxNode = TerminalMatch;
25300    fn untyped(&self) -> SyntaxStablePtrId {
25301        self.0
25302    }
25303    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalMatch {
25304        TerminalMatch::from_syntax_node(db, self.0.lookup(db))
25305    }
25306}
25307impl From<TerminalMatchPtr> for SyntaxStablePtrId {
25308    fn from(ptr: TerminalMatchPtr) -> Self {
25309        ptr.untyped()
25310    }
25311}
25312#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
25313pub struct TerminalMatchGreen(pub GreenId);
25314impl TypedSyntaxNode for TerminalMatch {
25315    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalMatch);
25316    type StablePtr = TerminalMatchPtr;
25317    type Green = TerminalMatchGreen;
25318    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
25319        TerminalMatchGreen(
25320            Arc::new(GreenNode {
25321                kind: SyntaxKind::TerminalMatch,
25322                details: GreenNodeDetails::Node {
25323                    children: vec![
25324                        Trivia::missing(db).0,
25325                        TokenMatch::missing(db).0,
25326                        Trivia::missing(db).0,
25327                    ],
25328                    width: TextWidth::default(),
25329                },
25330            })
25331            .intern(db),
25332        )
25333    }
25334    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
25335        let kind = node.kind(db);
25336        assert_eq!(
25337            kind,
25338            SyntaxKind::TerminalMatch,
25339            "Unexpected SyntaxKind {:?}. Expected {:?}.",
25340            kind,
25341            SyntaxKind::TerminalMatch
25342        );
25343        let children = db.get_children(node.clone());
25344        Self { node, children }
25345    }
25346    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
25347        let kind = node.kind(db);
25348        if kind == SyntaxKind::TerminalMatch {
25349            Some(Self::from_syntax_node(db, node))
25350        } else {
25351            None
25352        }
25353    }
25354    fn as_syntax_node(&self) -> SyntaxNode {
25355        self.node.clone()
25356    }
25357    fn stable_ptr(&self) -> Self::StablePtr {
25358        TerminalMatchPtr(self.node.0.stable_ptr)
25359    }
25360}
25361impl From<&TerminalMatch> for SyntaxStablePtrId {
25362    fn from(node: &TerminalMatch) -> Self {
25363        node.stable_ptr().untyped()
25364    }
25365}
25366#[derive(Clone, Debug, Eq, Hash, PartialEq)]
25367pub struct TokenModule {
25368    node: SyntaxNode,
25369}
25370impl Token for TokenModule {
25371    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
25372        TokenModuleGreen(
25373            Arc::new(GreenNode {
25374                kind: SyntaxKind::TokenModule,
25375                details: GreenNodeDetails::Token(text),
25376            })
25377            .intern(db),
25378        )
25379    }
25380    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
25381        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
25382            .clone()
25383    }
25384}
25385#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
25386pub struct TokenModulePtr(pub SyntaxStablePtrId);
25387impl TypedStablePtr for TokenModulePtr {
25388    type SyntaxNode = TokenModule;
25389    fn untyped(&self) -> SyntaxStablePtrId {
25390        self.0
25391    }
25392    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenModule {
25393        TokenModule::from_syntax_node(db, self.0.lookup(db))
25394    }
25395}
25396impl From<TokenModulePtr> for SyntaxStablePtrId {
25397    fn from(ptr: TokenModulePtr) -> Self {
25398        ptr.untyped()
25399    }
25400}
25401#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
25402pub struct TokenModuleGreen(pub GreenId);
25403impl TokenModuleGreen {
25404    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
25405        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
25406    }
25407}
25408impl TypedSyntaxNode for TokenModule {
25409    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenModule);
25410    type StablePtr = TokenModulePtr;
25411    type Green = TokenModuleGreen;
25412    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
25413        TokenModuleGreen(
25414            Arc::new(GreenNode {
25415                kind: SyntaxKind::TokenMissing,
25416                details: GreenNodeDetails::Token("".into()),
25417            })
25418            .intern(db),
25419        )
25420    }
25421    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
25422        match node.0.green.lookup_intern(db).details {
25423            GreenNodeDetails::Token(_) => Self { node },
25424            GreenNodeDetails::Node { .. } => {
25425                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenModule)
25426            }
25427        }
25428    }
25429    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
25430        match node.0.green.lookup_intern(db).details {
25431            GreenNodeDetails::Token(_) => Some(Self { node }),
25432            GreenNodeDetails::Node { .. } => None,
25433        }
25434    }
25435    fn as_syntax_node(&self) -> SyntaxNode {
25436        self.node.clone()
25437    }
25438    fn stable_ptr(&self) -> Self::StablePtr {
25439        TokenModulePtr(self.node.0.stable_ptr)
25440    }
25441}
25442impl From<&TokenModule> for SyntaxStablePtrId {
25443    fn from(node: &TokenModule) -> Self {
25444        node.stable_ptr().untyped()
25445    }
25446}
25447#[derive(Clone, Debug, Eq, Hash, PartialEq)]
25448pub struct TerminalModule {
25449    node: SyntaxNode,
25450    children: Arc<[SyntaxNode]>,
25451}
25452impl Terminal for TerminalModule {
25453    const KIND: SyntaxKind = SyntaxKind::TerminalModule;
25454    type TokenType = TokenModule;
25455    fn new_green(
25456        db: &dyn SyntaxGroup,
25457        leading_trivia: TriviaGreen,
25458        token: <<TerminalModule as Terminal>::TokenType as TypedSyntaxNode>::Green,
25459        trailing_trivia: TriviaGreen,
25460    ) -> Self::Green {
25461        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
25462        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
25463        TerminalModuleGreen(
25464            Arc::new(GreenNode {
25465                kind: SyntaxKind::TerminalModule,
25466                details: GreenNodeDetails::Node { children, width },
25467            })
25468            .intern(db),
25469        )
25470    }
25471    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
25472        self.token(db).text(db)
25473    }
25474}
25475impl TerminalModule {
25476    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
25477        Trivia::from_syntax_node(db, self.children[0].clone())
25478    }
25479    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenModule {
25480        TokenModule::from_syntax_node(db, self.children[1].clone())
25481    }
25482    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
25483        Trivia::from_syntax_node(db, self.children[2].clone())
25484    }
25485}
25486#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
25487pub struct TerminalModulePtr(pub SyntaxStablePtrId);
25488impl TerminalModulePtr {}
25489impl TypedStablePtr for TerminalModulePtr {
25490    type SyntaxNode = TerminalModule;
25491    fn untyped(&self) -> SyntaxStablePtrId {
25492        self.0
25493    }
25494    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalModule {
25495        TerminalModule::from_syntax_node(db, self.0.lookup(db))
25496    }
25497}
25498impl From<TerminalModulePtr> for SyntaxStablePtrId {
25499    fn from(ptr: TerminalModulePtr) -> Self {
25500        ptr.untyped()
25501    }
25502}
25503#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
25504pub struct TerminalModuleGreen(pub GreenId);
25505impl TypedSyntaxNode for TerminalModule {
25506    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalModule);
25507    type StablePtr = TerminalModulePtr;
25508    type Green = TerminalModuleGreen;
25509    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
25510        TerminalModuleGreen(
25511            Arc::new(GreenNode {
25512                kind: SyntaxKind::TerminalModule,
25513                details: GreenNodeDetails::Node {
25514                    children: vec![
25515                        Trivia::missing(db).0,
25516                        TokenModule::missing(db).0,
25517                        Trivia::missing(db).0,
25518                    ],
25519                    width: TextWidth::default(),
25520                },
25521            })
25522            .intern(db),
25523        )
25524    }
25525    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
25526        let kind = node.kind(db);
25527        assert_eq!(
25528            kind,
25529            SyntaxKind::TerminalModule,
25530            "Unexpected SyntaxKind {:?}. Expected {:?}.",
25531            kind,
25532            SyntaxKind::TerminalModule
25533        );
25534        let children = db.get_children(node.clone());
25535        Self { node, children }
25536    }
25537    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
25538        let kind = node.kind(db);
25539        if kind == SyntaxKind::TerminalModule {
25540            Some(Self::from_syntax_node(db, node))
25541        } else {
25542            None
25543        }
25544    }
25545    fn as_syntax_node(&self) -> SyntaxNode {
25546        self.node.clone()
25547    }
25548    fn stable_ptr(&self) -> Self::StablePtr {
25549        TerminalModulePtr(self.node.0.stable_ptr)
25550    }
25551}
25552impl From<&TerminalModule> for SyntaxStablePtrId {
25553    fn from(node: &TerminalModule) -> Self {
25554        node.stable_ptr().untyped()
25555    }
25556}
25557#[derive(Clone, Debug, Eq, Hash, PartialEq)]
25558pub struct TokenMut {
25559    node: SyntaxNode,
25560}
25561impl Token for TokenMut {
25562    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
25563        TokenMutGreen(
25564            Arc::new(GreenNode {
25565                kind: SyntaxKind::TokenMut,
25566                details: GreenNodeDetails::Token(text),
25567            })
25568            .intern(db),
25569        )
25570    }
25571    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
25572        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
25573            .clone()
25574    }
25575}
25576#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
25577pub struct TokenMutPtr(pub SyntaxStablePtrId);
25578impl TypedStablePtr for TokenMutPtr {
25579    type SyntaxNode = TokenMut;
25580    fn untyped(&self) -> SyntaxStablePtrId {
25581        self.0
25582    }
25583    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenMut {
25584        TokenMut::from_syntax_node(db, self.0.lookup(db))
25585    }
25586}
25587impl From<TokenMutPtr> for SyntaxStablePtrId {
25588    fn from(ptr: TokenMutPtr) -> Self {
25589        ptr.untyped()
25590    }
25591}
25592#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
25593pub struct TokenMutGreen(pub GreenId);
25594impl TokenMutGreen {
25595    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
25596        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
25597    }
25598}
25599impl TypedSyntaxNode for TokenMut {
25600    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenMut);
25601    type StablePtr = TokenMutPtr;
25602    type Green = TokenMutGreen;
25603    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
25604        TokenMutGreen(
25605            Arc::new(GreenNode {
25606                kind: SyntaxKind::TokenMissing,
25607                details: GreenNodeDetails::Token("".into()),
25608            })
25609            .intern(db),
25610        )
25611    }
25612    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
25613        match node.0.green.lookup_intern(db).details {
25614            GreenNodeDetails::Token(_) => Self { node },
25615            GreenNodeDetails::Node { .. } => {
25616                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenMut)
25617            }
25618        }
25619    }
25620    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
25621        match node.0.green.lookup_intern(db).details {
25622            GreenNodeDetails::Token(_) => Some(Self { node }),
25623            GreenNodeDetails::Node { .. } => None,
25624        }
25625    }
25626    fn as_syntax_node(&self) -> SyntaxNode {
25627        self.node.clone()
25628    }
25629    fn stable_ptr(&self) -> Self::StablePtr {
25630        TokenMutPtr(self.node.0.stable_ptr)
25631    }
25632}
25633impl From<&TokenMut> for SyntaxStablePtrId {
25634    fn from(node: &TokenMut) -> Self {
25635        node.stable_ptr().untyped()
25636    }
25637}
25638#[derive(Clone, Debug, Eq, Hash, PartialEq)]
25639pub struct TerminalMut {
25640    node: SyntaxNode,
25641    children: Arc<[SyntaxNode]>,
25642}
25643impl Terminal for TerminalMut {
25644    const KIND: SyntaxKind = SyntaxKind::TerminalMut;
25645    type TokenType = TokenMut;
25646    fn new_green(
25647        db: &dyn SyntaxGroup,
25648        leading_trivia: TriviaGreen,
25649        token: <<TerminalMut as Terminal>::TokenType as TypedSyntaxNode>::Green,
25650        trailing_trivia: TriviaGreen,
25651    ) -> Self::Green {
25652        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
25653        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
25654        TerminalMutGreen(
25655            Arc::new(GreenNode {
25656                kind: SyntaxKind::TerminalMut,
25657                details: GreenNodeDetails::Node { children, width },
25658            })
25659            .intern(db),
25660        )
25661    }
25662    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
25663        self.token(db).text(db)
25664    }
25665}
25666impl TerminalMut {
25667    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
25668        Trivia::from_syntax_node(db, self.children[0].clone())
25669    }
25670    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenMut {
25671        TokenMut::from_syntax_node(db, self.children[1].clone())
25672    }
25673    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
25674        Trivia::from_syntax_node(db, self.children[2].clone())
25675    }
25676}
25677#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
25678pub struct TerminalMutPtr(pub SyntaxStablePtrId);
25679impl TerminalMutPtr {}
25680impl TypedStablePtr for TerminalMutPtr {
25681    type SyntaxNode = TerminalMut;
25682    fn untyped(&self) -> SyntaxStablePtrId {
25683        self.0
25684    }
25685    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalMut {
25686        TerminalMut::from_syntax_node(db, self.0.lookup(db))
25687    }
25688}
25689impl From<TerminalMutPtr> for SyntaxStablePtrId {
25690    fn from(ptr: TerminalMutPtr) -> Self {
25691        ptr.untyped()
25692    }
25693}
25694#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
25695pub struct TerminalMutGreen(pub GreenId);
25696impl TypedSyntaxNode for TerminalMut {
25697    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalMut);
25698    type StablePtr = TerminalMutPtr;
25699    type Green = TerminalMutGreen;
25700    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
25701        TerminalMutGreen(
25702            Arc::new(GreenNode {
25703                kind: SyntaxKind::TerminalMut,
25704                details: GreenNodeDetails::Node {
25705                    children: vec![
25706                        Trivia::missing(db).0,
25707                        TokenMut::missing(db).0,
25708                        Trivia::missing(db).0,
25709                    ],
25710                    width: TextWidth::default(),
25711                },
25712            })
25713            .intern(db),
25714        )
25715    }
25716    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
25717        let kind = node.kind(db);
25718        assert_eq!(
25719            kind,
25720            SyntaxKind::TerminalMut,
25721            "Unexpected SyntaxKind {:?}. Expected {:?}.",
25722            kind,
25723            SyntaxKind::TerminalMut
25724        );
25725        let children = db.get_children(node.clone());
25726        Self { node, children }
25727    }
25728    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
25729        let kind = node.kind(db);
25730        if kind == SyntaxKind::TerminalMut { Some(Self::from_syntax_node(db, node)) } else { None }
25731    }
25732    fn as_syntax_node(&self) -> SyntaxNode {
25733        self.node.clone()
25734    }
25735    fn stable_ptr(&self) -> Self::StablePtr {
25736        TerminalMutPtr(self.node.0.stable_ptr)
25737    }
25738}
25739impl From<&TerminalMut> for SyntaxStablePtrId {
25740    fn from(node: &TerminalMut) -> Self {
25741        node.stable_ptr().untyped()
25742    }
25743}
25744#[derive(Clone, Debug, Eq, Hash, PartialEq)]
25745pub struct TokenNoPanic {
25746    node: SyntaxNode,
25747}
25748impl Token for TokenNoPanic {
25749    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
25750        TokenNoPanicGreen(
25751            Arc::new(GreenNode {
25752                kind: SyntaxKind::TokenNoPanic,
25753                details: GreenNodeDetails::Token(text),
25754            })
25755            .intern(db),
25756        )
25757    }
25758    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
25759        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
25760            .clone()
25761    }
25762}
25763#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
25764pub struct TokenNoPanicPtr(pub SyntaxStablePtrId);
25765impl TypedStablePtr for TokenNoPanicPtr {
25766    type SyntaxNode = TokenNoPanic;
25767    fn untyped(&self) -> SyntaxStablePtrId {
25768        self.0
25769    }
25770    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenNoPanic {
25771        TokenNoPanic::from_syntax_node(db, self.0.lookup(db))
25772    }
25773}
25774impl From<TokenNoPanicPtr> for SyntaxStablePtrId {
25775    fn from(ptr: TokenNoPanicPtr) -> Self {
25776        ptr.untyped()
25777    }
25778}
25779#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
25780pub struct TokenNoPanicGreen(pub GreenId);
25781impl TokenNoPanicGreen {
25782    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
25783        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
25784    }
25785}
25786impl TypedSyntaxNode for TokenNoPanic {
25787    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenNoPanic);
25788    type StablePtr = TokenNoPanicPtr;
25789    type Green = TokenNoPanicGreen;
25790    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
25791        TokenNoPanicGreen(
25792            Arc::new(GreenNode {
25793                kind: SyntaxKind::TokenMissing,
25794                details: GreenNodeDetails::Token("".into()),
25795            })
25796            .intern(db),
25797        )
25798    }
25799    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
25800        match node.0.green.lookup_intern(db).details {
25801            GreenNodeDetails::Token(_) => Self { node },
25802            GreenNodeDetails::Node { .. } => {
25803                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenNoPanic)
25804            }
25805        }
25806    }
25807    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
25808        match node.0.green.lookup_intern(db).details {
25809            GreenNodeDetails::Token(_) => Some(Self { node }),
25810            GreenNodeDetails::Node { .. } => None,
25811        }
25812    }
25813    fn as_syntax_node(&self) -> SyntaxNode {
25814        self.node.clone()
25815    }
25816    fn stable_ptr(&self) -> Self::StablePtr {
25817        TokenNoPanicPtr(self.node.0.stable_ptr)
25818    }
25819}
25820impl From<&TokenNoPanic> for SyntaxStablePtrId {
25821    fn from(node: &TokenNoPanic) -> Self {
25822        node.stable_ptr().untyped()
25823    }
25824}
25825#[derive(Clone, Debug, Eq, Hash, PartialEq)]
25826pub struct TerminalNoPanic {
25827    node: SyntaxNode,
25828    children: Arc<[SyntaxNode]>,
25829}
25830impl Terminal for TerminalNoPanic {
25831    const KIND: SyntaxKind = SyntaxKind::TerminalNoPanic;
25832    type TokenType = TokenNoPanic;
25833    fn new_green(
25834        db: &dyn SyntaxGroup,
25835        leading_trivia: TriviaGreen,
25836        token: <<TerminalNoPanic as Terminal>::TokenType as TypedSyntaxNode>::Green,
25837        trailing_trivia: TriviaGreen,
25838    ) -> Self::Green {
25839        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
25840        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
25841        TerminalNoPanicGreen(
25842            Arc::new(GreenNode {
25843                kind: SyntaxKind::TerminalNoPanic,
25844                details: GreenNodeDetails::Node { children, width },
25845            })
25846            .intern(db),
25847        )
25848    }
25849    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
25850        self.token(db).text(db)
25851    }
25852}
25853impl TerminalNoPanic {
25854    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
25855        Trivia::from_syntax_node(db, self.children[0].clone())
25856    }
25857    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenNoPanic {
25858        TokenNoPanic::from_syntax_node(db, self.children[1].clone())
25859    }
25860    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
25861        Trivia::from_syntax_node(db, self.children[2].clone())
25862    }
25863}
25864#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
25865pub struct TerminalNoPanicPtr(pub SyntaxStablePtrId);
25866impl TerminalNoPanicPtr {}
25867impl TypedStablePtr for TerminalNoPanicPtr {
25868    type SyntaxNode = TerminalNoPanic;
25869    fn untyped(&self) -> SyntaxStablePtrId {
25870        self.0
25871    }
25872    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalNoPanic {
25873        TerminalNoPanic::from_syntax_node(db, self.0.lookup(db))
25874    }
25875}
25876impl From<TerminalNoPanicPtr> for SyntaxStablePtrId {
25877    fn from(ptr: TerminalNoPanicPtr) -> Self {
25878        ptr.untyped()
25879    }
25880}
25881#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
25882pub struct TerminalNoPanicGreen(pub GreenId);
25883impl TypedSyntaxNode for TerminalNoPanic {
25884    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalNoPanic);
25885    type StablePtr = TerminalNoPanicPtr;
25886    type Green = TerminalNoPanicGreen;
25887    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
25888        TerminalNoPanicGreen(
25889            Arc::new(GreenNode {
25890                kind: SyntaxKind::TerminalNoPanic,
25891                details: GreenNodeDetails::Node {
25892                    children: vec![
25893                        Trivia::missing(db).0,
25894                        TokenNoPanic::missing(db).0,
25895                        Trivia::missing(db).0,
25896                    ],
25897                    width: TextWidth::default(),
25898                },
25899            })
25900            .intern(db),
25901        )
25902    }
25903    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
25904        let kind = node.kind(db);
25905        assert_eq!(
25906            kind,
25907            SyntaxKind::TerminalNoPanic,
25908            "Unexpected SyntaxKind {:?}. Expected {:?}.",
25909            kind,
25910            SyntaxKind::TerminalNoPanic
25911        );
25912        let children = db.get_children(node.clone());
25913        Self { node, children }
25914    }
25915    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
25916        let kind = node.kind(db);
25917        if kind == SyntaxKind::TerminalNoPanic {
25918            Some(Self::from_syntax_node(db, node))
25919        } else {
25920            None
25921        }
25922    }
25923    fn as_syntax_node(&self) -> SyntaxNode {
25924        self.node.clone()
25925    }
25926    fn stable_ptr(&self) -> Self::StablePtr {
25927        TerminalNoPanicPtr(self.node.0.stable_ptr)
25928    }
25929}
25930impl From<&TerminalNoPanic> for SyntaxStablePtrId {
25931    fn from(node: &TerminalNoPanic) -> Self {
25932        node.stable_ptr().untyped()
25933    }
25934}
25935#[derive(Clone, Debug, Eq, Hash, PartialEq)]
25936pub struct TokenOf {
25937    node: SyntaxNode,
25938}
25939impl Token for TokenOf {
25940    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
25941        TokenOfGreen(
25942            Arc::new(GreenNode {
25943                kind: SyntaxKind::TokenOf,
25944                details: GreenNodeDetails::Token(text),
25945            })
25946            .intern(db),
25947        )
25948    }
25949    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
25950        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
25951            .clone()
25952    }
25953}
25954#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
25955pub struct TokenOfPtr(pub SyntaxStablePtrId);
25956impl TypedStablePtr for TokenOfPtr {
25957    type SyntaxNode = TokenOf;
25958    fn untyped(&self) -> SyntaxStablePtrId {
25959        self.0
25960    }
25961    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenOf {
25962        TokenOf::from_syntax_node(db, self.0.lookup(db))
25963    }
25964}
25965impl From<TokenOfPtr> for SyntaxStablePtrId {
25966    fn from(ptr: TokenOfPtr) -> Self {
25967        ptr.untyped()
25968    }
25969}
25970#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
25971pub struct TokenOfGreen(pub GreenId);
25972impl TokenOfGreen {
25973    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
25974        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
25975    }
25976}
25977impl TypedSyntaxNode for TokenOf {
25978    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenOf);
25979    type StablePtr = TokenOfPtr;
25980    type Green = TokenOfGreen;
25981    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
25982        TokenOfGreen(
25983            Arc::new(GreenNode {
25984                kind: SyntaxKind::TokenMissing,
25985                details: GreenNodeDetails::Token("".into()),
25986            })
25987            .intern(db),
25988        )
25989    }
25990    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
25991        match node.0.green.lookup_intern(db).details {
25992            GreenNodeDetails::Token(_) => Self { node },
25993            GreenNodeDetails::Node { .. } => {
25994                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenOf)
25995            }
25996        }
25997    }
25998    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
25999        match node.0.green.lookup_intern(db).details {
26000            GreenNodeDetails::Token(_) => Some(Self { node }),
26001            GreenNodeDetails::Node { .. } => None,
26002        }
26003    }
26004    fn as_syntax_node(&self) -> SyntaxNode {
26005        self.node.clone()
26006    }
26007    fn stable_ptr(&self) -> Self::StablePtr {
26008        TokenOfPtr(self.node.0.stable_ptr)
26009    }
26010}
26011impl From<&TokenOf> for SyntaxStablePtrId {
26012    fn from(node: &TokenOf) -> Self {
26013        node.stable_ptr().untyped()
26014    }
26015}
26016#[derive(Clone, Debug, Eq, Hash, PartialEq)]
26017pub struct TerminalOf {
26018    node: SyntaxNode,
26019    children: Arc<[SyntaxNode]>,
26020}
26021impl Terminal for TerminalOf {
26022    const KIND: SyntaxKind = SyntaxKind::TerminalOf;
26023    type TokenType = TokenOf;
26024    fn new_green(
26025        db: &dyn SyntaxGroup,
26026        leading_trivia: TriviaGreen,
26027        token: <<TerminalOf as Terminal>::TokenType as TypedSyntaxNode>::Green,
26028        trailing_trivia: TriviaGreen,
26029    ) -> Self::Green {
26030        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
26031        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
26032        TerminalOfGreen(
26033            Arc::new(GreenNode {
26034                kind: SyntaxKind::TerminalOf,
26035                details: GreenNodeDetails::Node { children, width },
26036            })
26037            .intern(db),
26038        )
26039    }
26040    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
26041        self.token(db).text(db)
26042    }
26043}
26044impl TerminalOf {
26045    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
26046        Trivia::from_syntax_node(db, self.children[0].clone())
26047    }
26048    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenOf {
26049        TokenOf::from_syntax_node(db, self.children[1].clone())
26050    }
26051    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
26052        Trivia::from_syntax_node(db, self.children[2].clone())
26053    }
26054}
26055#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
26056pub struct TerminalOfPtr(pub SyntaxStablePtrId);
26057impl TerminalOfPtr {}
26058impl TypedStablePtr for TerminalOfPtr {
26059    type SyntaxNode = TerminalOf;
26060    fn untyped(&self) -> SyntaxStablePtrId {
26061        self.0
26062    }
26063    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalOf {
26064        TerminalOf::from_syntax_node(db, self.0.lookup(db))
26065    }
26066}
26067impl From<TerminalOfPtr> for SyntaxStablePtrId {
26068    fn from(ptr: TerminalOfPtr) -> Self {
26069        ptr.untyped()
26070    }
26071}
26072#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
26073pub struct TerminalOfGreen(pub GreenId);
26074impl TypedSyntaxNode for TerminalOf {
26075    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalOf);
26076    type StablePtr = TerminalOfPtr;
26077    type Green = TerminalOfGreen;
26078    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
26079        TerminalOfGreen(
26080            Arc::new(GreenNode {
26081                kind: SyntaxKind::TerminalOf,
26082                details: GreenNodeDetails::Node {
26083                    children: vec![
26084                        Trivia::missing(db).0,
26085                        TokenOf::missing(db).0,
26086                        Trivia::missing(db).0,
26087                    ],
26088                    width: TextWidth::default(),
26089                },
26090            })
26091            .intern(db),
26092        )
26093    }
26094    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
26095        let kind = node.kind(db);
26096        assert_eq!(
26097            kind,
26098            SyntaxKind::TerminalOf,
26099            "Unexpected SyntaxKind {:?}. Expected {:?}.",
26100            kind,
26101            SyntaxKind::TerminalOf
26102        );
26103        let children = db.get_children(node.clone());
26104        Self { node, children }
26105    }
26106    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
26107        let kind = node.kind(db);
26108        if kind == SyntaxKind::TerminalOf { Some(Self::from_syntax_node(db, node)) } else { None }
26109    }
26110    fn as_syntax_node(&self) -> SyntaxNode {
26111        self.node.clone()
26112    }
26113    fn stable_ptr(&self) -> Self::StablePtr {
26114        TerminalOfPtr(self.node.0.stable_ptr)
26115    }
26116}
26117impl From<&TerminalOf> for SyntaxStablePtrId {
26118    fn from(node: &TerminalOf) -> Self {
26119        node.stable_ptr().untyped()
26120    }
26121}
26122#[derive(Clone, Debug, Eq, Hash, PartialEq)]
26123pub struct TokenRef {
26124    node: SyntaxNode,
26125}
26126impl Token for TokenRef {
26127    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
26128        TokenRefGreen(
26129            Arc::new(GreenNode {
26130                kind: SyntaxKind::TokenRef,
26131                details: GreenNodeDetails::Token(text),
26132            })
26133            .intern(db),
26134        )
26135    }
26136    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
26137        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
26138            .clone()
26139    }
26140}
26141#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
26142pub struct TokenRefPtr(pub SyntaxStablePtrId);
26143impl TypedStablePtr for TokenRefPtr {
26144    type SyntaxNode = TokenRef;
26145    fn untyped(&self) -> SyntaxStablePtrId {
26146        self.0
26147    }
26148    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenRef {
26149        TokenRef::from_syntax_node(db, self.0.lookup(db))
26150    }
26151}
26152impl From<TokenRefPtr> for SyntaxStablePtrId {
26153    fn from(ptr: TokenRefPtr) -> Self {
26154        ptr.untyped()
26155    }
26156}
26157#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
26158pub struct TokenRefGreen(pub GreenId);
26159impl TokenRefGreen {
26160    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
26161        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
26162    }
26163}
26164impl TypedSyntaxNode for TokenRef {
26165    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenRef);
26166    type StablePtr = TokenRefPtr;
26167    type Green = TokenRefGreen;
26168    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
26169        TokenRefGreen(
26170            Arc::new(GreenNode {
26171                kind: SyntaxKind::TokenMissing,
26172                details: GreenNodeDetails::Token("".into()),
26173            })
26174            .intern(db),
26175        )
26176    }
26177    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
26178        match node.0.green.lookup_intern(db).details {
26179            GreenNodeDetails::Token(_) => Self { node },
26180            GreenNodeDetails::Node { .. } => {
26181                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenRef)
26182            }
26183        }
26184    }
26185    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
26186        match node.0.green.lookup_intern(db).details {
26187            GreenNodeDetails::Token(_) => Some(Self { node }),
26188            GreenNodeDetails::Node { .. } => None,
26189        }
26190    }
26191    fn as_syntax_node(&self) -> SyntaxNode {
26192        self.node.clone()
26193    }
26194    fn stable_ptr(&self) -> Self::StablePtr {
26195        TokenRefPtr(self.node.0.stable_ptr)
26196    }
26197}
26198impl From<&TokenRef> for SyntaxStablePtrId {
26199    fn from(node: &TokenRef) -> Self {
26200        node.stable_ptr().untyped()
26201    }
26202}
26203#[derive(Clone, Debug, Eq, Hash, PartialEq)]
26204pub struct TerminalRef {
26205    node: SyntaxNode,
26206    children: Arc<[SyntaxNode]>,
26207}
26208impl Terminal for TerminalRef {
26209    const KIND: SyntaxKind = SyntaxKind::TerminalRef;
26210    type TokenType = TokenRef;
26211    fn new_green(
26212        db: &dyn SyntaxGroup,
26213        leading_trivia: TriviaGreen,
26214        token: <<TerminalRef as Terminal>::TokenType as TypedSyntaxNode>::Green,
26215        trailing_trivia: TriviaGreen,
26216    ) -> Self::Green {
26217        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
26218        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
26219        TerminalRefGreen(
26220            Arc::new(GreenNode {
26221                kind: SyntaxKind::TerminalRef,
26222                details: GreenNodeDetails::Node { children, width },
26223            })
26224            .intern(db),
26225        )
26226    }
26227    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
26228        self.token(db).text(db)
26229    }
26230}
26231impl TerminalRef {
26232    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
26233        Trivia::from_syntax_node(db, self.children[0].clone())
26234    }
26235    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenRef {
26236        TokenRef::from_syntax_node(db, self.children[1].clone())
26237    }
26238    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
26239        Trivia::from_syntax_node(db, self.children[2].clone())
26240    }
26241}
26242#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
26243pub struct TerminalRefPtr(pub SyntaxStablePtrId);
26244impl TerminalRefPtr {}
26245impl TypedStablePtr for TerminalRefPtr {
26246    type SyntaxNode = TerminalRef;
26247    fn untyped(&self) -> SyntaxStablePtrId {
26248        self.0
26249    }
26250    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalRef {
26251        TerminalRef::from_syntax_node(db, self.0.lookup(db))
26252    }
26253}
26254impl From<TerminalRefPtr> for SyntaxStablePtrId {
26255    fn from(ptr: TerminalRefPtr) -> Self {
26256        ptr.untyped()
26257    }
26258}
26259#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
26260pub struct TerminalRefGreen(pub GreenId);
26261impl TypedSyntaxNode for TerminalRef {
26262    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalRef);
26263    type StablePtr = TerminalRefPtr;
26264    type Green = TerminalRefGreen;
26265    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
26266        TerminalRefGreen(
26267            Arc::new(GreenNode {
26268                kind: SyntaxKind::TerminalRef,
26269                details: GreenNodeDetails::Node {
26270                    children: vec![
26271                        Trivia::missing(db).0,
26272                        TokenRef::missing(db).0,
26273                        Trivia::missing(db).0,
26274                    ],
26275                    width: TextWidth::default(),
26276                },
26277            })
26278            .intern(db),
26279        )
26280    }
26281    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
26282        let kind = node.kind(db);
26283        assert_eq!(
26284            kind,
26285            SyntaxKind::TerminalRef,
26286            "Unexpected SyntaxKind {:?}. Expected {:?}.",
26287            kind,
26288            SyntaxKind::TerminalRef
26289        );
26290        let children = db.get_children(node.clone());
26291        Self { node, children }
26292    }
26293    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
26294        let kind = node.kind(db);
26295        if kind == SyntaxKind::TerminalRef { Some(Self::from_syntax_node(db, node)) } else { None }
26296    }
26297    fn as_syntax_node(&self) -> SyntaxNode {
26298        self.node.clone()
26299    }
26300    fn stable_ptr(&self) -> Self::StablePtr {
26301        TerminalRefPtr(self.node.0.stable_ptr)
26302    }
26303}
26304impl From<&TerminalRef> for SyntaxStablePtrId {
26305    fn from(node: &TerminalRef) -> Self {
26306        node.stable_ptr().untyped()
26307    }
26308}
26309#[derive(Clone, Debug, Eq, Hash, PartialEq)]
26310pub struct TokenContinue {
26311    node: SyntaxNode,
26312}
26313impl Token for TokenContinue {
26314    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
26315        TokenContinueGreen(
26316            Arc::new(GreenNode {
26317                kind: SyntaxKind::TokenContinue,
26318                details: GreenNodeDetails::Token(text),
26319            })
26320            .intern(db),
26321        )
26322    }
26323    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
26324        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
26325            .clone()
26326    }
26327}
26328#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
26329pub struct TokenContinuePtr(pub SyntaxStablePtrId);
26330impl TypedStablePtr for TokenContinuePtr {
26331    type SyntaxNode = TokenContinue;
26332    fn untyped(&self) -> SyntaxStablePtrId {
26333        self.0
26334    }
26335    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenContinue {
26336        TokenContinue::from_syntax_node(db, self.0.lookup(db))
26337    }
26338}
26339impl From<TokenContinuePtr> for SyntaxStablePtrId {
26340    fn from(ptr: TokenContinuePtr) -> Self {
26341        ptr.untyped()
26342    }
26343}
26344#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
26345pub struct TokenContinueGreen(pub GreenId);
26346impl TokenContinueGreen {
26347    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
26348        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
26349    }
26350}
26351impl TypedSyntaxNode for TokenContinue {
26352    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenContinue);
26353    type StablePtr = TokenContinuePtr;
26354    type Green = TokenContinueGreen;
26355    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
26356        TokenContinueGreen(
26357            Arc::new(GreenNode {
26358                kind: SyntaxKind::TokenMissing,
26359                details: GreenNodeDetails::Token("".into()),
26360            })
26361            .intern(db),
26362        )
26363    }
26364    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
26365        match node.0.green.lookup_intern(db).details {
26366            GreenNodeDetails::Token(_) => Self { node },
26367            GreenNodeDetails::Node { .. } => {
26368                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenContinue)
26369            }
26370        }
26371    }
26372    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
26373        match node.0.green.lookup_intern(db).details {
26374            GreenNodeDetails::Token(_) => Some(Self { node }),
26375            GreenNodeDetails::Node { .. } => None,
26376        }
26377    }
26378    fn as_syntax_node(&self) -> SyntaxNode {
26379        self.node.clone()
26380    }
26381    fn stable_ptr(&self) -> Self::StablePtr {
26382        TokenContinuePtr(self.node.0.stable_ptr)
26383    }
26384}
26385impl From<&TokenContinue> for SyntaxStablePtrId {
26386    fn from(node: &TokenContinue) -> Self {
26387        node.stable_ptr().untyped()
26388    }
26389}
26390#[derive(Clone, Debug, Eq, Hash, PartialEq)]
26391pub struct TerminalContinue {
26392    node: SyntaxNode,
26393    children: Arc<[SyntaxNode]>,
26394}
26395impl Terminal for TerminalContinue {
26396    const KIND: SyntaxKind = SyntaxKind::TerminalContinue;
26397    type TokenType = TokenContinue;
26398    fn new_green(
26399        db: &dyn SyntaxGroup,
26400        leading_trivia: TriviaGreen,
26401        token: <<TerminalContinue as Terminal>::TokenType as TypedSyntaxNode>::Green,
26402        trailing_trivia: TriviaGreen,
26403    ) -> Self::Green {
26404        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
26405        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
26406        TerminalContinueGreen(
26407            Arc::new(GreenNode {
26408                kind: SyntaxKind::TerminalContinue,
26409                details: GreenNodeDetails::Node { children, width },
26410            })
26411            .intern(db),
26412        )
26413    }
26414    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
26415        self.token(db).text(db)
26416    }
26417}
26418impl TerminalContinue {
26419    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
26420        Trivia::from_syntax_node(db, self.children[0].clone())
26421    }
26422    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenContinue {
26423        TokenContinue::from_syntax_node(db, self.children[1].clone())
26424    }
26425    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
26426        Trivia::from_syntax_node(db, self.children[2].clone())
26427    }
26428}
26429#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
26430pub struct TerminalContinuePtr(pub SyntaxStablePtrId);
26431impl TerminalContinuePtr {}
26432impl TypedStablePtr for TerminalContinuePtr {
26433    type SyntaxNode = TerminalContinue;
26434    fn untyped(&self) -> SyntaxStablePtrId {
26435        self.0
26436    }
26437    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalContinue {
26438        TerminalContinue::from_syntax_node(db, self.0.lookup(db))
26439    }
26440}
26441impl From<TerminalContinuePtr> for SyntaxStablePtrId {
26442    fn from(ptr: TerminalContinuePtr) -> Self {
26443        ptr.untyped()
26444    }
26445}
26446#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
26447pub struct TerminalContinueGreen(pub GreenId);
26448impl TypedSyntaxNode for TerminalContinue {
26449    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalContinue);
26450    type StablePtr = TerminalContinuePtr;
26451    type Green = TerminalContinueGreen;
26452    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
26453        TerminalContinueGreen(
26454            Arc::new(GreenNode {
26455                kind: SyntaxKind::TerminalContinue,
26456                details: GreenNodeDetails::Node {
26457                    children: vec![
26458                        Trivia::missing(db).0,
26459                        TokenContinue::missing(db).0,
26460                        Trivia::missing(db).0,
26461                    ],
26462                    width: TextWidth::default(),
26463                },
26464            })
26465            .intern(db),
26466        )
26467    }
26468    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
26469        let kind = node.kind(db);
26470        assert_eq!(
26471            kind,
26472            SyntaxKind::TerminalContinue,
26473            "Unexpected SyntaxKind {:?}. Expected {:?}.",
26474            kind,
26475            SyntaxKind::TerminalContinue
26476        );
26477        let children = db.get_children(node.clone());
26478        Self { node, children }
26479    }
26480    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
26481        let kind = node.kind(db);
26482        if kind == SyntaxKind::TerminalContinue {
26483            Some(Self::from_syntax_node(db, node))
26484        } else {
26485            None
26486        }
26487    }
26488    fn as_syntax_node(&self) -> SyntaxNode {
26489        self.node.clone()
26490    }
26491    fn stable_ptr(&self) -> Self::StablePtr {
26492        TerminalContinuePtr(self.node.0.stable_ptr)
26493    }
26494}
26495impl From<&TerminalContinue> for SyntaxStablePtrId {
26496    fn from(node: &TerminalContinue) -> Self {
26497        node.stable_ptr().untyped()
26498    }
26499}
26500#[derive(Clone, Debug, Eq, Hash, PartialEq)]
26501pub struct TokenReturn {
26502    node: SyntaxNode,
26503}
26504impl Token for TokenReturn {
26505    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
26506        TokenReturnGreen(
26507            Arc::new(GreenNode {
26508                kind: SyntaxKind::TokenReturn,
26509                details: GreenNodeDetails::Token(text),
26510            })
26511            .intern(db),
26512        )
26513    }
26514    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
26515        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
26516            .clone()
26517    }
26518}
26519#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
26520pub struct TokenReturnPtr(pub SyntaxStablePtrId);
26521impl TypedStablePtr for TokenReturnPtr {
26522    type SyntaxNode = TokenReturn;
26523    fn untyped(&self) -> SyntaxStablePtrId {
26524        self.0
26525    }
26526    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenReturn {
26527        TokenReturn::from_syntax_node(db, self.0.lookup(db))
26528    }
26529}
26530impl From<TokenReturnPtr> for SyntaxStablePtrId {
26531    fn from(ptr: TokenReturnPtr) -> Self {
26532        ptr.untyped()
26533    }
26534}
26535#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
26536pub struct TokenReturnGreen(pub GreenId);
26537impl TokenReturnGreen {
26538    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
26539        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
26540    }
26541}
26542impl TypedSyntaxNode for TokenReturn {
26543    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenReturn);
26544    type StablePtr = TokenReturnPtr;
26545    type Green = TokenReturnGreen;
26546    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
26547        TokenReturnGreen(
26548            Arc::new(GreenNode {
26549                kind: SyntaxKind::TokenMissing,
26550                details: GreenNodeDetails::Token("".into()),
26551            })
26552            .intern(db),
26553        )
26554    }
26555    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
26556        match node.0.green.lookup_intern(db).details {
26557            GreenNodeDetails::Token(_) => Self { node },
26558            GreenNodeDetails::Node { .. } => {
26559                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenReturn)
26560            }
26561        }
26562    }
26563    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
26564        match node.0.green.lookup_intern(db).details {
26565            GreenNodeDetails::Token(_) => Some(Self { node }),
26566            GreenNodeDetails::Node { .. } => None,
26567        }
26568    }
26569    fn as_syntax_node(&self) -> SyntaxNode {
26570        self.node.clone()
26571    }
26572    fn stable_ptr(&self) -> Self::StablePtr {
26573        TokenReturnPtr(self.node.0.stable_ptr)
26574    }
26575}
26576impl From<&TokenReturn> for SyntaxStablePtrId {
26577    fn from(node: &TokenReturn) -> Self {
26578        node.stable_ptr().untyped()
26579    }
26580}
26581#[derive(Clone, Debug, Eq, Hash, PartialEq)]
26582pub struct TerminalReturn {
26583    node: SyntaxNode,
26584    children: Arc<[SyntaxNode]>,
26585}
26586impl Terminal for TerminalReturn {
26587    const KIND: SyntaxKind = SyntaxKind::TerminalReturn;
26588    type TokenType = TokenReturn;
26589    fn new_green(
26590        db: &dyn SyntaxGroup,
26591        leading_trivia: TriviaGreen,
26592        token: <<TerminalReturn as Terminal>::TokenType as TypedSyntaxNode>::Green,
26593        trailing_trivia: TriviaGreen,
26594    ) -> Self::Green {
26595        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
26596        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
26597        TerminalReturnGreen(
26598            Arc::new(GreenNode {
26599                kind: SyntaxKind::TerminalReturn,
26600                details: GreenNodeDetails::Node { children, width },
26601            })
26602            .intern(db),
26603        )
26604    }
26605    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
26606        self.token(db).text(db)
26607    }
26608}
26609impl TerminalReturn {
26610    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
26611        Trivia::from_syntax_node(db, self.children[0].clone())
26612    }
26613    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenReturn {
26614        TokenReturn::from_syntax_node(db, self.children[1].clone())
26615    }
26616    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
26617        Trivia::from_syntax_node(db, self.children[2].clone())
26618    }
26619}
26620#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
26621pub struct TerminalReturnPtr(pub SyntaxStablePtrId);
26622impl TerminalReturnPtr {}
26623impl TypedStablePtr for TerminalReturnPtr {
26624    type SyntaxNode = TerminalReturn;
26625    fn untyped(&self) -> SyntaxStablePtrId {
26626        self.0
26627    }
26628    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalReturn {
26629        TerminalReturn::from_syntax_node(db, self.0.lookup(db))
26630    }
26631}
26632impl From<TerminalReturnPtr> for SyntaxStablePtrId {
26633    fn from(ptr: TerminalReturnPtr) -> Self {
26634        ptr.untyped()
26635    }
26636}
26637#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
26638pub struct TerminalReturnGreen(pub GreenId);
26639impl TypedSyntaxNode for TerminalReturn {
26640    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalReturn);
26641    type StablePtr = TerminalReturnPtr;
26642    type Green = TerminalReturnGreen;
26643    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
26644        TerminalReturnGreen(
26645            Arc::new(GreenNode {
26646                kind: SyntaxKind::TerminalReturn,
26647                details: GreenNodeDetails::Node {
26648                    children: vec![
26649                        Trivia::missing(db).0,
26650                        TokenReturn::missing(db).0,
26651                        Trivia::missing(db).0,
26652                    ],
26653                    width: TextWidth::default(),
26654                },
26655            })
26656            .intern(db),
26657        )
26658    }
26659    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
26660        let kind = node.kind(db);
26661        assert_eq!(
26662            kind,
26663            SyntaxKind::TerminalReturn,
26664            "Unexpected SyntaxKind {:?}. Expected {:?}.",
26665            kind,
26666            SyntaxKind::TerminalReturn
26667        );
26668        let children = db.get_children(node.clone());
26669        Self { node, children }
26670    }
26671    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
26672        let kind = node.kind(db);
26673        if kind == SyntaxKind::TerminalReturn {
26674            Some(Self::from_syntax_node(db, node))
26675        } else {
26676            None
26677        }
26678    }
26679    fn as_syntax_node(&self) -> SyntaxNode {
26680        self.node.clone()
26681    }
26682    fn stable_ptr(&self) -> Self::StablePtr {
26683        TerminalReturnPtr(self.node.0.stable_ptr)
26684    }
26685}
26686impl From<&TerminalReturn> for SyntaxStablePtrId {
26687    fn from(node: &TerminalReturn) -> Self {
26688        node.stable_ptr().untyped()
26689    }
26690}
26691#[derive(Clone, Debug, Eq, Hash, PartialEq)]
26692pub struct TokenBreak {
26693    node: SyntaxNode,
26694}
26695impl Token for TokenBreak {
26696    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
26697        TokenBreakGreen(
26698            Arc::new(GreenNode {
26699                kind: SyntaxKind::TokenBreak,
26700                details: GreenNodeDetails::Token(text),
26701            })
26702            .intern(db),
26703        )
26704    }
26705    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
26706        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
26707            .clone()
26708    }
26709}
26710#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
26711pub struct TokenBreakPtr(pub SyntaxStablePtrId);
26712impl TypedStablePtr for TokenBreakPtr {
26713    type SyntaxNode = TokenBreak;
26714    fn untyped(&self) -> SyntaxStablePtrId {
26715        self.0
26716    }
26717    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenBreak {
26718        TokenBreak::from_syntax_node(db, self.0.lookup(db))
26719    }
26720}
26721impl From<TokenBreakPtr> for SyntaxStablePtrId {
26722    fn from(ptr: TokenBreakPtr) -> Self {
26723        ptr.untyped()
26724    }
26725}
26726#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
26727pub struct TokenBreakGreen(pub GreenId);
26728impl TokenBreakGreen {
26729    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
26730        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
26731    }
26732}
26733impl TypedSyntaxNode for TokenBreak {
26734    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenBreak);
26735    type StablePtr = TokenBreakPtr;
26736    type Green = TokenBreakGreen;
26737    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
26738        TokenBreakGreen(
26739            Arc::new(GreenNode {
26740                kind: SyntaxKind::TokenMissing,
26741                details: GreenNodeDetails::Token("".into()),
26742            })
26743            .intern(db),
26744        )
26745    }
26746    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
26747        match node.0.green.lookup_intern(db).details {
26748            GreenNodeDetails::Token(_) => Self { node },
26749            GreenNodeDetails::Node { .. } => {
26750                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenBreak)
26751            }
26752        }
26753    }
26754    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
26755        match node.0.green.lookup_intern(db).details {
26756            GreenNodeDetails::Token(_) => Some(Self { node }),
26757            GreenNodeDetails::Node { .. } => None,
26758        }
26759    }
26760    fn as_syntax_node(&self) -> SyntaxNode {
26761        self.node.clone()
26762    }
26763    fn stable_ptr(&self) -> Self::StablePtr {
26764        TokenBreakPtr(self.node.0.stable_ptr)
26765    }
26766}
26767impl From<&TokenBreak> for SyntaxStablePtrId {
26768    fn from(node: &TokenBreak) -> Self {
26769        node.stable_ptr().untyped()
26770    }
26771}
26772#[derive(Clone, Debug, Eq, Hash, PartialEq)]
26773pub struct TerminalBreak {
26774    node: SyntaxNode,
26775    children: Arc<[SyntaxNode]>,
26776}
26777impl Terminal for TerminalBreak {
26778    const KIND: SyntaxKind = SyntaxKind::TerminalBreak;
26779    type TokenType = TokenBreak;
26780    fn new_green(
26781        db: &dyn SyntaxGroup,
26782        leading_trivia: TriviaGreen,
26783        token: <<TerminalBreak as Terminal>::TokenType as TypedSyntaxNode>::Green,
26784        trailing_trivia: TriviaGreen,
26785    ) -> Self::Green {
26786        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
26787        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
26788        TerminalBreakGreen(
26789            Arc::new(GreenNode {
26790                kind: SyntaxKind::TerminalBreak,
26791                details: GreenNodeDetails::Node { children, width },
26792            })
26793            .intern(db),
26794        )
26795    }
26796    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
26797        self.token(db).text(db)
26798    }
26799}
26800impl TerminalBreak {
26801    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
26802        Trivia::from_syntax_node(db, self.children[0].clone())
26803    }
26804    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenBreak {
26805        TokenBreak::from_syntax_node(db, self.children[1].clone())
26806    }
26807    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
26808        Trivia::from_syntax_node(db, self.children[2].clone())
26809    }
26810}
26811#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
26812pub struct TerminalBreakPtr(pub SyntaxStablePtrId);
26813impl TerminalBreakPtr {}
26814impl TypedStablePtr for TerminalBreakPtr {
26815    type SyntaxNode = TerminalBreak;
26816    fn untyped(&self) -> SyntaxStablePtrId {
26817        self.0
26818    }
26819    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalBreak {
26820        TerminalBreak::from_syntax_node(db, self.0.lookup(db))
26821    }
26822}
26823impl From<TerminalBreakPtr> for SyntaxStablePtrId {
26824    fn from(ptr: TerminalBreakPtr) -> Self {
26825        ptr.untyped()
26826    }
26827}
26828#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
26829pub struct TerminalBreakGreen(pub GreenId);
26830impl TypedSyntaxNode for TerminalBreak {
26831    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalBreak);
26832    type StablePtr = TerminalBreakPtr;
26833    type Green = TerminalBreakGreen;
26834    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
26835        TerminalBreakGreen(
26836            Arc::new(GreenNode {
26837                kind: SyntaxKind::TerminalBreak,
26838                details: GreenNodeDetails::Node {
26839                    children: vec![
26840                        Trivia::missing(db).0,
26841                        TokenBreak::missing(db).0,
26842                        Trivia::missing(db).0,
26843                    ],
26844                    width: TextWidth::default(),
26845                },
26846            })
26847            .intern(db),
26848        )
26849    }
26850    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
26851        let kind = node.kind(db);
26852        assert_eq!(
26853            kind,
26854            SyntaxKind::TerminalBreak,
26855            "Unexpected SyntaxKind {:?}. Expected {:?}.",
26856            kind,
26857            SyntaxKind::TerminalBreak
26858        );
26859        let children = db.get_children(node.clone());
26860        Self { node, children }
26861    }
26862    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
26863        let kind = node.kind(db);
26864        if kind == SyntaxKind::TerminalBreak {
26865            Some(Self::from_syntax_node(db, node))
26866        } else {
26867            None
26868        }
26869    }
26870    fn as_syntax_node(&self) -> SyntaxNode {
26871        self.node.clone()
26872    }
26873    fn stable_ptr(&self) -> Self::StablePtr {
26874        TerminalBreakPtr(self.node.0.stable_ptr)
26875    }
26876}
26877impl From<&TerminalBreak> for SyntaxStablePtrId {
26878    fn from(node: &TerminalBreak) -> Self {
26879        node.stable_ptr().untyped()
26880    }
26881}
26882#[derive(Clone, Debug, Eq, Hash, PartialEq)]
26883pub struct TokenStruct {
26884    node: SyntaxNode,
26885}
26886impl Token for TokenStruct {
26887    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
26888        TokenStructGreen(
26889            Arc::new(GreenNode {
26890                kind: SyntaxKind::TokenStruct,
26891                details: GreenNodeDetails::Token(text),
26892            })
26893            .intern(db),
26894        )
26895    }
26896    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
26897        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
26898            .clone()
26899    }
26900}
26901#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
26902pub struct TokenStructPtr(pub SyntaxStablePtrId);
26903impl TypedStablePtr for TokenStructPtr {
26904    type SyntaxNode = TokenStruct;
26905    fn untyped(&self) -> SyntaxStablePtrId {
26906        self.0
26907    }
26908    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenStruct {
26909        TokenStruct::from_syntax_node(db, self.0.lookup(db))
26910    }
26911}
26912impl From<TokenStructPtr> for SyntaxStablePtrId {
26913    fn from(ptr: TokenStructPtr) -> Self {
26914        ptr.untyped()
26915    }
26916}
26917#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
26918pub struct TokenStructGreen(pub GreenId);
26919impl TokenStructGreen {
26920    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
26921        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
26922    }
26923}
26924impl TypedSyntaxNode for TokenStruct {
26925    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenStruct);
26926    type StablePtr = TokenStructPtr;
26927    type Green = TokenStructGreen;
26928    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
26929        TokenStructGreen(
26930            Arc::new(GreenNode {
26931                kind: SyntaxKind::TokenMissing,
26932                details: GreenNodeDetails::Token("".into()),
26933            })
26934            .intern(db),
26935        )
26936    }
26937    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
26938        match node.0.green.lookup_intern(db).details {
26939            GreenNodeDetails::Token(_) => Self { node },
26940            GreenNodeDetails::Node { .. } => {
26941                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenStruct)
26942            }
26943        }
26944    }
26945    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
26946        match node.0.green.lookup_intern(db).details {
26947            GreenNodeDetails::Token(_) => Some(Self { node }),
26948            GreenNodeDetails::Node { .. } => None,
26949        }
26950    }
26951    fn as_syntax_node(&self) -> SyntaxNode {
26952        self.node.clone()
26953    }
26954    fn stable_ptr(&self) -> Self::StablePtr {
26955        TokenStructPtr(self.node.0.stable_ptr)
26956    }
26957}
26958impl From<&TokenStruct> for SyntaxStablePtrId {
26959    fn from(node: &TokenStruct) -> Self {
26960        node.stable_ptr().untyped()
26961    }
26962}
26963#[derive(Clone, Debug, Eq, Hash, PartialEq)]
26964pub struct TerminalStruct {
26965    node: SyntaxNode,
26966    children: Arc<[SyntaxNode]>,
26967}
26968impl Terminal for TerminalStruct {
26969    const KIND: SyntaxKind = SyntaxKind::TerminalStruct;
26970    type TokenType = TokenStruct;
26971    fn new_green(
26972        db: &dyn SyntaxGroup,
26973        leading_trivia: TriviaGreen,
26974        token: <<TerminalStruct as Terminal>::TokenType as TypedSyntaxNode>::Green,
26975        trailing_trivia: TriviaGreen,
26976    ) -> Self::Green {
26977        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
26978        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
26979        TerminalStructGreen(
26980            Arc::new(GreenNode {
26981                kind: SyntaxKind::TerminalStruct,
26982                details: GreenNodeDetails::Node { children, width },
26983            })
26984            .intern(db),
26985        )
26986    }
26987    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
26988        self.token(db).text(db)
26989    }
26990}
26991impl TerminalStruct {
26992    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
26993        Trivia::from_syntax_node(db, self.children[0].clone())
26994    }
26995    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenStruct {
26996        TokenStruct::from_syntax_node(db, self.children[1].clone())
26997    }
26998    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
26999        Trivia::from_syntax_node(db, self.children[2].clone())
27000    }
27001}
27002#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
27003pub struct TerminalStructPtr(pub SyntaxStablePtrId);
27004impl TerminalStructPtr {}
27005impl TypedStablePtr for TerminalStructPtr {
27006    type SyntaxNode = TerminalStruct;
27007    fn untyped(&self) -> SyntaxStablePtrId {
27008        self.0
27009    }
27010    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalStruct {
27011        TerminalStruct::from_syntax_node(db, self.0.lookup(db))
27012    }
27013}
27014impl From<TerminalStructPtr> for SyntaxStablePtrId {
27015    fn from(ptr: TerminalStructPtr) -> Self {
27016        ptr.untyped()
27017    }
27018}
27019#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
27020pub struct TerminalStructGreen(pub GreenId);
27021impl TypedSyntaxNode for TerminalStruct {
27022    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalStruct);
27023    type StablePtr = TerminalStructPtr;
27024    type Green = TerminalStructGreen;
27025    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
27026        TerminalStructGreen(
27027            Arc::new(GreenNode {
27028                kind: SyntaxKind::TerminalStruct,
27029                details: GreenNodeDetails::Node {
27030                    children: vec![
27031                        Trivia::missing(db).0,
27032                        TokenStruct::missing(db).0,
27033                        Trivia::missing(db).0,
27034                    ],
27035                    width: TextWidth::default(),
27036                },
27037            })
27038            .intern(db),
27039        )
27040    }
27041    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
27042        let kind = node.kind(db);
27043        assert_eq!(
27044            kind,
27045            SyntaxKind::TerminalStruct,
27046            "Unexpected SyntaxKind {:?}. Expected {:?}.",
27047            kind,
27048            SyntaxKind::TerminalStruct
27049        );
27050        let children = db.get_children(node.clone());
27051        Self { node, children }
27052    }
27053    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
27054        let kind = node.kind(db);
27055        if kind == SyntaxKind::TerminalStruct {
27056            Some(Self::from_syntax_node(db, node))
27057        } else {
27058            None
27059        }
27060    }
27061    fn as_syntax_node(&self) -> SyntaxNode {
27062        self.node.clone()
27063    }
27064    fn stable_ptr(&self) -> Self::StablePtr {
27065        TerminalStructPtr(self.node.0.stable_ptr)
27066    }
27067}
27068impl From<&TerminalStruct> for SyntaxStablePtrId {
27069    fn from(node: &TerminalStruct) -> Self {
27070        node.stable_ptr().untyped()
27071    }
27072}
27073#[derive(Clone, Debug, Eq, Hash, PartialEq)]
27074pub struct TokenTrait {
27075    node: SyntaxNode,
27076}
27077impl Token for TokenTrait {
27078    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
27079        TokenTraitGreen(
27080            Arc::new(GreenNode {
27081                kind: SyntaxKind::TokenTrait,
27082                details: GreenNodeDetails::Token(text),
27083            })
27084            .intern(db),
27085        )
27086    }
27087    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
27088        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
27089            .clone()
27090    }
27091}
27092#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
27093pub struct TokenTraitPtr(pub SyntaxStablePtrId);
27094impl TypedStablePtr for TokenTraitPtr {
27095    type SyntaxNode = TokenTrait;
27096    fn untyped(&self) -> SyntaxStablePtrId {
27097        self.0
27098    }
27099    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenTrait {
27100        TokenTrait::from_syntax_node(db, self.0.lookup(db))
27101    }
27102}
27103impl From<TokenTraitPtr> for SyntaxStablePtrId {
27104    fn from(ptr: TokenTraitPtr) -> Self {
27105        ptr.untyped()
27106    }
27107}
27108#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
27109pub struct TokenTraitGreen(pub GreenId);
27110impl TokenTraitGreen {
27111    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
27112        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
27113    }
27114}
27115impl TypedSyntaxNode for TokenTrait {
27116    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenTrait);
27117    type StablePtr = TokenTraitPtr;
27118    type Green = TokenTraitGreen;
27119    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
27120        TokenTraitGreen(
27121            Arc::new(GreenNode {
27122                kind: SyntaxKind::TokenMissing,
27123                details: GreenNodeDetails::Token("".into()),
27124            })
27125            .intern(db),
27126        )
27127    }
27128    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
27129        match node.0.green.lookup_intern(db).details {
27130            GreenNodeDetails::Token(_) => Self { node },
27131            GreenNodeDetails::Node { .. } => {
27132                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenTrait)
27133            }
27134        }
27135    }
27136    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
27137        match node.0.green.lookup_intern(db).details {
27138            GreenNodeDetails::Token(_) => Some(Self { node }),
27139            GreenNodeDetails::Node { .. } => None,
27140        }
27141    }
27142    fn as_syntax_node(&self) -> SyntaxNode {
27143        self.node.clone()
27144    }
27145    fn stable_ptr(&self) -> Self::StablePtr {
27146        TokenTraitPtr(self.node.0.stable_ptr)
27147    }
27148}
27149impl From<&TokenTrait> for SyntaxStablePtrId {
27150    fn from(node: &TokenTrait) -> Self {
27151        node.stable_ptr().untyped()
27152    }
27153}
27154#[derive(Clone, Debug, Eq, Hash, PartialEq)]
27155pub struct TerminalTrait {
27156    node: SyntaxNode,
27157    children: Arc<[SyntaxNode]>,
27158}
27159impl Terminal for TerminalTrait {
27160    const KIND: SyntaxKind = SyntaxKind::TerminalTrait;
27161    type TokenType = TokenTrait;
27162    fn new_green(
27163        db: &dyn SyntaxGroup,
27164        leading_trivia: TriviaGreen,
27165        token: <<TerminalTrait as Terminal>::TokenType as TypedSyntaxNode>::Green,
27166        trailing_trivia: TriviaGreen,
27167    ) -> Self::Green {
27168        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
27169        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
27170        TerminalTraitGreen(
27171            Arc::new(GreenNode {
27172                kind: SyntaxKind::TerminalTrait,
27173                details: GreenNodeDetails::Node { children, width },
27174            })
27175            .intern(db),
27176        )
27177    }
27178    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
27179        self.token(db).text(db)
27180    }
27181}
27182impl TerminalTrait {
27183    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
27184        Trivia::from_syntax_node(db, self.children[0].clone())
27185    }
27186    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenTrait {
27187        TokenTrait::from_syntax_node(db, self.children[1].clone())
27188    }
27189    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
27190        Trivia::from_syntax_node(db, self.children[2].clone())
27191    }
27192}
27193#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
27194pub struct TerminalTraitPtr(pub SyntaxStablePtrId);
27195impl TerminalTraitPtr {}
27196impl TypedStablePtr for TerminalTraitPtr {
27197    type SyntaxNode = TerminalTrait;
27198    fn untyped(&self) -> SyntaxStablePtrId {
27199        self.0
27200    }
27201    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalTrait {
27202        TerminalTrait::from_syntax_node(db, self.0.lookup(db))
27203    }
27204}
27205impl From<TerminalTraitPtr> for SyntaxStablePtrId {
27206    fn from(ptr: TerminalTraitPtr) -> Self {
27207        ptr.untyped()
27208    }
27209}
27210#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
27211pub struct TerminalTraitGreen(pub GreenId);
27212impl TypedSyntaxNode for TerminalTrait {
27213    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalTrait);
27214    type StablePtr = TerminalTraitPtr;
27215    type Green = TerminalTraitGreen;
27216    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
27217        TerminalTraitGreen(
27218            Arc::new(GreenNode {
27219                kind: SyntaxKind::TerminalTrait,
27220                details: GreenNodeDetails::Node {
27221                    children: vec![
27222                        Trivia::missing(db).0,
27223                        TokenTrait::missing(db).0,
27224                        Trivia::missing(db).0,
27225                    ],
27226                    width: TextWidth::default(),
27227                },
27228            })
27229            .intern(db),
27230        )
27231    }
27232    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
27233        let kind = node.kind(db);
27234        assert_eq!(
27235            kind,
27236            SyntaxKind::TerminalTrait,
27237            "Unexpected SyntaxKind {:?}. Expected {:?}.",
27238            kind,
27239            SyntaxKind::TerminalTrait
27240        );
27241        let children = db.get_children(node.clone());
27242        Self { node, children }
27243    }
27244    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
27245        let kind = node.kind(db);
27246        if kind == SyntaxKind::TerminalTrait {
27247            Some(Self::from_syntax_node(db, node))
27248        } else {
27249            None
27250        }
27251    }
27252    fn as_syntax_node(&self) -> SyntaxNode {
27253        self.node.clone()
27254    }
27255    fn stable_ptr(&self) -> Self::StablePtr {
27256        TerminalTraitPtr(self.node.0.stable_ptr)
27257    }
27258}
27259impl From<&TerminalTrait> for SyntaxStablePtrId {
27260    fn from(node: &TerminalTrait) -> Self {
27261        node.stable_ptr().untyped()
27262    }
27263}
27264#[derive(Clone, Debug, Eq, Hash, PartialEq)]
27265pub struct TokenTrue {
27266    node: SyntaxNode,
27267}
27268impl Token for TokenTrue {
27269    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
27270        TokenTrueGreen(
27271            Arc::new(GreenNode {
27272                kind: SyntaxKind::TokenTrue,
27273                details: GreenNodeDetails::Token(text),
27274            })
27275            .intern(db),
27276        )
27277    }
27278    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
27279        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
27280            .clone()
27281    }
27282}
27283#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
27284pub struct TokenTruePtr(pub SyntaxStablePtrId);
27285impl TypedStablePtr for TokenTruePtr {
27286    type SyntaxNode = TokenTrue;
27287    fn untyped(&self) -> SyntaxStablePtrId {
27288        self.0
27289    }
27290    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenTrue {
27291        TokenTrue::from_syntax_node(db, self.0.lookup(db))
27292    }
27293}
27294impl From<TokenTruePtr> for SyntaxStablePtrId {
27295    fn from(ptr: TokenTruePtr) -> Self {
27296        ptr.untyped()
27297    }
27298}
27299#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
27300pub struct TokenTrueGreen(pub GreenId);
27301impl TokenTrueGreen {
27302    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
27303        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
27304    }
27305}
27306impl TypedSyntaxNode for TokenTrue {
27307    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenTrue);
27308    type StablePtr = TokenTruePtr;
27309    type Green = TokenTrueGreen;
27310    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
27311        TokenTrueGreen(
27312            Arc::new(GreenNode {
27313                kind: SyntaxKind::TokenMissing,
27314                details: GreenNodeDetails::Token("".into()),
27315            })
27316            .intern(db),
27317        )
27318    }
27319    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
27320        match node.0.green.lookup_intern(db).details {
27321            GreenNodeDetails::Token(_) => Self { node },
27322            GreenNodeDetails::Node { .. } => {
27323                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenTrue)
27324            }
27325        }
27326    }
27327    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
27328        match node.0.green.lookup_intern(db).details {
27329            GreenNodeDetails::Token(_) => Some(Self { node }),
27330            GreenNodeDetails::Node { .. } => None,
27331        }
27332    }
27333    fn as_syntax_node(&self) -> SyntaxNode {
27334        self.node.clone()
27335    }
27336    fn stable_ptr(&self) -> Self::StablePtr {
27337        TokenTruePtr(self.node.0.stable_ptr)
27338    }
27339}
27340impl From<&TokenTrue> for SyntaxStablePtrId {
27341    fn from(node: &TokenTrue) -> Self {
27342        node.stable_ptr().untyped()
27343    }
27344}
27345#[derive(Clone, Debug, Eq, Hash, PartialEq)]
27346pub struct TerminalTrue {
27347    node: SyntaxNode,
27348    children: Arc<[SyntaxNode]>,
27349}
27350impl Terminal for TerminalTrue {
27351    const KIND: SyntaxKind = SyntaxKind::TerminalTrue;
27352    type TokenType = TokenTrue;
27353    fn new_green(
27354        db: &dyn SyntaxGroup,
27355        leading_trivia: TriviaGreen,
27356        token: <<TerminalTrue as Terminal>::TokenType as TypedSyntaxNode>::Green,
27357        trailing_trivia: TriviaGreen,
27358    ) -> Self::Green {
27359        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
27360        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
27361        TerminalTrueGreen(
27362            Arc::new(GreenNode {
27363                kind: SyntaxKind::TerminalTrue,
27364                details: GreenNodeDetails::Node { children, width },
27365            })
27366            .intern(db),
27367        )
27368    }
27369    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
27370        self.token(db).text(db)
27371    }
27372}
27373impl TerminalTrue {
27374    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
27375        Trivia::from_syntax_node(db, self.children[0].clone())
27376    }
27377    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenTrue {
27378        TokenTrue::from_syntax_node(db, self.children[1].clone())
27379    }
27380    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
27381        Trivia::from_syntax_node(db, self.children[2].clone())
27382    }
27383}
27384#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
27385pub struct TerminalTruePtr(pub SyntaxStablePtrId);
27386impl TerminalTruePtr {}
27387impl TypedStablePtr for TerminalTruePtr {
27388    type SyntaxNode = TerminalTrue;
27389    fn untyped(&self) -> SyntaxStablePtrId {
27390        self.0
27391    }
27392    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalTrue {
27393        TerminalTrue::from_syntax_node(db, self.0.lookup(db))
27394    }
27395}
27396impl From<TerminalTruePtr> for SyntaxStablePtrId {
27397    fn from(ptr: TerminalTruePtr) -> Self {
27398        ptr.untyped()
27399    }
27400}
27401#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
27402pub struct TerminalTrueGreen(pub GreenId);
27403impl TypedSyntaxNode for TerminalTrue {
27404    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalTrue);
27405    type StablePtr = TerminalTruePtr;
27406    type Green = TerminalTrueGreen;
27407    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
27408        TerminalTrueGreen(
27409            Arc::new(GreenNode {
27410                kind: SyntaxKind::TerminalTrue,
27411                details: GreenNodeDetails::Node {
27412                    children: vec![
27413                        Trivia::missing(db).0,
27414                        TokenTrue::missing(db).0,
27415                        Trivia::missing(db).0,
27416                    ],
27417                    width: TextWidth::default(),
27418                },
27419            })
27420            .intern(db),
27421        )
27422    }
27423    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
27424        let kind = node.kind(db);
27425        assert_eq!(
27426            kind,
27427            SyntaxKind::TerminalTrue,
27428            "Unexpected SyntaxKind {:?}. Expected {:?}.",
27429            kind,
27430            SyntaxKind::TerminalTrue
27431        );
27432        let children = db.get_children(node.clone());
27433        Self { node, children }
27434    }
27435    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
27436        let kind = node.kind(db);
27437        if kind == SyntaxKind::TerminalTrue { Some(Self::from_syntax_node(db, node)) } else { None }
27438    }
27439    fn as_syntax_node(&self) -> SyntaxNode {
27440        self.node.clone()
27441    }
27442    fn stable_ptr(&self) -> Self::StablePtr {
27443        TerminalTruePtr(self.node.0.stable_ptr)
27444    }
27445}
27446impl From<&TerminalTrue> for SyntaxStablePtrId {
27447    fn from(node: &TerminalTrue) -> Self {
27448        node.stable_ptr().untyped()
27449    }
27450}
27451#[derive(Clone, Debug, Eq, Hash, PartialEq)]
27452pub struct TokenType {
27453    node: SyntaxNode,
27454}
27455impl Token for TokenType {
27456    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
27457        TokenTypeGreen(
27458            Arc::new(GreenNode {
27459                kind: SyntaxKind::TokenType,
27460                details: GreenNodeDetails::Token(text),
27461            })
27462            .intern(db),
27463        )
27464    }
27465    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
27466        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
27467            .clone()
27468    }
27469}
27470#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
27471pub struct TokenTypePtr(pub SyntaxStablePtrId);
27472impl TypedStablePtr for TokenTypePtr {
27473    type SyntaxNode = TokenType;
27474    fn untyped(&self) -> SyntaxStablePtrId {
27475        self.0
27476    }
27477    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenType {
27478        TokenType::from_syntax_node(db, self.0.lookup(db))
27479    }
27480}
27481impl From<TokenTypePtr> for SyntaxStablePtrId {
27482    fn from(ptr: TokenTypePtr) -> Self {
27483        ptr.untyped()
27484    }
27485}
27486#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
27487pub struct TokenTypeGreen(pub GreenId);
27488impl TokenTypeGreen {
27489    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
27490        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
27491    }
27492}
27493impl TypedSyntaxNode for TokenType {
27494    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenType);
27495    type StablePtr = TokenTypePtr;
27496    type Green = TokenTypeGreen;
27497    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
27498        TokenTypeGreen(
27499            Arc::new(GreenNode {
27500                kind: SyntaxKind::TokenMissing,
27501                details: GreenNodeDetails::Token("".into()),
27502            })
27503            .intern(db),
27504        )
27505    }
27506    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
27507        match node.0.green.lookup_intern(db).details {
27508            GreenNodeDetails::Token(_) => Self { node },
27509            GreenNodeDetails::Node { .. } => {
27510                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenType)
27511            }
27512        }
27513    }
27514    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
27515        match node.0.green.lookup_intern(db).details {
27516            GreenNodeDetails::Token(_) => Some(Self { node }),
27517            GreenNodeDetails::Node { .. } => None,
27518        }
27519    }
27520    fn as_syntax_node(&self) -> SyntaxNode {
27521        self.node.clone()
27522    }
27523    fn stable_ptr(&self) -> Self::StablePtr {
27524        TokenTypePtr(self.node.0.stable_ptr)
27525    }
27526}
27527impl From<&TokenType> for SyntaxStablePtrId {
27528    fn from(node: &TokenType) -> Self {
27529        node.stable_ptr().untyped()
27530    }
27531}
27532#[derive(Clone, Debug, Eq, Hash, PartialEq)]
27533pub struct TerminalType {
27534    node: SyntaxNode,
27535    children: Arc<[SyntaxNode]>,
27536}
27537impl Terminal for TerminalType {
27538    const KIND: SyntaxKind = SyntaxKind::TerminalType;
27539    type TokenType = TokenType;
27540    fn new_green(
27541        db: &dyn SyntaxGroup,
27542        leading_trivia: TriviaGreen,
27543        token: <<TerminalType as Terminal>::TokenType as TypedSyntaxNode>::Green,
27544        trailing_trivia: TriviaGreen,
27545    ) -> Self::Green {
27546        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
27547        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
27548        TerminalTypeGreen(
27549            Arc::new(GreenNode {
27550                kind: SyntaxKind::TerminalType,
27551                details: GreenNodeDetails::Node { children, width },
27552            })
27553            .intern(db),
27554        )
27555    }
27556    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
27557        self.token(db).text(db)
27558    }
27559}
27560impl TerminalType {
27561    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
27562        Trivia::from_syntax_node(db, self.children[0].clone())
27563    }
27564    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenType {
27565        TokenType::from_syntax_node(db, self.children[1].clone())
27566    }
27567    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
27568        Trivia::from_syntax_node(db, self.children[2].clone())
27569    }
27570}
27571#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
27572pub struct TerminalTypePtr(pub SyntaxStablePtrId);
27573impl TerminalTypePtr {}
27574impl TypedStablePtr for TerminalTypePtr {
27575    type SyntaxNode = TerminalType;
27576    fn untyped(&self) -> SyntaxStablePtrId {
27577        self.0
27578    }
27579    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalType {
27580        TerminalType::from_syntax_node(db, self.0.lookup(db))
27581    }
27582}
27583impl From<TerminalTypePtr> for SyntaxStablePtrId {
27584    fn from(ptr: TerminalTypePtr) -> Self {
27585        ptr.untyped()
27586    }
27587}
27588#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
27589pub struct TerminalTypeGreen(pub GreenId);
27590impl TypedSyntaxNode for TerminalType {
27591    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalType);
27592    type StablePtr = TerminalTypePtr;
27593    type Green = TerminalTypeGreen;
27594    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
27595        TerminalTypeGreen(
27596            Arc::new(GreenNode {
27597                kind: SyntaxKind::TerminalType,
27598                details: GreenNodeDetails::Node {
27599                    children: vec![
27600                        Trivia::missing(db).0,
27601                        TokenType::missing(db).0,
27602                        Trivia::missing(db).0,
27603                    ],
27604                    width: TextWidth::default(),
27605                },
27606            })
27607            .intern(db),
27608        )
27609    }
27610    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
27611        let kind = node.kind(db);
27612        assert_eq!(
27613            kind,
27614            SyntaxKind::TerminalType,
27615            "Unexpected SyntaxKind {:?}. Expected {:?}.",
27616            kind,
27617            SyntaxKind::TerminalType
27618        );
27619        let children = db.get_children(node.clone());
27620        Self { node, children }
27621    }
27622    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
27623        let kind = node.kind(db);
27624        if kind == SyntaxKind::TerminalType { Some(Self::from_syntax_node(db, node)) } else { None }
27625    }
27626    fn as_syntax_node(&self) -> SyntaxNode {
27627        self.node.clone()
27628    }
27629    fn stable_ptr(&self) -> Self::StablePtr {
27630        TerminalTypePtr(self.node.0.stable_ptr)
27631    }
27632}
27633impl From<&TerminalType> for SyntaxStablePtrId {
27634    fn from(node: &TerminalType) -> Self {
27635        node.stable_ptr().untyped()
27636    }
27637}
27638#[derive(Clone, Debug, Eq, Hash, PartialEq)]
27639pub struct TokenUse {
27640    node: SyntaxNode,
27641}
27642impl Token for TokenUse {
27643    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
27644        TokenUseGreen(
27645            Arc::new(GreenNode {
27646                kind: SyntaxKind::TokenUse,
27647                details: GreenNodeDetails::Token(text),
27648            })
27649            .intern(db),
27650        )
27651    }
27652    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
27653        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
27654            .clone()
27655    }
27656}
27657#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
27658pub struct TokenUsePtr(pub SyntaxStablePtrId);
27659impl TypedStablePtr for TokenUsePtr {
27660    type SyntaxNode = TokenUse;
27661    fn untyped(&self) -> SyntaxStablePtrId {
27662        self.0
27663    }
27664    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenUse {
27665        TokenUse::from_syntax_node(db, self.0.lookup(db))
27666    }
27667}
27668impl From<TokenUsePtr> for SyntaxStablePtrId {
27669    fn from(ptr: TokenUsePtr) -> Self {
27670        ptr.untyped()
27671    }
27672}
27673#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
27674pub struct TokenUseGreen(pub GreenId);
27675impl TokenUseGreen {
27676    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
27677        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
27678    }
27679}
27680impl TypedSyntaxNode for TokenUse {
27681    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenUse);
27682    type StablePtr = TokenUsePtr;
27683    type Green = TokenUseGreen;
27684    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
27685        TokenUseGreen(
27686            Arc::new(GreenNode {
27687                kind: SyntaxKind::TokenMissing,
27688                details: GreenNodeDetails::Token("".into()),
27689            })
27690            .intern(db),
27691        )
27692    }
27693    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
27694        match node.0.green.lookup_intern(db).details {
27695            GreenNodeDetails::Token(_) => Self { node },
27696            GreenNodeDetails::Node { .. } => {
27697                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenUse)
27698            }
27699        }
27700    }
27701    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
27702        match node.0.green.lookup_intern(db).details {
27703            GreenNodeDetails::Token(_) => Some(Self { node }),
27704            GreenNodeDetails::Node { .. } => None,
27705        }
27706    }
27707    fn as_syntax_node(&self) -> SyntaxNode {
27708        self.node.clone()
27709    }
27710    fn stable_ptr(&self) -> Self::StablePtr {
27711        TokenUsePtr(self.node.0.stable_ptr)
27712    }
27713}
27714impl From<&TokenUse> for SyntaxStablePtrId {
27715    fn from(node: &TokenUse) -> Self {
27716        node.stable_ptr().untyped()
27717    }
27718}
27719#[derive(Clone, Debug, Eq, Hash, PartialEq)]
27720pub struct TerminalUse {
27721    node: SyntaxNode,
27722    children: Arc<[SyntaxNode]>,
27723}
27724impl Terminal for TerminalUse {
27725    const KIND: SyntaxKind = SyntaxKind::TerminalUse;
27726    type TokenType = TokenUse;
27727    fn new_green(
27728        db: &dyn SyntaxGroup,
27729        leading_trivia: TriviaGreen,
27730        token: <<TerminalUse as Terminal>::TokenType as TypedSyntaxNode>::Green,
27731        trailing_trivia: TriviaGreen,
27732    ) -> Self::Green {
27733        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
27734        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
27735        TerminalUseGreen(
27736            Arc::new(GreenNode {
27737                kind: SyntaxKind::TerminalUse,
27738                details: GreenNodeDetails::Node { children, width },
27739            })
27740            .intern(db),
27741        )
27742    }
27743    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
27744        self.token(db).text(db)
27745    }
27746}
27747impl TerminalUse {
27748    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
27749        Trivia::from_syntax_node(db, self.children[0].clone())
27750    }
27751    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenUse {
27752        TokenUse::from_syntax_node(db, self.children[1].clone())
27753    }
27754    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
27755        Trivia::from_syntax_node(db, self.children[2].clone())
27756    }
27757}
27758#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
27759pub struct TerminalUsePtr(pub SyntaxStablePtrId);
27760impl TerminalUsePtr {}
27761impl TypedStablePtr for TerminalUsePtr {
27762    type SyntaxNode = TerminalUse;
27763    fn untyped(&self) -> SyntaxStablePtrId {
27764        self.0
27765    }
27766    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalUse {
27767        TerminalUse::from_syntax_node(db, self.0.lookup(db))
27768    }
27769}
27770impl From<TerminalUsePtr> for SyntaxStablePtrId {
27771    fn from(ptr: TerminalUsePtr) -> Self {
27772        ptr.untyped()
27773    }
27774}
27775#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
27776pub struct TerminalUseGreen(pub GreenId);
27777impl TypedSyntaxNode for TerminalUse {
27778    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalUse);
27779    type StablePtr = TerminalUsePtr;
27780    type Green = TerminalUseGreen;
27781    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
27782        TerminalUseGreen(
27783            Arc::new(GreenNode {
27784                kind: SyntaxKind::TerminalUse,
27785                details: GreenNodeDetails::Node {
27786                    children: vec![
27787                        Trivia::missing(db).0,
27788                        TokenUse::missing(db).0,
27789                        Trivia::missing(db).0,
27790                    ],
27791                    width: TextWidth::default(),
27792                },
27793            })
27794            .intern(db),
27795        )
27796    }
27797    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
27798        let kind = node.kind(db);
27799        assert_eq!(
27800            kind,
27801            SyntaxKind::TerminalUse,
27802            "Unexpected SyntaxKind {:?}. Expected {:?}.",
27803            kind,
27804            SyntaxKind::TerminalUse
27805        );
27806        let children = db.get_children(node.clone());
27807        Self { node, children }
27808    }
27809    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
27810        let kind = node.kind(db);
27811        if kind == SyntaxKind::TerminalUse { Some(Self::from_syntax_node(db, node)) } else { None }
27812    }
27813    fn as_syntax_node(&self) -> SyntaxNode {
27814        self.node.clone()
27815    }
27816    fn stable_ptr(&self) -> Self::StablePtr {
27817        TerminalUsePtr(self.node.0.stable_ptr)
27818    }
27819}
27820impl From<&TerminalUse> for SyntaxStablePtrId {
27821    fn from(node: &TerminalUse) -> Self {
27822        node.stable_ptr().untyped()
27823    }
27824}
27825#[derive(Clone, Debug, Eq, Hash, PartialEq)]
27826pub struct TokenPub {
27827    node: SyntaxNode,
27828}
27829impl Token for TokenPub {
27830    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
27831        TokenPubGreen(
27832            Arc::new(GreenNode {
27833                kind: SyntaxKind::TokenPub,
27834                details: GreenNodeDetails::Token(text),
27835            })
27836            .intern(db),
27837        )
27838    }
27839    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
27840        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
27841            .clone()
27842    }
27843}
27844#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
27845pub struct TokenPubPtr(pub SyntaxStablePtrId);
27846impl TypedStablePtr for TokenPubPtr {
27847    type SyntaxNode = TokenPub;
27848    fn untyped(&self) -> SyntaxStablePtrId {
27849        self.0
27850    }
27851    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenPub {
27852        TokenPub::from_syntax_node(db, self.0.lookup(db))
27853    }
27854}
27855impl From<TokenPubPtr> for SyntaxStablePtrId {
27856    fn from(ptr: TokenPubPtr) -> Self {
27857        ptr.untyped()
27858    }
27859}
27860#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
27861pub struct TokenPubGreen(pub GreenId);
27862impl TokenPubGreen {
27863    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
27864        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
27865    }
27866}
27867impl TypedSyntaxNode for TokenPub {
27868    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenPub);
27869    type StablePtr = TokenPubPtr;
27870    type Green = TokenPubGreen;
27871    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
27872        TokenPubGreen(
27873            Arc::new(GreenNode {
27874                kind: SyntaxKind::TokenMissing,
27875                details: GreenNodeDetails::Token("".into()),
27876            })
27877            .intern(db),
27878        )
27879    }
27880    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
27881        match node.0.green.lookup_intern(db).details {
27882            GreenNodeDetails::Token(_) => Self { node },
27883            GreenNodeDetails::Node { .. } => {
27884                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenPub)
27885            }
27886        }
27887    }
27888    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
27889        match node.0.green.lookup_intern(db).details {
27890            GreenNodeDetails::Token(_) => Some(Self { node }),
27891            GreenNodeDetails::Node { .. } => None,
27892        }
27893    }
27894    fn as_syntax_node(&self) -> SyntaxNode {
27895        self.node.clone()
27896    }
27897    fn stable_ptr(&self) -> Self::StablePtr {
27898        TokenPubPtr(self.node.0.stable_ptr)
27899    }
27900}
27901impl From<&TokenPub> for SyntaxStablePtrId {
27902    fn from(node: &TokenPub) -> Self {
27903        node.stable_ptr().untyped()
27904    }
27905}
27906#[derive(Clone, Debug, Eq, Hash, PartialEq)]
27907pub struct TerminalPub {
27908    node: SyntaxNode,
27909    children: Arc<[SyntaxNode]>,
27910}
27911impl Terminal for TerminalPub {
27912    const KIND: SyntaxKind = SyntaxKind::TerminalPub;
27913    type TokenType = TokenPub;
27914    fn new_green(
27915        db: &dyn SyntaxGroup,
27916        leading_trivia: TriviaGreen,
27917        token: <<TerminalPub as Terminal>::TokenType as TypedSyntaxNode>::Green,
27918        trailing_trivia: TriviaGreen,
27919    ) -> Self::Green {
27920        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
27921        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
27922        TerminalPubGreen(
27923            Arc::new(GreenNode {
27924                kind: SyntaxKind::TerminalPub,
27925                details: GreenNodeDetails::Node { children, width },
27926            })
27927            .intern(db),
27928        )
27929    }
27930    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
27931        self.token(db).text(db)
27932    }
27933}
27934impl TerminalPub {
27935    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
27936        Trivia::from_syntax_node(db, self.children[0].clone())
27937    }
27938    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenPub {
27939        TokenPub::from_syntax_node(db, self.children[1].clone())
27940    }
27941    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
27942        Trivia::from_syntax_node(db, self.children[2].clone())
27943    }
27944}
27945#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
27946pub struct TerminalPubPtr(pub SyntaxStablePtrId);
27947impl TerminalPubPtr {}
27948impl TypedStablePtr for TerminalPubPtr {
27949    type SyntaxNode = TerminalPub;
27950    fn untyped(&self) -> SyntaxStablePtrId {
27951        self.0
27952    }
27953    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalPub {
27954        TerminalPub::from_syntax_node(db, self.0.lookup(db))
27955    }
27956}
27957impl From<TerminalPubPtr> for SyntaxStablePtrId {
27958    fn from(ptr: TerminalPubPtr) -> Self {
27959        ptr.untyped()
27960    }
27961}
27962#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
27963pub struct TerminalPubGreen(pub GreenId);
27964impl TypedSyntaxNode for TerminalPub {
27965    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalPub);
27966    type StablePtr = TerminalPubPtr;
27967    type Green = TerminalPubGreen;
27968    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
27969        TerminalPubGreen(
27970            Arc::new(GreenNode {
27971                kind: SyntaxKind::TerminalPub,
27972                details: GreenNodeDetails::Node {
27973                    children: vec![
27974                        Trivia::missing(db).0,
27975                        TokenPub::missing(db).0,
27976                        Trivia::missing(db).0,
27977                    ],
27978                    width: TextWidth::default(),
27979                },
27980            })
27981            .intern(db),
27982        )
27983    }
27984    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
27985        let kind = node.kind(db);
27986        assert_eq!(
27987            kind,
27988            SyntaxKind::TerminalPub,
27989            "Unexpected SyntaxKind {:?}. Expected {:?}.",
27990            kind,
27991            SyntaxKind::TerminalPub
27992        );
27993        let children = db.get_children(node.clone());
27994        Self { node, children }
27995    }
27996    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
27997        let kind = node.kind(db);
27998        if kind == SyntaxKind::TerminalPub { Some(Self::from_syntax_node(db, node)) } else { None }
27999    }
28000    fn as_syntax_node(&self) -> SyntaxNode {
28001        self.node.clone()
28002    }
28003    fn stable_ptr(&self) -> Self::StablePtr {
28004        TerminalPubPtr(self.node.0.stable_ptr)
28005    }
28006}
28007impl From<&TerminalPub> for SyntaxStablePtrId {
28008    fn from(node: &TerminalPub) -> Self {
28009        node.stable_ptr().untyped()
28010    }
28011}
28012#[derive(Clone, Debug, Eq, Hash, PartialEq)]
28013pub struct TokenAnd {
28014    node: SyntaxNode,
28015}
28016impl Token for TokenAnd {
28017    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
28018        TokenAndGreen(
28019            Arc::new(GreenNode {
28020                kind: SyntaxKind::TokenAnd,
28021                details: GreenNodeDetails::Token(text),
28022            })
28023            .intern(db),
28024        )
28025    }
28026    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
28027        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
28028            .clone()
28029    }
28030}
28031#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
28032pub struct TokenAndPtr(pub SyntaxStablePtrId);
28033impl TypedStablePtr for TokenAndPtr {
28034    type SyntaxNode = TokenAnd;
28035    fn untyped(&self) -> SyntaxStablePtrId {
28036        self.0
28037    }
28038    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenAnd {
28039        TokenAnd::from_syntax_node(db, self.0.lookup(db))
28040    }
28041}
28042impl From<TokenAndPtr> for SyntaxStablePtrId {
28043    fn from(ptr: TokenAndPtr) -> Self {
28044        ptr.untyped()
28045    }
28046}
28047#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
28048pub struct TokenAndGreen(pub GreenId);
28049impl TokenAndGreen {
28050    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
28051        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
28052    }
28053}
28054impl TypedSyntaxNode for TokenAnd {
28055    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenAnd);
28056    type StablePtr = TokenAndPtr;
28057    type Green = TokenAndGreen;
28058    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
28059        TokenAndGreen(
28060            Arc::new(GreenNode {
28061                kind: SyntaxKind::TokenMissing,
28062                details: GreenNodeDetails::Token("".into()),
28063            })
28064            .intern(db),
28065        )
28066    }
28067    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
28068        match node.0.green.lookup_intern(db).details {
28069            GreenNodeDetails::Token(_) => Self { node },
28070            GreenNodeDetails::Node { .. } => {
28071                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenAnd)
28072            }
28073        }
28074    }
28075    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
28076        match node.0.green.lookup_intern(db).details {
28077            GreenNodeDetails::Token(_) => Some(Self { node }),
28078            GreenNodeDetails::Node { .. } => None,
28079        }
28080    }
28081    fn as_syntax_node(&self) -> SyntaxNode {
28082        self.node.clone()
28083    }
28084    fn stable_ptr(&self) -> Self::StablePtr {
28085        TokenAndPtr(self.node.0.stable_ptr)
28086    }
28087}
28088impl From<&TokenAnd> for SyntaxStablePtrId {
28089    fn from(node: &TokenAnd) -> Self {
28090        node.stable_ptr().untyped()
28091    }
28092}
28093#[derive(Clone, Debug, Eq, Hash, PartialEq)]
28094pub struct TerminalAnd {
28095    node: SyntaxNode,
28096    children: Arc<[SyntaxNode]>,
28097}
28098impl Terminal for TerminalAnd {
28099    const KIND: SyntaxKind = SyntaxKind::TerminalAnd;
28100    type TokenType = TokenAnd;
28101    fn new_green(
28102        db: &dyn SyntaxGroup,
28103        leading_trivia: TriviaGreen,
28104        token: <<TerminalAnd as Terminal>::TokenType as TypedSyntaxNode>::Green,
28105        trailing_trivia: TriviaGreen,
28106    ) -> Self::Green {
28107        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
28108        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
28109        TerminalAndGreen(
28110            Arc::new(GreenNode {
28111                kind: SyntaxKind::TerminalAnd,
28112                details: GreenNodeDetails::Node { children, width },
28113            })
28114            .intern(db),
28115        )
28116    }
28117    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
28118        self.token(db).text(db)
28119    }
28120}
28121impl TerminalAnd {
28122    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
28123        Trivia::from_syntax_node(db, self.children[0].clone())
28124    }
28125    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenAnd {
28126        TokenAnd::from_syntax_node(db, self.children[1].clone())
28127    }
28128    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
28129        Trivia::from_syntax_node(db, self.children[2].clone())
28130    }
28131}
28132#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
28133pub struct TerminalAndPtr(pub SyntaxStablePtrId);
28134impl TerminalAndPtr {}
28135impl TypedStablePtr for TerminalAndPtr {
28136    type SyntaxNode = TerminalAnd;
28137    fn untyped(&self) -> SyntaxStablePtrId {
28138        self.0
28139    }
28140    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalAnd {
28141        TerminalAnd::from_syntax_node(db, self.0.lookup(db))
28142    }
28143}
28144impl From<TerminalAndPtr> for SyntaxStablePtrId {
28145    fn from(ptr: TerminalAndPtr) -> Self {
28146        ptr.untyped()
28147    }
28148}
28149#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
28150pub struct TerminalAndGreen(pub GreenId);
28151impl TypedSyntaxNode for TerminalAnd {
28152    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalAnd);
28153    type StablePtr = TerminalAndPtr;
28154    type Green = TerminalAndGreen;
28155    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
28156        TerminalAndGreen(
28157            Arc::new(GreenNode {
28158                kind: SyntaxKind::TerminalAnd,
28159                details: GreenNodeDetails::Node {
28160                    children: vec![
28161                        Trivia::missing(db).0,
28162                        TokenAnd::missing(db).0,
28163                        Trivia::missing(db).0,
28164                    ],
28165                    width: TextWidth::default(),
28166                },
28167            })
28168            .intern(db),
28169        )
28170    }
28171    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
28172        let kind = node.kind(db);
28173        assert_eq!(
28174            kind,
28175            SyntaxKind::TerminalAnd,
28176            "Unexpected SyntaxKind {:?}. Expected {:?}.",
28177            kind,
28178            SyntaxKind::TerminalAnd
28179        );
28180        let children = db.get_children(node.clone());
28181        Self { node, children }
28182    }
28183    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
28184        let kind = node.kind(db);
28185        if kind == SyntaxKind::TerminalAnd { Some(Self::from_syntax_node(db, node)) } else { None }
28186    }
28187    fn as_syntax_node(&self) -> SyntaxNode {
28188        self.node.clone()
28189    }
28190    fn stable_ptr(&self) -> Self::StablePtr {
28191        TerminalAndPtr(self.node.0.stable_ptr)
28192    }
28193}
28194impl From<&TerminalAnd> for SyntaxStablePtrId {
28195    fn from(node: &TerminalAnd) -> Self {
28196        node.stable_ptr().untyped()
28197    }
28198}
28199#[derive(Clone, Debug, Eq, Hash, PartialEq)]
28200pub struct TokenAndAnd {
28201    node: SyntaxNode,
28202}
28203impl Token for TokenAndAnd {
28204    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
28205        TokenAndAndGreen(
28206            Arc::new(GreenNode {
28207                kind: SyntaxKind::TokenAndAnd,
28208                details: GreenNodeDetails::Token(text),
28209            })
28210            .intern(db),
28211        )
28212    }
28213    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
28214        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
28215            .clone()
28216    }
28217}
28218#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
28219pub struct TokenAndAndPtr(pub SyntaxStablePtrId);
28220impl TypedStablePtr for TokenAndAndPtr {
28221    type SyntaxNode = TokenAndAnd;
28222    fn untyped(&self) -> SyntaxStablePtrId {
28223        self.0
28224    }
28225    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenAndAnd {
28226        TokenAndAnd::from_syntax_node(db, self.0.lookup(db))
28227    }
28228}
28229impl From<TokenAndAndPtr> for SyntaxStablePtrId {
28230    fn from(ptr: TokenAndAndPtr) -> Self {
28231        ptr.untyped()
28232    }
28233}
28234#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
28235pub struct TokenAndAndGreen(pub GreenId);
28236impl TokenAndAndGreen {
28237    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
28238        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
28239    }
28240}
28241impl TypedSyntaxNode for TokenAndAnd {
28242    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenAndAnd);
28243    type StablePtr = TokenAndAndPtr;
28244    type Green = TokenAndAndGreen;
28245    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
28246        TokenAndAndGreen(
28247            Arc::new(GreenNode {
28248                kind: SyntaxKind::TokenMissing,
28249                details: GreenNodeDetails::Token("".into()),
28250            })
28251            .intern(db),
28252        )
28253    }
28254    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
28255        match node.0.green.lookup_intern(db).details {
28256            GreenNodeDetails::Token(_) => Self { node },
28257            GreenNodeDetails::Node { .. } => {
28258                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenAndAnd)
28259            }
28260        }
28261    }
28262    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
28263        match node.0.green.lookup_intern(db).details {
28264            GreenNodeDetails::Token(_) => Some(Self { node }),
28265            GreenNodeDetails::Node { .. } => None,
28266        }
28267    }
28268    fn as_syntax_node(&self) -> SyntaxNode {
28269        self.node.clone()
28270    }
28271    fn stable_ptr(&self) -> Self::StablePtr {
28272        TokenAndAndPtr(self.node.0.stable_ptr)
28273    }
28274}
28275impl From<&TokenAndAnd> for SyntaxStablePtrId {
28276    fn from(node: &TokenAndAnd) -> Self {
28277        node.stable_ptr().untyped()
28278    }
28279}
28280#[derive(Clone, Debug, Eq, Hash, PartialEq)]
28281pub struct TerminalAndAnd {
28282    node: SyntaxNode,
28283    children: Arc<[SyntaxNode]>,
28284}
28285impl Terminal for TerminalAndAnd {
28286    const KIND: SyntaxKind = SyntaxKind::TerminalAndAnd;
28287    type TokenType = TokenAndAnd;
28288    fn new_green(
28289        db: &dyn SyntaxGroup,
28290        leading_trivia: TriviaGreen,
28291        token: <<TerminalAndAnd as Terminal>::TokenType as TypedSyntaxNode>::Green,
28292        trailing_trivia: TriviaGreen,
28293    ) -> Self::Green {
28294        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
28295        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
28296        TerminalAndAndGreen(
28297            Arc::new(GreenNode {
28298                kind: SyntaxKind::TerminalAndAnd,
28299                details: GreenNodeDetails::Node { children, width },
28300            })
28301            .intern(db),
28302        )
28303    }
28304    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
28305        self.token(db).text(db)
28306    }
28307}
28308impl TerminalAndAnd {
28309    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
28310        Trivia::from_syntax_node(db, self.children[0].clone())
28311    }
28312    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenAndAnd {
28313        TokenAndAnd::from_syntax_node(db, self.children[1].clone())
28314    }
28315    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
28316        Trivia::from_syntax_node(db, self.children[2].clone())
28317    }
28318}
28319#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
28320pub struct TerminalAndAndPtr(pub SyntaxStablePtrId);
28321impl TerminalAndAndPtr {}
28322impl TypedStablePtr for TerminalAndAndPtr {
28323    type SyntaxNode = TerminalAndAnd;
28324    fn untyped(&self) -> SyntaxStablePtrId {
28325        self.0
28326    }
28327    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalAndAnd {
28328        TerminalAndAnd::from_syntax_node(db, self.0.lookup(db))
28329    }
28330}
28331impl From<TerminalAndAndPtr> for SyntaxStablePtrId {
28332    fn from(ptr: TerminalAndAndPtr) -> Self {
28333        ptr.untyped()
28334    }
28335}
28336#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
28337pub struct TerminalAndAndGreen(pub GreenId);
28338impl TypedSyntaxNode for TerminalAndAnd {
28339    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalAndAnd);
28340    type StablePtr = TerminalAndAndPtr;
28341    type Green = TerminalAndAndGreen;
28342    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
28343        TerminalAndAndGreen(
28344            Arc::new(GreenNode {
28345                kind: SyntaxKind::TerminalAndAnd,
28346                details: GreenNodeDetails::Node {
28347                    children: vec![
28348                        Trivia::missing(db).0,
28349                        TokenAndAnd::missing(db).0,
28350                        Trivia::missing(db).0,
28351                    ],
28352                    width: TextWidth::default(),
28353                },
28354            })
28355            .intern(db),
28356        )
28357    }
28358    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
28359        let kind = node.kind(db);
28360        assert_eq!(
28361            kind,
28362            SyntaxKind::TerminalAndAnd,
28363            "Unexpected SyntaxKind {:?}. Expected {:?}.",
28364            kind,
28365            SyntaxKind::TerminalAndAnd
28366        );
28367        let children = db.get_children(node.clone());
28368        Self { node, children }
28369    }
28370    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
28371        let kind = node.kind(db);
28372        if kind == SyntaxKind::TerminalAndAnd {
28373            Some(Self::from_syntax_node(db, node))
28374        } else {
28375            None
28376        }
28377    }
28378    fn as_syntax_node(&self) -> SyntaxNode {
28379        self.node.clone()
28380    }
28381    fn stable_ptr(&self) -> Self::StablePtr {
28382        TerminalAndAndPtr(self.node.0.stable_ptr)
28383    }
28384}
28385impl From<&TerminalAndAnd> for SyntaxStablePtrId {
28386    fn from(node: &TerminalAndAnd) -> Self {
28387        node.stable_ptr().untyped()
28388    }
28389}
28390#[derive(Clone, Debug, Eq, Hash, PartialEq)]
28391pub struct TokenArrow {
28392    node: SyntaxNode,
28393}
28394impl Token for TokenArrow {
28395    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
28396        TokenArrowGreen(
28397            Arc::new(GreenNode {
28398                kind: SyntaxKind::TokenArrow,
28399                details: GreenNodeDetails::Token(text),
28400            })
28401            .intern(db),
28402        )
28403    }
28404    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
28405        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
28406            .clone()
28407    }
28408}
28409#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
28410pub struct TokenArrowPtr(pub SyntaxStablePtrId);
28411impl TypedStablePtr for TokenArrowPtr {
28412    type SyntaxNode = TokenArrow;
28413    fn untyped(&self) -> SyntaxStablePtrId {
28414        self.0
28415    }
28416    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenArrow {
28417        TokenArrow::from_syntax_node(db, self.0.lookup(db))
28418    }
28419}
28420impl From<TokenArrowPtr> for SyntaxStablePtrId {
28421    fn from(ptr: TokenArrowPtr) -> Self {
28422        ptr.untyped()
28423    }
28424}
28425#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
28426pub struct TokenArrowGreen(pub GreenId);
28427impl TokenArrowGreen {
28428    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
28429        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
28430    }
28431}
28432impl TypedSyntaxNode for TokenArrow {
28433    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenArrow);
28434    type StablePtr = TokenArrowPtr;
28435    type Green = TokenArrowGreen;
28436    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
28437        TokenArrowGreen(
28438            Arc::new(GreenNode {
28439                kind: SyntaxKind::TokenMissing,
28440                details: GreenNodeDetails::Token("".into()),
28441            })
28442            .intern(db),
28443        )
28444    }
28445    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
28446        match node.0.green.lookup_intern(db).details {
28447            GreenNodeDetails::Token(_) => Self { node },
28448            GreenNodeDetails::Node { .. } => {
28449                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenArrow)
28450            }
28451        }
28452    }
28453    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
28454        match node.0.green.lookup_intern(db).details {
28455            GreenNodeDetails::Token(_) => Some(Self { node }),
28456            GreenNodeDetails::Node { .. } => None,
28457        }
28458    }
28459    fn as_syntax_node(&self) -> SyntaxNode {
28460        self.node.clone()
28461    }
28462    fn stable_ptr(&self) -> Self::StablePtr {
28463        TokenArrowPtr(self.node.0.stable_ptr)
28464    }
28465}
28466impl From<&TokenArrow> for SyntaxStablePtrId {
28467    fn from(node: &TokenArrow) -> Self {
28468        node.stable_ptr().untyped()
28469    }
28470}
28471#[derive(Clone, Debug, Eq, Hash, PartialEq)]
28472pub struct TerminalArrow {
28473    node: SyntaxNode,
28474    children: Arc<[SyntaxNode]>,
28475}
28476impl Terminal for TerminalArrow {
28477    const KIND: SyntaxKind = SyntaxKind::TerminalArrow;
28478    type TokenType = TokenArrow;
28479    fn new_green(
28480        db: &dyn SyntaxGroup,
28481        leading_trivia: TriviaGreen,
28482        token: <<TerminalArrow as Terminal>::TokenType as TypedSyntaxNode>::Green,
28483        trailing_trivia: TriviaGreen,
28484    ) -> Self::Green {
28485        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
28486        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
28487        TerminalArrowGreen(
28488            Arc::new(GreenNode {
28489                kind: SyntaxKind::TerminalArrow,
28490                details: GreenNodeDetails::Node { children, width },
28491            })
28492            .intern(db),
28493        )
28494    }
28495    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
28496        self.token(db).text(db)
28497    }
28498}
28499impl TerminalArrow {
28500    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
28501        Trivia::from_syntax_node(db, self.children[0].clone())
28502    }
28503    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenArrow {
28504        TokenArrow::from_syntax_node(db, self.children[1].clone())
28505    }
28506    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
28507        Trivia::from_syntax_node(db, self.children[2].clone())
28508    }
28509}
28510#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
28511pub struct TerminalArrowPtr(pub SyntaxStablePtrId);
28512impl TerminalArrowPtr {}
28513impl TypedStablePtr for TerminalArrowPtr {
28514    type SyntaxNode = TerminalArrow;
28515    fn untyped(&self) -> SyntaxStablePtrId {
28516        self.0
28517    }
28518    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalArrow {
28519        TerminalArrow::from_syntax_node(db, self.0.lookup(db))
28520    }
28521}
28522impl From<TerminalArrowPtr> for SyntaxStablePtrId {
28523    fn from(ptr: TerminalArrowPtr) -> Self {
28524        ptr.untyped()
28525    }
28526}
28527#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
28528pub struct TerminalArrowGreen(pub GreenId);
28529impl TypedSyntaxNode for TerminalArrow {
28530    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalArrow);
28531    type StablePtr = TerminalArrowPtr;
28532    type Green = TerminalArrowGreen;
28533    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
28534        TerminalArrowGreen(
28535            Arc::new(GreenNode {
28536                kind: SyntaxKind::TerminalArrow,
28537                details: GreenNodeDetails::Node {
28538                    children: vec![
28539                        Trivia::missing(db).0,
28540                        TokenArrow::missing(db).0,
28541                        Trivia::missing(db).0,
28542                    ],
28543                    width: TextWidth::default(),
28544                },
28545            })
28546            .intern(db),
28547        )
28548    }
28549    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
28550        let kind = node.kind(db);
28551        assert_eq!(
28552            kind,
28553            SyntaxKind::TerminalArrow,
28554            "Unexpected SyntaxKind {:?}. Expected {:?}.",
28555            kind,
28556            SyntaxKind::TerminalArrow
28557        );
28558        let children = db.get_children(node.clone());
28559        Self { node, children }
28560    }
28561    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
28562        let kind = node.kind(db);
28563        if kind == SyntaxKind::TerminalArrow {
28564            Some(Self::from_syntax_node(db, node))
28565        } else {
28566            None
28567        }
28568    }
28569    fn as_syntax_node(&self) -> SyntaxNode {
28570        self.node.clone()
28571    }
28572    fn stable_ptr(&self) -> Self::StablePtr {
28573        TerminalArrowPtr(self.node.0.stable_ptr)
28574    }
28575}
28576impl From<&TerminalArrow> for SyntaxStablePtrId {
28577    fn from(node: &TerminalArrow) -> Self {
28578        node.stable_ptr().untyped()
28579    }
28580}
28581#[derive(Clone, Debug, Eq, Hash, PartialEq)]
28582pub struct TokenAt {
28583    node: SyntaxNode,
28584}
28585impl Token for TokenAt {
28586    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
28587        TokenAtGreen(
28588            Arc::new(GreenNode {
28589                kind: SyntaxKind::TokenAt,
28590                details: GreenNodeDetails::Token(text),
28591            })
28592            .intern(db),
28593        )
28594    }
28595    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
28596        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
28597            .clone()
28598    }
28599}
28600#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
28601pub struct TokenAtPtr(pub SyntaxStablePtrId);
28602impl TypedStablePtr for TokenAtPtr {
28603    type SyntaxNode = TokenAt;
28604    fn untyped(&self) -> SyntaxStablePtrId {
28605        self.0
28606    }
28607    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenAt {
28608        TokenAt::from_syntax_node(db, self.0.lookup(db))
28609    }
28610}
28611impl From<TokenAtPtr> for SyntaxStablePtrId {
28612    fn from(ptr: TokenAtPtr) -> Self {
28613        ptr.untyped()
28614    }
28615}
28616#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
28617pub struct TokenAtGreen(pub GreenId);
28618impl TokenAtGreen {
28619    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
28620        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
28621    }
28622}
28623impl TypedSyntaxNode for TokenAt {
28624    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenAt);
28625    type StablePtr = TokenAtPtr;
28626    type Green = TokenAtGreen;
28627    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
28628        TokenAtGreen(
28629            Arc::new(GreenNode {
28630                kind: SyntaxKind::TokenMissing,
28631                details: GreenNodeDetails::Token("".into()),
28632            })
28633            .intern(db),
28634        )
28635    }
28636    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
28637        match node.0.green.lookup_intern(db).details {
28638            GreenNodeDetails::Token(_) => Self { node },
28639            GreenNodeDetails::Node { .. } => {
28640                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenAt)
28641            }
28642        }
28643    }
28644    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
28645        match node.0.green.lookup_intern(db).details {
28646            GreenNodeDetails::Token(_) => Some(Self { node }),
28647            GreenNodeDetails::Node { .. } => None,
28648        }
28649    }
28650    fn as_syntax_node(&self) -> SyntaxNode {
28651        self.node.clone()
28652    }
28653    fn stable_ptr(&self) -> Self::StablePtr {
28654        TokenAtPtr(self.node.0.stable_ptr)
28655    }
28656}
28657impl From<&TokenAt> for SyntaxStablePtrId {
28658    fn from(node: &TokenAt) -> Self {
28659        node.stable_ptr().untyped()
28660    }
28661}
28662#[derive(Clone, Debug, Eq, Hash, PartialEq)]
28663pub struct TerminalAt {
28664    node: SyntaxNode,
28665    children: Arc<[SyntaxNode]>,
28666}
28667impl Terminal for TerminalAt {
28668    const KIND: SyntaxKind = SyntaxKind::TerminalAt;
28669    type TokenType = TokenAt;
28670    fn new_green(
28671        db: &dyn SyntaxGroup,
28672        leading_trivia: TriviaGreen,
28673        token: <<TerminalAt as Terminal>::TokenType as TypedSyntaxNode>::Green,
28674        trailing_trivia: TriviaGreen,
28675    ) -> Self::Green {
28676        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
28677        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
28678        TerminalAtGreen(
28679            Arc::new(GreenNode {
28680                kind: SyntaxKind::TerminalAt,
28681                details: GreenNodeDetails::Node { children, width },
28682            })
28683            .intern(db),
28684        )
28685    }
28686    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
28687        self.token(db).text(db)
28688    }
28689}
28690impl TerminalAt {
28691    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
28692        Trivia::from_syntax_node(db, self.children[0].clone())
28693    }
28694    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenAt {
28695        TokenAt::from_syntax_node(db, self.children[1].clone())
28696    }
28697    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
28698        Trivia::from_syntax_node(db, self.children[2].clone())
28699    }
28700}
28701#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
28702pub struct TerminalAtPtr(pub SyntaxStablePtrId);
28703impl TerminalAtPtr {}
28704impl TypedStablePtr for TerminalAtPtr {
28705    type SyntaxNode = TerminalAt;
28706    fn untyped(&self) -> SyntaxStablePtrId {
28707        self.0
28708    }
28709    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalAt {
28710        TerminalAt::from_syntax_node(db, self.0.lookup(db))
28711    }
28712}
28713impl From<TerminalAtPtr> for SyntaxStablePtrId {
28714    fn from(ptr: TerminalAtPtr) -> Self {
28715        ptr.untyped()
28716    }
28717}
28718#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
28719pub struct TerminalAtGreen(pub GreenId);
28720impl TypedSyntaxNode for TerminalAt {
28721    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalAt);
28722    type StablePtr = TerminalAtPtr;
28723    type Green = TerminalAtGreen;
28724    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
28725        TerminalAtGreen(
28726            Arc::new(GreenNode {
28727                kind: SyntaxKind::TerminalAt,
28728                details: GreenNodeDetails::Node {
28729                    children: vec![
28730                        Trivia::missing(db).0,
28731                        TokenAt::missing(db).0,
28732                        Trivia::missing(db).0,
28733                    ],
28734                    width: TextWidth::default(),
28735                },
28736            })
28737            .intern(db),
28738        )
28739    }
28740    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
28741        let kind = node.kind(db);
28742        assert_eq!(
28743            kind,
28744            SyntaxKind::TerminalAt,
28745            "Unexpected SyntaxKind {:?}. Expected {:?}.",
28746            kind,
28747            SyntaxKind::TerminalAt
28748        );
28749        let children = db.get_children(node.clone());
28750        Self { node, children }
28751    }
28752    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
28753        let kind = node.kind(db);
28754        if kind == SyntaxKind::TerminalAt { Some(Self::from_syntax_node(db, node)) } else { None }
28755    }
28756    fn as_syntax_node(&self) -> SyntaxNode {
28757        self.node.clone()
28758    }
28759    fn stable_ptr(&self) -> Self::StablePtr {
28760        TerminalAtPtr(self.node.0.stable_ptr)
28761    }
28762}
28763impl From<&TerminalAt> for SyntaxStablePtrId {
28764    fn from(node: &TerminalAt) -> Self {
28765        node.stable_ptr().untyped()
28766    }
28767}
28768#[derive(Clone, Debug, Eq, Hash, PartialEq)]
28769pub struct TokenBadCharacters {
28770    node: SyntaxNode,
28771}
28772impl Token for TokenBadCharacters {
28773    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
28774        TokenBadCharactersGreen(
28775            Arc::new(GreenNode {
28776                kind: SyntaxKind::TokenBadCharacters,
28777                details: GreenNodeDetails::Token(text),
28778            })
28779            .intern(db),
28780        )
28781    }
28782    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
28783        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
28784            .clone()
28785    }
28786}
28787#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
28788pub struct TokenBadCharactersPtr(pub SyntaxStablePtrId);
28789impl TypedStablePtr for TokenBadCharactersPtr {
28790    type SyntaxNode = TokenBadCharacters;
28791    fn untyped(&self) -> SyntaxStablePtrId {
28792        self.0
28793    }
28794    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenBadCharacters {
28795        TokenBadCharacters::from_syntax_node(db, self.0.lookup(db))
28796    }
28797}
28798impl From<TokenBadCharactersPtr> for SyntaxStablePtrId {
28799    fn from(ptr: TokenBadCharactersPtr) -> Self {
28800        ptr.untyped()
28801    }
28802}
28803#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
28804pub struct TokenBadCharactersGreen(pub GreenId);
28805impl TokenBadCharactersGreen {
28806    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
28807        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
28808    }
28809}
28810impl TypedSyntaxNode for TokenBadCharacters {
28811    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenBadCharacters);
28812    type StablePtr = TokenBadCharactersPtr;
28813    type Green = TokenBadCharactersGreen;
28814    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
28815        TokenBadCharactersGreen(
28816            Arc::new(GreenNode {
28817                kind: SyntaxKind::TokenMissing,
28818                details: GreenNodeDetails::Token("".into()),
28819            })
28820            .intern(db),
28821        )
28822    }
28823    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
28824        match node.0.green.lookup_intern(db).details {
28825            GreenNodeDetails::Token(_) => Self { node },
28826            GreenNodeDetails::Node { .. } => panic!(
28827                "Expected a token {:?}, not an internal node",
28828                SyntaxKind::TokenBadCharacters
28829            ),
28830        }
28831    }
28832    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
28833        match node.0.green.lookup_intern(db).details {
28834            GreenNodeDetails::Token(_) => Some(Self { node }),
28835            GreenNodeDetails::Node { .. } => None,
28836        }
28837    }
28838    fn as_syntax_node(&self) -> SyntaxNode {
28839        self.node.clone()
28840    }
28841    fn stable_ptr(&self) -> Self::StablePtr {
28842        TokenBadCharactersPtr(self.node.0.stable_ptr)
28843    }
28844}
28845impl From<&TokenBadCharacters> for SyntaxStablePtrId {
28846    fn from(node: &TokenBadCharacters) -> Self {
28847        node.stable_ptr().untyped()
28848    }
28849}
28850#[derive(Clone, Debug, Eq, Hash, PartialEq)]
28851pub struct TerminalBadCharacters {
28852    node: SyntaxNode,
28853    children: Arc<[SyntaxNode]>,
28854}
28855impl Terminal for TerminalBadCharacters {
28856    const KIND: SyntaxKind = SyntaxKind::TerminalBadCharacters;
28857    type TokenType = TokenBadCharacters;
28858    fn new_green(
28859        db: &dyn SyntaxGroup,
28860        leading_trivia: TriviaGreen,
28861        token: <<TerminalBadCharacters as Terminal>::TokenType as TypedSyntaxNode>::Green,
28862        trailing_trivia: TriviaGreen,
28863    ) -> Self::Green {
28864        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
28865        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
28866        TerminalBadCharactersGreen(
28867            Arc::new(GreenNode {
28868                kind: SyntaxKind::TerminalBadCharacters,
28869                details: GreenNodeDetails::Node { children, width },
28870            })
28871            .intern(db),
28872        )
28873    }
28874    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
28875        self.token(db).text(db)
28876    }
28877}
28878impl TerminalBadCharacters {
28879    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
28880        Trivia::from_syntax_node(db, self.children[0].clone())
28881    }
28882    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenBadCharacters {
28883        TokenBadCharacters::from_syntax_node(db, self.children[1].clone())
28884    }
28885    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
28886        Trivia::from_syntax_node(db, self.children[2].clone())
28887    }
28888}
28889#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
28890pub struct TerminalBadCharactersPtr(pub SyntaxStablePtrId);
28891impl TerminalBadCharactersPtr {}
28892impl TypedStablePtr for TerminalBadCharactersPtr {
28893    type SyntaxNode = TerminalBadCharacters;
28894    fn untyped(&self) -> SyntaxStablePtrId {
28895        self.0
28896    }
28897    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalBadCharacters {
28898        TerminalBadCharacters::from_syntax_node(db, self.0.lookup(db))
28899    }
28900}
28901impl From<TerminalBadCharactersPtr> for SyntaxStablePtrId {
28902    fn from(ptr: TerminalBadCharactersPtr) -> Self {
28903        ptr.untyped()
28904    }
28905}
28906#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
28907pub struct TerminalBadCharactersGreen(pub GreenId);
28908impl TypedSyntaxNode for TerminalBadCharacters {
28909    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalBadCharacters);
28910    type StablePtr = TerminalBadCharactersPtr;
28911    type Green = TerminalBadCharactersGreen;
28912    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
28913        TerminalBadCharactersGreen(
28914            Arc::new(GreenNode {
28915                kind: SyntaxKind::TerminalBadCharacters,
28916                details: GreenNodeDetails::Node {
28917                    children: vec![
28918                        Trivia::missing(db).0,
28919                        TokenBadCharacters::missing(db).0,
28920                        Trivia::missing(db).0,
28921                    ],
28922                    width: TextWidth::default(),
28923                },
28924            })
28925            .intern(db),
28926        )
28927    }
28928    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
28929        let kind = node.kind(db);
28930        assert_eq!(
28931            kind,
28932            SyntaxKind::TerminalBadCharacters,
28933            "Unexpected SyntaxKind {:?}. Expected {:?}.",
28934            kind,
28935            SyntaxKind::TerminalBadCharacters
28936        );
28937        let children = db.get_children(node.clone());
28938        Self { node, children }
28939    }
28940    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
28941        let kind = node.kind(db);
28942        if kind == SyntaxKind::TerminalBadCharacters {
28943            Some(Self::from_syntax_node(db, node))
28944        } else {
28945            None
28946        }
28947    }
28948    fn as_syntax_node(&self) -> SyntaxNode {
28949        self.node.clone()
28950    }
28951    fn stable_ptr(&self) -> Self::StablePtr {
28952        TerminalBadCharactersPtr(self.node.0.stable_ptr)
28953    }
28954}
28955impl From<&TerminalBadCharacters> for SyntaxStablePtrId {
28956    fn from(node: &TerminalBadCharacters) -> Self {
28957        node.stable_ptr().untyped()
28958    }
28959}
28960#[derive(Clone, Debug, Eq, Hash, PartialEq)]
28961pub struct TokenColon {
28962    node: SyntaxNode,
28963}
28964impl Token for TokenColon {
28965    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
28966        TokenColonGreen(
28967            Arc::new(GreenNode {
28968                kind: SyntaxKind::TokenColon,
28969                details: GreenNodeDetails::Token(text),
28970            })
28971            .intern(db),
28972        )
28973    }
28974    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
28975        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
28976            .clone()
28977    }
28978}
28979#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
28980pub struct TokenColonPtr(pub SyntaxStablePtrId);
28981impl TypedStablePtr for TokenColonPtr {
28982    type SyntaxNode = TokenColon;
28983    fn untyped(&self) -> SyntaxStablePtrId {
28984        self.0
28985    }
28986    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenColon {
28987        TokenColon::from_syntax_node(db, self.0.lookup(db))
28988    }
28989}
28990impl From<TokenColonPtr> for SyntaxStablePtrId {
28991    fn from(ptr: TokenColonPtr) -> Self {
28992        ptr.untyped()
28993    }
28994}
28995#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
28996pub struct TokenColonGreen(pub GreenId);
28997impl TokenColonGreen {
28998    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
28999        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
29000    }
29001}
29002impl TypedSyntaxNode for TokenColon {
29003    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenColon);
29004    type StablePtr = TokenColonPtr;
29005    type Green = TokenColonGreen;
29006    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
29007        TokenColonGreen(
29008            Arc::new(GreenNode {
29009                kind: SyntaxKind::TokenMissing,
29010                details: GreenNodeDetails::Token("".into()),
29011            })
29012            .intern(db),
29013        )
29014    }
29015    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
29016        match node.0.green.lookup_intern(db).details {
29017            GreenNodeDetails::Token(_) => Self { node },
29018            GreenNodeDetails::Node { .. } => {
29019                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenColon)
29020            }
29021        }
29022    }
29023    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
29024        match node.0.green.lookup_intern(db).details {
29025            GreenNodeDetails::Token(_) => Some(Self { node }),
29026            GreenNodeDetails::Node { .. } => None,
29027        }
29028    }
29029    fn as_syntax_node(&self) -> SyntaxNode {
29030        self.node.clone()
29031    }
29032    fn stable_ptr(&self) -> Self::StablePtr {
29033        TokenColonPtr(self.node.0.stable_ptr)
29034    }
29035}
29036impl From<&TokenColon> for SyntaxStablePtrId {
29037    fn from(node: &TokenColon) -> Self {
29038        node.stable_ptr().untyped()
29039    }
29040}
29041#[derive(Clone, Debug, Eq, Hash, PartialEq)]
29042pub struct TerminalColon {
29043    node: SyntaxNode,
29044    children: Arc<[SyntaxNode]>,
29045}
29046impl Terminal for TerminalColon {
29047    const KIND: SyntaxKind = SyntaxKind::TerminalColon;
29048    type TokenType = TokenColon;
29049    fn new_green(
29050        db: &dyn SyntaxGroup,
29051        leading_trivia: TriviaGreen,
29052        token: <<TerminalColon as Terminal>::TokenType as TypedSyntaxNode>::Green,
29053        trailing_trivia: TriviaGreen,
29054    ) -> Self::Green {
29055        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
29056        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
29057        TerminalColonGreen(
29058            Arc::new(GreenNode {
29059                kind: SyntaxKind::TerminalColon,
29060                details: GreenNodeDetails::Node { children, width },
29061            })
29062            .intern(db),
29063        )
29064    }
29065    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
29066        self.token(db).text(db)
29067    }
29068}
29069impl TerminalColon {
29070    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
29071        Trivia::from_syntax_node(db, self.children[0].clone())
29072    }
29073    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenColon {
29074        TokenColon::from_syntax_node(db, self.children[1].clone())
29075    }
29076    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
29077        Trivia::from_syntax_node(db, self.children[2].clone())
29078    }
29079}
29080#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
29081pub struct TerminalColonPtr(pub SyntaxStablePtrId);
29082impl TerminalColonPtr {}
29083impl TypedStablePtr for TerminalColonPtr {
29084    type SyntaxNode = TerminalColon;
29085    fn untyped(&self) -> SyntaxStablePtrId {
29086        self.0
29087    }
29088    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalColon {
29089        TerminalColon::from_syntax_node(db, self.0.lookup(db))
29090    }
29091}
29092impl From<TerminalColonPtr> for SyntaxStablePtrId {
29093    fn from(ptr: TerminalColonPtr) -> Self {
29094        ptr.untyped()
29095    }
29096}
29097#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
29098pub struct TerminalColonGreen(pub GreenId);
29099impl TypedSyntaxNode for TerminalColon {
29100    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalColon);
29101    type StablePtr = TerminalColonPtr;
29102    type Green = TerminalColonGreen;
29103    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
29104        TerminalColonGreen(
29105            Arc::new(GreenNode {
29106                kind: SyntaxKind::TerminalColon,
29107                details: GreenNodeDetails::Node {
29108                    children: vec![
29109                        Trivia::missing(db).0,
29110                        TokenColon::missing(db).0,
29111                        Trivia::missing(db).0,
29112                    ],
29113                    width: TextWidth::default(),
29114                },
29115            })
29116            .intern(db),
29117        )
29118    }
29119    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
29120        let kind = node.kind(db);
29121        assert_eq!(
29122            kind,
29123            SyntaxKind::TerminalColon,
29124            "Unexpected SyntaxKind {:?}. Expected {:?}.",
29125            kind,
29126            SyntaxKind::TerminalColon
29127        );
29128        let children = db.get_children(node.clone());
29129        Self { node, children }
29130    }
29131    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
29132        let kind = node.kind(db);
29133        if kind == SyntaxKind::TerminalColon {
29134            Some(Self::from_syntax_node(db, node))
29135        } else {
29136            None
29137        }
29138    }
29139    fn as_syntax_node(&self) -> SyntaxNode {
29140        self.node.clone()
29141    }
29142    fn stable_ptr(&self) -> Self::StablePtr {
29143        TerminalColonPtr(self.node.0.stable_ptr)
29144    }
29145}
29146impl From<&TerminalColon> for SyntaxStablePtrId {
29147    fn from(node: &TerminalColon) -> Self {
29148        node.stable_ptr().untyped()
29149    }
29150}
29151#[derive(Clone, Debug, Eq, Hash, PartialEq)]
29152pub struct TokenColonColon {
29153    node: SyntaxNode,
29154}
29155impl Token for TokenColonColon {
29156    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
29157        TokenColonColonGreen(
29158            Arc::new(GreenNode {
29159                kind: SyntaxKind::TokenColonColon,
29160                details: GreenNodeDetails::Token(text),
29161            })
29162            .intern(db),
29163        )
29164    }
29165    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
29166        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
29167            .clone()
29168    }
29169}
29170#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
29171pub struct TokenColonColonPtr(pub SyntaxStablePtrId);
29172impl TypedStablePtr for TokenColonColonPtr {
29173    type SyntaxNode = TokenColonColon;
29174    fn untyped(&self) -> SyntaxStablePtrId {
29175        self.0
29176    }
29177    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenColonColon {
29178        TokenColonColon::from_syntax_node(db, self.0.lookup(db))
29179    }
29180}
29181impl From<TokenColonColonPtr> for SyntaxStablePtrId {
29182    fn from(ptr: TokenColonColonPtr) -> Self {
29183        ptr.untyped()
29184    }
29185}
29186#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
29187pub struct TokenColonColonGreen(pub GreenId);
29188impl TokenColonColonGreen {
29189    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
29190        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
29191    }
29192}
29193impl TypedSyntaxNode for TokenColonColon {
29194    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenColonColon);
29195    type StablePtr = TokenColonColonPtr;
29196    type Green = TokenColonColonGreen;
29197    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
29198        TokenColonColonGreen(
29199            Arc::new(GreenNode {
29200                kind: SyntaxKind::TokenMissing,
29201                details: GreenNodeDetails::Token("".into()),
29202            })
29203            .intern(db),
29204        )
29205    }
29206    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
29207        match node.0.green.lookup_intern(db).details {
29208            GreenNodeDetails::Token(_) => Self { node },
29209            GreenNodeDetails::Node { .. } => {
29210                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenColonColon)
29211            }
29212        }
29213    }
29214    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
29215        match node.0.green.lookup_intern(db).details {
29216            GreenNodeDetails::Token(_) => Some(Self { node }),
29217            GreenNodeDetails::Node { .. } => None,
29218        }
29219    }
29220    fn as_syntax_node(&self) -> SyntaxNode {
29221        self.node.clone()
29222    }
29223    fn stable_ptr(&self) -> Self::StablePtr {
29224        TokenColonColonPtr(self.node.0.stable_ptr)
29225    }
29226}
29227impl From<&TokenColonColon> for SyntaxStablePtrId {
29228    fn from(node: &TokenColonColon) -> Self {
29229        node.stable_ptr().untyped()
29230    }
29231}
29232#[derive(Clone, Debug, Eq, Hash, PartialEq)]
29233pub struct TerminalColonColon {
29234    node: SyntaxNode,
29235    children: Arc<[SyntaxNode]>,
29236}
29237impl Terminal for TerminalColonColon {
29238    const KIND: SyntaxKind = SyntaxKind::TerminalColonColon;
29239    type TokenType = TokenColonColon;
29240    fn new_green(
29241        db: &dyn SyntaxGroup,
29242        leading_trivia: TriviaGreen,
29243        token: <<TerminalColonColon as Terminal>::TokenType as TypedSyntaxNode>::Green,
29244        trailing_trivia: TriviaGreen,
29245    ) -> Self::Green {
29246        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
29247        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
29248        TerminalColonColonGreen(
29249            Arc::new(GreenNode {
29250                kind: SyntaxKind::TerminalColonColon,
29251                details: GreenNodeDetails::Node { children, width },
29252            })
29253            .intern(db),
29254        )
29255    }
29256    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
29257        self.token(db).text(db)
29258    }
29259}
29260impl TerminalColonColon {
29261    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
29262        Trivia::from_syntax_node(db, self.children[0].clone())
29263    }
29264    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenColonColon {
29265        TokenColonColon::from_syntax_node(db, self.children[1].clone())
29266    }
29267    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
29268        Trivia::from_syntax_node(db, self.children[2].clone())
29269    }
29270}
29271#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
29272pub struct TerminalColonColonPtr(pub SyntaxStablePtrId);
29273impl TerminalColonColonPtr {}
29274impl TypedStablePtr for TerminalColonColonPtr {
29275    type SyntaxNode = TerminalColonColon;
29276    fn untyped(&self) -> SyntaxStablePtrId {
29277        self.0
29278    }
29279    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalColonColon {
29280        TerminalColonColon::from_syntax_node(db, self.0.lookup(db))
29281    }
29282}
29283impl From<TerminalColonColonPtr> for SyntaxStablePtrId {
29284    fn from(ptr: TerminalColonColonPtr) -> Self {
29285        ptr.untyped()
29286    }
29287}
29288#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
29289pub struct TerminalColonColonGreen(pub GreenId);
29290impl TypedSyntaxNode for TerminalColonColon {
29291    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalColonColon);
29292    type StablePtr = TerminalColonColonPtr;
29293    type Green = TerminalColonColonGreen;
29294    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
29295        TerminalColonColonGreen(
29296            Arc::new(GreenNode {
29297                kind: SyntaxKind::TerminalColonColon,
29298                details: GreenNodeDetails::Node {
29299                    children: vec![
29300                        Trivia::missing(db).0,
29301                        TokenColonColon::missing(db).0,
29302                        Trivia::missing(db).0,
29303                    ],
29304                    width: TextWidth::default(),
29305                },
29306            })
29307            .intern(db),
29308        )
29309    }
29310    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
29311        let kind = node.kind(db);
29312        assert_eq!(
29313            kind,
29314            SyntaxKind::TerminalColonColon,
29315            "Unexpected SyntaxKind {:?}. Expected {:?}.",
29316            kind,
29317            SyntaxKind::TerminalColonColon
29318        );
29319        let children = db.get_children(node.clone());
29320        Self { node, children }
29321    }
29322    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
29323        let kind = node.kind(db);
29324        if kind == SyntaxKind::TerminalColonColon {
29325            Some(Self::from_syntax_node(db, node))
29326        } else {
29327            None
29328        }
29329    }
29330    fn as_syntax_node(&self) -> SyntaxNode {
29331        self.node.clone()
29332    }
29333    fn stable_ptr(&self) -> Self::StablePtr {
29334        TerminalColonColonPtr(self.node.0.stable_ptr)
29335    }
29336}
29337impl From<&TerminalColonColon> for SyntaxStablePtrId {
29338    fn from(node: &TerminalColonColon) -> Self {
29339        node.stable_ptr().untyped()
29340    }
29341}
29342#[derive(Clone, Debug, Eq, Hash, PartialEq)]
29343pub struct TokenComma {
29344    node: SyntaxNode,
29345}
29346impl Token for TokenComma {
29347    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
29348        TokenCommaGreen(
29349            Arc::new(GreenNode {
29350                kind: SyntaxKind::TokenComma,
29351                details: GreenNodeDetails::Token(text),
29352            })
29353            .intern(db),
29354        )
29355    }
29356    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
29357        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
29358            .clone()
29359    }
29360}
29361#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
29362pub struct TokenCommaPtr(pub SyntaxStablePtrId);
29363impl TypedStablePtr for TokenCommaPtr {
29364    type SyntaxNode = TokenComma;
29365    fn untyped(&self) -> SyntaxStablePtrId {
29366        self.0
29367    }
29368    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenComma {
29369        TokenComma::from_syntax_node(db, self.0.lookup(db))
29370    }
29371}
29372impl From<TokenCommaPtr> for SyntaxStablePtrId {
29373    fn from(ptr: TokenCommaPtr) -> Self {
29374        ptr.untyped()
29375    }
29376}
29377#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
29378pub struct TokenCommaGreen(pub GreenId);
29379impl TokenCommaGreen {
29380    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
29381        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
29382    }
29383}
29384impl TypedSyntaxNode for TokenComma {
29385    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenComma);
29386    type StablePtr = TokenCommaPtr;
29387    type Green = TokenCommaGreen;
29388    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
29389        TokenCommaGreen(
29390            Arc::new(GreenNode {
29391                kind: SyntaxKind::TokenMissing,
29392                details: GreenNodeDetails::Token("".into()),
29393            })
29394            .intern(db),
29395        )
29396    }
29397    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
29398        match node.0.green.lookup_intern(db).details {
29399            GreenNodeDetails::Token(_) => Self { node },
29400            GreenNodeDetails::Node { .. } => {
29401                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenComma)
29402            }
29403        }
29404    }
29405    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
29406        match node.0.green.lookup_intern(db).details {
29407            GreenNodeDetails::Token(_) => Some(Self { node }),
29408            GreenNodeDetails::Node { .. } => None,
29409        }
29410    }
29411    fn as_syntax_node(&self) -> SyntaxNode {
29412        self.node.clone()
29413    }
29414    fn stable_ptr(&self) -> Self::StablePtr {
29415        TokenCommaPtr(self.node.0.stable_ptr)
29416    }
29417}
29418impl From<&TokenComma> for SyntaxStablePtrId {
29419    fn from(node: &TokenComma) -> Self {
29420        node.stable_ptr().untyped()
29421    }
29422}
29423#[derive(Clone, Debug, Eq, Hash, PartialEq)]
29424pub struct TerminalComma {
29425    node: SyntaxNode,
29426    children: Arc<[SyntaxNode]>,
29427}
29428impl Terminal for TerminalComma {
29429    const KIND: SyntaxKind = SyntaxKind::TerminalComma;
29430    type TokenType = TokenComma;
29431    fn new_green(
29432        db: &dyn SyntaxGroup,
29433        leading_trivia: TriviaGreen,
29434        token: <<TerminalComma as Terminal>::TokenType as TypedSyntaxNode>::Green,
29435        trailing_trivia: TriviaGreen,
29436    ) -> Self::Green {
29437        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
29438        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
29439        TerminalCommaGreen(
29440            Arc::new(GreenNode {
29441                kind: SyntaxKind::TerminalComma,
29442                details: GreenNodeDetails::Node { children, width },
29443            })
29444            .intern(db),
29445        )
29446    }
29447    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
29448        self.token(db).text(db)
29449    }
29450}
29451impl TerminalComma {
29452    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
29453        Trivia::from_syntax_node(db, self.children[0].clone())
29454    }
29455    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenComma {
29456        TokenComma::from_syntax_node(db, self.children[1].clone())
29457    }
29458    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
29459        Trivia::from_syntax_node(db, self.children[2].clone())
29460    }
29461}
29462#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
29463pub struct TerminalCommaPtr(pub SyntaxStablePtrId);
29464impl TerminalCommaPtr {}
29465impl TypedStablePtr for TerminalCommaPtr {
29466    type SyntaxNode = TerminalComma;
29467    fn untyped(&self) -> SyntaxStablePtrId {
29468        self.0
29469    }
29470    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalComma {
29471        TerminalComma::from_syntax_node(db, self.0.lookup(db))
29472    }
29473}
29474impl From<TerminalCommaPtr> for SyntaxStablePtrId {
29475    fn from(ptr: TerminalCommaPtr) -> Self {
29476        ptr.untyped()
29477    }
29478}
29479#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
29480pub struct TerminalCommaGreen(pub GreenId);
29481impl TypedSyntaxNode for TerminalComma {
29482    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalComma);
29483    type StablePtr = TerminalCommaPtr;
29484    type Green = TerminalCommaGreen;
29485    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
29486        TerminalCommaGreen(
29487            Arc::new(GreenNode {
29488                kind: SyntaxKind::TerminalComma,
29489                details: GreenNodeDetails::Node {
29490                    children: vec![
29491                        Trivia::missing(db).0,
29492                        TokenComma::missing(db).0,
29493                        Trivia::missing(db).0,
29494                    ],
29495                    width: TextWidth::default(),
29496                },
29497            })
29498            .intern(db),
29499        )
29500    }
29501    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
29502        let kind = node.kind(db);
29503        assert_eq!(
29504            kind,
29505            SyntaxKind::TerminalComma,
29506            "Unexpected SyntaxKind {:?}. Expected {:?}.",
29507            kind,
29508            SyntaxKind::TerminalComma
29509        );
29510        let children = db.get_children(node.clone());
29511        Self { node, children }
29512    }
29513    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
29514        let kind = node.kind(db);
29515        if kind == SyntaxKind::TerminalComma {
29516            Some(Self::from_syntax_node(db, node))
29517        } else {
29518            None
29519        }
29520    }
29521    fn as_syntax_node(&self) -> SyntaxNode {
29522        self.node.clone()
29523    }
29524    fn stable_ptr(&self) -> Self::StablePtr {
29525        TerminalCommaPtr(self.node.0.stable_ptr)
29526    }
29527}
29528impl From<&TerminalComma> for SyntaxStablePtrId {
29529    fn from(node: &TerminalComma) -> Self {
29530        node.stable_ptr().untyped()
29531    }
29532}
29533#[derive(Clone, Debug, Eq, Hash, PartialEq)]
29534pub struct TokenDiv {
29535    node: SyntaxNode,
29536}
29537impl Token for TokenDiv {
29538    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
29539        TokenDivGreen(
29540            Arc::new(GreenNode {
29541                kind: SyntaxKind::TokenDiv,
29542                details: GreenNodeDetails::Token(text),
29543            })
29544            .intern(db),
29545        )
29546    }
29547    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
29548        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
29549            .clone()
29550    }
29551}
29552#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
29553pub struct TokenDivPtr(pub SyntaxStablePtrId);
29554impl TypedStablePtr for TokenDivPtr {
29555    type SyntaxNode = TokenDiv;
29556    fn untyped(&self) -> SyntaxStablePtrId {
29557        self.0
29558    }
29559    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenDiv {
29560        TokenDiv::from_syntax_node(db, self.0.lookup(db))
29561    }
29562}
29563impl From<TokenDivPtr> for SyntaxStablePtrId {
29564    fn from(ptr: TokenDivPtr) -> Self {
29565        ptr.untyped()
29566    }
29567}
29568#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
29569pub struct TokenDivGreen(pub GreenId);
29570impl TokenDivGreen {
29571    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
29572        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
29573    }
29574}
29575impl TypedSyntaxNode for TokenDiv {
29576    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenDiv);
29577    type StablePtr = TokenDivPtr;
29578    type Green = TokenDivGreen;
29579    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
29580        TokenDivGreen(
29581            Arc::new(GreenNode {
29582                kind: SyntaxKind::TokenMissing,
29583                details: GreenNodeDetails::Token("".into()),
29584            })
29585            .intern(db),
29586        )
29587    }
29588    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
29589        match node.0.green.lookup_intern(db).details {
29590            GreenNodeDetails::Token(_) => Self { node },
29591            GreenNodeDetails::Node { .. } => {
29592                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenDiv)
29593            }
29594        }
29595    }
29596    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
29597        match node.0.green.lookup_intern(db).details {
29598            GreenNodeDetails::Token(_) => Some(Self { node }),
29599            GreenNodeDetails::Node { .. } => None,
29600        }
29601    }
29602    fn as_syntax_node(&self) -> SyntaxNode {
29603        self.node.clone()
29604    }
29605    fn stable_ptr(&self) -> Self::StablePtr {
29606        TokenDivPtr(self.node.0.stable_ptr)
29607    }
29608}
29609impl From<&TokenDiv> for SyntaxStablePtrId {
29610    fn from(node: &TokenDiv) -> Self {
29611        node.stable_ptr().untyped()
29612    }
29613}
29614#[derive(Clone, Debug, Eq, Hash, PartialEq)]
29615pub struct TerminalDiv {
29616    node: SyntaxNode,
29617    children: Arc<[SyntaxNode]>,
29618}
29619impl Terminal for TerminalDiv {
29620    const KIND: SyntaxKind = SyntaxKind::TerminalDiv;
29621    type TokenType = TokenDiv;
29622    fn new_green(
29623        db: &dyn SyntaxGroup,
29624        leading_trivia: TriviaGreen,
29625        token: <<TerminalDiv as Terminal>::TokenType as TypedSyntaxNode>::Green,
29626        trailing_trivia: TriviaGreen,
29627    ) -> Self::Green {
29628        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
29629        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
29630        TerminalDivGreen(
29631            Arc::new(GreenNode {
29632                kind: SyntaxKind::TerminalDiv,
29633                details: GreenNodeDetails::Node { children, width },
29634            })
29635            .intern(db),
29636        )
29637    }
29638    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
29639        self.token(db).text(db)
29640    }
29641}
29642impl TerminalDiv {
29643    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
29644        Trivia::from_syntax_node(db, self.children[0].clone())
29645    }
29646    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenDiv {
29647        TokenDiv::from_syntax_node(db, self.children[1].clone())
29648    }
29649    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
29650        Trivia::from_syntax_node(db, self.children[2].clone())
29651    }
29652}
29653#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
29654pub struct TerminalDivPtr(pub SyntaxStablePtrId);
29655impl TerminalDivPtr {}
29656impl TypedStablePtr for TerminalDivPtr {
29657    type SyntaxNode = TerminalDiv;
29658    fn untyped(&self) -> SyntaxStablePtrId {
29659        self.0
29660    }
29661    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalDiv {
29662        TerminalDiv::from_syntax_node(db, self.0.lookup(db))
29663    }
29664}
29665impl From<TerminalDivPtr> for SyntaxStablePtrId {
29666    fn from(ptr: TerminalDivPtr) -> Self {
29667        ptr.untyped()
29668    }
29669}
29670#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
29671pub struct TerminalDivGreen(pub GreenId);
29672impl TypedSyntaxNode for TerminalDiv {
29673    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalDiv);
29674    type StablePtr = TerminalDivPtr;
29675    type Green = TerminalDivGreen;
29676    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
29677        TerminalDivGreen(
29678            Arc::new(GreenNode {
29679                kind: SyntaxKind::TerminalDiv,
29680                details: GreenNodeDetails::Node {
29681                    children: vec![
29682                        Trivia::missing(db).0,
29683                        TokenDiv::missing(db).0,
29684                        Trivia::missing(db).0,
29685                    ],
29686                    width: TextWidth::default(),
29687                },
29688            })
29689            .intern(db),
29690        )
29691    }
29692    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
29693        let kind = node.kind(db);
29694        assert_eq!(
29695            kind,
29696            SyntaxKind::TerminalDiv,
29697            "Unexpected SyntaxKind {:?}. Expected {:?}.",
29698            kind,
29699            SyntaxKind::TerminalDiv
29700        );
29701        let children = db.get_children(node.clone());
29702        Self { node, children }
29703    }
29704    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
29705        let kind = node.kind(db);
29706        if kind == SyntaxKind::TerminalDiv { Some(Self::from_syntax_node(db, node)) } else { None }
29707    }
29708    fn as_syntax_node(&self) -> SyntaxNode {
29709        self.node.clone()
29710    }
29711    fn stable_ptr(&self) -> Self::StablePtr {
29712        TerminalDivPtr(self.node.0.stable_ptr)
29713    }
29714}
29715impl From<&TerminalDiv> for SyntaxStablePtrId {
29716    fn from(node: &TerminalDiv) -> Self {
29717        node.stable_ptr().untyped()
29718    }
29719}
29720#[derive(Clone, Debug, Eq, Hash, PartialEq)]
29721pub struct TokenDivEq {
29722    node: SyntaxNode,
29723}
29724impl Token for TokenDivEq {
29725    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
29726        TokenDivEqGreen(
29727            Arc::new(GreenNode {
29728                kind: SyntaxKind::TokenDivEq,
29729                details: GreenNodeDetails::Token(text),
29730            })
29731            .intern(db),
29732        )
29733    }
29734    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
29735        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
29736            .clone()
29737    }
29738}
29739#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
29740pub struct TokenDivEqPtr(pub SyntaxStablePtrId);
29741impl TypedStablePtr for TokenDivEqPtr {
29742    type SyntaxNode = TokenDivEq;
29743    fn untyped(&self) -> SyntaxStablePtrId {
29744        self.0
29745    }
29746    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenDivEq {
29747        TokenDivEq::from_syntax_node(db, self.0.lookup(db))
29748    }
29749}
29750impl From<TokenDivEqPtr> for SyntaxStablePtrId {
29751    fn from(ptr: TokenDivEqPtr) -> Self {
29752        ptr.untyped()
29753    }
29754}
29755#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
29756pub struct TokenDivEqGreen(pub GreenId);
29757impl TokenDivEqGreen {
29758    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
29759        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
29760    }
29761}
29762impl TypedSyntaxNode for TokenDivEq {
29763    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenDivEq);
29764    type StablePtr = TokenDivEqPtr;
29765    type Green = TokenDivEqGreen;
29766    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
29767        TokenDivEqGreen(
29768            Arc::new(GreenNode {
29769                kind: SyntaxKind::TokenMissing,
29770                details: GreenNodeDetails::Token("".into()),
29771            })
29772            .intern(db),
29773        )
29774    }
29775    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
29776        match node.0.green.lookup_intern(db).details {
29777            GreenNodeDetails::Token(_) => Self { node },
29778            GreenNodeDetails::Node { .. } => {
29779                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenDivEq)
29780            }
29781        }
29782    }
29783    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
29784        match node.0.green.lookup_intern(db).details {
29785            GreenNodeDetails::Token(_) => Some(Self { node }),
29786            GreenNodeDetails::Node { .. } => None,
29787        }
29788    }
29789    fn as_syntax_node(&self) -> SyntaxNode {
29790        self.node.clone()
29791    }
29792    fn stable_ptr(&self) -> Self::StablePtr {
29793        TokenDivEqPtr(self.node.0.stable_ptr)
29794    }
29795}
29796impl From<&TokenDivEq> for SyntaxStablePtrId {
29797    fn from(node: &TokenDivEq) -> Self {
29798        node.stable_ptr().untyped()
29799    }
29800}
29801#[derive(Clone, Debug, Eq, Hash, PartialEq)]
29802pub struct TerminalDivEq {
29803    node: SyntaxNode,
29804    children: Arc<[SyntaxNode]>,
29805}
29806impl Terminal for TerminalDivEq {
29807    const KIND: SyntaxKind = SyntaxKind::TerminalDivEq;
29808    type TokenType = TokenDivEq;
29809    fn new_green(
29810        db: &dyn SyntaxGroup,
29811        leading_trivia: TriviaGreen,
29812        token: <<TerminalDivEq as Terminal>::TokenType as TypedSyntaxNode>::Green,
29813        trailing_trivia: TriviaGreen,
29814    ) -> Self::Green {
29815        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
29816        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
29817        TerminalDivEqGreen(
29818            Arc::new(GreenNode {
29819                kind: SyntaxKind::TerminalDivEq,
29820                details: GreenNodeDetails::Node { children, width },
29821            })
29822            .intern(db),
29823        )
29824    }
29825    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
29826        self.token(db).text(db)
29827    }
29828}
29829impl TerminalDivEq {
29830    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
29831        Trivia::from_syntax_node(db, self.children[0].clone())
29832    }
29833    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenDivEq {
29834        TokenDivEq::from_syntax_node(db, self.children[1].clone())
29835    }
29836    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
29837        Trivia::from_syntax_node(db, self.children[2].clone())
29838    }
29839}
29840#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
29841pub struct TerminalDivEqPtr(pub SyntaxStablePtrId);
29842impl TerminalDivEqPtr {}
29843impl TypedStablePtr for TerminalDivEqPtr {
29844    type SyntaxNode = TerminalDivEq;
29845    fn untyped(&self) -> SyntaxStablePtrId {
29846        self.0
29847    }
29848    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalDivEq {
29849        TerminalDivEq::from_syntax_node(db, self.0.lookup(db))
29850    }
29851}
29852impl From<TerminalDivEqPtr> for SyntaxStablePtrId {
29853    fn from(ptr: TerminalDivEqPtr) -> Self {
29854        ptr.untyped()
29855    }
29856}
29857#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
29858pub struct TerminalDivEqGreen(pub GreenId);
29859impl TypedSyntaxNode for TerminalDivEq {
29860    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalDivEq);
29861    type StablePtr = TerminalDivEqPtr;
29862    type Green = TerminalDivEqGreen;
29863    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
29864        TerminalDivEqGreen(
29865            Arc::new(GreenNode {
29866                kind: SyntaxKind::TerminalDivEq,
29867                details: GreenNodeDetails::Node {
29868                    children: vec![
29869                        Trivia::missing(db).0,
29870                        TokenDivEq::missing(db).0,
29871                        Trivia::missing(db).0,
29872                    ],
29873                    width: TextWidth::default(),
29874                },
29875            })
29876            .intern(db),
29877        )
29878    }
29879    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
29880        let kind = node.kind(db);
29881        assert_eq!(
29882            kind,
29883            SyntaxKind::TerminalDivEq,
29884            "Unexpected SyntaxKind {:?}. Expected {:?}.",
29885            kind,
29886            SyntaxKind::TerminalDivEq
29887        );
29888        let children = db.get_children(node.clone());
29889        Self { node, children }
29890    }
29891    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
29892        let kind = node.kind(db);
29893        if kind == SyntaxKind::TerminalDivEq {
29894            Some(Self::from_syntax_node(db, node))
29895        } else {
29896            None
29897        }
29898    }
29899    fn as_syntax_node(&self) -> SyntaxNode {
29900        self.node.clone()
29901    }
29902    fn stable_ptr(&self) -> Self::StablePtr {
29903        TerminalDivEqPtr(self.node.0.stable_ptr)
29904    }
29905}
29906impl From<&TerminalDivEq> for SyntaxStablePtrId {
29907    fn from(node: &TerminalDivEq) -> Self {
29908        node.stable_ptr().untyped()
29909    }
29910}
29911#[derive(Clone, Debug, Eq, Hash, PartialEq)]
29912pub struct TokenDot {
29913    node: SyntaxNode,
29914}
29915impl Token for TokenDot {
29916    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
29917        TokenDotGreen(
29918            Arc::new(GreenNode {
29919                kind: SyntaxKind::TokenDot,
29920                details: GreenNodeDetails::Token(text),
29921            })
29922            .intern(db),
29923        )
29924    }
29925    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
29926        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
29927            .clone()
29928    }
29929}
29930#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
29931pub struct TokenDotPtr(pub SyntaxStablePtrId);
29932impl TypedStablePtr for TokenDotPtr {
29933    type SyntaxNode = TokenDot;
29934    fn untyped(&self) -> SyntaxStablePtrId {
29935        self.0
29936    }
29937    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenDot {
29938        TokenDot::from_syntax_node(db, self.0.lookup(db))
29939    }
29940}
29941impl From<TokenDotPtr> for SyntaxStablePtrId {
29942    fn from(ptr: TokenDotPtr) -> Self {
29943        ptr.untyped()
29944    }
29945}
29946#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
29947pub struct TokenDotGreen(pub GreenId);
29948impl TokenDotGreen {
29949    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
29950        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
29951    }
29952}
29953impl TypedSyntaxNode for TokenDot {
29954    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenDot);
29955    type StablePtr = TokenDotPtr;
29956    type Green = TokenDotGreen;
29957    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
29958        TokenDotGreen(
29959            Arc::new(GreenNode {
29960                kind: SyntaxKind::TokenMissing,
29961                details: GreenNodeDetails::Token("".into()),
29962            })
29963            .intern(db),
29964        )
29965    }
29966    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
29967        match node.0.green.lookup_intern(db).details {
29968            GreenNodeDetails::Token(_) => Self { node },
29969            GreenNodeDetails::Node { .. } => {
29970                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenDot)
29971            }
29972        }
29973    }
29974    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
29975        match node.0.green.lookup_intern(db).details {
29976            GreenNodeDetails::Token(_) => Some(Self { node }),
29977            GreenNodeDetails::Node { .. } => None,
29978        }
29979    }
29980    fn as_syntax_node(&self) -> SyntaxNode {
29981        self.node.clone()
29982    }
29983    fn stable_ptr(&self) -> Self::StablePtr {
29984        TokenDotPtr(self.node.0.stable_ptr)
29985    }
29986}
29987impl From<&TokenDot> for SyntaxStablePtrId {
29988    fn from(node: &TokenDot) -> Self {
29989        node.stable_ptr().untyped()
29990    }
29991}
29992#[derive(Clone, Debug, Eq, Hash, PartialEq)]
29993pub struct TerminalDot {
29994    node: SyntaxNode,
29995    children: Arc<[SyntaxNode]>,
29996}
29997impl Terminal for TerminalDot {
29998    const KIND: SyntaxKind = SyntaxKind::TerminalDot;
29999    type TokenType = TokenDot;
30000    fn new_green(
30001        db: &dyn SyntaxGroup,
30002        leading_trivia: TriviaGreen,
30003        token: <<TerminalDot as Terminal>::TokenType as TypedSyntaxNode>::Green,
30004        trailing_trivia: TriviaGreen,
30005    ) -> Self::Green {
30006        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
30007        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
30008        TerminalDotGreen(
30009            Arc::new(GreenNode {
30010                kind: SyntaxKind::TerminalDot,
30011                details: GreenNodeDetails::Node { children, width },
30012            })
30013            .intern(db),
30014        )
30015    }
30016    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
30017        self.token(db).text(db)
30018    }
30019}
30020impl TerminalDot {
30021    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
30022        Trivia::from_syntax_node(db, self.children[0].clone())
30023    }
30024    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenDot {
30025        TokenDot::from_syntax_node(db, self.children[1].clone())
30026    }
30027    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
30028        Trivia::from_syntax_node(db, self.children[2].clone())
30029    }
30030}
30031#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
30032pub struct TerminalDotPtr(pub SyntaxStablePtrId);
30033impl TerminalDotPtr {}
30034impl TypedStablePtr for TerminalDotPtr {
30035    type SyntaxNode = TerminalDot;
30036    fn untyped(&self) -> SyntaxStablePtrId {
30037        self.0
30038    }
30039    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalDot {
30040        TerminalDot::from_syntax_node(db, self.0.lookup(db))
30041    }
30042}
30043impl From<TerminalDotPtr> for SyntaxStablePtrId {
30044    fn from(ptr: TerminalDotPtr) -> Self {
30045        ptr.untyped()
30046    }
30047}
30048#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
30049pub struct TerminalDotGreen(pub GreenId);
30050impl TypedSyntaxNode for TerminalDot {
30051    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalDot);
30052    type StablePtr = TerminalDotPtr;
30053    type Green = TerminalDotGreen;
30054    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
30055        TerminalDotGreen(
30056            Arc::new(GreenNode {
30057                kind: SyntaxKind::TerminalDot,
30058                details: GreenNodeDetails::Node {
30059                    children: vec![
30060                        Trivia::missing(db).0,
30061                        TokenDot::missing(db).0,
30062                        Trivia::missing(db).0,
30063                    ],
30064                    width: TextWidth::default(),
30065                },
30066            })
30067            .intern(db),
30068        )
30069    }
30070    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
30071        let kind = node.kind(db);
30072        assert_eq!(
30073            kind,
30074            SyntaxKind::TerminalDot,
30075            "Unexpected SyntaxKind {:?}. Expected {:?}.",
30076            kind,
30077            SyntaxKind::TerminalDot
30078        );
30079        let children = db.get_children(node.clone());
30080        Self { node, children }
30081    }
30082    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
30083        let kind = node.kind(db);
30084        if kind == SyntaxKind::TerminalDot { Some(Self::from_syntax_node(db, node)) } else { None }
30085    }
30086    fn as_syntax_node(&self) -> SyntaxNode {
30087        self.node.clone()
30088    }
30089    fn stable_ptr(&self) -> Self::StablePtr {
30090        TerminalDotPtr(self.node.0.stable_ptr)
30091    }
30092}
30093impl From<&TerminalDot> for SyntaxStablePtrId {
30094    fn from(node: &TerminalDot) -> Self {
30095        node.stable_ptr().untyped()
30096    }
30097}
30098#[derive(Clone, Debug, Eq, Hash, PartialEq)]
30099pub struct TokenDotDot {
30100    node: SyntaxNode,
30101}
30102impl Token for TokenDotDot {
30103    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
30104        TokenDotDotGreen(
30105            Arc::new(GreenNode {
30106                kind: SyntaxKind::TokenDotDot,
30107                details: GreenNodeDetails::Token(text),
30108            })
30109            .intern(db),
30110        )
30111    }
30112    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
30113        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
30114            .clone()
30115    }
30116}
30117#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
30118pub struct TokenDotDotPtr(pub SyntaxStablePtrId);
30119impl TypedStablePtr for TokenDotDotPtr {
30120    type SyntaxNode = TokenDotDot;
30121    fn untyped(&self) -> SyntaxStablePtrId {
30122        self.0
30123    }
30124    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenDotDot {
30125        TokenDotDot::from_syntax_node(db, self.0.lookup(db))
30126    }
30127}
30128impl From<TokenDotDotPtr> for SyntaxStablePtrId {
30129    fn from(ptr: TokenDotDotPtr) -> Self {
30130        ptr.untyped()
30131    }
30132}
30133#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
30134pub struct TokenDotDotGreen(pub GreenId);
30135impl TokenDotDotGreen {
30136    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
30137        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
30138    }
30139}
30140impl TypedSyntaxNode for TokenDotDot {
30141    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenDotDot);
30142    type StablePtr = TokenDotDotPtr;
30143    type Green = TokenDotDotGreen;
30144    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
30145        TokenDotDotGreen(
30146            Arc::new(GreenNode {
30147                kind: SyntaxKind::TokenMissing,
30148                details: GreenNodeDetails::Token("".into()),
30149            })
30150            .intern(db),
30151        )
30152    }
30153    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
30154        match node.0.green.lookup_intern(db).details {
30155            GreenNodeDetails::Token(_) => Self { node },
30156            GreenNodeDetails::Node { .. } => {
30157                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenDotDot)
30158            }
30159        }
30160    }
30161    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
30162        match node.0.green.lookup_intern(db).details {
30163            GreenNodeDetails::Token(_) => Some(Self { node }),
30164            GreenNodeDetails::Node { .. } => None,
30165        }
30166    }
30167    fn as_syntax_node(&self) -> SyntaxNode {
30168        self.node.clone()
30169    }
30170    fn stable_ptr(&self) -> Self::StablePtr {
30171        TokenDotDotPtr(self.node.0.stable_ptr)
30172    }
30173}
30174impl From<&TokenDotDot> for SyntaxStablePtrId {
30175    fn from(node: &TokenDotDot) -> Self {
30176        node.stable_ptr().untyped()
30177    }
30178}
30179#[derive(Clone, Debug, Eq, Hash, PartialEq)]
30180pub struct TerminalDotDot {
30181    node: SyntaxNode,
30182    children: Arc<[SyntaxNode]>,
30183}
30184impl Terminal for TerminalDotDot {
30185    const KIND: SyntaxKind = SyntaxKind::TerminalDotDot;
30186    type TokenType = TokenDotDot;
30187    fn new_green(
30188        db: &dyn SyntaxGroup,
30189        leading_trivia: TriviaGreen,
30190        token: <<TerminalDotDot as Terminal>::TokenType as TypedSyntaxNode>::Green,
30191        trailing_trivia: TriviaGreen,
30192    ) -> Self::Green {
30193        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
30194        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
30195        TerminalDotDotGreen(
30196            Arc::new(GreenNode {
30197                kind: SyntaxKind::TerminalDotDot,
30198                details: GreenNodeDetails::Node { children, width },
30199            })
30200            .intern(db),
30201        )
30202    }
30203    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
30204        self.token(db).text(db)
30205    }
30206}
30207impl TerminalDotDot {
30208    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
30209        Trivia::from_syntax_node(db, self.children[0].clone())
30210    }
30211    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenDotDot {
30212        TokenDotDot::from_syntax_node(db, self.children[1].clone())
30213    }
30214    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
30215        Trivia::from_syntax_node(db, self.children[2].clone())
30216    }
30217}
30218#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
30219pub struct TerminalDotDotPtr(pub SyntaxStablePtrId);
30220impl TerminalDotDotPtr {}
30221impl TypedStablePtr for TerminalDotDotPtr {
30222    type SyntaxNode = TerminalDotDot;
30223    fn untyped(&self) -> SyntaxStablePtrId {
30224        self.0
30225    }
30226    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalDotDot {
30227        TerminalDotDot::from_syntax_node(db, self.0.lookup(db))
30228    }
30229}
30230impl From<TerminalDotDotPtr> for SyntaxStablePtrId {
30231    fn from(ptr: TerminalDotDotPtr) -> Self {
30232        ptr.untyped()
30233    }
30234}
30235#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
30236pub struct TerminalDotDotGreen(pub GreenId);
30237impl TypedSyntaxNode for TerminalDotDot {
30238    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalDotDot);
30239    type StablePtr = TerminalDotDotPtr;
30240    type Green = TerminalDotDotGreen;
30241    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
30242        TerminalDotDotGreen(
30243            Arc::new(GreenNode {
30244                kind: SyntaxKind::TerminalDotDot,
30245                details: GreenNodeDetails::Node {
30246                    children: vec![
30247                        Trivia::missing(db).0,
30248                        TokenDotDot::missing(db).0,
30249                        Trivia::missing(db).0,
30250                    ],
30251                    width: TextWidth::default(),
30252                },
30253            })
30254            .intern(db),
30255        )
30256    }
30257    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
30258        let kind = node.kind(db);
30259        assert_eq!(
30260            kind,
30261            SyntaxKind::TerminalDotDot,
30262            "Unexpected SyntaxKind {:?}. Expected {:?}.",
30263            kind,
30264            SyntaxKind::TerminalDotDot
30265        );
30266        let children = db.get_children(node.clone());
30267        Self { node, children }
30268    }
30269    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
30270        let kind = node.kind(db);
30271        if kind == SyntaxKind::TerminalDotDot {
30272            Some(Self::from_syntax_node(db, node))
30273        } else {
30274            None
30275        }
30276    }
30277    fn as_syntax_node(&self) -> SyntaxNode {
30278        self.node.clone()
30279    }
30280    fn stable_ptr(&self) -> Self::StablePtr {
30281        TerminalDotDotPtr(self.node.0.stable_ptr)
30282    }
30283}
30284impl From<&TerminalDotDot> for SyntaxStablePtrId {
30285    fn from(node: &TerminalDotDot) -> Self {
30286        node.stable_ptr().untyped()
30287    }
30288}
30289#[derive(Clone, Debug, Eq, Hash, PartialEq)]
30290pub struct TokenDotDotEq {
30291    node: SyntaxNode,
30292}
30293impl Token for TokenDotDotEq {
30294    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
30295        TokenDotDotEqGreen(
30296            Arc::new(GreenNode {
30297                kind: SyntaxKind::TokenDotDotEq,
30298                details: GreenNodeDetails::Token(text),
30299            })
30300            .intern(db),
30301        )
30302    }
30303    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
30304        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
30305            .clone()
30306    }
30307}
30308#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
30309pub struct TokenDotDotEqPtr(pub SyntaxStablePtrId);
30310impl TypedStablePtr for TokenDotDotEqPtr {
30311    type SyntaxNode = TokenDotDotEq;
30312    fn untyped(&self) -> SyntaxStablePtrId {
30313        self.0
30314    }
30315    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenDotDotEq {
30316        TokenDotDotEq::from_syntax_node(db, self.0.lookup(db))
30317    }
30318}
30319impl From<TokenDotDotEqPtr> for SyntaxStablePtrId {
30320    fn from(ptr: TokenDotDotEqPtr) -> Self {
30321        ptr.untyped()
30322    }
30323}
30324#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
30325pub struct TokenDotDotEqGreen(pub GreenId);
30326impl TokenDotDotEqGreen {
30327    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
30328        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
30329    }
30330}
30331impl TypedSyntaxNode for TokenDotDotEq {
30332    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenDotDotEq);
30333    type StablePtr = TokenDotDotEqPtr;
30334    type Green = TokenDotDotEqGreen;
30335    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
30336        TokenDotDotEqGreen(
30337            Arc::new(GreenNode {
30338                kind: SyntaxKind::TokenMissing,
30339                details: GreenNodeDetails::Token("".into()),
30340            })
30341            .intern(db),
30342        )
30343    }
30344    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
30345        match node.0.green.lookup_intern(db).details {
30346            GreenNodeDetails::Token(_) => Self { node },
30347            GreenNodeDetails::Node { .. } => {
30348                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenDotDotEq)
30349            }
30350        }
30351    }
30352    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
30353        match node.0.green.lookup_intern(db).details {
30354            GreenNodeDetails::Token(_) => Some(Self { node }),
30355            GreenNodeDetails::Node { .. } => None,
30356        }
30357    }
30358    fn as_syntax_node(&self) -> SyntaxNode {
30359        self.node.clone()
30360    }
30361    fn stable_ptr(&self) -> Self::StablePtr {
30362        TokenDotDotEqPtr(self.node.0.stable_ptr)
30363    }
30364}
30365impl From<&TokenDotDotEq> for SyntaxStablePtrId {
30366    fn from(node: &TokenDotDotEq) -> Self {
30367        node.stable_ptr().untyped()
30368    }
30369}
30370#[derive(Clone, Debug, Eq, Hash, PartialEq)]
30371pub struct TerminalDotDotEq {
30372    node: SyntaxNode,
30373    children: Arc<[SyntaxNode]>,
30374}
30375impl Terminal for TerminalDotDotEq {
30376    const KIND: SyntaxKind = SyntaxKind::TerminalDotDotEq;
30377    type TokenType = TokenDotDotEq;
30378    fn new_green(
30379        db: &dyn SyntaxGroup,
30380        leading_trivia: TriviaGreen,
30381        token: <<TerminalDotDotEq as Terminal>::TokenType as TypedSyntaxNode>::Green,
30382        trailing_trivia: TriviaGreen,
30383    ) -> Self::Green {
30384        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
30385        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
30386        TerminalDotDotEqGreen(
30387            Arc::new(GreenNode {
30388                kind: SyntaxKind::TerminalDotDotEq,
30389                details: GreenNodeDetails::Node { children, width },
30390            })
30391            .intern(db),
30392        )
30393    }
30394    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
30395        self.token(db).text(db)
30396    }
30397}
30398impl TerminalDotDotEq {
30399    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
30400        Trivia::from_syntax_node(db, self.children[0].clone())
30401    }
30402    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenDotDotEq {
30403        TokenDotDotEq::from_syntax_node(db, self.children[1].clone())
30404    }
30405    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
30406        Trivia::from_syntax_node(db, self.children[2].clone())
30407    }
30408}
30409#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
30410pub struct TerminalDotDotEqPtr(pub SyntaxStablePtrId);
30411impl TerminalDotDotEqPtr {}
30412impl TypedStablePtr for TerminalDotDotEqPtr {
30413    type SyntaxNode = TerminalDotDotEq;
30414    fn untyped(&self) -> SyntaxStablePtrId {
30415        self.0
30416    }
30417    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalDotDotEq {
30418        TerminalDotDotEq::from_syntax_node(db, self.0.lookup(db))
30419    }
30420}
30421impl From<TerminalDotDotEqPtr> for SyntaxStablePtrId {
30422    fn from(ptr: TerminalDotDotEqPtr) -> Self {
30423        ptr.untyped()
30424    }
30425}
30426#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
30427pub struct TerminalDotDotEqGreen(pub GreenId);
30428impl TypedSyntaxNode for TerminalDotDotEq {
30429    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalDotDotEq);
30430    type StablePtr = TerminalDotDotEqPtr;
30431    type Green = TerminalDotDotEqGreen;
30432    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
30433        TerminalDotDotEqGreen(
30434            Arc::new(GreenNode {
30435                kind: SyntaxKind::TerminalDotDotEq,
30436                details: GreenNodeDetails::Node {
30437                    children: vec![
30438                        Trivia::missing(db).0,
30439                        TokenDotDotEq::missing(db).0,
30440                        Trivia::missing(db).0,
30441                    ],
30442                    width: TextWidth::default(),
30443                },
30444            })
30445            .intern(db),
30446        )
30447    }
30448    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
30449        let kind = node.kind(db);
30450        assert_eq!(
30451            kind,
30452            SyntaxKind::TerminalDotDotEq,
30453            "Unexpected SyntaxKind {:?}. Expected {:?}.",
30454            kind,
30455            SyntaxKind::TerminalDotDotEq
30456        );
30457        let children = db.get_children(node.clone());
30458        Self { node, children }
30459    }
30460    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
30461        let kind = node.kind(db);
30462        if kind == SyntaxKind::TerminalDotDotEq {
30463            Some(Self::from_syntax_node(db, node))
30464        } else {
30465            None
30466        }
30467    }
30468    fn as_syntax_node(&self) -> SyntaxNode {
30469        self.node.clone()
30470    }
30471    fn stable_ptr(&self) -> Self::StablePtr {
30472        TerminalDotDotEqPtr(self.node.0.stable_ptr)
30473    }
30474}
30475impl From<&TerminalDotDotEq> for SyntaxStablePtrId {
30476    fn from(node: &TerminalDotDotEq) -> Self {
30477        node.stable_ptr().untyped()
30478    }
30479}
30480#[derive(Clone, Debug, Eq, Hash, PartialEq)]
30481pub struct TokenEndOfFile {
30482    node: SyntaxNode,
30483}
30484impl Token for TokenEndOfFile {
30485    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
30486        TokenEndOfFileGreen(
30487            Arc::new(GreenNode {
30488                kind: SyntaxKind::TokenEndOfFile,
30489                details: GreenNodeDetails::Token(text),
30490            })
30491            .intern(db),
30492        )
30493    }
30494    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
30495        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
30496            .clone()
30497    }
30498}
30499#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
30500pub struct TokenEndOfFilePtr(pub SyntaxStablePtrId);
30501impl TypedStablePtr for TokenEndOfFilePtr {
30502    type SyntaxNode = TokenEndOfFile;
30503    fn untyped(&self) -> SyntaxStablePtrId {
30504        self.0
30505    }
30506    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenEndOfFile {
30507        TokenEndOfFile::from_syntax_node(db, self.0.lookup(db))
30508    }
30509}
30510impl From<TokenEndOfFilePtr> for SyntaxStablePtrId {
30511    fn from(ptr: TokenEndOfFilePtr) -> Self {
30512        ptr.untyped()
30513    }
30514}
30515#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
30516pub struct TokenEndOfFileGreen(pub GreenId);
30517impl TokenEndOfFileGreen {
30518    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
30519        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
30520    }
30521}
30522impl TypedSyntaxNode for TokenEndOfFile {
30523    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenEndOfFile);
30524    type StablePtr = TokenEndOfFilePtr;
30525    type Green = TokenEndOfFileGreen;
30526    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
30527        TokenEndOfFileGreen(
30528            Arc::new(GreenNode {
30529                kind: SyntaxKind::TokenMissing,
30530                details: GreenNodeDetails::Token("".into()),
30531            })
30532            .intern(db),
30533        )
30534    }
30535    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
30536        match node.0.green.lookup_intern(db).details {
30537            GreenNodeDetails::Token(_) => Self { node },
30538            GreenNodeDetails::Node { .. } => {
30539                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenEndOfFile)
30540            }
30541        }
30542    }
30543    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
30544        match node.0.green.lookup_intern(db).details {
30545            GreenNodeDetails::Token(_) => Some(Self { node }),
30546            GreenNodeDetails::Node { .. } => None,
30547        }
30548    }
30549    fn as_syntax_node(&self) -> SyntaxNode {
30550        self.node.clone()
30551    }
30552    fn stable_ptr(&self) -> Self::StablePtr {
30553        TokenEndOfFilePtr(self.node.0.stable_ptr)
30554    }
30555}
30556impl From<&TokenEndOfFile> for SyntaxStablePtrId {
30557    fn from(node: &TokenEndOfFile) -> Self {
30558        node.stable_ptr().untyped()
30559    }
30560}
30561#[derive(Clone, Debug, Eq, Hash, PartialEq)]
30562pub struct TerminalEndOfFile {
30563    node: SyntaxNode,
30564    children: Arc<[SyntaxNode]>,
30565}
30566impl Terminal for TerminalEndOfFile {
30567    const KIND: SyntaxKind = SyntaxKind::TerminalEndOfFile;
30568    type TokenType = TokenEndOfFile;
30569    fn new_green(
30570        db: &dyn SyntaxGroup,
30571        leading_trivia: TriviaGreen,
30572        token: <<TerminalEndOfFile as Terminal>::TokenType as TypedSyntaxNode>::Green,
30573        trailing_trivia: TriviaGreen,
30574    ) -> Self::Green {
30575        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
30576        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
30577        TerminalEndOfFileGreen(
30578            Arc::new(GreenNode {
30579                kind: SyntaxKind::TerminalEndOfFile,
30580                details: GreenNodeDetails::Node { children, width },
30581            })
30582            .intern(db),
30583        )
30584    }
30585    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
30586        self.token(db).text(db)
30587    }
30588}
30589impl TerminalEndOfFile {
30590    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
30591        Trivia::from_syntax_node(db, self.children[0].clone())
30592    }
30593    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenEndOfFile {
30594        TokenEndOfFile::from_syntax_node(db, self.children[1].clone())
30595    }
30596    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
30597        Trivia::from_syntax_node(db, self.children[2].clone())
30598    }
30599}
30600#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
30601pub struct TerminalEndOfFilePtr(pub SyntaxStablePtrId);
30602impl TerminalEndOfFilePtr {}
30603impl TypedStablePtr for TerminalEndOfFilePtr {
30604    type SyntaxNode = TerminalEndOfFile;
30605    fn untyped(&self) -> SyntaxStablePtrId {
30606        self.0
30607    }
30608    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalEndOfFile {
30609        TerminalEndOfFile::from_syntax_node(db, self.0.lookup(db))
30610    }
30611}
30612impl From<TerminalEndOfFilePtr> for SyntaxStablePtrId {
30613    fn from(ptr: TerminalEndOfFilePtr) -> Self {
30614        ptr.untyped()
30615    }
30616}
30617#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
30618pub struct TerminalEndOfFileGreen(pub GreenId);
30619impl TypedSyntaxNode for TerminalEndOfFile {
30620    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalEndOfFile);
30621    type StablePtr = TerminalEndOfFilePtr;
30622    type Green = TerminalEndOfFileGreen;
30623    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
30624        TerminalEndOfFileGreen(
30625            Arc::new(GreenNode {
30626                kind: SyntaxKind::TerminalEndOfFile,
30627                details: GreenNodeDetails::Node {
30628                    children: vec![
30629                        Trivia::missing(db).0,
30630                        TokenEndOfFile::missing(db).0,
30631                        Trivia::missing(db).0,
30632                    ],
30633                    width: TextWidth::default(),
30634                },
30635            })
30636            .intern(db),
30637        )
30638    }
30639    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
30640        let kind = node.kind(db);
30641        assert_eq!(
30642            kind,
30643            SyntaxKind::TerminalEndOfFile,
30644            "Unexpected SyntaxKind {:?}. Expected {:?}.",
30645            kind,
30646            SyntaxKind::TerminalEndOfFile
30647        );
30648        let children = db.get_children(node.clone());
30649        Self { node, children }
30650    }
30651    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
30652        let kind = node.kind(db);
30653        if kind == SyntaxKind::TerminalEndOfFile {
30654            Some(Self::from_syntax_node(db, node))
30655        } else {
30656            None
30657        }
30658    }
30659    fn as_syntax_node(&self) -> SyntaxNode {
30660        self.node.clone()
30661    }
30662    fn stable_ptr(&self) -> Self::StablePtr {
30663        TerminalEndOfFilePtr(self.node.0.stable_ptr)
30664    }
30665}
30666impl From<&TerminalEndOfFile> for SyntaxStablePtrId {
30667    fn from(node: &TerminalEndOfFile) -> Self {
30668        node.stable_ptr().untyped()
30669    }
30670}
30671#[derive(Clone, Debug, Eq, Hash, PartialEq)]
30672pub struct TokenEq {
30673    node: SyntaxNode,
30674}
30675impl Token for TokenEq {
30676    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
30677        TokenEqGreen(
30678            Arc::new(GreenNode {
30679                kind: SyntaxKind::TokenEq,
30680                details: GreenNodeDetails::Token(text),
30681            })
30682            .intern(db),
30683        )
30684    }
30685    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
30686        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
30687            .clone()
30688    }
30689}
30690#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
30691pub struct TokenEqPtr(pub SyntaxStablePtrId);
30692impl TypedStablePtr for TokenEqPtr {
30693    type SyntaxNode = TokenEq;
30694    fn untyped(&self) -> SyntaxStablePtrId {
30695        self.0
30696    }
30697    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenEq {
30698        TokenEq::from_syntax_node(db, self.0.lookup(db))
30699    }
30700}
30701impl From<TokenEqPtr> for SyntaxStablePtrId {
30702    fn from(ptr: TokenEqPtr) -> Self {
30703        ptr.untyped()
30704    }
30705}
30706#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
30707pub struct TokenEqGreen(pub GreenId);
30708impl TokenEqGreen {
30709    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
30710        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
30711    }
30712}
30713impl TypedSyntaxNode for TokenEq {
30714    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenEq);
30715    type StablePtr = TokenEqPtr;
30716    type Green = TokenEqGreen;
30717    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
30718        TokenEqGreen(
30719            Arc::new(GreenNode {
30720                kind: SyntaxKind::TokenMissing,
30721                details: GreenNodeDetails::Token("".into()),
30722            })
30723            .intern(db),
30724        )
30725    }
30726    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
30727        match node.0.green.lookup_intern(db).details {
30728            GreenNodeDetails::Token(_) => Self { node },
30729            GreenNodeDetails::Node { .. } => {
30730                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenEq)
30731            }
30732        }
30733    }
30734    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
30735        match node.0.green.lookup_intern(db).details {
30736            GreenNodeDetails::Token(_) => Some(Self { node }),
30737            GreenNodeDetails::Node { .. } => None,
30738        }
30739    }
30740    fn as_syntax_node(&self) -> SyntaxNode {
30741        self.node.clone()
30742    }
30743    fn stable_ptr(&self) -> Self::StablePtr {
30744        TokenEqPtr(self.node.0.stable_ptr)
30745    }
30746}
30747impl From<&TokenEq> for SyntaxStablePtrId {
30748    fn from(node: &TokenEq) -> Self {
30749        node.stable_ptr().untyped()
30750    }
30751}
30752#[derive(Clone, Debug, Eq, Hash, PartialEq)]
30753pub struct TerminalEq {
30754    node: SyntaxNode,
30755    children: Arc<[SyntaxNode]>,
30756}
30757impl Terminal for TerminalEq {
30758    const KIND: SyntaxKind = SyntaxKind::TerminalEq;
30759    type TokenType = TokenEq;
30760    fn new_green(
30761        db: &dyn SyntaxGroup,
30762        leading_trivia: TriviaGreen,
30763        token: <<TerminalEq as Terminal>::TokenType as TypedSyntaxNode>::Green,
30764        trailing_trivia: TriviaGreen,
30765    ) -> Self::Green {
30766        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
30767        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
30768        TerminalEqGreen(
30769            Arc::new(GreenNode {
30770                kind: SyntaxKind::TerminalEq,
30771                details: GreenNodeDetails::Node { children, width },
30772            })
30773            .intern(db),
30774        )
30775    }
30776    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
30777        self.token(db).text(db)
30778    }
30779}
30780impl TerminalEq {
30781    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
30782        Trivia::from_syntax_node(db, self.children[0].clone())
30783    }
30784    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenEq {
30785        TokenEq::from_syntax_node(db, self.children[1].clone())
30786    }
30787    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
30788        Trivia::from_syntax_node(db, self.children[2].clone())
30789    }
30790}
30791#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
30792pub struct TerminalEqPtr(pub SyntaxStablePtrId);
30793impl TerminalEqPtr {}
30794impl TypedStablePtr for TerminalEqPtr {
30795    type SyntaxNode = TerminalEq;
30796    fn untyped(&self) -> SyntaxStablePtrId {
30797        self.0
30798    }
30799    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalEq {
30800        TerminalEq::from_syntax_node(db, self.0.lookup(db))
30801    }
30802}
30803impl From<TerminalEqPtr> for SyntaxStablePtrId {
30804    fn from(ptr: TerminalEqPtr) -> Self {
30805        ptr.untyped()
30806    }
30807}
30808#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
30809pub struct TerminalEqGreen(pub GreenId);
30810impl TypedSyntaxNode for TerminalEq {
30811    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalEq);
30812    type StablePtr = TerminalEqPtr;
30813    type Green = TerminalEqGreen;
30814    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
30815        TerminalEqGreen(
30816            Arc::new(GreenNode {
30817                kind: SyntaxKind::TerminalEq,
30818                details: GreenNodeDetails::Node {
30819                    children: vec![
30820                        Trivia::missing(db).0,
30821                        TokenEq::missing(db).0,
30822                        Trivia::missing(db).0,
30823                    ],
30824                    width: TextWidth::default(),
30825                },
30826            })
30827            .intern(db),
30828        )
30829    }
30830    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
30831        let kind = node.kind(db);
30832        assert_eq!(
30833            kind,
30834            SyntaxKind::TerminalEq,
30835            "Unexpected SyntaxKind {:?}. Expected {:?}.",
30836            kind,
30837            SyntaxKind::TerminalEq
30838        );
30839        let children = db.get_children(node.clone());
30840        Self { node, children }
30841    }
30842    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
30843        let kind = node.kind(db);
30844        if kind == SyntaxKind::TerminalEq { Some(Self::from_syntax_node(db, node)) } else { None }
30845    }
30846    fn as_syntax_node(&self) -> SyntaxNode {
30847        self.node.clone()
30848    }
30849    fn stable_ptr(&self) -> Self::StablePtr {
30850        TerminalEqPtr(self.node.0.stable_ptr)
30851    }
30852}
30853impl From<&TerminalEq> for SyntaxStablePtrId {
30854    fn from(node: &TerminalEq) -> Self {
30855        node.stable_ptr().untyped()
30856    }
30857}
30858#[derive(Clone, Debug, Eq, Hash, PartialEq)]
30859pub struct TokenEqEq {
30860    node: SyntaxNode,
30861}
30862impl Token for TokenEqEq {
30863    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
30864        TokenEqEqGreen(
30865            Arc::new(GreenNode {
30866                kind: SyntaxKind::TokenEqEq,
30867                details: GreenNodeDetails::Token(text),
30868            })
30869            .intern(db),
30870        )
30871    }
30872    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
30873        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
30874            .clone()
30875    }
30876}
30877#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
30878pub struct TokenEqEqPtr(pub SyntaxStablePtrId);
30879impl TypedStablePtr for TokenEqEqPtr {
30880    type SyntaxNode = TokenEqEq;
30881    fn untyped(&self) -> SyntaxStablePtrId {
30882        self.0
30883    }
30884    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenEqEq {
30885        TokenEqEq::from_syntax_node(db, self.0.lookup(db))
30886    }
30887}
30888impl From<TokenEqEqPtr> for SyntaxStablePtrId {
30889    fn from(ptr: TokenEqEqPtr) -> Self {
30890        ptr.untyped()
30891    }
30892}
30893#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
30894pub struct TokenEqEqGreen(pub GreenId);
30895impl TokenEqEqGreen {
30896    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
30897        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
30898    }
30899}
30900impl TypedSyntaxNode for TokenEqEq {
30901    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenEqEq);
30902    type StablePtr = TokenEqEqPtr;
30903    type Green = TokenEqEqGreen;
30904    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
30905        TokenEqEqGreen(
30906            Arc::new(GreenNode {
30907                kind: SyntaxKind::TokenMissing,
30908                details: GreenNodeDetails::Token("".into()),
30909            })
30910            .intern(db),
30911        )
30912    }
30913    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
30914        match node.0.green.lookup_intern(db).details {
30915            GreenNodeDetails::Token(_) => Self { node },
30916            GreenNodeDetails::Node { .. } => {
30917                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenEqEq)
30918            }
30919        }
30920    }
30921    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
30922        match node.0.green.lookup_intern(db).details {
30923            GreenNodeDetails::Token(_) => Some(Self { node }),
30924            GreenNodeDetails::Node { .. } => None,
30925        }
30926    }
30927    fn as_syntax_node(&self) -> SyntaxNode {
30928        self.node.clone()
30929    }
30930    fn stable_ptr(&self) -> Self::StablePtr {
30931        TokenEqEqPtr(self.node.0.stable_ptr)
30932    }
30933}
30934impl From<&TokenEqEq> for SyntaxStablePtrId {
30935    fn from(node: &TokenEqEq) -> Self {
30936        node.stable_ptr().untyped()
30937    }
30938}
30939#[derive(Clone, Debug, Eq, Hash, PartialEq)]
30940pub struct TerminalEqEq {
30941    node: SyntaxNode,
30942    children: Arc<[SyntaxNode]>,
30943}
30944impl Terminal for TerminalEqEq {
30945    const KIND: SyntaxKind = SyntaxKind::TerminalEqEq;
30946    type TokenType = TokenEqEq;
30947    fn new_green(
30948        db: &dyn SyntaxGroup,
30949        leading_trivia: TriviaGreen,
30950        token: <<TerminalEqEq as Terminal>::TokenType as TypedSyntaxNode>::Green,
30951        trailing_trivia: TriviaGreen,
30952    ) -> Self::Green {
30953        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
30954        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
30955        TerminalEqEqGreen(
30956            Arc::new(GreenNode {
30957                kind: SyntaxKind::TerminalEqEq,
30958                details: GreenNodeDetails::Node { children, width },
30959            })
30960            .intern(db),
30961        )
30962    }
30963    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
30964        self.token(db).text(db)
30965    }
30966}
30967impl TerminalEqEq {
30968    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
30969        Trivia::from_syntax_node(db, self.children[0].clone())
30970    }
30971    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenEqEq {
30972        TokenEqEq::from_syntax_node(db, self.children[1].clone())
30973    }
30974    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
30975        Trivia::from_syntax_node(db, self.children[2].clone())
30976    }
30977}
30978#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
30979pub struct TerminalEqEqPtr(pub SyntaxStablePtrId);
30980impl TerminalEqEqPtr {}
30981impl TypedStablePtr for TerminalEqEqPtr {
30982    type SyntaxNode = TerminalEqEq;
30983    fn untyped(&self) -> SyntaxStablePtrId {
30984        self.0
30985    }
30986    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalEqEq {
30987        TerminalEqEq::from_syntax_node(db, self.0.lookup(db))
30988    }
30989}
30990impl From<TerminalEqEqPtr> for SyntaxStablePtrId {
30991    fn from(ptr: TerminalEqEqPtr) -> Self {
30992        ptr.untyped()
30993    }
30994}
30995#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
30996pub struct TerminalEqEqGreen(pub GreenId);
30997impl TypedSyntaxNode for TerminalEqEq {
30998    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalEqEq);
30999    type StablePtr = TerminalEqEqPtr;
31000    type Green = TerminalEqEqGreen;
31001    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
31002        TerminalEqEqGreen(
31003            Arc::new(GreenNode {
31004                kind: SyntaxKind::TerminalEqEq,
31005                details: GreenNodeDetails::Node {
31006                    children: vec![
31007                        Trivia::missing(db).0,
31008                        TokenEqEq::missing(db).0,
31009                        Trivia::missing(db).0,
31010                    ],
31011                    width: TextWidth::default(),
31012                },
31013            })
31014            .intern(db),
31015        )
31016    }
31017    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
31018        let kind = node.kind(db);
31019        assert_eq!(
31020            kind,
31021            SyntaxKind::TerminalEqEq,
31022            "Unexpected SyntaxKind {:?}. Expected {:?}.",
31023            kind,
31024            SyntaxKind::TerminalEqEq
31025        );
31026        let children = db.get_children(node.clone());
31027        Self { node, children }
31028    }
31029    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
31030        let kind = node.kind(db);
31031        if kind == SyntaxKind::TerminalEqEq { Some(Self::from_syntax_node(db, node)) } else { None }
31032    }
31033    fn as_syntax_node(&self) -> SyntaxNode {
31034        self.node.clone()
31035    }
31036    fn stable_ptr(&self) -> Self::StablePtr {
31037        TerminalEqEqPtr(self.node.0.stable_ptr)
31038    }
31039}
31040impl From<&TerminalEqEq> for SyntaxStablePtrId {
31041    fn from(node: &TerminalEqEq) -> Self {
31042        node.stable_ptr().untyped()
31043    }
31044}
31045#[derive(Clone, Debug, Eq, Hash, PartialEq)]
31046pub struct TokenGE {
31047    node: SyntaxNode,
31048}
31049impl Token for TokenGE {
31050    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
31051        TokenGEGreen(
31052            Arc::new(GreenNode {
31053                kind: SyntaxKind::TokenGE,
31054                details: GreenNodeDetails::Token(text),
31055            })
31056            .intern(db),
31057        )
31058    }
31059    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
31060        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
31061            .clone()
31062    }
31063}
31064#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
31065pub struct TokenGEPtr(pub SyntaxStablePtrId);
31066impl TypedStablePtr for TokenGEPtr {
31067    type SyntaxNode = TokenGE;
31068    fn untyped(&self) -> SyntaxStablePtrId {
31069        self.0
31070    }
31071    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenGE {
31072        TokenGE::from_syntax_node(db, self.0.lookup(db))
31073    }
31074}
31075impl From<TokenGEPtr> for SyntaxStablePtrId {
31076    fn from(ptr: TokenGEPtr) -> Self {
31077        ptr.untyped()
31078    }
31079}
31080#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
31081pub struct TokenGEGreen(pub GreenId);
31082impl TokenGEGreen {
31083    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
31084        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
31085    }
31086}
31087impl TypedSyntaxNode for TokenGE {
31088    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenGE);
31089    type StablePtr = TokenGEPtr;
31090    type Green = TokenGEGreen;
31091    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
31092        TokenGEGreen(
31093            Arc::new(GreenNode {
31094                kind: SyntaxKind::TokenMissing,
31095                details: GreenNodeDetails::Token("".into()),
31096            })
31097            .intern(db),
31098        )
31099    }
31100    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
31101        match node.0.green.lookup_intern(db).details {
31102            GreenNodeDetails::Token(_) => Self { node },
31103            GreenNodeDetails::Node { .. } => {
31104                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenGE)
31105            }
31106        }
31107    }
31108    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
31109        match node.0.green.lookup_intern(db).details {
31110            GreenNodeDetails::Token(_) => Some(Self { node }),
31111            GreenNodeDetails::Node { .. } => None,
31112        }
31113    }
31114    fn as_syntax_node(&self) -> SyntaxNode {
31115        self.node.clone()
31116    }
31117    fn stable_ptr(&self) -> Self::StablePtr {
31118        TokenGEPtr(self.node.0.stable_ptr)
31119    }
31120}
31121impl From<&TokenGE> for SyntaxStablePtrId {
31122    fn from(node: &TokenGE) -> Self {
31123        node.stable_ptr().untyped()
31124    }
31125}
31126#[derive(Clone, Debug, Eq, Hash, PartialEq)]
31127pub struct TerminalGE {
31128    node: SyntaxNode,
31129    children: Arc<[SyntaxNode]>,
31130}
31131impl Terminal for TerminalGE {
31132    const KIND: SyntaxKind = SyntaxKind::TerminalGE;
31133    type TokenType = TokenGE;
31134    fn new_green(
31135        db: &dyn SyntaxGroup,
31136        leading_trivia: TriviaGreen,
31137        token: <<TerminalGE as Terminal>::TokenType as TypedSyntaxNode>::Green,
31138        trailing_trivia: TriviaGreen,
31139    ) -> Self::Green {
31140        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
31141        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
31142        TerminalGEGreen(
31143            Arc::new(GreenNode {
31144                kind: SyntaxKind::TerminalGE,
31145                details: GreenNodeDetails::Node { children, width },
31146            })
31147            .intern(db),
31148        )
31149    }
31150    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
31151        self.token(db).text(db)
31152    }
31153}
31154impl TerminalGE {
31155    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
31156        Trivia::from_syntax_node(db, self.children[0].clone())
31157    }
31158    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenGE {
31159        TokenGE::from_syntax_node(db, self.children[1].clone())
31160    }
31161    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
31162        Trivia::from_syntax_node(db, self.children[2].clone())
31163    }
31164}
31165#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
31166pub struct TerminalGEPtr(pub SyntaxStablePtrId);
31167impl TerminalGEPtr {}
31168impl TypedStablePtr for TerminalGEPtr {
31169    type SyntaxNode = TerminalGE;
31170    fn untyped(&self) -> SyntaxStablePtrId {
31171        self.0
31172    }
31173    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalGE {
31174        TerminalGE::from_syntax_node(db, self.0.lookup(db))
31175    }
31176}
31177impl From<TerminalGEPtr> for SyntaxStablePtrId {
31178    fn from(ptr: TerminalGEPtr) -> Self {
31179        ptr.untyped()
31180    }
31181}
31182#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
31183pub struct TerminalGEGreen(pub GreenId);
31184impl TypedSyntaxNode for TerminalGE {
31185    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalGE);
31186    type StablePtr = TerminalGEPtr;
31187    type Green = TerminalGEGreen;
31188    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
31189        TerminalGEGreen(
31190            Arc::new(GreenNode {
31191                kind: SyntaxKind::TerminalGE,
31192                details: GreenNodeDetails::Node {
31193                    children: vec![
31194                        Trivia::missing(db).0,
31195                        TokenGE::missing(db).0,
31196                        Trivia::missing(db).0,
31197                    ],
31198                    width: TextWidth::default(),
31199                },
31200            })
31201            .intern(db),
31202        )
31203    }
31204    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
31205        let kind = node.kind(db);
31206        assert_eq!(
31207            kind,
31208            SyntaxKind::TerminalGE,
31209            "Unexpected SyntaxKind {:?}. Expected {:?}.",
31210            kind,
31211            SyntaxKind::TerminalGE
31212        );
31213        let children = db.get_children(node.clone());
31214        Self { node, children }
31215    }
31216    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
31217        let kind = node.kind(db);
31218        if kind == SyntaxKind::TerminalGE { Some(Self::from_syntax_node(db, node)) } else { None }
31219    }
31220    fn as_syntax_node(&self) -> SyntaxNode {
31221        self.node.clone()
31222    }
31223    fn stable_ptr(&self) -> Self::StablePtr {
31224        TerminalGEPtr(self.node.0.stable_ptr)
31225    }
31226}
31227impl From<&TerminalGE> for SyntaxStablePtrId {
31228    fn from(node: &TerminalGE) -> Self {
31229        node.stable_ptr().untyped()
31230    }
31231}
31232#[derive(Clone, Debug, Eq, Hash, PartialEq)]
31233pub struct TokenGT {
31234    node: SyntaxNode,
31235}
31236impl Token for TokenGT {
31237    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
31238        TokenGTGreen(
31239            Arc::new(GreenNode {
31240                kind: SyntaxKind::TokenGT,
31241                details: GreenNodeDetails::Token(text),
31242            })
31243            .intern(db),
31244        )
31245    }
31246    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
31247        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
31248            .clone()
31249    }
31250}
31251#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
31252pub struct TokenGTPtr(pub SyntaxStablePtrId);
31253impl TypedStablePtr for TokenGTPtr {
31254    type SyntaxNode = TokenGT;
31255    fn untyped(&self) -> SyntaxStablePtrId {
31256        self.0
31257    }
31258    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenGT {
31259        TokenGT::from_syntax_node(db, self.0.lookup(db))
31260    }
31261}
31262impl From<TokenGTPtr> for SyntaxStablePtrId {
31263    fn from(ptr: TokenGTPtr) -> Self {
31264        ptr.untyped()
31265    }
31266}
31267#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
31268pub struct TokenGTGreen(pub GreenId);
31269impl TokenGTGreen {
31270    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
31271        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
31272    }
31273}
31274impl TypedSyntaxNode for TokenGT {
31275    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenGT);
31276    type StablePtr = TokenGTPtr;
31277    type Green = TokenGTGreen;
31278    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
31279        TokenGTGreen(
31280            Arc::new(GreenNode {
31281                kind: SyntaxKind::TokenMissing,
31282                details: GreenNodeDetails::Token("".into()),
31283            })
31284            .intern(db),
31285        )
31286    }
31287    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
31288        match node.0.green.lookup_intern(db).details {
31289            GreenNodeDetails::Token(_) => Self { node },
31290            GreenNodeDetails::Node { .. } => {
31291                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenGT)
31292            }
31293        }
31294    }
31295    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
31296        match node.0.green.lookup_intern(db).details {
31297            GreenNodeDetails::Token(_) => Some(Self { node }),
31298            GreenNodeDetails::Node { .. } => None,
31299        }
31300    }
31301    fn as_syntax_node(&self) -> SyntaxNode {
31302        self.node.clone()
31303    }
31304    fn stable_ptr(&self) -> Self::StablePtr {
31305        TokenGTPtr(self.node.0.stable_ptr)
31306    }
31307}
31308impl From<&TokenGT> for SyntaxStablePtrId {
31309    fn from(node: &TokenGT) -> Self {
31310        node.stable_ptr().untyped()
31311    }
31312}
31313#[derive(Clone, Debug, Eq, Hash, PartialEq)]
31314pub struct TerminalGT {
31315    node: SyntaxNode,
31316    children: Arc<[SyntaxNode]>,
31317}
31318impl Terminal for TerminalGT {
31319    const KIND: SyntaxKind = SyntaxKind::TerminalGT;
31320    type TokenType = TokenGT;
31321    fn new_green(
31322        db: &dyn SyntaxGroup,
31323        leading_trivia: TriviaGreen,
31324        token: <<TerminalGT as Terminal>::TokenType as TypedSyntaxNode>::Green,
31325        trailing_trivia: TriviaGreen,
31326    ) -> Self::Green {
31327        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
31328        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
31329        TerminalGTGreen(
31330            Arc::new(GreenNode {
31331                kind: SyntaxKind::TerminalGT,
31332                details: GreenNodeDetails::Node { children, width },
31333            })
31334            .intern(db),
31335        )
31336    }
31337    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
31338        self.token(db).text(db)
31339    }
31340}
31341impl TerminalGT {
31342    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
31343        Trivia::from_syntax_node(db, self.children[0].clone())
31344    }
31345    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenGT {
31346        TokenGT::from_syntax_node(db, self.children[1].clone())
31347    }
31348    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
31349        Trivia::from_syntax_node(db, self.children[2].clone())
31350    }
31351}
31352#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
31353pub struct TerminalGTPtr(pub SyntaxStablePtrId);
31354impl TerminalGTPtr {}
31355impl TypedStablePtr for TerminalGTPtr {
31356    type SyntaxNode = TerminalGT;
31357    fn untyped(&self) -> SyntaxStablePtrId {
31358        self.0
31359    }
31360    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalGT {
31361        TerminalGT::from_syntax_node(db, self.0.lookup(db))
31362    }
31363}
31364impl From<TerminalGTPtr> for SyntaxStablePtrId {
31365    fn from(ptr: TerminalGTPtr) -> Self {
31366        ptr.untyped()
31367    }
31368}
31369#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
31370pub struct TerminalGTGreen(pub GreenId);
31371impl TypedSyntaxNode for TerminalGT {
31372    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalGT);
31373    type StablePtr = TerminalGTPtr;
31374    type Green = TerminalGTGreen;
31375    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
31376        TerminalGTGreen(
31377            Arc::new(GreenNode {
31378                kind: SyntaxKind::TerminalGT,
31379                details: GreenNodeDetails::Node {
31380                    children: vec![
31381                        Trivia::missing(db).0,
31382                        TokenGT::missing(db).0,
31383                        Trivia::missing(db).0,
31384                    ],
31385                    width: TextWidth::default(),
31386                },
31387            })
31388            .intern(db),
31389        )
31390    }
31391    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
31392        let kind = node.kind(db);
31393        assert_eq!(
31394            kind,
31395            SyntaxKind::TerminalGT,
31396            "Unexpected SyntaxKind {:?}. Expected {:?}.",
31397            kind,
31398            SyntaxKind::TerminalGT
31399        );
31400        let children = db.get_children(node.clone());
31401        Self { node, children }
31402    }
31403    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
31404        let kind = node.kind(db);
31405        if kind == SyntaxKind::TerminalGT { Some(Self::from_syntax_node(db, node)) } else { None }
31406    }
31407    fn as_syntax_node(&self) -> SyntaxNode {
31408        self.node.clone()
31409    }
31410    fn stable_ptr(&self) -> Self::StablePtr {
31411        TerminalGTPtr(self.node.0.stable_ptr)
31412    }
31413}
31414impl From<&TerminalGT> for SyntaxStablePtrId {
31415    fn from(node: &TerminalGT) -> Self {
31416        node.stable_ptr().untyped()
31417    }
31418}
31419#[derive(Clone, Debug, Eq, Hash, PartialEq)]
31420pub struct TokenHash {
31421    node: SyntaxNode,
31422}
31423impl Token for TokenHash {
31424    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
31425        TokenHashGreen(
31426            Arc::new(GreenNode {
31427                kind: SyntaxKind::TokenHash,
31428                details: GreenNodeDetails::Token(text),
31429            })
31430            .intern(db),
31431        )
31432    }
31433    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
31434        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
31435            .clone()
31436    }
31437}
31438#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
31439pub struct TokenHashPtr(pub SyntaxStablePtrId);
31440impl TypedStablePtr for TokenHashPtr {
31441    type SyntaxNode = TokenHash;
31442    fn untyped(&self) -> SyntaxStablePtrId {
31443        self.0
31444    }
31445    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenHash {
31446        TokenHash::from_syntax_node(db, self.0.lookup(db))
31447    }
31448}
31449impl From<TokenHashPtr> for SyntaxStablePtrId {
31450    fn from(ptr: TokenHashPtr) -> Self {
31451        ptr.untyped()
31452    }
31453}
31454#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
31455pub struct TokenHashGreen(pub GreenId);
31456impl TokenHashGreen {
31457    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
31458        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
31459    }
31460}
31461impl TypedSyntaxNode for TokenHash {
31462    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenHash);
31463    type StablePtr = TokenHashPtr;
31464    type Green = TokenHashGreen;
31465    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
31466        TokenHashGreen(
31467            Arc::new(GreenNode {
31468                kind: SyntaxKind::TokenMissing,
31469                details: GreenNodeDetails::Token("".into()),
31470            })
31471            .intern(db),
31472        )
31473    }
31474    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
31475        match node.0.green.lookup_intern(db).details {
31476            GreenNodeDetails::Token(_) => Self { node },
31477            GreenNodeDetails::Node { .. } => {
31478                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenHash)
31479            }
31480        }
31481    }
31482    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
31483        match node.0.green.lookup_intern(db).details {
31484            GreenNodeDetails::Token(_) => Some(Self { node }),
31485            GreenNodeDetails::Node { .. } => None,
31486        }
31487    }
31488    fn as_syntax_node(&self) -> SyntaxNode {
31489        self.node.clone()
31490    }
31491    fn stable_ptr(&self) -> Self::StablePtr {
31492        TokenHashPtr(self.node.0.stable_ptr)
31493    }
31494}
31495impl From<&TokenHash> for SyntaxStablePtrId {
31496    fn from(node: &TokenHash) -> Self {
31497        node.stable_ptr().untyped()
31498    }
31499}
31500#[derive(Clone, Debug, Eq, Hash, PartialEq)]
31501pub struct TerminalHash {
31502    node: SyntaxNode,
31503    children: Arc<[SyntaxNode]>,
31504}
31505impl Terminal for TerminalHash {
31506    const KIND: SyntaxKind = SyntaxKind::TerminalHash;
31507    type TokenType = TokenHash;
31508    fn new_green(
31509        db: &dyn SyntaxGroup,
31510        leading_trivia: TriviaGreen,
31511        token: <<TerminalHash as Terminal>::TokenType as TypedSyntaxNode>::Green,
31512        trailing_trivia: TriviaGreen,
31513    ) -> Self::Green {
31514        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
31515        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
31516        TerminalHashGreen(
31517            Arc::new(GreenNode {
31518                kind: SyntaxKind::TerminalHash,
31519                details: GreenNodeDetails::Node { children, width },
31520            })
31521            .intern(db),
31522        )
31523    }
31524    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
31525        self.token(db).text(db)
31526    }
31527}
31528impl TerminalHash {
31529    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
31530        Trivia::from_syntax_node(db, self.children[0].clone())
31531    }
31532    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenHash {
31533        TokenHash::from_syntax_node(db, self.children[1].clone())
31534    }
31535    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
31536        Trivia::from_syntax_node(db, self.children[2].clone())
31537    }
31538}
31539#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
31540pub struct TerminalHashPtr(pub SyntaxStablePtrId);
31541impl TerminalHashPtr {}
31542impl TypedStablePtr for TerminalHashPtr {
31543    type SyntaxNode = TerminalHash;
31544    fn untyped(&self) -> SyntaxStablePtrId {
31545        self.0
31546    }
31547    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalHash {
31548        TerminalHash::from_syntax_node(db, self.0.lookup(db))
31549    }
31550}
31551impl From<TerminalHashPtr> for SyntaxStablePtrId {
31552    fn from(ptr: TerminalHashPtr) -> Self {
31553        ptr.untyped()
31554    }
31555}
31556#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
31557pub struct TerminalHashGreen(pub GreenId);
31558impl TypedSyntaxNode for TerminalHash {
31559    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalHash);
31560    type StablePtr = TerminalHashPtr;
31561    type Green = TerminalHashGreen;
31562    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
31563        TerminalHashGreen(
31564            Arc::new(GreenNode {
31565                kind: SyntaxKind::TerminalHash,
31566                details: GreenNodeDetails::Node {
31567                    children: vec![
31568                        Trivia::missing(db).0,
31569                        TokenHash::missing(db).0,
31570                        Trivia::missing(db).0,
31571                    ],
31572                    width: TextWidth::default(),
31573                },
31574            })
31575            .intern(db),
31576        )
31577    }
31578    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
31579        let kind = node.kind(db);
31580        assert_eq!(
31581            kind,
31582            SyntaxKind::TerminalHash,
31583            "Unexpected SyntaxKind {:?}. Expected {:?}.",
31584            kind,
31585            SyntaxKind::TerminalHash
31586        );
31587        let children = db.get_children(node.clone());
31588        Self { node, children }
31589    }
31590    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
31591        let kind = node.kind(db);
31592        if kind == SyntaxKind::TerminalHash { Some(Self::from_syntax_node(db, node)) } else { None }
31593    }
31594    fn as_syntax_node(&self) -> SyntaxNode {
31595        self.node.clone()
31596    }
31597    fn stable_ptr(&self) -> Self::StablePtr {
31598        TerminalHashPtr(self.node.0.stable_ptr)
31599    }
31600}
31601impl From<&TerminalHash> for SyntaxStablePtrId {
31602    fn from(node: &TerminalHash) -> Self {
31603        node.stable_ptr().untyped()
31604    }
31605}
31606#[derive(Clone, Debug, Eq, Hash, PartialEq)]
31607pub struct TokenLBrace {
31608    node: SyntaxNode,
31609}
31610impl Token for TokenLBrace {
31611    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
31612        TokenLBraceGreen(
31613            Arc::new(GreenNode {
31614                kind: SyntaxKind::TokenLBrace,
31615                details: GreenNodeDetails::Token(text),
31616            })
31617            .intern(db),
31618        )
31619    }
31620    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
31621        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
31622            .clone()
31623    }
31624}
31625#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
31626pub struct TokenLBracePtr(pub SyntaxStablePtrId);
31627impl TypedStablePtr for TokenLBracePtr {
31628    type SyntaxNode = TokenLBrace;
31629    fn untyped(&self) -> SyntaxStablePtrId {
31630        self.0
31631    }
31632    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenLBrace {
31633        TokenLBrace::from_syntax_node(db, self.0.lookup(db))
31634    }
31635}
31636impl From<TokenLBracePtr> for SyntaxStablePtrId {
31637    fn from(ptr: TokenLBracePtr) -> Self {
31638        ptr.untyped()
31639    }
31640}
31641#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
31642pub struct TokenLBraceGreen(pub GreenId);
31643impl TokenLBraceGreen {
31644    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
31645        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
31646    }
31647}
31648impl TypedSyntaxNode for TokenLBrace {
31649    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenLBrace);
31650    type StablePtr = TokenLBracePtr;
31651    type Green = TokenLBraceGreen;
31652    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
31653        TokenLBraceGreen(
31654            Arc::new(GreenNode {
31655                kind: SyntaxKind::TokenMissing,
31656                details: GreenNodeDetails::Token("".into()),
31657            })
31658            .intern(db),
31659        )
31660    }
31661    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
31662        match node.0.green.lookup_intern(db).details {
31663            GreenNodeDetails::Token(_) => Self { node },
31664            GreenNodeDetails::Node { .. } => {
31665                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenLBrace)
31666            }
31667        }
31668    }
31669    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
31670        match node.0.green.lookup_intern(db).details {
31671            GreenNodeDetails::Token(_) => Some(Self { node }),
31672            GreenNodeDetails::Node { .. } => None,
31673        }
31674    }
31675    fn as_syntax_node(&self) -> SyntaxNode {
31676        self.node.clone()
31677    }
31678    fn stable_ptr(&self) -> Self::StablePtr {
31679        TokenLBracePtr(self.node.0.stable_ptr)
31680    }
31681}
31682impl From<&TokenLBrace> for SyntaxStablePtrId {
31683    fn from(node: &TokenLBrace) -> Self {
31684        node.stable_ptr().untyped()
31685    }
31686}
31687#[derive(Clone, Debug, Eq, Hash, PartialEq)]
31688pub struct TerminalLBrace {
31689    node: SyntaxNode,
31690    children: Arc<[SyntaxNode]>,
31691}
31692impl Terminal for TerminalLBrace {
31693    const KIND: SyntaxKind = SyntaxKind::TerminalLBrace;
31694    type TokenType = TokenLBrace;
31695    fn new_green(
31696        db: &dyn SyntaxGroup,
31697        leading_trivia: TriviaGreen,
31698        token: <<TerminalLBrace as Terminal>::TokenType as TypedSyntaxNode>::Green,
31699        trailing_trivia: TriviaGreen,
31700    ) -> Self::Green {
31701        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
31702        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
31703        TerminalLBraceGreen(
31704            Arc::new(GreenNode {
31705                kind: SyntaxKind::TerminalLBrace,
31706                details: GreenNodeDetails::Node { children, width },
31707            })
31708            .intern(db),
31709        )
31710    }
31711    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
31712        self.token(db).text(db)
31713    }
31714}
31715impl TerminalLBrace {
31716    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
31717        Trivia::from_syntax_node(db, self.children[0].clone())
31718    }
31719    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenLBrace {
31720        TokenLBrace::from_syntax_node(db, self.children[1].clone())
31721    }
31722    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
31723        Trivia::from_syntax_node(db, self.children[2].clone())
31724    }
31725}
31726#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
31727pub struct TerminalLBracePtr(pub SyntaxStablePtrId);
31728impl TerminalLBracePtr {}
31729impl TypedStablePtr for TerminalLBracePtr {
31730    type SyntaxNode = TerminalLBrace;
31731    fn untyped(&self) -> SyntaxStablePtrId {
31732        self.0
31733    }
31734    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalLBrace {
31735        TerminalLBrace::from_syntax_node(db, self.0.lookup(db))
31736    }
31737}
31738impl From<TerminalLBracePtr> for SyntaxStablePtrId {
31739    fn from(ptr: TerminalLBracePtr) -> Self {
31740        ptr.untyped()
31741    }
31742}
31743#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
31744pub struct TerminalLBraceGreen(pub GreenId);
31745impl TypedSyntaxNode for TerminalLBrace {
31746    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalLBrace);
31747    type StablePtr = TerminalLBracePtr;
31748    type Green = TerminalLBraceGreen;
31749    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
31750        TerminalLBraceGreen(
31751            Arc::new(GreenNode {
31752                kind: SyntaxKind::TerminalLBrace,
31753                details: GreenNodeDetails::Node {
31754                    children: vec![
31755                        Trivia::missing(db).0,
31756                        TokenLBrace::missing(db).0,
31757                        Trivia::missing(db).0,
31758                    ],
31759                    width: TextWidth::default(),
31760                },
31761            })
31762            .intern(db),
31763        )
31764    }
31765    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
31766        let kind = node.kind(db);
31767        assert_eq!(
31768            kind,
31769            SyntaxKind::TerminalLBrace,
31770            "Unexpected SyntaxKind {:?}. Expected {:?}.",
31771            kind,
31772            SyntaxKind::TerminalLBrace
31773        );
31774        let children = db.get_children(node.clone());
31775        Self { node, children }
31776    }
31777    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
31778        let kind = node.kind(db);
31779        if kind == SyntaxKind::TerminalLBrace {
31780            Some(Self::from_syntax_node(db, node))
31781        } else {
31782            None
31783        }
31784    }
31785    fn as_syntax_node(&self) -> SyntaxNode {
31786        self.node.clone()
31787    }
31788    fn stable_ptr(&self) -> Self::StablePtr {
31789        TerminalLBracePtr(self.node.0.stable_ptr)
31790    }
31791}
31792impl From<&TerminalLBrace> for SyntaxStablePtrId {
31793    fn from(node: &TerminalLBrace) -> Self {
31794        node.stable_ptr().untyped()
31795    }
31796}
31797#[derive(Clone, Debug, Eq, Hash, PartialEq)]
31798pub struct TokenLBrack {
31799    node: SyntaxNode,
31800}
31801impl Token for TokenLBrack {
31802    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
31803        TokenLBrackGreen(
31804            Arc::new(GreenNode {
31805                kind: SyntaxKind::TokenLBrack,
31806                details: GreenNodeDetails::Token(text),
31807            })
31808            .intern(db),
31809        )
31810    }
31811    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
31812        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
31813            .clone()
31814    }
31815}
31816#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
31817pub struct TokenLBrackPtr(pub SyntaxStablePtrId);
31818impl TypedStablePtr for TokenLBrackPtr {
31819    type SyntaxNode = TokenLBrack;
31820    fn untyped(&self) -> SyntaxStablePtrId {
31821        self.0
31822    }
31823    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenLBrack {
31824        TokenLBrack::from_syntax_node(db, self.0.lookup(db))
31825    }
31826}
31827impl From<TokenLBrackPtr> for SyntaxStablePtrId {
31828    fn from(ptr: TokenLBrackPtr) -> Self {
31829        ptr.untyped()
31830    }
31831}
31832#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
31833pub struct TokenLBrackGreen(pub GreenId);
31834impl TokenLBrackGreen {
31835    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
31836        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
31837    }
31838}
31839impl TypedSyntaxNode for TokenLBrack {
31840    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenLBrack);
31841    type StablePtr = TokenLBrackPtr;
31842    type Green = TokenLBrackGreen;
31843    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
31844        TokenLBrackGreen(
31845            Arc::new(GreenNode {
31846                kind: SyntaxKind::TokenMissing,
31847                details: GreenNodeDetails::Token("".into()),
31848            })
31849            .intern(db),
31850        )
31851    }
31852    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
31853        match node.0.green.lookup_intern(db).details {
31854            GreenNodeDetails::Token(_) => Self { node },
31855            GreenNodeDetails::Node { .. } => {
31856                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenLBrack)
31857            }
31858        }
31859    }
31860    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
31861        match node.0.green.lookup_intern(db).details {
31862            GreenNodeDetails::Token(_) => Some(Self { node }),
31863            GreenNodeDetails::Node { .. } => None,
31864        }
31865    }
31866    fn as_syntax_node(&self) -> SyntaxNode {
31867        self.node.clone()
31868    }
31869    fn stable_ptr(&self) -> Self::StablePtr {
31870        TokenLBrackPtr(self.node.0.stable_ptr)
31871    }
31872}
31873impl From<&TokenLBrack> for SyntaxStablePtrId {
31874    fn from(node: &TokenLBrack) -> Self {
31875        node.stable_ptr().untyped()
31876    }
31877}
31878#[derive(Clone, Debug, Eq, Hash, PartialEq)]
31879pub struct TerminalLBrack {
31880    node: SyntaxNode,
31881    children: Arc<[SyntaxNode]>,
31882}
31883impl Terminal for TerminalLBrack {
31884    const KIND: SyntaxKind = SyntaxKind::TerminalLBrack;
31885    type TokenType = TokenLBrack;
31886    fn new_green(
31887        db: &dyn SyntaxGroup,
31888        leading_trivia: TriviaGreen,
31889        token: <<TerminalLBrack as Terminal>::TokenType as TypedSyntaxNode>::Green,
31890        trailing_trivia: TriviaGreen,
31891    ) -> Self::Green {
31892        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
31893        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
31894        TerminalLBrackGreen(
31895            Arc::new(GreenNode {
31896                kind: SyntaxKind::TerminalLBrack,
31897                details: GreenNodeDetails::Node { children, width },
31898            })
31899            .intern(db),
31900        )
31901    }
31902    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
31903        self.token(db).text(db)
31904    }
31905}
31906impl TerminalLBrack {
31907    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
31908        Trivia::from_syntax_node(db, self.children[0].clone())
31909    }
31910    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenLBrack {
31911        TokenLBrack::from_syntax_node(db, self.children[1].clone())
31912    }
31913    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
31914        Trivia::from_syntax_node(db, self.children[2].clone())
31915    }
31916}
31917#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
31918pub struct TerminalLBrackPtr(pub SyntaxStablePtrId);
31919impl TerminalLBrackPtr {}
31920impl TypedStablePtr for TerminalLBrackPtr {
31921    type SyntaxNode = TerminalLBrack;
31922    fn untyped(&self) -> SyntaxStablePtrId {
31923        self.0
31924    }
31925    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalLBrack {
31926        TerminalLBrack::from_syntax_node(db, self.0.lookup(db))
31927    }
31928}
31929impl From<TerminalLBrackPtr> for SyntaxStablePtrId {
31930    fn from(ptr: TerminalLBrackPtr) -> Self {
31931        ptr.untyped()
31932    }
31933}
31934#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
31935pub struct TerminalLBrackGreen(pub GreenId);
31936impl TypedSyntaxNode for TerminalLBrack {
31937    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalLBrack);
31938    type StablePtr = TerminalLBrackPtr;
31939    type Green = TerminalLBrackGreen;
31940    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
31941        TerminalLBrackGreen(
31942            Arc::new(GreenNode {
31943                kind: SyntaxKind::TerminalLBrack,
31944                details: GreenNodeDetails::Node {
31945                    children: vec![
31946                        Trivia::missing(db).0,
31947                        TokenLBrack::missing(db).0,
31948                        Trivia::missing(db).0,
31949                    ],
31950                    width: TextWidth::default(),
31951                },
31952            })
31953            .intern(db),
31954        )
31955    }
31956    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
31957        let kind = node.kind(db);
31958        assert_eq!(
31959            kind,
31960            SyntaxKind::TerminalLBrack,
31961            "Unexpected SyntaxKind {:?}. Expected {:?}.",
31962            kind,
31963            SyntaxKind::TerminalLBrack
31964        );
31965        let children = db.get_children(node.clone());
31966        Self { node, children }
31967    }
31968    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
31969        let kind = node.kind(db);
31970        if kind == SyntaxKind::TerminalLBrack {
31971            Some(Self::from_syntax_node(db, node))
31972        } else {
31973            None
31974        }
31975    }
31976    fn as_syntax_node(&self) -> SyntaxNode {
31977        self.node.clone()
31978    }
31979    fn stable_ptr(&self) -> Self::StablePtr {
31980        TerminalLBrackPtr(self.node.0.stable_ptr)
31981    }
31982}
31983impl From<&TerminalLBrack> for SyntaxStablePtrId {
31984    fn from(node: &TerminalLBrack) -> Self {
31985        node.stable_ptr().untyped()
31986    }
31987}
31988#[derive(Clone, Debug, Eq, Hash, PartialEq)]
31989pub struct TokenLE {
31990    node: SyntaxNode,
31991}
31992impl Token for TokenLE {
31993    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
31994        TokenLEGreen(
31995            Arc::new(GreenNode {
31996                kind: SyntaxKind::TokenLE,
31997                details: GreenNodeDetails::Token(text),
31998            })
31999            .intern(db),
32000        )
32001    }
32002    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
32003        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
32004            .clone()
32005    }
32006}
32007#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
32008pub struct TokenLEPtr(pub SyntaxStablePtrId);
32009impl TypedStablePtr for TokenLEPtr {
32010    type SyntaxNode = TokenLE;
32011    fn untyped(&self) -> SyntaxStablePtrId {
32012        self.0
32013    }
32014    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenLE {
32015        TokenLE::from_syntax_node(db, self.0.lookup(db))
32016    }
32017}
32018impl From<TokenLEPtr> for SyntaxStablePtrId {
32019    fn from(ptr: TokenLEPtr) -> Self {
32020        ptr.untyped()
32021    }
32022}
32023#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
32024pub struct TokenLEGreen(pub GreenId);
32025impl TokenLEGreen {
32026    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
32027        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
32028    }
32029}
32030impl TypedSyntaxNode for TokenLE {
32031    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenLE);
32032    type StablePtr = TokenLEPtr;
32033    type Green = TokenLEGreen;
32034    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
32035        TokenLEGreen(
32036            Arc::new(GreenNode {
32037                kind: SyntaxKind::TokenMissing,
32038                details: GreenNodeDetails::Token("".into()),
32039            })
32040            .intern(db),
32041        )
32042    }
32043    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
32044        match node.0.green.lookup_intern(db).details {
32045            GreenNodeDetails::Token(_) => Self { node },
32046            GreenNodeDetails::Node { .. } => {
32047                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenLE)
32048            }
32049        }
32050    }
32051    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
32052        match node.0.green.lookup_intern(db).details {
32053            GreenNodeDetails::Token(_) => Some(Self { node }),
32054            GreenNodeDetails::Node { .. } => None,
32055        }
32056    }
32057    fn as_syntax_node(&self) -> SyntaxNode {
32058        self.node.clone()
32059    }
32060    fn stable_ptr(&self) -> Self::StablePtr {
32061        TokenLEPtr(self.node.0.stable_ptr)
32062    }
32063}
32064impl From<&TokenLE> for SyntaxStablePtrId {
32065    fn from(node: &TokenLE) -> Self {
32066        node.stable_ptr().untyped()
32067    }
32068}
32069#[derive(Clone, Debug, Eq, Hash, PartialEq)]
32070pub struct TerminalLE {
32071    node: SyntaxNode,
32072    children: Arc<[SyntaxNode]>,
32073}
32074impl Terminal for TerminalLE {
32075    const KIND: SyntaxKind = SyntaxKind::TerminalLE;
32076    type TokenType = TokenLE;
32077    fn new_green(
32078        db: &dyn SyntaxGroup,
32079        leading_trivia: TriviaGreen,
32080        token: <<TerminalLE as Terminal>::TokenType as TypedSyntaxNode>::Green,
32081        trailing_trivia: TriviaGreen,
32082    ) -> Self::Green {
32083        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
32084        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
32085        TerminalLEGreen(
32086            Arc::new(GreenNode {
32087                kind: SyntaxKind::TerminalLE,
32088                details: GreenNodeDetails::Node { children, width },
32089            })
32090            .intern(db),
32091        )
32092    }
32093    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
32094        self.token(db).text(db)
32095    }
32096}
32097impl TerminalLE {
32098    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
32099        Trivia::from_syntax_node(db, self.children[0].clone())
32100    }
32101    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenLE {
32102        TokenLE::from_syntax_node(db, self.children[1].clone())
32103    }
32104    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
32105        Trivia::from_syntax_node(db, self.children[2].clone())
32106    }
32107}
32108#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
32109pub struct TerminalLEPtr(pub SyntaxStablePtrId);
32110impl TerminalLEPtr {}
32111impl TypedStablePtr for TerminalLEPtr {
32112    type SyntaxNode = TerminalLE;
32113    fn untyped(&self) -> SyntaxStablePtrId {
32114        self.0
32115    }
32116    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalLE {
32117        TerminalLE::from_syntax_node(db, self.0.lookup(db))
32118    }
32119}
32120impl From<TerminalLEPtr> for SyntaxStablePtrId {
32121    fn from(ptr: TerminalLEPtr) -> Self {
32122        ptr.untyped()
32123    }
32124}
32125#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
32126pub struct TerminalLEGreen(pub GreenId);
32127impl TypedSyntaxNode for TerminalLE {
32128    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalLE);
32129    type StablePtr = TerminalLEPtr;
32130    type Green = TerminalLEGreen;
32131    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
32132        TerminalLEGreen(
32133            Arc::new(GreenNode {
32134                kind: SyntaxKind::TerminalLE,
32135                details: GreenNodeDetails::Node {
32136                    children: vec![
32137                        Trivia::missing(db).0,
32138                        TokenLE::missing(db).0,
32139                        Trivia::missing(db).0,
32140                    ],
32141                    width: TextWidth::default(),
32142                },
32143            })
32144            .intern(db),
32145        )
32146    }
32147    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
32148        let kind = node.kind(db);
32149        assert_eq!(
32150            kind,
32151            SyntaxKind::TerminalLE,
32152            "Unexpected SyntaxKind {:?}. Expected {:?}.",
32153            kind,
32154            SyntaxKind::TerminalLE
32155        );
32156        let children = db.get_children(node.clone());
32157        Self { node, children }
32158    }
32159    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
32160        let kind = node.kind(db);
32161        if kind == SyntaxKind::TerminalLE { Some(Self::from_syntax_node(db, node)) } else { None }
32162    }
32163    fn as_syntax_node(&self) -> SyntaxNode {
32164        self.node.clone()
32165    }
32166    fn stable_ptr(&self) -> Self::StablePtr {
32167        TerminalLEPtr(self.node.0.stable_ptr)
32168    }
32169}
32170impl From<&TerminalLE> for SyntaxStablePtrId {
32171    fn from(node: &TerminalLE) -> Self {
32172        node.stable_ptr().untyped()
32173    }
32174}
32175#[derive(Clone, Debug, Eq, Hash, PartialEq)]
32176pub struct TokenLParen {
32177    node: SyntaxNode,
32178}
32179impl Token for TokenLParen {
32180    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
32181        TokenLParenGreen(
32182            Arc::new(GreenNode {
32183                kind: SyntaxKind::TokenLParen,
32184                details: GreenNodeDetails::Token(text),
32185            })
32186            .intern(db),
32187        )
32188    }
32189    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
32190        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
32191            .clone()
32192    }
32193}
32194#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
32195pub struct TokenLParenPtr(pub SyntaxStablePtrId);
32196impl TypedStablePtr for TokenLParenPtr {
32197    type SyntaxNode = TokenLParen;
32198    fn untyped(&self) -> SyntaxStablePtrId {
32199        self.0
32200    }
32201    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenLParen {
32202        TokenLParen::from_syntax_node(db, self.0.lookup(db))
32203    }
32204}
32205impl From<TokenLParenPtr> for SyntaxStablePtrId {
32206    fn from(ptr: TokenLParenPtr) -> Self {
32207        ptr.untyped()
32208    }
32209}
32210#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
32211pub struct TokenLParenGreen(pub GreenId);
32212impl TokenLParenGreen {
32213    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
32214        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
32215    }
32216}
32217impl TypedSyntaxNode for TokenLParen {
32218    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenLParen);
32219    type StablePtr = TokenLParenPtr;
32220    type Green = TokenLParenGreen;
32221    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
32222        TokenLParenGreen(
32223            Arc::new(GreenNode {
32224                kind: SyntaxKind::TokenMissing,
32225                details: GreenNodeDetails::Token("".into()),
32226            })
32227            .intern(db),
32228        )
32229    }
32230    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
32231        match node.0.green.lookup_intern(db).details {
32232            GreenNodeDetails::Token(_) => Self { node },
32233            GreenNodeDetails::Node { .. } => {
32234                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenLParen)
32235            }
32236        }
32237    }
32238    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
32239        match node.0.green.lookup_intern(db).details {
32240            GreenNodeDetails::Token(_) => Some(Self { node }),
32241            GreenNodeDetails::Node { .. } => None,
32242        }
32243    }
32244    fn as_syntax_node(&self) -> SyntaxNode {
32245        self.node.clone()
32246    }
32247    fn stable_ptr(&self) -> Self::StablePtr {
32248        TokenLParenPtr(self.node.0.stable_ptr)
32249    }
32250}
32251impl From<&TokenLParen> for SyntaxStablePtrId {
32252    fn from(node: &TokenLParen) -> Self {
32253        node.stable_ptr().untyped()
32254    }
32255}
32256#[derive(Clone, Debug, Eq, Hash, PartialEq)]
32257pub struct TerminalLParen {
32258    node: SyntaxNode,
32259    children: Arc<[SyntaxNode]>,
32260}
32261impl Terminal for TerminalLParen {
32262    const KIND: SyntaxKind = SyntaxKind::TerminalLParen;
32263    type TokenType = TokenLParen;
32264    fn new_green(
32265        db: &dyn SyntaxGroup,
32266        leading_trivia: TriviaGreen,
32267        token: <<TerminalLParen as Terminal>::TokenType as TypedSyntaxNode>::Green,
32268        trailing_trivia: TriviaGreen,
32269    ) -> Self::Green {
32270        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
32271        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
32272        TerminalLParenGreen(
32273            Arc::new(GreenNode {
32274                kind: SyntaxKind::TerminalLParen,
32275                details: GreenNodeDetails::Node { children, width },
32276            })
32277            .intern(db),
32278        )
32279    }
32280    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
32281        self.token(db).text(db)
32282    }
32283}
32284impl TerminalLParen {
32285    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
32286        Trivia::from_syntax_node(db, self.children[0].clone())
32287    }
32288    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenLParen {
32289        TokenLParen::from_syntax_node(db, self.children[1].clone())
32290    }
32291    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
32292        Trivia::from_syntax_node(db, self.children[2].clone())
32293    }
32294}
32295#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
32296pub struct TerminalLParenPtr(pub SyntaxStablePtrId);
32297impl TerminalLParenPtr {}
32298impl TypedStablePtr for TerminalLParenPtr {
32299    type SyntaxNode = TerminalLParen;
32300    fn untyped(&self) -> SyntaxStablePtrId {
32301        self.0
32302    }
32303    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalLParen {
32304        TerminalLParen::from_syntax_node(db, self.0.lookup(db))
32305    }
32306}
32307impl From<TerminalLParenPtr> for SyntaxStablePtrId {
32308    fn from(ptr: TerminalLParenPtr) -> Self {
32309        ptr.untyped()
32310    }
32311}
32312#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
32313pub struct TerminalLParenGreen(pub GreenId);
32314impl TypedSyntaxNode for TerminalLParen {
32315    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalLParen);
32316    type StablePtr = TerminalLParenPtr;
32317    type Green = TerminalLParenGreen;
32318    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
32319        TerminalLParenGreen(
32320            Arc::new(GreenNode {
32321                kind: SyntaxKind::TerminalLParen,
32322                details: GreenNodeDetails::Node {
32323                    children: vec![
32324                        Trivia::missing(db).0,
32325                        TokenLParen::missing(db).0,
32326                        Trivia::missing(db).0,
32327                    ],
32328                    width: TextWidth::default(),
32329                },
32330            })
32331            .intern(db),
32332        )
32333    }
32334    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
32335        let kind = node.kind(db);
32336        assert_eq!(
32337            kind,
32338            SyntaxKind::TerminalLParen,
32339            "Unexpected SyntaxKind {:?}. Expected {:?}.",
32340            kind,
32341            SyntaxKind::TerminalLParen
32342        );
32343        let children = db.get_children(node.clone());
32344        Self { node, children }
32345    }
32346    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
32347        let kind = node.kind(db);
32348        if kind == SyntaxKind::TerminalLParen {
32349            Some(Self::from_syntax_node(db, node))
32350        } else {
32351            None
32352        }
32353    }
32354    fn as_syntax_node(&self) -> SyntaxNode {
32355        self.node.clone()
32356    }
32357    fn stable_ptr(&self) -> Self::StablePtr {
32358        TerminalLParenPtr(self.node.0.stable_ptr)
32359    }
32360}
32361impl From<&TerminalLParen> for SyntaxStablePtrId {
32362    fn from(node: &TerminalLParen) -> Self {
32363        node.stable_ptr().untyped()
32364    }
32365}
32366#[derive(Clone, Debug, Eq, Hash, PartialEq)]
32367pub struct TokenLT {
32368    node: SyntaxNode,
32369}
32370impl Token for TokenLT {
32371    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
32372        TokenLTGreen(
32373            Arc::new(GreenNode {
32374                kind: SyntaxKind::TokenLT,
32375                details: GreenNodeDetails::Token(text),
32376            })
32377            .intern(db),
32378        )
32379    }
32380    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
32381        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
32382            .clone()
32383    }
32384}
32385#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
32386pub struct TokenLTPtr(pub SyntaxStablePtrId);
32387impl TypedStablePtr for TokenLTPtr {
32388    type SyntaxNode = TokenLT;
32389    fn untyped(&self) -> SyntaxStablePtrId {
32390        self.0
32391    }
32392    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenLT {
32393        TokenLT::from_syntax_node(db, self.0.lookup(db))
32394    }
32395}
32396impl From<TokenLTPtr> for SyntaxStablePtrId {
32397    fn from(ptr: TokenLTPtr) -> Self {
32398        ptr.untyped()
32399    }
32400}
32401#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
32402pub struct TokenLTGreen(pub GreenId);
32403impl TokenLTGreen {
32404    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
32405        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
32406    }
32407}
32408impl TypedSyntaxNode for TokenLT {
32409    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenLT);
32410    type StablePtr = TokenLTPtr;
32411    type Green = TokenLTGreen;
32412    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
32413        TokenLTGreen(
32414            Arc::new(GreenNode {
32415                kind: SyntaxKind::TokenMissing,
32416                details: GreenNodeDetails::Token("".into()),
32417            })
32418            .intern(db),
32419        )
32420    }
32421    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
32422        match node.0.green.lookup_intern(db).details {
32423            GreenNodeDetails::Token(_) => Self { node },
32424            GreenNodeDetails::Node { .. } => {
32425                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenLT)
32426            }
32427        }
32428    }
32429    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
32430        match node.0.green.lookup_intern(db).details {
32431            GreenNodeDetails::Token(_) => Some(Self { node }),
32432            GreenNodeDetails::Node { .. } => None,
32433        }
32434    }
32435    fn as_syntax_node(&self) -> SyntaxNode {
32436        self.node.clone()
32437    }
32438    fn stable_ptr(&self) -> Self::StablePtr {
32439        TokenLTPtr(self.node.0.stable_ptr)
32440    }
32441}
32442impl From<&TokenLT> for SyntaxStablePtrId {
32443    fn from(node: &TokenLT) -> Self {
32444        node.stable_ptr().untyped()
32445    }
32446}
32447#[derive(Clone, Debug, Eq, Hash, PartialEq)]
32448pub struct TerminalLT {
32449    node: SyntaxNode,
32450    children: Arc<[SyntaxNode]>,
32451}
32452impl Terminal for TerminalLT {
32453    const KIND: SyntaxKind = SyntaxKind::TerminalLT;
32454    type TokenType = TokenLT;
32455    fn new_green(
32456        db: &dyn SyntaxGroup,
32457        leading_trivia: TriviaGreen,
32458        token: <<TerminalLT as Terminal>::TokenType as TypedSyntaxNode>::Green,
32459        trailing_trivia: TriviaGreen,
32460    ) -> Self::Green {
32461        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
32462        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
32463        TerminalLTGreen(
32464            Arc::new(GreenNode {
32465                kind: SyntaxKind::TerminalLT,
32466                details: GreenNodeDetails::Node { children, width },
32467            })
32468            .intern(db),
32469        )
32470    }
32471    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
32472        self.token(db).text(db)
32473    }
32474}
32475impl TerminalLT {
32476    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
32477        Trivia::from_syntax_node(db, self.children[0].clone())
32478    }
32479    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenLT {
32480        TokenLT::from_syntax_node(db, self.children[1].clone())
32481    }
32482    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
32483        Trivia::from_syntax_node(db, self.children[2].clone())
32484    }
32485}
32486#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
32487pub struct TerminalLTPtr(pub SyntaxStablePtrId);
32488impl TerminalLTPtr {}
32489impl TypedStablePtr for TerminalLTPtr {
32490    type SyntaxNode = TerminalLT;
32491    fn untyped(&self) -> SyntaxStablePtrId {
32492        self.0
32493    }
32494    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalLT {
32495        TerminalLT::from_syntax_node(db, self.0.lookup(db))
32496    }
32497}
32498impl From<TerminalLTPtr> for SyntaxStablePtrId {
32499    fn from(ptr: TerminalLTPtr) -> Self {
32500        ptr.untyped()
32501    }
32502}
32503#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
32504pub struct TerminalLTGreen(pub GreenId);
32505impl TypedSyntaxNode for TerminalLT {
32506    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalLT);
32507    type StablePtr = TerminalLTPtr;
32508    type Green = TerminalLTGreen;
32509    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
32510        TerminalLTGreen(
32511            Arc::new(GreenNode {
32512                kind: SyntaxKind::TerminalLT,
32513                details: GreenNodeDetails::Node {
32514                    children: vec![
32515                        Trivia::missing(db).0,
32516                        TokenLT::missing(db).0,
32517                        Trivia::missing(db).0,
32518                    ],
32519                    width: TextWidth::default(),
32520                },
32521            })
32522            .intern(db),
32523        )
32524    }
32525    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
32526        let kind = node.kind(db);
32527        assert_eq!(
32528            kind,
32529            SyntaxKind::TerminalLT,
32530            "Unexpected SyntaxKind {:?}. Expected {:?}.",
32531            kind,
32532            SyntaxKind::TerminalLT
32533        );
32534        let children = db.get_children(node.clone());
32535        Self { node, children }
32536    }
32537    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
32538        let kind = node.kind(db);
32539        if kind == SyntaxKind::TerminalLT { Some(Self::from_syntax_node(db, node)) } else { None }
32540    }
32541    fn as_syntax_node(&self) -> SyntaxNode {
32542        self.node.clone()
32543    }
32544    fn stable_ptr(&self) -> Self::StablePtr {
32545        TerminalLTPtr(self.node.0.stable_ptr)
32546    }
32547}
32548impl From<&TerminalLT> for SyntaxStablePtrId {
32549    fn from(node: &TerminalLT) -> Self {
32550        node.stable_ptr().untyped()
32551    }
32552}
32553#[derive(Clone, Debug, Eq, Hash, PartialEq)]
32554pub struct TokenMatchArrow {
32555    node: SyntaxNode,
32556}
32557impl Token for TokenMatchArrow {
32558    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
32559        TokenMatchArrowGreen(
32560            Arc::new(GreenNode {
32561                kind: SyntaxKind::TokenMatchArrow,
32562                details: GreenNodeDetails::Token(text),
32563            })
32564            .intern(db),
32565        )
32566    }
32567    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
32568        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
32569            .clone()
32570    }
32571}
32572#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
32573pub struct TokenMatchArrowPtr(pub SyntaxStablePtrId);
32574impl TypedStablePtr for TokenMatchArrowPtr {
32575    type SyntaxNode = TokenMatchArrow;
32576    fn untyped(&self) -> SyntaxStablePtrId {
32577        self.0
32578    }
32579    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenMatchArrow {
32580        TokenMatchArrow::from_syntax_node(db, self.0.lookup(db))
32581    }
32582}
32583impl From<TokenMatchArrowPtr> for SyntaxStablePtrId {
32584    fn from(ptr: TokenMatchArrowPtr) -> Self {
32585        ptr.untyped()
32586    }
32587}
32588#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
32589pub struct TokenMatchArrowGreen(pub GreenId);
32590impl TokenMatchArrowGreen {
32591    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
32592        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
32593    }
32594}
32595impl TypedSyntaxNode for TokenMatchArrow {
32596    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenMatchArrow);
32597    type StablePtr = TokenMatchArrowPtr;
32598    type Green = TokenMatchArrowGreen;
32599    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
32600        TokenMatchArrowGreen(
32601            Arc::new(GreenNode {
32602                kind: SyntaxKind::TokenMissing,
32603                details: GreenNodeDetails::Token("".into()),
32604            })
32605            .intern(db),
32606        )
32607    }
32608    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
32609        match node.0.green.lookup_intern(db).details {
32610            GreenNodeDetails::Token(_) => Self { node },
32611            GreenNodeDetails::Node { .. } => {
32612                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenMatchArrow)
32613            }
32614        }
32615    }
32616    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
32617        match node.0.green.lookup_intern(db).details {
32618            GreenNodeDetails::Token(_) => Some(Self { node }),
32619            GreenNodeDetails::Node { .. } => None,
32620        }
32621    }
32622    fn as_syntax_node(&self) -> SyntaxNode {
32623        self.node.clone()
32624    }
32625    fn stable_ptr(&self) -> Self::StablePtr {
32626        TokenMatchArrowPtr(self.node.0.stable_ptr)
32627    }
32628}
32629impl From<&TokenMatchArrow> for SyntaxStablePtrId {
32630    fn from(node: &TokenMatchArrow) -> Self {
32631        node.stable_ptr().untyped()
32632    }
32633}
32634#[derive(Clone, Debug, Eq, Hash, PartialEq)]
32635pub struct TerminalMatchArrow {
32636    node: SyntaxNode,
32637    children: Arc<[SyntaxNode]>,
32638}
32639impl Terminal for TerminalMatchArrow {
32640    const KIND: SyntaxKind = SyntaxKind::TerminalMatchArrow;
32641    type TokenType = TokenMatchArrow;
32642    fn new_green(
32643        db: &dyn SyntaxGroup,
32644        leading_trivia: TriviaGreen,
32645        token: <<TerminalMatchArrow as Terminal>::TokenType as TypedSyntaxNode>::Green,
32646        trailing_trivia: TriviaGreen,
32647    ) -> Self::Green {
32648        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
32649        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
32650        TerminalMatchArrowGreen(
32651            Arc::new(GreenNode {
32652                kind: SyntaxKind::TerminalMatchArrow,
32653                details: GreenNodeDetails::Node { children, width },
32654            })
32655            .intern(db),
32656        )
32657    }
32658    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
32659        self.token(db).text(db)
32660    }
32661}
32662impl TerminalMatchArrow {
32663    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
32664        Trivia::from_syntax_node(db, self.children[0].clone())
32665    }
32666    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenMatchArrow {
32667        TokenMatchArrow::from_syntax_node(db, self.children[1].clone())
32668    }
32669    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
32670        Trivia::from_syntax_node(db, self.children[2].clone())
32671    }
32672}
32673#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
32674pub struct TerminalMatchArrowPtr(pub SyntaxStablePtrId);
32675impl TerminalMatchArrowPtr {}
32676impl TypedStablePtr for TerminalMatchArrowPtr {
32677    type SyntaxNode = TerminalMatchArrow;
32678    fn untyped(&self) -> SyntaxStablePtrId {
32679        self.0
32680    }
32681    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalMatchArrow {
32682        TerminalMatchArrow::from_syntax_node(db, self.0.lookup(db))
32683    }
32684}
32685impl From<TerminalMatchArrowPtr> for SyntaxStablePtrId {
32686    fn from(ptr: TerminalMatchArrowPtr) -> Self {
32687        ptr.untyped()
32688    }
32689}
32690#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
32691pub struct TerminalMatchArrowGreen(pub GreenId);
32692impl TypedSyntaxNode for TerminalMatchArrow {
32693    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalMatchArrow);
32694    type StablePtr = TerminalMatchArrowPtr;
32695    type Green = TerminalMatchArrowGreen;
32696    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
32697        TerminalMatchArrowGreen(
32698            Arc::new(GreenNode {
32699                kind: SyntaxKind::TerminalMatchArrow,
32700                details: GreenNodeDetails::Node {
32701                    children: vec![
32702                        Trivia::missing(db).0,
32703                        TokenMatchArrow::missing(db).0,
32704                        Trivia::missing(db).0,
32705                    ],
32706                    width: TextWidth::default(),
32707                },
32708            })
32709            .intern(db),
32710        )
32711    }
32712    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
32713        let kind = node.kind(db);
32714        assert_eq!(
32715            kind,
32716            SyntaxKind::TerminalMatchArrow,
32717            "Unexpected SyntaxKind {:?}. Expected {:?}.",
32718            kind,
32719            SyntaxKind::TerminalMatchArrow
32720        );
32721        let children = db.get_children(node.clone());
32722        Self { node, children }
32723    }
32724    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
32725        let kind = node.kind(db);
32726        if kind == SyntaxKind::TerminalMatchArrow {
32727            Some(Self::from_syntax_node(db, node))
32728        } else {
32729            None
32730        }
32731    }
32732    fn as_syntax_node(&self) -> SyntaxNode {
32733        self.node.clone()
32734    }
32735    fn stable_ptr(&self) -> Self::StablePtr {
32736        TerminalMatchArrowPtr(self.node.0.stable_ptr)
32737    }
32738}
32739impl From<&TerminalMatchArrow> for SyntaxStablePtrId {
32740    fn from(node: &TerminalMatchArrow) -> Self {
32741        node.stable_ptr().untyped()
32742    }
32743}
32744#[derive(Clone, Debug, Eq, Hash, PartialEq)]
32745pub struct TokenMinus {
32746    node: SyntaxNode,
32747}
32748impl Token for TokenMinus {
32749    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
32750        TokenMinusGreen(
32751            Arc::new(GreenNode {
32752                kind: SyntaxKind::TokenMinus,
32753                details: GreenNodeDetails::Token(text),
32754            })
32755            .intern(db),
32756        )
32757    }
32758    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
32759        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
32760            .clone()
32761    }
32762}
32763#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
32764pub struct TokenMinusPtr(pub SyntaxStablePtrId);
32765impl TypedStablePtr for TokenMinusPtr {
32766    type SyntaxNode = TokenMinus;
32767    fn untyped(&self) -> SyntaxStablePtrId {
32768        self.0
32769    }
32770    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenMinus {
32771        TokenMinus::from_syntax_node(db, self.0.lookup(db))
32772    }
32773}
32774impl From<TokenMinusPtr> for SyntaxStablePtrId {
32775    fn from(ptr: TokenMinusPtr) -> Self {
32776        ptr.untyped()
32777    }
32778}
32779#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
32780pub struct TokenMinusGreen(pub GreenId);
32781impl TokenMinusGreen {
32782    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
32783        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
32784    }
32785}
32786impl TypedSyntaxNode for TokenMinus {
32787    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenMinus);
32788    type StablePtr = TokenMinusPtr;
32789    type Green = TokenMinusGreen;
32790    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
32791        TokenMinusGreen(
32792            Arc::new(GreenNode {
32793                kind: SyntaxKind::TokenMissing,
32794                details: GreenNodeDetails::Token("".into()),
32795            })
32796            .intern(db),
32797        )
32798    }
32799    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
32800        match node.0.green.lookup_intern(db).details {
32801            GreenNodeDetails::Token(_) => Self { node },
32802            GreenNodeDetails::Node { .. } => {
32803                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenMinus)
32804            }
32805        }
32806    }
32807    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
32808        match node.0.green.lookup_intern(db).details {
32809            GreenNodeDetails::Token(_) => Some(Self { node }),
32810            GreenNodeDetails::Node { .. } => None,
32811        }
32812    }
32813    fn as_syntax_node(&self) -> SyntaxNode {
32814        self.node.clone()
32815    }
32816    fn stable_ptr(&self) -> Self::StablePtr {
32817        TokenMinusPtr(self.node.0.stable_ptr)
32818    }
32819}
32820impl From<&TokenMinus> for SyntaxStablePtrId {
32821    fn from(node: &TokenMinus) -> Self {
32822        node.stable_ptr().untyped()
32823    }
32824}
32825#[derive(Clone, Debug, Eq, Hash, PartialEq)]
32826pub struct TerminalMinus {
32827    node: SyntaxNode,
32828    children: Arc<[SyntaxNode]>,
32829}
32830impl Terminal for TerminalMinus {
32831    const KIND: SyntaxKind = SyntaxKind::TerminalMinus;
32832    type TokenType = TokenMinus;
32833    fn new_green(
32834        db: &dyn SyntaxGroup,
32835        leading_trivia: TriviaGreen,
32836        token: <<TerminalMinus as Terminal>::TokenType as TypedSyntaxNode>::Green,
32837        trailing_trivia: TriviaGreen,
32838    ) -> Self::Green {
32839        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
32840        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
32841        TerminalMinusGreen(
32842            Arc::new(GreenNode {
32843                kind: SyntaxKind::TerminalMinus,
32844                details: GreenNodeDetails::Node { children, width },
32845            })
32846            .intern(db),
32847        )
32848    }
32849    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
32850        self.token(db).text(db)
32851    }
32852}
32853impl TerminalMinus {
32854    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
32855        Trivia::from_syntax_node(db, self.children[0].clone())
32856    }
32857    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenMinus {
32858        TokenMinus::from_syntax_node(db, self.children[1].clone())
32859    }
32860    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
32861        Trivia::from_syntax_node(db, self.children[2].clone())
32862    }
32863}
32864#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
32865pub struct TerminalMinusPtr(pub SyntaxStablePtrId);
32866impl TerminalMinusPtr {}
32867impl TypedStablePtr for TerminalMinusPtr {
32868    type SyntaxNode = TerminalMinus;
32869    fn untyped(&self) -> SyntaxStablePtrId {
32870        self.0
32871    }
32872    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalMinus {
32873        TerminalMinus::from_syntax_node(db, self.0.lookup(db))
32874    }
32875}
32876impl From<TerminalMinusPtr> for SyntaxStablePtrId {
32877    fn from(ptr: TerminalMinusPtr) -> Self {
32878        ptr.untyped()
32879    }
32880}
32881#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
32882pub struct TerminalMinusGreen(pub GreenId);
32883impl TypedSyntaxNode for TerminalMinus {
32884    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalMinus);
32885    type StablePtr = TerminalMinusPtr;
32886    type Green = TerminalMinusGreen;
32887    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
32888        TerminalMinusGreen(
32889            Arc::new(GreenNode {
32890                kind: SyntaxKind::TerminalMinus,
32891                details: GreenNodeDetails::Node {
32892                    children: vec![
32893                        Trivia::missing(db).0,
32894                        TokenMinus::missing(db).0,
32895                        Trivia::missing(db).0,
32896                    ],
32897                    width: TextWidth::default(),
32898                },
32899            })
32900            .intern(db),
32901        )
32902    }
32903    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
32904        let kind = node.kind(db);
32905        assert_eq!(
32906            kind,
32907            SyntaxKind::TerminalMinus,
32908            "Unexpected SyntaxKind {:?}. Expected {:?}.",
32909            kind,
32910            SyntaxKind::TerminalMinus
32911        );
32912        let children = db.get_children(node.clone());
32913        Self { node, children }
32914    }
32915    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
32916        let kind = node.kind(db);
32917        if kind == SyntaxKind::TerminalMinus {
32918            Some(Self::from_syntax_node(db, node))
32919        } else {
32920            None
32921        }
32922    }
32923    fn as_syntax_node(&self) -> SyntaxNode {
32924        self.node.clone()
32925    }
32926    fn stable_ptr(&self) -> Self::StablePtr {
32927        TerminalMinusPtr(self.node.0.stable_ptr)
32928    }
32929}
32930impl From<&TerminalMinus> for SyntaxStablePtrId {
32931    fn from(node: &TerminalMinus) -> Self {
32932        node.stable_ptr().untyped()
32933    }
32934}
32935#[derive(Clone, Debug, Eq, Hash, PartialEq)]
32936pub struct TokenMinusEq {
32937    node: SyntaxNode,
32938}
32939impl Token for TokenMinusEq {
32940    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
32941        TokenMinusEqGreen(
32942            Arc::new(GreenNode {
32943                kind: SyntaxKind::TokenMinusEq,
32944                details: GreenNodeDetails::Token(text),
32945            })
32946            .intern(db),
32947        )
32948    }
32949    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
32950        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
32951            .clone()
32952    }
32953}
32954#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
32955pub struct TokenMinusEqPtr(pub SyntaxStablePtrId);
32956impl TypedStablePtr for TokenMinusEqPtr {
32957    type SyntaxNode = TokenMinusEq;
32958    fn untyped(&self) -> SyntaxStablePtrId {
32959        self.0
32960    }
32961    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenMinusEq {
32962        TokenMinusEq::from_syntax_node(db, self.0.lookup(db))
32963    }
32964}
32965impl From<TokenMinusEqPtr> for SyntaxStablePtrId {
32966    fn from(ptr: TokenMinusEqPtr) -> Self {
32967        ptr.untyped()
32968    }
32969}
32970#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
32971pub struct TokenMinusEqGreen(pub GreenId);
32972impl TokenMinusEqGreen {
32973    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
32974        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
32975    }
32976}
32977impl TypedSyntaxNode for TokenMinusEq {
32978    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenMinusEq);
32979    type StablePtr = TokenMinusEqPtr;
32980    type Green = TokenMinusEqGreen;
32981    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
32982        TokenMinusEqGreen(
32983            Arc::new(GreenNode {
32984                kind: SyntaxKind::TokenMissing,
32985                details: GreenNodeDetails::Token("".into()),
32986            })
32987            .intern(db),
32988        )
32989    }
32990    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
32991        match node.0.green.lookup_intern(db).details {
32992            GreenNodeDetails::Token(_) => Self { node },
32993            GreenNodeDetails::Node { .. } => {
32994                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenMinusEq)
32995            }
32996        }
32997    }
32998    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
32999        match node.0.green.lookup_intern(db).details {
33000            GreenNodeDetails::Token(_) => Some(Self { node }),
33001            GreenNodeDetails::Node { .. } => None,
33002        }
33003    }
33004    fn as_syntax_node(&self) -> SyntaxNode {
33005        self.node.clone()
33006    }
33007    fn stable_ptr(&self) -> Self::StablePtr {
33008        TokenMinusEqPtr(self.node.0.stable_ptr)
33009    }
33010}
33011impl From<&TokenMinusEq> for SyntaxStablePtrId {
33012    fn from(node: &TokenMinusEq) -> Self {
33013        node.stable_ptr().untyped()
33014    }
33015}
33016#[derive(Clone, Debug, Eq, Hash, PartialEq)]
33017pub struct TerminalMinusEq {
33018    node: SyntaxNode,
33019    children: Arc<[SyntaxNode]>,
33020}
33021impl Terminal for TerminalMinusEq {
33022    const KIND: SyntaxKind = SyntaxKind::TerminalMinusEq;
33023    type TokenType = TokenMinusEq;
33024    fn new_green(
33025        db: &dyn SyntaxGroup,
33026        leading_trivia: TriviaGreen,
33027        token: <<TerminalMinusEq as Terminal>::TokenType as TypedSyntaxNode>::Green,
33028        trailing_trivia: TriviaGreen,
33029    ) -> Self::Green {
33030        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
33031        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
33032        TerminalMinusEqGreen(
33033            Arc::new(GreenNode {
33034                kind: SyntaxKind::TerminalMinusEq,
33035                details: GreenNodeDetails::Node { children, width },
33036            })
33037            .intern(db),
33038        )
33039    }
33040    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
33041        self.token(db).text(db)
33042    }
33043}
33044impl TerminalMinusEq {
33045    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
33046        Trivia::from_syntax_node(db, self.children[0].clone())
33047    }
33048    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenMinusEq {
33049        TokenMinusEq::from_syntax_node(db, self.children[1].clone())
33050    }
33051    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
33052        Trivia::from_syntax_node(db, self.children[2].clone())
33053    }
33054}
33055#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
33056pub struct TerminalMinusEqPtr(pub SyntaxStablePtrId);
33057impl TerminalMinusEqPtr {}
33058impl TypedStablePtr for TerminalMinusEqPtr {
33059    type SyntaxNode = TerminalMinusEq;
33060    fn untyped(&self) -> SyntaxStablePtrId {
33061        self.0
33062    }
33063    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalMinusEq {
33064        TerminalMinusEq::from_syntax_node(db, self.0.lookup(db))
33065    }
33066}
33067impl From<TerminalMinusEqPtr> for SyntaxStablePtrId {
33068    fn from(ptr: TerminalMinusEqPtr) -> Self {
33069        ptr.untyped()
33070    }
33071}
33072#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
33073pub struct TerminalMinusEqGreen(pub GreenId);
33074impl TypedSyntaxNode for TerminalMinusEq {
33075    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalMinusEq);
33076    type StablePtr = TerminalMinusEqPtr;
33077    type Green = TerminalMinusEqGreen;
33078    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
33079        TerminalMinusEqGreen(
33080            Arc::new(GreenNode {
33081                kind: SyntaxKind::TerminalMinusEq,
33082                details: GreenNodeDetails::Node {
33083                    children: vec![
33084                        Trivia::missing(db).0,
33085                        TokenMinusEq::missing(db).0,
33086                        Trivia::missing(db).0,
33087                    ],
33088                    width: TextWidth::default(),
33089                },
33090            })
33091            .intern(db),
33092        )
33093    }
33094    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
33095        let kind = node.kind(db);
33096        assert_eq!(
33097            kind,
33098            SyntaxKind::TerminalMinusEq,
33099            "Unexpected SyntaxKind {:?}. Expected {:?}.",
33100            kind,
33101            SyntaxKind::TerminalMinusEq
33102        );
33103        let children = db.get_children(node.clone());
33104        Self { node, children }
33105    }
33106    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
33107        let kind = node.kind(db);
33108        if kind == SyntaxKind::TerminalMinusEq {
33109            Some(Self::from_syntax_node(db, node))
33110        } else {
33111            None
33112        }
33113    }
33114    fn as_syntax_node(&self) -> SyntaxNode {
33115        self.node.clone()
33116    }
33117    fn stable_ptr(&self) -> Self::StablePtr {
33118        TerminalMinusEqPtr(self.node.0.stable_ptr)
33119    }
33120}
33121impl From<&TerminalMinusEq> for SyntaxStablePtrId {
33122    fn from(node: &TerminalMinusEq) -> Self {
33123        node.stable_ptr().untyped()
33124    }
33125}
33126#[derive(Clone, Debug, Eq, Hash, PartialEq)]
33127pub struct TokenMod {
33128    node: SyntaxNode,
33129}
33130impl Token for TokenMod {
33131    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
33132        TokenModGreen(
33133            Arc::new(GreenNode {
33134                kind: SyntaxKind::TokenMod,
33135                details: GreenNodeDetails::Token(text),
33136            })
33137            .intern(db),
33138        )
33139    }
33140    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
33141        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
33142            .clone()
33143    }
33144}
33145#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
33146pub struct TokenModPtr(pub SyntaxStablePtrId);
33147impl TypedStablePtr for TokenModPtr {
33148    type SyntaxNode = TokenMod;
33149    fn untyped(&self) -> SyntaxStablePtrId {
33150        self.0
33151    }
33152    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenMod {
33153        TokenMod::from_syntax_node(db, self.0.lookup(db))
33154    }
33155}
33156impl From<TokenModPtr> for SyntaxStablePtrId {
33157    fn from(ptr: TokenModPtr) -> Self {
33158        ptr.untyped()
33159    }
33160}
33161#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
33162pub struct TokenModGreen(pub GreenId);
33163impl TokenModGreen {
33164    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
33165        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
33166    }
33167}
33168impl TypedSyntaxNode for TokenMod {
33169    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenMod);
33170    type StablePtr = TokenModPtr;
33171    type Green = TokenModGreen;
33172    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
33173        TokenModGreen(
33174            Arc::new(GreenNode {
33175                kind: SyntaxKind::TokenMissing,
33176                details: GreenNodeDetails::Token("".into()),
33177            })
33178            .intern(db),
33179        )
33180    }
33181    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
33182        match node.0.green.lookup_intern(db).details {
33183            GreenNodeDetails::Token(_) => Self { node },
33184            GreenNodeDetails::Node { .. } => {
33185                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenMod)
33186            }
33187        }
33188    }
33189    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
33190        match node.0.green.lookup_intern(db).details {
33191            GreenNodeDetails::Token(_) => Some(Self { node }),
33192            GreenNodeDetails::Node { .. } => None,
33193        }
33194    }
33195    fn as_syntax_node(&self) -> SyntaxNode {
33196        self.node.clone()
33197    }
33198    fn stable_ptr(&self) -> Self::StablePtr {
33199        TokenModPtr(self.node.0.stable_ptr)
33200    }
33201}
33202impl From<&TokenMod> for SyntaxStablePtrId {
33203    fn from(node: &TokenMod) -> Self {
33204        node.stable_ptr().untyped()
33205    }
33206}
33207#[derive(Clone, Debug, Eq, Hash, PartialEq)]
33208pub struct TerminalMod {
33209    node: SyntaxNode,
33210    children: Arc<[SyntaxNode]>,
33211}
33212impl Terminal for TerminalMod {
33213    const KIND: SyntaxKind = SyntaxKind::TerminalMod;
33214    type TokenType = TokenMod;
33215    fn new_green(
33216        db: &dyn SyntaxGroup,
33217        leading_trivia: TriviaGreen,
33218        token: <<TerminalMod as Terminal>::TokenType as TypedSyntaxNode>::Green,
33219        trailing_trivia: TriviaGreen,
33220    ) -> Self::Green {
33221        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
33222        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
33223        TerminalModGreen(
33224            Arc::new(GreenNode {
33225                kind: SyntaxKind::TerminalMod,
33226                details: GreenNodeDetails::Node { children, width },
33227            })
33228            .intern(db),
33229        )
33230    }
33231    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
33232        self.token(db).text(db)
33233    }
33234}
33235impl TerminalMod {
33236    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
33237        Trivia::from_syntax_node(db, self.children[0].clone())
33238    }
33239    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenMod {
33240        TokenMod::from_syntax_node(db, self.children[1].clone())
33241    }
33242    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
33243        Trivia::from_syntax_node(db, self.children[2].clone())
33244    }
33245}
33246#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
33247pub struct TerminalModPtr(pub SyntaxStablePtrId);
33248impl TerminalModPtr {}
33249impl TypedStablePtr for TerminalModPtr {
33250    type SyntaxNode = TerminalMod;
33251    fn untyped(&self) -> SyntaxStablePtrId {
33252        self.0
33253    }
33254    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalMod {
33255        TerminalMod::from_syntax_node(db, self.0.lookup(db))
33256    }
33257}
33258impl From<TerminalModPtr> for SyntaxStablePtrId {
33259    fn from(ptr: TerminalModPtr) -> Self {
33260        ptr.untyped()
33261    }
33262}
33263#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
33264pub struct TerminalModGreen(pub GreenId);
33265impl TypedSyntaxNode for TerminalMod {
33266    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalMod);
33267    type StablePtr = TerminalModPtr;
33268    type Green = TerminalModGreen;
33269    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
33270        TerminalModGreen(
33271            Arc::new(GreenNode {
33272                kind: SyntaxKind::TerminalMod,
33273                details: GreenNodeDetails::Node {
33274                    children: vec![
33275                        Trivia::missing(db).0,
33276                        TokenMod::missing(db).0,
33277                        Trivia::missing(db).0,
33278                    ],
33279                    width: TextWidth::default(),
33280                },
33281            })
33282            .intern(db),
33283        )
33284    }
33285    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
33286        let kind = node.kind(db);
33287        assert_eq!(
33288            kind,
33289            SyntaxKind::TerminalMod,
33290            "Unexpected SyntaxKind {:?}. Expected {:?}.",
33291            kind,
33292            SyntaxKind::TerminalMod
33293        );
33294        let children = db.get_children(node.clone());
33295        Self { node, children }
33296    }
33297    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
33298        let kind = node.kind(db);
33299        if kind == SyntaxKind::TerminalMod { Some(Self::from_syntax_node(db, node)) } else { None }
33300    }
33301    fn as_syntax_node(&self) -> SyntaxNode {
33302        self.node.clone()
33303    }
33304    fn stable_ptr(&self) -> Self::StablePtr {
33305        TerminalModPtr(self.node.0.stable_ptr)
33306    }
33307}
33308impl From<&TerminalMod> for SyntaxStablePtrId {
33309    fn from(node: &TerminalMod) -> Self {
33310        node.stable_ptr().untyped()
33311    }
33312}
33313#[derive(Clone, Debug, Eq, Hash, PartialEq)]
33314pub struct TokenModEq {
33315    node: SyntaxNode,
33316}
33317impl Token for TokenModEq {
33318    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
33319        TokenModEqGreen(
33320            Arc::new(GreenNode {
33321                kind: SyntaxKind::TokenModEq,
33322                details: GreenNodeDetails::Token(text),
33323            })
33324            .intern(db),
33325        )
33326    }
33327    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
33328        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
33329            .clone()
33330    }
33331}
33332#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
33333pub struct TokenModEqPtr(pub SyntaxStablePtrId);
33334impl TypedStablePtr for TokenModEqPtr {
33335    type SyntaxNode = TokenModEq;
33336    fn untyped(&self) -> SyntaxStablePtrId {
33337        self.0
33338    }
33339    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenModEq {
33340        TokenModEq::from_syntax_node(db, self.0.lookup(db))
33341    }
33342}
33343impl From<TokenModEqPtr> for SyntaxStablePtrId {
33344    fn from(ptr: TokenModEqPtr) -> Self {
33345        ptr.untyped()
33346    }
33347}
33348#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
33349pub struct TokenModEqGreen(pub GreenId);
33350impl TokenModEqGreen {
33351    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
33352        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
33353    }
33354}
33355impl TypedSyntaxNode for TokenModEq {
33356    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenModEq);
33357    type StablePtr = TokenModEqPtr;
33358    type Green = TokenModEqGreen;
33359    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
33360        TokenModEqGreen(
33361            Arc::new(GreenNode {
33362                kind: SyntaxKind::TokenMissing,
33363                details: GreenNodeDetails::Token("".into()),
33364            })
33365            .intern(db),
33366        )
33367    }
33368    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
33369        match node.0.green.lookup_intern(db).details {
33370            GreenNodeDetails::Token(_) => Self { node },
33371            GreenNodeDetails::Node { .. } => {
33372                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenModEq)
33373            }
33374        }
33375    }
33376    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
33377        match node.0.green.lookup_intern(db).details {
33378            GreenNodeDetails::Token(_) => Some(Self { node }),
33379            GreenNodeDetails::Node { .. } => None,
33380        }
33381    }
33382    fn as_syntax_node(&self) -> SyntaxNode {
33383        self.node.clone()
33384    }
33385    fn stable_ptr(&self) -> Self::StablePtr {
33386        TokenModEqPtr(self.node.0.stable_ptr)
33387    }
33388}
33389impl From<&TokenModEq> for SyntaxStablePtrId {
33390    fn from(node: &TokenModEq) -> Self {
33391        node.stable_ptr().untyped()
33392    }
33393}
33394#[derive(Clone, Debug, Eq, Hash, PartialEq)]
33395pub struct TerminalModEq {
33396    node: SyntaxNode,
33397    children: Arc<[SyntaxNode]>,
33398}
33399impl Terminal for TerminalModEq {
33400    const KIND: SyntaxKind = SyntaxKind::TerminalModEq;
33401    type TokenType = TokenModEq;
33402    fn new_green(
33403        db: &dyn SyntaxGroup,
33404        leading_trivia: TriviaGreen,
33405        token: <<TerminalModEq as Terminal>::TokenType as TypedSyntaxNode>::Green,
33406        trailing_trivia: TriviaGreen,
33407    ) -> Self::Green {
33408        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
33409        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
33410        TerminalModEqGreen(
33411            Arc::new(GreenNode {
33412                kind: SyntaxKind::TerminalModEq,
33413                details: GreenNodeDetails::Node { children, width },
33414            })
33415            .intern(db),
33416        )
33417    }
33418    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
33419        self.token(db).text(db)
33420    }
33421}
33422impl TerminalModEq {
33423    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
33424        Trivia::from_syntax_node(db, self.children[0].clone())
33425    }
33426    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenModEq {
33427        TokenModEq::from_syntax_node(db, self.children[1].clone())
33428    }
33429    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
33430        Trivia::from_syntax_node(db, self.children[2].clone())
33431    }
33432}
33433#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
33434pub struct TerminalModEqPtr(pub SyntaxStablePtrId);
33435impl TerminalModEqPtr {}
33436impl TypedStablePtr for TerminalModEqPtr {
33437    type SyntaxNode = TerminalModEq;
33438    fn untyped(&self) -> SyntaxStablePtrId {
33439        self.0
33440    }
33441    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalModEq {
33442        TerminalModEq::from_syntax_node(db, self.0.lookup(db))
33443    }
33444}
33445impl From<TerminalModEqPtr> for SyntaxStablePtrId {
33446    fn from(ptr: TerminalModEqPtr) -> Self {
33447        ptr.untyped()
33448    }
33449}
33450#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
33451pub struct TerminalModEqGreen(pub GreenId);
33452impl TypedSyntaxNode for TerminalModEq {
33453    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalModEq);
33454    type StablePtr = TerminalModEqPtr;
33455    type Green = TerminalModEqGreen;
33456    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
33457        TerminalModEqGreen(
33458            Arc::new(GreenNode {
33459                kind: SyntaxKind::TerminalModEq,
33460                details: GreenNodeDetails::Node {
33461                    children: vec![
33462                        Trivia::missing(db).0,
33463                        TokenModEq::missing(db).0,
33464                        Trivia::missing(db).0,
33465                    ],
33466                    width: TextWidth::default(),
33467                },
33468            })
33469            .intern(db),
33470        )
33471    }
33472    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
33473        let kind = node.kind(db);
33474        assert_eq!(
33475            kind,
33476            SyntaxKind::TerminalModEq,
33477            "Unexpected SyntaxKind {:?}. Expected {:?}.",
33478            kind,
33479            SyntaxKind::TerminalModEq
33480        );
33481        let children = db.get_children(node.clone());
33482        Self { node, children }
33483    }
33484    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
33485        let kind = node.kind(db);
33486        if kind == SyntaxKind::TerminalModEq {
33487            Some(Self::from_syntax_node(db, node))
33488        } else {
33489            None
33490        }
33491    }
33492    fn as_syntax_node(&self) -> SyntaxNode {
33493        self.node.clone()
33494    }
33495    fn stable_ptr(&self) -> Self::StablePtr {
33496        TerminalModEqPtr(self.node.0.stable_ptr)
33497    }
33498}
33499impl From<&TerminalModEq> for SyntaxStablePtrId {
33500    fn from(node: &TerminalModEq) -> Self {
33501        node.stable_ptr().untyped()
33502    }
33503}
33504#[derive(Clone, Debug, Eq, Hash, PartialEq)]
33505pub struct TokenMul {
33506    node: SyntaxNode,
33507}
33508impl Token for TokenMul {
33509    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
33510        TokenMulGreen(
33511            Arc::new(GreenNode {
33512                kind: SyntaxKind::TokenMul,
33513                details: GreenNodeDetails::Token(text),
33514            })
33515            .intern(db),
33516        )
33517    }
33518    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
33519        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
33520            .clone()
33521    }
33522}
33523#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
33524pub struct TokenMulPtr(pub SyntaxStablePtrId);
33525impl TypedStablePtr for TokenMulPtr {
33526    type SyntaxNode = TokenMul;
33527    fn untyped(&self) -> SyntaxStablePtrId {
33528        self.0
33529    }
33530    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenMul {
33531        TokenMul::from_syntax_node(db, self.0.lookup(db))
33532    }
33533}
33534impl From<TokenMulPtr> for SyntaxStablePtrId {
33535    fn from(ptr: TokenMulPtr) -> Self {
33536        ptr.untyped()
33537    }
33538}
33539#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
33540pub struct TokenMulGreen(pub GreenId);
33541impl TokenMulGreen {
33542    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
33543        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
33544    }
33545}
33546impl TypedSyntaxNode for TokenMul {
33547    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenMul);
33548    type StablePtr = TokenMulPtr;
33549    type Green = TokenMulGreen;
33550    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
33551        TokenMulGreen(
33552            Arc::new(GreenNode {
33553                kind: SyntaxKind::TokenMissing,
33554                details: GreenNodeDetails::Token("".into()),
33555            })
33556            .intern(db),
33557        )
33558    }
33559    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
33560        match node.0.green.lookup_intern(db).details {
33561            GreenNodeDetails::Token(_) => Self { node },
33562            GreenNodeDetails::Node { .. } => {
33563                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenMul)
33564            }
33565        }
33566    }
33567    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
33568        match node.0.green.lookup_intern(db).details {
33569            GreenNodeDetails::Token(_) => Some(Self { node }),
33570            GreenNodeDetails::Node { .. } => None,
33571        }
33572    }
33573    fn as_syntax_node(&self) -> SyntaxNode {
33574        self.node.clone()
33575    }
33576    fn stable_ptr(&self) -> Self::StablePtr {
33577        TokenMulPtr(self.node.0.stable_ptr)
33578    }
33579}
33580impl From<&TokenMul> for SyntaxStablePtrId {
33581    fn from(node: &TokenMul) -> Self {
33582        node.stable_ptr().untyped()
33583    }
33584}
33585#[derive(Clone, Debug, Eq, Hash, PartialEq)]
33586pub struct TerminalMul {
33587    node: SyntaxNode,
33588    children: Arc<[SyntaxNode]>,
33589}
33590impl Terminal for TerminalMul {
33591    const KIND: SyntaxKind = SyntaxKind::TerminalMul;
33592    type TokenType = TokenMul;
33593    fn new_green(
33594        db: &dyn SyntaxGroup,
33595        leading_trivia: TriviaGreen,
33596        token: <<TerminalMul as Terminal>::TokenType as TypedSyntaxNode>::Green,
33597        trailing_trivia: TriviaGreen,
33598    ) -> Self::Green {
33599        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
33600        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
33601        TerminalMulGreen(
33602            Arc::new(GreenNode {
33603                kind: SyntaxKind::TerminalMul,
33604                details: GreenNodeDetails::Node { children, width },
33605            })
33606            .intern(db),
33607        )
33608    }
33609    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
33610        self.token(db).text(db)
33611    }
33612}
33613impl TerminalMul {
33614    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
33615        Trivia::from_syntax_node(db, self.children[0].clone())
33616    }
33617    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenMul {
33618        TokenMul::from_syntax_node(db, self.children[1].clone())
33619    }
33620    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
33621        Trivia::from_syntax_node(db, self.children[2].clone())
33622    }
33623}
33624#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
33625pub struct TerminalMulPtr(pub SyntaxStablePtrId);
33626impl TerminalMulPtr {}
33627impl TypedStablePtr for TerminalMulPtr {
33628    type SyntaxNode = TerminalMul;
33629    fn untyped(&self) -> SyntaxStablePtrId {
33630        self.0
33631    }
33632    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalMul {
33633        TerminalMul::from_syntax_node(db, self.0.lookup(db))
33634    }
33635}
33636impl From<TerminalMulPtr> for SyntaxStablePtrId {
33637    fn from(ptr: TerminalMulPtr) -> Self {
33638        ptr.untyped()
33639    }
33640}
33641#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
33642pub struct TerminalMulGreen(pub GreenId);
33643impl TypedSyntaxNode for TerminalMul {
33644    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalMul);
33645    type StablePtr = TerminalMulPtr;
33646    type Green = TerminalMulGreen;
33647    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
33648        TerminalMulGreen(
33649            Arc::new(GreenNode {
33650                kind: SyntaxKind::TerminalMul,
33651                details: GreenNodeDetails::Node {
33652                    children: vec![
33653                        Trivia::missing(db).0,
33654                        TokenMul::missing(db).0,
33655                        Trivia::missing(db).0,
33656                    ],
33657                    width: TextWidth::default(),
33658                },
33659            })
33660            .intern(db),
33661        )
33662    }
33663    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
33664        let kind = node.kind(db);
33665        assert_eq!(
33666            kind,
33667            SyntaxKind::TerminalMul,
33668            "Unexpected SyntaxKind {:?}. Expected {:?}.",
33669            kind,
33670            SyntaxKind::TerminalMul
33671        );
33672        let children = db.get_children(node.clone());
33673        Self { node, children }
33674    }
33675    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
33676        let kind = node.kind(db);
33677        if kind == SyntaxKind::TerminalMul { Some(Self::from_syntax_node(db, node)) } else { None }
33678    }
33679    fn as_syntax_node(&self) -> SyntaxNode {
33680        self.node.clone()
33681    }
33682    fn stable_ptr(&self) -> Self::StablePtr {
33683        TerminalMulPtr(self.node.0.stable_ptr)
33684    }
33685}
33686impl From<&TerminalMul> for SyntaxStablePtrId {
33687    fn from(node: &TerminalMul) -> Self {
33688        node.stable_ptr().untyped()
33689    }
33690}
33691#[derive(Clone, Debug, Eq, Hash, PartialEq)]
33692pub struct TokenMulEq {
33693    node: SyntaxNode,
33694}
33695impl Token for TokenMulEq {
33696    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
33697        TokenMulEqGreen(
33698            Arc::new(GreenNode {
33699                kind: SyntaxKind::TokenMulEq,
33700                details: GreenNodeDetails::Token(text),
33701            })
33702            .intern(db),
33703        )
33704    }
33705    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
33706        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
33707            .clone()
33708    }
33709}
33710#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
33711pub struct TokenMulEqPtr(pub SyntaxStablePtrId);
33712impl TypedStablePtr for TokenMulEqPtr {
33713    type SyntaxNode = TokenMulEq;
33714    fn untyped(&self) -> SyntaxStablePtrId {
33715        self.0
33716    }
33717    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenMulEq {
33718        TokenMulEq::from_syntax_node(db, self.0.lookup(db))
33719    }
33720}
33721impl From<TokenMulEqPtr> for SyntaxStablePtrId {
33722    fn from(ptr: TokenMulEqPtr) -> Self {
33723        ptr.untyped()
33724    }
33725}
33726#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
33727pub struct TokenMulEqGreen(pub GreenId);
33728impl TokenMulEqGreen {
33729    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
33730        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
33731    }
33732}
33733impl TypedSyntaxNode for TokenMulEq {
33734    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenMulEq);
33735    type StablePtr = TokenMulEqPtr;
33736    type Green = TokenMulEqGreen;
33737    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
33738        TokenMulEqGreen(
33739            Arc::new(GreenNode {
33740                kind: SyntaxKind::TokenMissing,
33741                details: GreenNodeDetails::Token("".into()),
33742            })
33743            .intern(db),
33744        )
33745    }
33746    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
33747        match node.0.green.lookup_intern(db).details {
33748            GreenNodeDetails::Token(_) => Self { node },
33749            GreenNodeDetails::Node { .. } => {
33750                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenMulEq)
33751            }
33752        }
33753    }
33754    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
33755        match node.0.green.lookup_intern(db).details {
33756            GreenNodeDetails::Token(_) => Some(Self { node }),
33757            GreenNodeDetails::Node { .. } => None,
33758        }
33759    }
33760    fn as_syntax_node(&self) -> SyntaxNode {
33761        self.node.clone()
33762    }
33763    fn stable_ptr(&self) -> Self::StablePtr {
33764        TokenMulEqPtr(self.node.0.stable_ptr)
33765    }
33766}
33767impl From<&TokenMulEq> for SyntaxStablePtrId {
33768    fn from(node: &TokenMulEq) -> Self {
33769        node.stable_ptr().untyped()
33770    }
33771}
33772#[derive(Clone, Debug, Eq, Hash, PartialEq)]
33773pub struct TerminalMulEq {
33774    node: SyntaxNode,
33775    children: Arc<[SyntaxNode]>,
33776}
33777impl Terminal for TerminalMulEq {
33778    const KIND: SyntaxKind = SyntaxKind::TerminalMulEq;
33779    type TokenType = TokenMulEq;
33780    fn new_green(
33781        db: &dyn SyntaxGroup,
33782        leading_trivia: TriviaGreen,
33783        token: <<TerminalMulEq as Terminal>::TokenType as TypedSyntaxNode>::Green,
33784        trailing_trivia: TriviaGreen,
33785    ) -> Self::Green {
33786        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
33787        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
33788        TerminalMulEqGreen(
33789            Arc::new(GreenNode {
33790                kind: SyntaxKind::TerminalMulEq,
33791                details: GreenNodeDetails::Node { children, width },
33792            })
33793            .intern(db),
33794        )
33795    }
33796    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
33797        self.token(db).text(db)
33798    }
33799}
33800impl TerminalMulEq {
33801    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
33802        Trivia::from_syntax_node(db, self.children[0].clone())
33803    }
33804    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenMulEq {
33805        TokenMulEq::from_syntax_node(db, self.children[1].clone())
33806    }
33807    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
33808        Trivia::from_syntax_node(db, self.children[2].clone())
33809    }
33810}
33811#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
33812pub struct TerminalMulEqPtr(pub SyntaxStablePtrId);
33813impl TerminalMulEqPtr {}
33814impl TypedStablePtr for TerminalMulEqPtr {
33815    type SyntaxNode = TerminalMulEq;
33816    fn untyped(&self) -> SyntaxStablePtrId {
33817        self.0
33818    }
33819    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalMulEq {
33820        TerminalMulEq::from_syntax_node(db, self.0.lookup(db))
33821    }
33822}
33823impl From<TerminalMulEqPtr> for SyntaxStablePtrId {
33824    fn from(ptr: TerminalMulEqPtr) -> Self {
33825        ptr.untyped()
33826    }
33827}
33828#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
33829pub struct TerminalMulEqGreen(pub GreenId);
33830impl TypedSyntaxNode for TerminalMulEq {
33831    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalMulEq);
33832    type StablePtr = TerminalMulEqPtr;
33833    type Green = TerminalMulEqGreen;
33834    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
33835        TerminalMulEqGreen(
33836            Arc::new(GreenNode {
33837                kind: SyntaxKind::TerminalMulEq,
33838                details: GreenNodeDetails::Node {
33839                    children: vec![
33840                        Trivia::missing(db).0,
33841                        TokenMulEq::missing(db).0,
33842                        Trivia::missing(db).0,
33843                    ],
33844                    width: TextWidth::default(),
33845                },
33846            })
33847            .intern(db),
33848        )
33849    }
33850    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
33851        let kind = node.kind(db);
33852        assert_eq!(
33853            kind,
33854            SyntaxKind::TerminalMulEq,
33855            "Unexpected SyntaxKind {:?}. Expected {:?}.",
33856            kind,
33857            SyntaxKind::TerminalMulEq
33858        );
33859        let children = db.get_children(node.clone());
33860        Self { node, children }
33861    }
33862    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
33863        let kind = node.kind(db);
33864        if kind == SyntaxKind::TerminalMulEq {
33865            Some(Self::from_syntax_node(db, node))
33866        } else {
33867            None
33868        }
33869    }
33870    fn as_syntax_node(&self) -> SyntaxNode {
33871        self.node.clone()
33872    }
33873    fn stable_ptr(&self) -> Self::StablePtr {
33874        TerminalMulEqPtr(self.node.0.stable_ptr)
33875    }
33876}
33877impl From<&TerminalMulEq> for SyntaxStablePtrId {
33878    fn from(node: &TerminalMulEq) -> Self {
33879        node.stable_ptr().untyped()
33880    }
33881}
33882#[derive(Clone, Debug, Eq, Hash, PartialEq)]
33883pub struct TokenNeq {
33884    node: SyntaxNode,
33885}
33886impl Token for TokenNeq {
33887    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
33888        TokenNeqGreen(
33889            Arc::new(GreenNode {
33890                kind: SyntaxKind::TokenNeq,
33891                details: GreenNodeDetails::Token(text),
33892            })
33893            .intern(db),
33894        )
33895    }
33896    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
33897        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
33898            .clone()
33899    }
33900}
33901#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
33902pub struct TokenNeqPtr(pub SyntaxStablePtrId);
33903impl TypedStablePtr for TokenNeqPtr {
33904    type SyntaxNode = TokenNeq;
33905    fn untyped(&self) -> SyntaxStablePtrId {
33906        self.0
33907    }
33908    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenNeq {
33909        TokenNeq::from_syntax_node(db, self.0.lookup(db))
33910    }
33911}
33912impl From<TokenNeqPtr> for SyntaxStablePtrId {
33913    fn from(ptr: TokenNeqPtr) -> Self {
33914        ptr.untyped()
33915    }
33916}
33917#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
33918pub struct TokenNeqGreen(pub GreenId);
33919impl TokenNeqGreen {
33920    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
33921        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
33922    }
33923}
33924impl TypedSyntaxNode for TokenNeq {
33925    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenNeq);
33926    type StablePtr = TokenNeqPtr;
33927    type Green = TokenNeqGreen;
33928    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
33929        TokenNeqGreen(
33930            Arc::new(GreenNode {
33931                kind: SyntaxKind::TokenMissing,
33932                details: GreenNodeDetails::Token("".into()),
33933            })
33934            .intern(db),
33935        )
33936    }
33937    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
33938        match node.0.green.lookup_intern(db).details {
33939            GreenNodeDetails::Token(_) => Self { node },
33940            GreenNodeDetails::Node { .. } => {
33941                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenNeq)
33942            }
33943        }
33944    }
33945    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
33946        match node.0.green.lookup_intern(db).details {
33947            GreenNodeDetails::Token(_) => Some(Self { node }),
33948            GreenNodeDetails::Node { .. } => None,
33949        }
33950    }
33951    fn as_syntax_node(&self) -> SyntaxNode {
33952        self.node.clone()
33953    }
33954    fn stable_ptr(&self) -> Self::StablePtr {
33955        TokenNeqPtr(self.node.0.stable_ptr)
33956    }
33957}
33958impl From<&TokenNeq> for SyntaxStablePtrId {
33959    fn from(node: &TokenNeq) -> Self {
33960        node.stable_ptr().untyped()
33961    }
33962}
33963#[derive(Clone, Debug, Eq, Hash, PartialEq)]
33964pub struct TerminalNeq {
33965    node: SyntaxNode,
33966    children: Arc<[SyntaxNode]>,
33967}
33968impl Terminal for TerminalNeq {
33969    const KIND: SyntaxKind = SyntaxKind::TerminalNeq;
33970    type TokenType = TokenNeq;
33971    fn new_green(
33972        db: &dyn SyntaxGroup,
33973        leading_trivia: TriviaGreen,
33974        token: <<TerminalNeq as Terminal>::TokenType as TypedSyntaxNode>::Green,
33975        trailing_trivia: TriviaGreen,
33976    ) -> Self::Green {
33977        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
33978        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
33979        TerminalNeqGreen(
33980            Arc::new(GreenNode {
33981                kind: SyntaxKind::TerminalNeq,
33982                details: GreenNodeDetails::Node { children, width },
33983            })
33984            .intern(db),
33985        )
33986    }
33987    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
33988        self.token(db).text(db)
33989    }
33990}
33991impl TerminalNeq {
33992    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
33993        Trivia::from_syntax_node(db, self.children[0].clone())
33994    }
33995    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenNeq {
33996        TokenNeq::from_syntax_node(db, self.children[1].clone())
33997    }
33998    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
33999        Trivia::from_syntax_node(db, self.children[2].clone())
34000    }
34001}
34002#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
34003pub struct TerminalNeqPtr(pub SyntaxStablePtrId);
34004impl TerminalNeqPtr {}
34005impl TypedStablePtr for TerminalNeqPtr {
34006    type SyntaxNode = TerminalNeq;
34007    fn untyped(&self) -> SyntaxStablePtrId {
34008        self.0
34009    }
34010    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalNeq {
34011        TerminalNeq::from_syntax_node(db, self.0.lookup(db))
34012    }
34013}
34014impl From<TerminalNeqPtr> for SyntaxStablePtrId {
34015    fn from(ptr: TerminalNeqPtr) -> Self {
34016        ptr.untyped()
34017    }
34018}
34019#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
34020pub struct TerminalNeqGreen(pub GreenId);
34021impl TypedSyntaxNode for TerminalNeq {
34022    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalNeq);
34023    type StablePtr = TerminalNeqPtr;
34024    type Green = TerminalNeqGreen;
34025    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
34026        TerminalNeqGreen(
34027            Arc::new(GreenNode {
34028                kind: SyntaxKind::TerminalNeq,
34029                details: GreenNodeDetails::Node {
34030                    children: vec![
34031                        Trivia::missing(db).0,
34032                        TokenNeq::missing(db).0,
34033                        Trivia::missing(db).0,
34034                    ],
34035                    width: TextWidth::default(),
34036                },
34037            })
34038            .intern(db),
34039        )
34040    }
34041    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
34042        let kind = node.kind(db);
34043        assert_eq!(
34044            kind,
34045            SyntaxKind::TerminalNeq,
34046            "Unexpected SyntaxKind {:?}. Expected {:?}.",
34047            kind,
34048            SyntaxKind::TerminalNeq
34049        );
34050        let children = db.get_children(node.clone());
34051        Self { node, children }
34052    }
34053    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
34054        let kind = node.kind(db);
34055        if kind == SyntaxKind::TerminalNeq { Some(Self::from_syntax_node(db, node)) } else { None }
34056    }
34057    fn as_syntax_node(&self) -> SyntaxNode {
34058        self.node.clone()
34059    }
34060    fn stable_ptr(&self) -> Self::StablePtr {
34061        TerminalNeqPtr(self.node.0.stable_ptr)
34062    }
34063}
34064impl From<&TerminalNeq> for SyntaxStablePtrId {
34065    fn from(node: &TerminalNeq) -> Self {
34066        node.stable_ptr().untyped()
34067    }
34068}
34069#[derive(Clone, Debug, Eq, Hash, PartialEq)]
34070pub struct TokenNot {
34071    node: SyntaxNode,
34072}
34073impl Token for TokenNot {
34074    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
34075        TokenNotGreen(
34076            Arc::new(GreenNode {
34077                kind: SyntaxKind::TokenNot,
34078                details: GreenNodeDetails::Token(text),
34079            })
34080            .intern(db),
34081        )
34082    }
34083    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
34084        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
34085            .clone()
34086    }
34087}
34088#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
34089pub struct TokenNotPtr(pub SyntaxStablePtrId);
34090impl TypedStablePtr for TokenNotPtr {
34091    type SyntaxNode = TokenNot;
34092    fn untyped(&self) -> SyntaxStablePtrId {
34093        self.0
34094    }
34095    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenNot {
34096        TokenNot::from_syntax_node(db, self.0.lookup(db))
34097    }
34098}
34099impl From<TokenNotPtr> for SyntaxStablePtrId {
34100    fn from(ptr: TokenNotPtr) -> Self {
34101        ptr.untyped()
34102    }
34103}
34104#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
34105pub struct TokenNotGreen(pub GreenId);
34106impl TokenNotGreen {
34107    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
34108        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
34109    }
34110}
34111impl TypedSyntaxNode for TokenNot {
34112    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenNot);
34113    type StablePtr = TokenNotPtr;
34114    type Green = TokenNotGreen;
34115    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
34116        TokenNotGreen(
34117            Arc::new(GreenNode {
34118                kind: SyntaxKind::TokenMissing,
34119                details: GreenNodeDetails::Token("".into()),
34120            })
34121            .intern(db),
34122        )
34123    }
34124    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
34125        match node.0.green.lookup_intern(db).details {
34126            GreenNodeDetails::Token(_) => Self { node },
34127            GreenNodeDetails::Node { .. } => {
34128                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenNot)
34129            }
34130        }
34131    }
34132    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
34133        match node.0.green.lookup_intern(db).details {
34134            GreenNodeDetails::Token(_) => Some(Self { node }),
34135            GreenNodeDetails::Node { .. } => None,
34136        }
34137    }
34138    fn as_syntax_node(&self) -> SyntaxNode {
34139        self.node.clone()
34140    }
34141    fn stable_ptr(&self) -> Self::StablePtr {
34142        TokenNotPtr(self.node.0.stable_ptr)
34143    }
34144}
34145impl From<&TokenNot> for SyntaxStablePtrId {
34146    fn from(node: &TokenNot) -> Self {
34147        node.stable_ptr().untyped()
34148    }
34149}
34150#[derive(Clone, Debug, Eq, Hash, PartialEq)]
34151pub struct TerminalNot {
34152    node: SyntaxNode,
34153    children: Arc<[SyntaxNode]>,
34154}
34155impl Terminal for TerminalNot {
34156    const KIND: SyntaxKind = SyntaxKind::TerminalNot;
34157    type TokenType = TokenNot;
34158    fn new_green(
34159        db: &dyn SyntaxGroup,
34160        leading_trivia: TriviaGreen,
34161        token: <<TerminalNot as Terminal>::TokenType as TypedSyntaxNode>::Green,
34162        trailing_trivia: TriviaGreen,
34163    ) -> Self::Green {
34164        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
34165        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
34166        TerminalNotGreen(
34167            Arc::new(GreenNode {
34168                kind: SyntaxKind::TerminalNot,
34169                details: GreenNodeDetails::Node { children, width },
34170            })
34171            .intern(db),
34172        )
34173    }
34174    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
34175        self.token(db).text(db)
34176    }
34177}
34178impl TerminalNot {
34179    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
34180        Trivia::from_syntax_node(db, self.children[0].clone())
34181    }
34182    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenNot {
34183        TokenNot::from_syntax_node(db, self.children[1].clone())
34184    }
34185    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
34186        Trivia::from_syntax_node(db, self.children[2].clone())
34187    }
34188}
34189#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
34190pub struct TerminalNotPtr(pub SyntaxStablePtrId);
34191impl TerminalNotPtr {}
34192impl TypedStablePtr for TerminalNotPtr {
34193    type SyntaxNode = TerminalNot;
34194    fn untyped(&self) -> SyntaxStablePtrId {
34195        self.0
34196    }
34197    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalNot {
34198        TerminalNot::from_syntax_node(db, self.0.lookup(db))
34199    }
34200}
34201impl From<TerminalNotPtr> for SyntaxStablePtrId {
34202    fn from(ptr: TerminalNotPtr) -> Self {
34203        ptr.untyped()
34204    }
34205}
34206#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
34207pub struct TerminalNotGreen(pub GreenId);
34208impl TypedSyntaxNode for TerminalNot {
34209    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalNot);
34210    type StablePtr = TerminalNotPtr;
34211    type Green = TerminalNotGreen;
34212    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
34213        TerminalNotGreen(
34214            Arc::new(GreenNode {
34215                kind: SyntaxKind::TerminalNot,
34216                details: GreenNodeDetails::Node {
34217                    children: vec![
34218                        Trivia::missing(db).0,
34219                        TokenNot::missing(db).0,
34220                        Trivia::missing(db).0,
34221                    ],
34222                    width: TextWidth::default(),
34223                },
34224            })
34225            .intern(db),
34226        )
34227    }
34228    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
34229        let kind = node.kind(db);
34230        assert_eq!(
34231            kind,
34232            SyntaxKind::TerminalNot,
34233            "Unexpected SyntaxKind {:?}. Expected {:?}.",
34234            kind,
34235            SyntaxKind::TerminalNot
34236        );
34237        let children = db.get_children(node.clone());
34238        Self { node, children }
34239    }
34240    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
34241        let kind = node.kind(db);
34242        if kind == SyntaxKind::TerminalNot { Some(Self::from_syntax_node(db, node)) } else { None }
34243    }
34244    fn as_syntax_node(&self) -> SyntaxNode {
34245        self.node.clone()
34246    }
34247    fn stable_ptr(&self) -> Self::StablePtr {
34248        TerminalNotPtr(self.node.0.stable_ptr)
34249    }
34250}
34251impl From<&TerminalNot> for SyntaxStablePtrId {
34252    fn from(node: &TerminalNot) -> Self {
34253        node.stable_ptr().untyped()
34254    }
34255}
34256#[derive(Clone, Debug, Eq, Hash, PartialEq)]
34257pub struct TokenBitNot {
34258    node: SyntaxNode,
34259}
34260impl Token for TokenBitNot {
34261    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
34262        TokenBitNotGreen(
34263            Arc::new(GreenNode {
34264                kind: SyntaxKind::TokenBitNot,
34265                details: GreenNodeDetails::Token(text),
34266            })
34267            .intern(db),
34268        )
34269    }
34270    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
34271        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
34272            .clone()
34273    }
34274}
34275#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
34276pub struct TokenBitNotPtr(pub SyntaxStablePtrId);
34277impl TypedStablePtr for TokenBitNotPtr {
34278    type SyntaxNode = TokenBitNot;
34279    fn untyped(&self) -> SyntaxStablePtrId {
34280        self.0
34281    }
34282    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenBitNot {
34283        TokenBitNot::from_syntax_node(db, self.0.lookup(db))
34284    }
34285}
34286impl From<TokenBitNotPtr> for SyntaxStablePtrId {
34287    fn from(ptr: TokenBitNotPtr) -> Self {
34288        ptr.untyped()
34289    }
34290}
34291#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
34292pub struct TokenBitNotGreen(pub GreenId);
34293impl TokenBitNotGreen {
34294    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
34295        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
34296    }
34297}
34298impl TypedSyntaxNode for TokenBitNot {
34299    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenBitNot);
34300    type StablePtr = TokenBitNotPtr;
34301    type Green = TokenBitNotGreen;
34302    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
34303        TokenBitNotGreen(
34304            Arc::new(GreenNode {
34305                kind: SyntaxKind::TokenMissing,
34306                details: GreenNodeDetails::Token("".into()),
34307            })
34308            .intern(db),
34309        )
34310    }
34311    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
34312        match node.0.green.lookup_intern(db).details {
34313            GreenNodeDetails::Token(_) => Self { node },
34314            GreenNodeDetails::Node { .. } => {
34315                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenBitNot)
34316            }
34317        }
34318    }
34319    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
34320        match node.0.green.lookup_intern(db).details {
34321            GreenNodeDetails::Token(_) => Some(Self { node }),
34322            GreenNodeDetails::Node { .. } => None,
34323        }
34324    }
34325    fn as_syntax_node(&self) -> SyntaxNode {
34326        self.node.clone()
34327    }
34328    fn stable_ptr(&self) -> Self::StablePtr {
34329        TokenBitNotPtr(self.node.0.stable_ptr)
34330    }
34331}
34332impl From<&TokenBitNot> for SyntaxStablePtrId {
34333    fn from(node: &TokenBitNot) -> Self {
34334        node.stable_ptr().untyped()
34335    }
34336}
34337#[derive(Clone, Debug, Eq, Hash, PartialEq)]
34338pub struct TerminalBitNot {
34339    node: SyntaxNode,
34340    children: Arc<[SyntaxNode]>,
34341}
34342impl Terminal for TerminalBitNot {
34343    const KIND: SyntaxKind = SyntaxKind::TerminalBitNot;
34344    type TokenType = TokenBitNot;
34345    fn new_green(
34346        db: &dyn SyntaxGroup,
34347        leading_trivia: TriviaGreen,
34348        token: <<TerminalBitNot as Terminal>::TokenType as TypedSyntaxNode>::Green,
34349        trailing_trivia: TriviaGreen,
34350    ) -> Self::Green {
34351        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
34352        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
34353        TerminalBitNotGreen(
34354            Arc::new(GreenNode {
34355                kind: SyntaxKind::TerminalBitNot,
34356                details: GreenNodeDetails::Node { children, width },
34357            })
34358            .intern(db),
34359        )
34360    }
34361    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
34362        self.token(db).text(db)
34363    }
34364}
34365impl TerminalBitNot {
34366    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
34367        Trivia::from_syntax_node(db, self.children[0].clone())
34368    }
34369    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenBitNot {
34370        TokenBitNot::from_syntax_node(db, self.children[1].clone())
34371    }
34372    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
34373        Trivia::from_syntax_node(db, self.children[2].clone())
34374    }
34375}
34376#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
34377pub struct TerminalBitNotPtr(pub SyntaxStablePtrId);
34378impl TerminalBitNotPtr {}
34379impl TypedStablePtr for TerminalBitNotPtr {
34380    type SyntaxNode = TerminalBitNot;
34381    fn untyped(&self) -> SyntaxStablePtrId {
34382        self.0
34383    }
34384    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalBitNot {
34385        TerminalBitNot::from_syntax_node(db, self.0.lookup(db))
34386    }
34387}
34388impl From<TerminalBitNotPtr> for SyntaxStablePtrId {
34389    fn from(ptr: TerminalBitNotPtr) -> Self {
34390        ptr.untyped()
34391    }
34392}
34393#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
34394pub struct TerminalBitNotGreen(pub GreenId);
34395impl TypedSyntaxNode for TerminalBitNot {
34396    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalBitNot);
34397    type StablePtr = TerminalBitNotPtr;
34398    type Green = TerminalBitNotGreen;
34399    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
34400        TerminalBitNotGreen(
34401            Arc::new(GreenNode {
34402                kind: SyntaxKind::TerminalBitNot,
34403                details: GreenNodeDetails::Node {
34404                    children: vec![
34405                        Trivia::missing(db).0,
34406                        TokenBitNot::missing(db).0,
34407                        Trivia::missing(db).0,
34408                    ],
34409                    width: TextWidth::default(),
34410                },
34411            })
34412            .intern(db),
34413        )
34414    }
34415    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
34416        let kind = node.kind(db);
34417        assert_eq!(
34418            kind,
34419            SyntaxKind::TerminalBitNot,
34420            "Unexpected SyntaxKind {:?}. Expected {:?}.",
34421            kind,
34422            SyntaxKind::TerminalBitNot
34423        );
34424        let children = db.get_children(node.clone());
34425        Self { node, children }
34426    }
34427    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
34428        let kind = node.kind(db);
34429        if kind == SyntaxKind::TerminalBitNot {
34430            Some(Self::from_syntax_node(db, node))
34431        } else {
34432            None
34433        }
34434    }
34435    fn as_syntax_node(&self) -> SyntaxNode {
34436        self.node.clone()
34437    }
34438    fn stable_ptr(&self) -> Self::StablePtr {
34439        TerminalBitNotPtr(self.node.0.stable_ptr)
34440    }
34441}
34442impl From<&TerminalBitNot> for SyntaxStablePtrId {
34443    fn from(node: &TerminalBitNot) -> Self {
34444        node.stable_ptr().untyped()
34445    }
34446}
34447#[derive(Clone, Debug, Eq, Hash, PartialEq)]
34448pub struct TokenOr {
34449    node: SyntaxNode,
34450}
34451impl Token for TokenOr {
34452    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
34453        TokenOrGreen(
34454            Arc::new(GreenNode {
34455                kind: SyntaxKind::TokenOr,
34456                details: GreenNodeDetails::Token(text),
34457            })
34458            .intern(db),
34459        )
34460    }
34461    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
34462        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
34463            .clone()
34464    }
34465}
34466#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
34467pub struct TokenOrPtr(pub SyntaxStablePtrId);
34468impl TypedStablePtr for TokenOrPtr {
34469    type SyntaxNode = TokenOr;
34470    fn untyped(&self) -> SyntaxStablePtrId {
34471        self.0
34472    }
34473    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenOr {
34474        TokenOr::from_syntax_node(db, self.0.lookup(db))
34475    }
34476}
34477impl From<TokenOrPtr> for SyntaxStablePtrId {
34478    fn from(ptr: TokenOrPtr) -> Self {
34479        ptr.untyped()
34480    }
34481}
34482#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
34483pub struct TokenOrGreen(pub GreenId);
34484impl TokenOrGreen {
34485    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
34486        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
34487    }
34488}
34489impl TypedSyntaxNode for TokenOr {
34490    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenOr);
34491    type StablePtr = TokenOrPtr;
34492    type Green = TokenOrGreen;
34493    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
34494        TokenOrGreen(
34495            Arc::new(GreenNode {
34496                kind: SyntaxKind::TokenMissing,
34497                details: GreenNodeDetails::Token("".into()),
34498            })
34499            .intern(db),
34500        )
34501    }
34502    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
34503        match node.0.green.lookup_intern(db).details {
34504            GreenNodeDetails::Token(_) => Self { node },
34505            GreenNodeDetails::Node { .. } => {
34506                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenOr)
34507            }
34508        }
34509    }
34510    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
34511        match node.0.green.lookup_intern(db).details {
34512            GreenNodeDetails::Token(_) => Some(Self { node }),
34513            GreenNodeDetails::Node { .. } => None,
34514        }
34515    }
34516    fn as_syntax_node(&self) -> SyntaxNode {
34517        self.node.clone()
34518    }
34519    fn stable_ptr(&self) -> Self::StablePtr {
34520        TokenOrPtr(self.node.0.stable_ptr)
34521    }
34522}
34523impl From<&TokenOr> for SyntaxStablePtrId {
34524    fn from(node: &TokenOr) -> Self {
34525        node.stable_ptr().untyped()
34526    }
34527}
34528#[derive(Clone, Debug, Eq, Hash, PartialEq)]
34529pub struct TerminalOr {
34530    node: SyntaxNode,
34531    children: Arc<[SyntaxNode]>,
34532}
34533impl Terminal for TerminalOr {
34534    const KIND: SyntaxKind = SyntaxKind::TerminalOr;
34535    type TokenType = TokenOr;
34536    fn new_green(
34537        db: &dyn SyntaxGroup,
34538        leading_trivia: TriviaGreen,
34539        token: <<TerminalOr as Terminal>::TokenType as TypedSyntaxNode>::Green,
34540        trailing_trivia: TriviaGreen,
34541    ) -> Self::Green {
34542        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
34543        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
34544        TerminalOrGreen(
34545            Arc::new(GreenNode {
34546                kind: SyntaxKind::TerminalOr,
34547                details: GreenNodeDetails::Node { children, width },
34548            })
34549            .intern(db),
34550        )
34551    }
34552    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
34553        self.token(db).text(db)
34554    }
34555}
34556impl TerminalOr {
34557    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
34558        Trivia::from_syntax_node(db, self.children[0].clone())
34559    }
34560    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenOr {
34561        TokenOr::from_syntax_node(db, self.children[1].clone())
34562    }
34563    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
34564        Trivia::from_syntax_node(db, self.children[2].clone())
34565    }
34566}
34567#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
34568pub struct TerminalOrPtr(pub SyntaxStablePtrId);
34569impl TerminalOrPtr {}
34570impl TypedStablePtr for TerminalOrPtr {
34571    type SyntaxNode = TerminalOr;
34572    fn untyped(&self) -> SyntaxStablePtrId {
34573        self.0
34574    }
34575    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalOr {
34576        TerminalOr::from_syntax_node(db, self.0.lookup(db))
34577    }
34578}
34579impl From<TerminalOrPtr> for SyntaxStablePtrId {
34580    fn from(ptr: TerminalOrPtr) -> Self {
34581        ptr.untyped()
34582    }
34583}
34584#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
34585pub struct TerminalOrGreen(pub GreenId);
34586impl TypedSyntaxNode for TerminalOr {
34587    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalOr);
34588    type StablePtr = TerminalOrPtr;
34589    type Green = TerminalOrGreen;
34590    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
34591        TerminalOrGreen(
34592            Arc::new(GreenNode {
34593                kind: SyntaxKind::TerminalOr,
34594                details: GreenNodeDetails::Node {
34595                    children: vec![
34596                        Trivia::missing(db).0,
34597                        TokenOr::missing(db).0,
34598                        Trivia::missing(db).0,
34599                    ],
34600                    width: TextWidth::default(),
34601                },
34602            })
34603            .intern(db),
34604        )
34605    }
34606    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
34607        let kind = node.kind(db);
34608        assert_eq!(
34609            kind,
34610            SyntaxKind::TerminalOr,
34611            "Unexpected SyntaxKind {:?}. Expected {:?}.",
34612            kind,
34613            SyntaxKind::TerminalOr
34614        );
34615        let children = db.get_children(node.clone());
34616        Self { node, children }
34617    }
34618    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
34619        let kind = node.kind(db);
34620        if kind == SyntaxKind::TerminalOr { Some(Self::from_syntax_node(db, node)) } else { None }
34621    }
34622    fn as_syntax_node(&self) -> SyntaxNode {
34623        self.node.clone()
34624    }
34625    fn stable_ptr(&self) -> Self::StablePtr {
34626        TerminalOrPtr(self.node.0.stable_ptr)
34627    }
34628}
34629impl From<&TerminalOr> for SyntaxStablePtrId {
34630    fn from(node: &TerminalOr) -> Self {
34631        node.stable_ptr().untyped()
34632    }
34633}
34634#[derive(Clone, Debug, Eq, Hash, PartialEq)]
34635pub struct TokenOrOr {
34636    node: SyntaxNode,
34637}
34638impl Token for TokenOrOr {
34639    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
34640        TokenOrOrGreen(
34641            Arc::new(GreenNode {
34642                kind: SyntaxKind::TokenOrOr,
34643                details: GreenNodeDetails::Token(text),
34644            })
34645            .intern(db),
34646        )
34647    }
34648    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
34649        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
34650            .clone()
34651    }
34652}
34653#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
34654pub struct TokenOrOrPtr(pub SyntaxStablePtrId);
34655impl TypedStablePtr for TokenOrOrPtr {
34656    type SyntaxNode = TokenOrOr;
34657    fn untyped(&self) -> SyntaxStablePtrId {
34658        self.0
34659    }
34660    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenOrOr {
34661        TokenOrOr::from_syntax_node(db, self.0.lookup(db))
34662    }
34663}
34664impl From<TokenOrOrPtr> for SyntaxStablePtrId {
34665    fn from(ptr: TokenOrOrPtr) -> Self {
34666        ptr.untyped()
34667    }
34668}
34669#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
34670pub struct TokenOrOrGreen(pub GreenId);
34671impl TokenOrOrGreen {
34672    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
34673        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
34674    }
34675}
34676impl TypedSyntaxNode for TokenOrOr {
34677    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenOrOr);
34678    type StablePtr = TokenOrOrPtr;
34679    type Green = TokenOrOrGreen;
34680    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
34681        TokenOrOrGreen(
34682            Arc::new(GreenNode {
34683                kind: SyntaxKind::TokenMissing,
34684                details: GreenNodeDetails::Token("".into()),
34685            })
34686            .intern(db),
34687        )
34688    }
34689    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
34690        match node.0.green.lookup_intern(db).details {
34691            GreenNodeDetails::Token(_) => Self { node },
34692            GreenNodeDetails::Node { .. } => {
34693                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenOrOr)
34694            }
34695        }
34696    }
34697    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
34698        match node.0.green.lookup_intern(db).details {
34699            GreenNodeDetails::Token(_) => Some(Self { node }),
34700            GreenNodeDetails::Node { .. } => None,
34701        }
34702    }
34703    fn as_syntax_node(&self) -> SyntaxNode {
34704        self.node.clone()
34705    }
34706    fn stable_ptr(&self) -> Self::StablePtr {
34707        TokenOrOrPtr(self.node.0.stable_ptr)
34708    }
34709}
34710impl From<&TokenOrOr> for SyntaxStablePtrId {
34711    fn from(node: &TokenOrOr) -> Self {
34712        node.stable_ptr().untyped()
34713    }
34714}
34715#[derive(Clone, Debug, Eq, Hash, PartialEq)]
34716pub struct TerminalOrOr {
34717    node: SyntaxNode,
34718    children: Arc<[SyntaxNode]>,
34719}
34720impl Terminal for TerminalOrOr {
34721    const KIND: SyntaxKind = SyntaxKind::TerminalOrOr;
34722    type TokenType = TokenOrOr;
34723    fn new_green(
34724        db: &dyn SyntaxGroup,
34725        leading_trivia: TriviaGreen,
34726        token: <<TerminalOrOr as Terminal>::TokenType as TypedSyntaxNode>::Green,
34727        trailing_trivia: TriviaGreen,
34728    ) -> Self::Green {
34729        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
34730        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
34731        TerminalOrOrGreen(
34732            Arc::new(GreenNode {
34733                kind: SyntaxKind::TerminalOrOr,
34734                details: GreenNodeDetails::Node { children, width },
34735            })
34736            .intern(db),
34737        )
34738    }
34739    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
34740        self.token(db).text(db)
34741    }
34742}
34743impl TerminalOrOr {
34744    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
34745        Trivia::from_syntax_node(db, self.children[0].clone())
34746    }
34747    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenOrOr {
34748        TokenOrOr::from_syntax_node(db, self.children[1].clone())
34749    }
34750    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
34751        Trivia::from_syntax_node(db, self.children[2].clone())
34752    }
34753}
34754#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
34755pub struct TerminalOrOrPtr(pub SyntaxStablePtrId);
34756impl TerminalOrOrPtr {}
34757impl TypedStablePtr for TerminalOrOrPtr {
34758    type SyntaxNode = TerminalOrOr;
34759    fn untyped(&self) -> SyntaxStablePtrId {
34760        self.0
34761    }
34762    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalOrOr {
34763        TerminalOrOr::from_syntax_node(db, self.0.lookup(db))
34764    }
34765}
34766impl From<TerminalOrOrPtr> for SyntaxStablePtrId {
34767    fn from(ptr: TerminalOrOrPtr) -> Self {
34768        ptr.untyped()
34769    }
34770}
34771#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
34772pub struct TerminalOrOrGreen(pub GreenId);
34773impl TypedSyntaxNode for TerminalOrOr {
34774    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalOrOr);
34775    type StablePtr = TerminalOrOrPtr;
34776    type Green = TerminalOrOrGreen;
34777    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
34778        TerminalOrOrGreen(
34779            Arc::new(GreenNode {
34780                kind: SyntaxKind::TerminalOrOr,
34781                details: GreenNodeDetails::Node {
34782                    children: vec![
34783                        Trivia::missing(db).0,
34784                        TokenOrOr::missing(db).0,
34785                        Trivia::missing(db).0,
34786                    ],
34787                    width: TextWidth::default(),
34788                },
34789            })
34790            .intern(db),
34791        )
34792    }
34793    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
34794        let kind = node.kind(db);
34795        assert_eq!(
34796            kind,
34797            SyntaxKind::TerminalOrOr,
34798            "Unexpected SyntaxKind {:?}. Expected {:?}.",
34799            kind,
34800            SyntaxKind::TerminalOrOr
34801        );
34802        let children = db.get_children(node.clone());
34803        Self { node, children }
34804    }
34805    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
34806        let kind = node.kind(db);
34807        if kind == SyntaxKind::TerminalOrOr { Some(Self::from_syntax_node(db, node)) } else { None }
34808    }
34809    fn as_syntax_node(&self) -> SyntaxNode {
34810        self.node.clone()
34811    }
34812    fn stable_ptr(&self) -> Self::StablePtr {
34813        TerminalOrOrPtr(self.node.0.stable_ptr)
34814    }
34815}
34816impl From<&TerminalOrOr> for SyntaxStablePtrId {
34817    fn from(node: &TerminalOrOr) -> Self {
34818        node.stable_ptr().untyped()
34819    }
34820}
34821#[derive(Clone, Debug, Eq, Hash, PartialEq)]
34822pub struct TokenPlus {
34823    node: SyntaxNode,
34824}
34825impl Token for TokenPlus {
34826    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
34827        TokenPlusGreen(
34828            Arc::new(GreenNode {
34829                kind: SyntaxKind::TokenPlus,
34830                details: GreenNodeDetails::Token(text),
34831            })
34832            .intern(db),
34833        )
34834    }
34835    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
34836        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
34837            .clone()
34838    }
34839}
34840#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
34841pub struct TokenPlusPtr(pub SyntaxStablePtrId);
34842impl TypedStablePtr for TokenPlusPtr {
34843    type SyntaxNode = TokenPlus;
34844    fn untyped(&self) -> SyntaxStablePtrId {
34845        self.0
34846    }
34847    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenPlus {
34848        TokenPlus::from_syntax_node(db, self.0.lookup(db))
34849    }
34850}
34851impl From<TokenPlusPtr> for SyntaxStablePtrId {
34852    fn from(ptr: TokenPlusPtr) -> Self {
34853        ptr.untyped()
34854    }
34855}
34856#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
34857pub struct TokenPlusGreen(pub GreenId);
34858impl TokenPlusGreen {
34859    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
34860        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
34861    }
34862}
34863impl TypedSyntaxNode for TokenPlus {
34864    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenPlus);
34865    type StablePtr = TokenPlusPtr;
34866    type Green = TokenPlusGreen;
34867    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
34868        TokenPlusGreen(
34869            Arc::new(GreenNode {
34870                kind: SyntaxKind::TokenMissing,
34871                details: GreenNodeDetails::Token("".into()),
34872            })
34873            .intern(db),
34874        )
34875    }
34876    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
34877        match node.0.green.lookup_intern(db).details {
34878            GreenNodeDetails::Token(_) => Self { node },
34879            GreenNodeDetails::Node { .. } => {
34880                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenPlus)
34881            }
34882        }
34883    }
34884    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
34885        match node.0.green.lookup_intern(db).details {
34886            GreenNodeDetails::Token(_) => Some(Self { node }),
34887            GreenNodeDetails::Node { .. } => None,
34888        }
34889    }
34890    fn as_syntax_node(&self) -> SyntaxNode {
34891        self.node.clone()
34892    }
34893    fn stable_ptr(&self) -> Self::StablePtr {
34894        TokenPlusPtr(self.node.0.stable_ptr)
34895    }
34896}
34897impl From<&TokenPlus> for SyntaxStablePtrId {
34898    fn from(node: &TokenPlus) -> Self {
34899        node.stable_ptr().untyped()
34900    }
34901}
34902#[derive(Clone, Debug, Eq, Hash, PartialEq)]
34903pub struct TerminalPlus {
34904    node: SyntaxNode,
34905    children: Arc<[SyntaxNode]>,
34906}
34907impl Terminal for TerminalPlus {
34908    const KIND: SyntaxKind = SyntaxKind::TerminalPlus;
34909    type TokenType = TokenPlus;
34910    fn new_green(
34911        db: &dyn SyntaxGroup,
34912        leading_trivia: TriviaGreen,
34913        token: <<TerminalPlus as Terminal>::TokenType as TypedSyntaxNode>::Green,
34914        trailing_trivia: TriviaGreen,
34915    ) -> Self::Green {
34916        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
34917        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
34918        TerminalPlusGreen(
34919            Arc::new(GreenNode {
34920                kind: SyntaxKind::TerminalPlus,
34921                details: GreenNodeDetails::Node { children, width },
34922            })
34923            .intern(db),
34924        )
34925    }
34926    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
34927        self.token(db).text(db)
34928    }
34929}
34930impl TerminalPlus {
34931    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
34932        Trivia::from_syntax_node(db, self.children[0].clone())
34933    }
34934    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenPlus {
34935        TokenPlus::from_syntax_node(db, self.children[1].clone())
34936    }
34937    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
34938        Trivia::from_syntax_node(db, self.children[2].clone())
34939    }
34940}
34941#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
34942pub struct TerminalPlusPtr(pub SyntaxStablePtrId);
34943impl TerminalPlusPtr {}
34944impl TypedStablePtr for TerminalPlusPtr {
34945    type SyntaxNode = TerminalPlus;
34946    fn untyped(&self) -> SyntaxStablePtrId {
34947        self.0
34948    }
34949    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalPlus {
34950        TerminalPlus::from_syntax_node(db, self.0.lookup(db))
34951    }
34952}
34953impl From<TerminalPlusPtr> for SyntaxStablePtrId {
34954    fn from(ptr: TerminalPlusPtr) -> Self {
34955        ptr.untyped()
34956    }
34957}
34958#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
34959pub struct TerminalPlusGreen(pub GreenId);
34960impl TypedSyntaxNode for TerminalPlus {
34961    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalPlus);
34962    type StablePtr = TerminalPlusPtr;
34963    type Green = TerminalPlusGreen;
34964    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
34965        TerminalPlusGreen(
34966            Arc::new(GreenNode {
34967                kind: SyntaxKind::TerminalPlus,
34968                details: GreenNodeDetails::Node {
34969                    children: vec![
34970                        Trivia::missing(db).0,
34971                        TokenPlus::missing(db).0,
34972                        Trivia::missing(db).0,
34973                    ],
34974                    width: TextWidth::default(),
34975                },
34976            })
34977            .intern(db),
34978        )
34979    }
34980    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
34981        let kind = node.kind(db);
34982        assert_eq!(
34983            kind,
34984            SyntaxKind::TerminalPlus,
34985            "Unexpected SyntaxKind {:?}. Expected {:?}.",
34986            kind,
34987            SyntaxKind::TerminalPlus
34988        );
34989        let children = db.get_children(node.clone());
34990        Self { node, children }
34991    }
34992    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
34993        let kind = node.kind(db);
34994        if kind == SyntaxKind::TerminalPlus { Some(Self::from_syntax_node(db, node)) } else { None }
34995    }
34996    fn as_syntax_node(&self) -> SyntaxNode {
34997        self.node.clone()
34998    }
34999    fn stable_ptr(&self) -> Self::StablePtr {
35000        TerminalPlusPtr(self.node.0.stable_ptr)
35001    }
35002}
35003impl From<&TerminalPlus> for SyntaxStablePtrId {
35004    fn from(node: &TerminalPlus) -> Self {
35005        node.stable_ptr().untyped()
35006    }
35007}
35008#[derive(Clone, Debug, Eq, Hash, PartialEq)]
35009pub struct TokenPlusEq {
35010    node: SyntaxNode,
35011}
35012impl Token for TokenPlusEq {
35013    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
35014        TokenPlusEqGreen(
35015            Arc::new(GreenNode {
35016                kind: SyntaxKind::TokenPlusEq,
35017                details: GreenNodeDetails::Token(text),
35018            })
35019            .intern(db),
35020        )
35021    }
35022    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
35023        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
35024            .clone()
35025    }
35026}
35027#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
35028pub struct TokenPlusEqPtr(pub SyntaxStablePtrId);
35029impl TypedStablePtr for TokenPlusEqPtr {
35030    type SyntaxNode = TokenPlusEq;
35031    fn untyped(&self) -> SyntaxStablePtrId {
35032        self.0
35033    }
35034    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenPlusEq {
35035        TokenPlusEq::from_syntax_node(db, self.0.lookup(db))
35036    }
35037}
35038impl From<TokenPlusEqPtr> for SyntaxStablePtrId {
35039    fn from(ptr: TokenPlusEqPtr) -> Self {
35040        ptr.untyped()
35041    }
35042}
35043#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
35044pub struct TokenPlusEqGreen(pub GreenId);
35045impl TokenPlusEqGreen {
35046    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
35047        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
35048    }
35049}
35050impl TypedSyntaxNode for TokenPlusEq {
35051    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenPlusEq);
35052    type StablePtr = TokenPlusEqPtr;
35053    type Green = TokenPlusEqGreen;
35054    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
35055        TokenPlusEqGreen(
35056            Arc::new(GreenNode {
35057                kind: SyntaxKind::TokenMissing,
35058                details: GreenNodeDetails::Token("".into()),
35059            })
35060            .intern(db),
35061        )
35062    }
35063    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
35064        match node.0.green.lookup_intern(db).details {
35065            GreenNodeDetails::Token(_) => Self { node },
35066            GreenNodeDetails::Node { .. } => {
35067                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenPlusEq)
35068            }
35069        }
35070    }
35071    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
35072        match node.0.green.lookup_intern(db).details {
35073            GreenNodeDetails::Token(_) => Some(Self { node }),
35074            GreenNodeDetails::Node { .. } => None,
35075        }
35076    }
35077    fn as_syntax_node(&self) -> SyntaxNode {
35078        self.node.clone()
35079    }
35080    fn stable_ptr(&self) -> Self::StablePtr {
35081        TokenPlusEqPtr(self.node.0.stable_ptr)
35082    }
35083}
35084impl From<&TokenPlusEq> for SyntaxStablePtrId {
35085    fn from(node: &TokenPlusEq) -> Self {
35086        node.stable_ptr().untyped()
35087    }
35088}
35089#[derive(Clone, Debug, Eq, Hash, PartialEq)]
35090pub struct TerminalPlusEq {
35091    node: SyntaxNode,
35092    children: Arc<[SyntaxNode]>,
35093}
35094impl Terminal for TerminalPlusEq {
35095    const KIND: SyntaxKind = SyntaxKind::TerminalPlusEq;
35096    type TokenType = TokenPlusEq;
35097    fn new_green(
35098        db: &dyn SyntaxGroup,
35099        leading_trivia: TriviaGreen,
35100        token: <<TerminalPlusEq as Terminal>::TokenType as TypedSyntaxNode>::Green,
35101        trailing_trivia: TriviaGreen,
35102    ) -> Self::Green {
35103        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
35104        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
35105        TerminalPlusEqGreen(
35106            Arc::new(GreenNode {
35107                kind: SyntaxKind::TerminalPlusEq,
35108                details: GreenNodeDetails::Node { children, width },
35109            })
35110            .intern(db),
35111        )
35112    }
35113    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
35114        self.token(db).text(db)
35115    }
35116}
35117impl TerminalPlusEq {
35118    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
35119        Trivia::from_syntax_node(db, self.children[0].clone())
35120    }
35121    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenPlusEq {
35122        TokenPlusEq::from_syntax_node(db, self.children[1].clone())
35123    }
35124    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
35125        Trivia::from_syntax_node(db, self.children[2].clone())
35126    }
35127}
35128#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
35129pub struct TerminalPlusEqPtr(pub SyntaxStablePtrId);
35130impl TerminalPlusEqPtr {}
35131impl TypedStablePtr for TerminalPlusEqPtr {
35132    type SyntaxNode = TerminalPlusEq;
35133    fn untyped(&self) -> SyntaxStablePtrId {
35134        self.0
35135    }
35136    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalPlusEq {
35137        TerminalPlusEq::from_syntax_node(db, self.0.lookup(db))
35138    }
35139}
35140impl From<TerminalPlusEqPtr> for SyntaxStablePtrId {
35141    fn from(ptr: TerminalPlusEqPtr) -> Self {
35142        ptr.untyped()
35143    }
35144}
35145#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
35146pub struct TerminalPlusEqGreen(pub GreenId);
35147impl TypedSyntaxNode for TerminalPlusEq {
35148    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalPlusEq);
35149    type StablePtr = TerminalPlusEqPtr;
35150    type Green = TerminalPlusEqGreen;
35151    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
35152        TerminalPlusEqGreen(
35153            Arc::new(GreenNode {
35154                kind: SyntaxKind::TerminalPlusEq,
35155                details: GreenNodeDetails::Node {
35156                    children: vec![
35157                        Trivia::missing(db).0,
35158                        TokenPlusEq::missing(db).0,
35159                        Trivia::missing(db).0,
35160                    ],
35161                    width: TextWidth::default(),
35162                },
35163            })
35164            .intern(db),
35165        )
35166    }
35167    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
35168        let kind = node.kind(db);
35169        assert_eq!(
35170            kind,
35171            SyntaxKind::TerminalPlusEq,
35172            "Unexpected SyntaxKind {:?}. Expected {:?}.",
35173            kind,
35174            SyntaxKind::TerminalPlusEq
35175        );
35176        let children = db.get_children(node.clone());
35177        Self { node, children }
35178    }
35179    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
35180        let kind = node.kind(db);
35181        if kind == SyntaxKind::TerminalPlusEq {
35182            Some(Self::from_syntax_node(db, node))
35183        } else {
35184            None
35185        }
35186    }
35187    fn as_syntax_node(&self) -> SyntaxNode {
35188        self.node.clone()
35189    }
35190    fn stable_ptr(&self) -> Self::StablePtr {
35191        TerminalPlusEqPtr(self.node.0.stable_ptr)
35192    }
35193}
35194impl From<&TerminalPlusEq> for SyntaxStablePtrId {
35195    fn from(node: &TerminalPlusEq) -> Self {
35196        node.stable_ptr().untyped()
35197    }
35198}
35199#[derive(Clone, Debug, Eq, Hash, PartialEq)]
35200pub struct TokenQuestionMark {
35201    node: SyntaxNode,
35202}
35203impl Token for TokenQuestionMark {
35204    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
35205        TokenQuestionMarkGreen(
35206            Arc::new(GreenNode {
35207                kind: SyntaxKind::TokenQuestionMark,
35208                details: GreenNodeDetails::Token(text),
35209            })
35210            .intern(db),
35211        )
35212    }
35213    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
35214        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
35215            .clone()
35216    }
35217}
35218#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
35219pub struct TokenQuestionMarkPtr(pub SyntaxStablePtrId);
35220impl TypedStablePtr for TokenQuestionMarkPtr {
35221    type SyntaxNode = TokenQuestionMark;
35222    fn untyped(&self) -> SyntaxStablePtrId {
35223        self.0
35224    }
35225    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenQuestionMark {
35226        TokenQuestionMark::from_syntax_node(db, self.0.lookup(db))
35227    }
35228}
35229impl From<TokenQuestionMarkPtr> for SyntaxStablePtrId {
35230    fn from(ptr: TokenQuestionMarkPtr) -> Self {
35231        ptr.untyped()
35232    }
35233}
35234#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
35235pub struct TokenQuestionMarkGreen(pub GreenId);
35236impl TokenQuestionMarkGreen {
35237    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
35238        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
35239    }
35240}
35241impl TypedSyntaxNode for TokenQuestionMark {
35242    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenQuestionMark);
35243    type StablePtr = TokenQuestionMarkPtr;
35244    type Green = TokenQuestionMarkGreen;
35245    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
35246        TokenQuestionMarkGreen(
35247            Arc::new(GreenNode {
35248                kind: SyntaxKind::TokenMissing,
35249                details: GreenNodeDetails::Token("".into()),
35250            })
35251            .intern(db),
35252        )
35253    }
35254    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
35255        match node.0.green.lookup_intern(db).details {
35256            GreenNodeDetails::Token(_) => Self { node },
35257            GreenNodeDetails::Node { .. } => {
35258                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenQuestionMark)
35259            }
35260        }
35261    }
35262    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
35263        match node.0.green.lookup_intern(db).details {
35264            GreenNodeDetails::Token(_) => Some(Self { node }),
35265            GreenNodeDetails::Node { .. } => None,
35266        }
35267    }
35268    fn as_syntax_node(&self) -> SyntaxNode {
35269        self.node.clone()
35270    }
35271    fn stable_ptr(&self) -> Self::StablePtr {
35272        TokenQuestionMarkPtr(self.node.0.stable_ptr)
35273    }
35274}
35275impl From<&TokenQuestionMark> for SyntaxStablePtrId {
35276    fn from(node: &TokenQuestionMark) -> Self {
35277        node.stable_ptr().untyped()
35278    }
35279}
35280#[derive(Clone, Debug, Eq, Hash, PartialEq)]
35281pub struct TerminalQuestionMark {
35282    node: SyntaxNode,
35283    children: Arc<[SyntaxNode]>,
35284}
35285impl Terminal for TerminalQuestionMark {
35286    const KIND: SyntaxKind = SyntaxKind::TerminalQuestionMark;
35287    type TokenType = TokenQuestionMark;
35288    fn new_green(
35289        db: &dyn SyntaxGroup,
35290        leading_trivia: TriviaGreen,
35291        token: <<TerminalQuestionMark as Terminal>::TokenType as TypedSyntaxNode>::Green,
35292        trailing_trivia: TriviaGreen,
35293    ) -> Self::Green {
35294        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
35295        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
35296        TerminalQuestionMarkGreen(
35297            Arc::new(GreenNode {
35298                kind: SyntaxKind::TerminalQuestionMark,
35299                details: GreenNodeDetails::Node { children, width },
35300            })
35301            .intern(db),
35302        )
35303    }
35304    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
35305        self.token(db).text(db)
35306    }
35307}
35308impl TerminalQuestionMark {
35309    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
35310        Trivia::from_syntax_node(db, self.children[0].clone())
35311    }
35312    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenQuestionMark {
35313        TokenQuestionMark::from_syntax_node(db, self.children[1].clone())
35314    }
35315    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
35316        Trivia::from_syntax_node(db, self.children[2].clone())
35317    }
35318}
35319#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
35320pub struct TerminalQuestionMarkPtr(pub SyntaxStablePtrId);
35321impl TerminalQuestionMarkPtr {}
35322impl TypedStablePtr for TerminalQuestionMarkPtr {
35323    type SyntaxNode = TerminalQuestionMark;
35324    fn untyped(&self) -> SyntaxStablePtrId {
35325        self.0
35326    }
35327    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalQuestionMark {
35328        TerminalQuestionMark::from_syntax_node(db, self.0.lookup(db))
35329    }
35330}
35331impl From<TerminalQuestionMarkPtr> for SyntaxStablePtrId {
35332    fn from(ptr: TerminalQuestionMarkPtr) -> Self {
35333        ptr.untyped()
35334    }
35335}
35336#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
35337pub struct TerminalQuestionMarkGreen(pub GreenId);
35338impl TypedSyntaxNode for TerminalQuestionMark {
35339    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalQuestionMark);
35340    type StablePtr = TerminalQuestionMarkPtr;
35341    type Green = TerminalQuestionMarkGreen;
35342    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
35343        TerminalQuestionMarkGreen(
35344            Arc::new(GreenNode {
35345                kind: SyntaxKind::TerminalQuestionMark,
35346                details: GreenNodeDetails::Node {
35347                    children: vec![
35348                        Trivia::missing(db).0,
35349                        TokenQuestionMark::missing(db).0,
35350                        Trivia::missing(db).0,
35351                    ],
35352                    width: TextWidth::default(),
35353                },
35354            })
35355            .intern(db),
35356        )
35357    }
35358    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
35359        let kind = node.kind(db);
35360        assert_eq!(
35361            kind,
35362            SyntaxKind::TerminalQuestionMark,
35363            "Unexpected SyntaxKind {:?}. Expected {:?}.",
35364            kind,
35365            SyntaxKind::TerminalQuestionMark
35366        );
35367        let children = db.get_children(node.clone());
35368        Self { node, children }
35369    }
35370    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
35371        let kind = node.kind(db);
35372        if kind == SyntaxKind::TerminalQuestionMark {
35373            Some(Self::from_syntax_node(db, node))
35374        } else {
35375            None
35376        }
35377    }
35378    fn as_syntax_node(&self) -> SyntaxNode {
35379        self.node.clone()
35380    }
35381    fn stable_ptr(&self) -> Self::StablePtr {
35382        TerminalQuestionMarkPtr(self.node.0.stable_ptr)
35383    }
35384}
35385impl From<&TerminalQuestionMark> for SyntaxStablePtrId {
35386    fn from(node: &TerminalQuestionMark) -> Self {
35387        node.stable_ptr().untyped()
35388    }
35389}
35390#[derive(Clone, Debug, Eq, Hash, PartialEq)]
35391pub struct TokenRBrace {
35392    node: SyntaxNode,
35393}
35394impl Token for TokenRBrace {
35395    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
35396        TokenRBraceGreen(
35397            Arc::new(GreenNode {
35398                kind: SyntaxKind::TokenRBrace,
35399                details: GreenNodeDetails::Token(text),
35400            })
35401            .intern(db),
35402        )
35403    }
35404    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
35405        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
35406            .clone()
35407    }
35408}
35409#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
35410pub struct TokenRBracePtr(pub SyntaxStablePtrId);
35411impl TypedStablePtr for TokenRBracePtr {
35412    type SyntaxNode = TokenRBrace;
35413    fn untyped(&self) -> SyntaxStablePtrId {
35414        self.0
35415    }
35416    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenRBrace {
35417        TokenRBrace::from_syntax_node(db, self.0.lookup(db))
35418    }
35419}
35420impl From<TokenRBracePtr> for SyntaxStablePtrId {
35421    fn from(ptr: TokenRBracePtr) -> Self {
35422        ptr.untyped()
35423    }
35424}
35425#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
35426pub struct TokenRBraceGreen(pub GreenId);
35427impl TokenRBraceGreen {
35428    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
35429        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
35430    }
35431}
35432impl TypedSyntaxNode for TokenRBrace {
35433    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenRBrace);
35434    type StablePtr = TokenRBracePtr;
35435    type Green = TokenRBraceGreen;
35436    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
35437        TokenRBraceGreen(
35438            Arc::new(GreenNode {
35439                kind: SyntaxKind::TokenMissing,
35440                details: GreenNodeDetails::Token("".into()),
35441            })
35442            .intern(db),
35443        )
35444    }
35445    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
35446        match node.0.green.lookup_intern(db).details {
35447            GreenNodeDetails::Token(_) => Self { node },
35448            GreenNodeDetails::Node { .. } => {
35449                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenRBrace)
35450            }
35451        }
35452    }
35453    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
35454        match node.0.green.lookup_intern(db).details {
35455            GreenNodeDetails::Token(_) => Some(Self { node }),
35456            GreenNodeDetails::Node { .. } => None,
35457        }
35458    }
35459    fn as_syntax_node(&self) -> SyntaxNode {
35460        self.node.clone()
35461    }
35462    fn stable_ptr(&self) -> Self::StablePtr {
35463        TokenRBracePtr(self.node.0.stable_ptr)
35464    }
35465}
35466impl From<&TokenRBrace> for SyntaxStablePtrId {
35467    fn from(node: &TokenRBrace) -> Self {
35468        node.stable_ptr().untyped()
35469    }
35470}
35471#[derive(Clone, Debug, Eq, Hash, PartialEq)]
35472pub struct TerminalRBrace {
35473    node: SyntaxNode,
35474    children: Arc<[SyntaxNode]>,
35475}
35476impl Terminal for TerminalRBrace {
35477    const KIND: SyntaxKind = SyntaxKind::TerminalRBrace;
35478    type TokenType = TokenRBrace;
35479    fn new_green(
35480        db: &dyn SyntaxGroup,
35481        leading_trivia: TriviaGreen,
35482        token: <<TerminalRBrace as Terminal>::TokenType as TypedSyntaxNode>::Green,
35483        trailing_trivia: TriviaGreen,
35484    ) -> Self::Green {
35485        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
35486        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
35487        TerminalRBraceGreen(
35488            Arc::new(GreenNode {
35489                kind: SyntaxKind::TerminalRBrace,
35490                details: GreenNodeDetails::Node { children, width },
35491            })
35492            .intern(db),
35493        )
35494    }
35495    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
35496        self.token(db).text(db)
35497    }
35498}
35499impl TerminalRBrace {
35500    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
35501        Trivia::from_syntax_node(db, self.children[0].clone())
35502    }
35503    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenRBrace {
35504        TokenRBrace::from_syntax_node(db, self.children[1].clone())
35505    }
35506    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
35507        Trivia::from_syntax_node(db, self.children[2].clone())
35508    }
35509}
35510#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
35511pub struct TerminalRBracePtr(pub SyntaxStablePtrId);
35512impl TerminalRBracePtr {}
35513impl TypedStablePtr for TerminalRBracePtr {
35514    type SyntaxNode = TerminalRBrace;
35515    fn untyped(&self) -> SyntaxStablePtrId {
35516        self.0
35517    }
35518    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalRBrace {
35519        TerminalRBrace::from_syntax_node(db, self.0.lookup(db))
35520    }
35521}
35522impl From<TerminalRBracePtr> for SyntaxStablePtrId {
35523    fn from(ptr: TerminalRBracePtr) -> Self {
35524        ptr.untyped()
35525    }
35526}
35527#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
35528pub struct TerminalRBraceGreen(pub GreenId);
35529impl TypedSyntaxNode for TerminalRBrace {
35530    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalRBrace);
35531    type StablePtr = TerminalRBracePtr;
35532    type Green = TerminalRBraceGreen;
35533    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
35534        TerminalRBraceGreen(
35535            Arc::new(GreenNode {
35536                kind: SyntaxKind::TerminalRBrace,
35537                details: GreenNodeDetails::Node {
35538                    children: vec![
35539                        Trivia::missing(db).0,
35540                        TokenRBrace::missing(db).0,
35541                        Trivia::missing(db).0,
35542                    ],
35543                    width: TextWidth::default(),
35544                },
35545            })
35546            .intern(db),
35547        )
35548    }
35549    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
35550        let kind = node.kind(db);
35551        assert_eq!(
35552            kind,
35553            SyntaxKind::TerminalRBrace,
35554            "Unexpected SyntaxKind {:?}. Expected {:?}.",
35555            kind,
35556            SyntaxKind::TerminalRBrace
35557        );
35558        let children = db.get_children(node.clone());
35559        Self { node, children }
35560    }
35561    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
35562        let kind = node.kind(db);
35563        if kind == SyntaxKind::TerminalRBrace {
35564            Some(Self::from_syntax_node(db, node))
35565        } else {
35566            None
35567        }
35568    }
35569    fn as_syntax_node(&self) -> SyntaxNode {
35570        self.node.clone()
35571    }
35572    fn stable_ptr(&self) -> Self::StablePtr {
35573        TerminalRBracePtr(self.node.0.stable_ptr)
35574    }
35575}
35576impl From<&TerminalRBrace> for SyntaxStablePtrId {
35577    fn from(node: &TerminalRBrace) -> Self {
35578        node.stable_ptr().untyped()
35579    }
35580}
35581#[derive(Clone, Debug, Eq, Hash, PartialEq)]
35582pub struct TokenRBrack {
35583    node: SyntaxNode,
35584}
35585impl Token for TokenRBrack {
35586    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
35587        TokenRBrackGreen(
35588            Arc::new(GreenNode {
35589                kind: SyntaxKind::TokenRBrack,
35590                details: GreenNodeDetails::Token(text),
35591            })
35592            .intern(db),
35593        )
35594    }
35595    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
35596        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
35597            .clone()
35598    }
35599}
35600#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
35601pub struct TokenRBrackPtr(pub SyntaxStablePtrId);
35602impl TypedStablePtr for TokenRBrackPtr {
35603    type SyntaxNode = TokenRBrack;
35604    fn untyped(&self) -> SyntaxStablePtrId {
35605        self.0
35606    }
35607    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenRBrack {
35608        TokenRBrack::from_syntax_node(db, self.0.lookup(db))
35609    }
35610}
35611impl From<TokenRBrackPtr> for SyntaxStablePtrId {
35612    fn from(ptr: TokenRBrackPtr) -> Self {
35613        ptr.untyped()
35614    }
35615}
35616#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
35617pub struct TokenRBrackGreen(pub GreenId);
35618impl TokenRBrackGreen {
35619    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
35620        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
35621    }
35622}
35623impl TypedSyntaxNode for TokenRBrack {
35624    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenRBrack);
35625    type StablePtr = TokenRBrackPtr;
35626    type Green = TokenRBrackGreen;
35627    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
35628        TokenRBrackGreen(
35629            Arc::new(GreenNode {
35630                kind: SyntaxKind::TokenMissing,
35631                details: GreenNodeDetails::Token("".into()),
35632            })
35633            .intern(db),
35634        )
35635    }
35636    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
35637        match node.0.green.lookup_intern(db).details {
35638            GreenNodeDetails::Token(_) => Self { node },
35639            GreenNodeDetails::Node { .. } => {
35640                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenRBrack)
35641            }
35642        }
35643    }
35644    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
35645        match node.0.green.lookup_intern(db).details {
35646            GreenNodeDetails::Token(_) => Some(Self { node }),
35647            GreenNodeDetails::Node { .. } => None,
35648        }
35649    }
35650    fn as_syntax_node(&self) -> SyntaxNode {
35651        self.node.clone()
35652    }
35653    fn stable_ptr(&self) -> Self::StablePtr {
35654        TokenRBrackPtr(self.node.0.stable_ptr)
35655    }
35656}
35657impl From<&TokenRBrack> for SyntaxStablePtrId {
35658    fn from(node: &TokenRBrack) -> Self {
35659        node.stable_ptr().untyped()
35660    }
35661}
35662#[derive(Clone, Debug, Eq, Hash, PartialEq)]
35663pub struct TerminalRBrack {
35664    node: SyntaxNode,
35665    children: Arc<[SyntaxNode]>,
35666}
35667impl Terminal for TerminalRBrack {
35668    const KIND: SyntaxKind = SyntaxKind::TerminalRBrack;
35669    type TokenType = TokenRBrack;
35670    fn new_green(
35671        db: &dyn SyntaxGroup,
35672        leading_trivia: TriviaGreen,
35673        token: <<TerminalRBrack as Terminal>::TokenType as TypedSyntaxNode>::Green,
35674        trailing_trivia: TriviaGreen,
35675    ) -> Self::Green {
35676        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
35677        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
35678        TerminalRBrackGreen(
35679            Arc::new(GreenNode {
35680                kind: SyntaxKind::TerminalRBrack,
35681                details: GreenNodeDetails::Node { children, width },
35682            })
35683            .intern(db),
35684        )
35685    }
35686    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
35687        self.token(db).text(db)
35688    }
35689}
35690impl TerminalRBrack {
35691    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
35692        Trivia::from_syntax_node(db, self.children[0].clone())
35693    }
35694    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenRBrack {
35695        TokenRBrack::from_syntax_node(db, self.children[1].clone())
35696    }
35697    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
35698        Trivia::from_syntax_node(db, self.children[2].clone())
35699    }
35700}
35701#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
35702pub struct TerminalRBrackPtr(pub SyntaxStablePtrId);
35703impl TerminalRBrackPtr {}
35704impl TypedStablePtr for TerminalRBrackPtr {
35705    type SyntaxNode = TerminalRBrack;
35706    fn untyped(&self) -> SyntaxStablePtrId {
35707        self.0
35708    }
35709    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalRBrack {
35710        TerminalRBrack::from_syntax_node(db, self.0.lookup(db))
35711    }
35712}
35713impl From<TerminalRBrackPtr> for SyntaxStablePtrId {
35714    fn from(ptr: TerminalRBrackPtr) -> Self {
35715        ptr.untyped()
35716    }
35717}
35718#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
35719pub struct TerminalRBrackGreen(pub GreenId);
35720impl TypedSyntaxNode for TerminalRBrack {
35721    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalRBrack);
35722    type StablePtr = TerminalRBrackPtr;
35723    type Green = TerminalRBrackGreen;
35724    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
35725        TerminalRBrackGreen(
35726            Arc::new(GreenNode {
35727                kind: SyntaxKind::TerminalRBrack,
35728                details: GreenNodeDetails::Node {
35729                    children: vec![
35730                        Trivia::missing(db).0,
35731                        TokenRBrack::missing(db).0,
35732                        Trivia::missing(db).0,
35733                    ],
35734                    width: TextWidth::default(),
35735                },
35736            })
35737            .intern(db),
35738        )
35739    }
35740    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
35741        let kind = node.kind(db);
35742        assert_eq!(
35743            kind,
35744            SyntaxKind::TerminalRBrack,
35745            "Unexpected SyntaxKind {:?}. Expected {:?}.",
35746            kind,
35747            SyntaxKind::TerminalRBrack
35748        );
35749        let children = db.get_children(node.clone());
35750        Self { node, children }
35751    }
35752    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
35753        let kind = node.kind(db);
35754        if kind == SyntaxKind::TerminalRBrack {
35755            Some(Self::from_syntax_node(db, node))
35756        } else {
35757            None
35758        }
35759    }
35760    fn as_syntax_node(&self) -> SyntaxNode {
35761        self.node.clone()
35762    }
35763    fn stable_ptr(&self) -> Self::StablePtr {
35764        TerminalRBrackPtr(self.node.0.stable_ptr)
35765    }
35766}
35767impl From<&TerminalRBrack> for SyntaxStablePtrId {
35768    fn from(node: &TerminalRBrack) -> Self {
35769        node.stable_ptr().untyped()
35770    }
35771}
35772#[derive(Clone, Debug, Eq, Hash, PartialEq)]
35773pub struct TokenRParen {
35774    node: SyntaxNode,
35775}
35776impl Token for TokenRParen {
35777    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
35778        TokenRParenGreen(
35779            Arc::new(GreenNode {
35780                kind: SyntaxKind::TokenRParen,
35781                details: GreenNodeDetails::Token(text),
35782            })
35783            .intern(db),
35784        )
35785    }
35786    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
35787        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
35788            .clone()
35789    }
35790}
35791#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
35792pub struct TokenRParenPtr(pub SyntaxStablePtrId);
35793impl TypedStablePtr for TokenRParenPtr {
35794    type SyntaxNode = TokenRParen;
35795    fn untyped(&self) -> SyntaxStablePtrId {
35796        self.0
35797    }
35798    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenRParen {
35799        TokenRParen::from_syntax_node(db, self.0.lookup(db))
35800    }
35801}
35802impl From<TokenRParenPtr> for SyntaxStablePtrId {
35803    fn from(ptr: TokenRParenPtr) -> Self {
35804        ptr.untyped()
35805    }
35806}
35807#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
35808pub struct TokenRParenGreen(pub GreenId);
35809impl TokenRParenGreen {
35810    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
35811        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
35812    }
35813}
35814impl TypedSyntaxNode for TokenRParen {
35815    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenRParen);
35816    type StablePtr = TokenRParenPtr;
35817    type Green = TokenRParenGreen;
35818    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
35819        TokenRParenGreen(
35820            Arc::new(GreenNode {
35821                kind: SyntaxKind::TokenMissing,
35822                details: GreenNodeDetails::Token("".into()),
35823            })
35824            .intern(db),
35825        )
35826    }
35827    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
35828        match node.0.green.lookup_intern(db).details {
35829            GreenNodeDetails::Token(_) => Self { node },
35830            GreenNodeDetails::Node { .. } => {
35831                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenRParen)
35832            }
35833        }
35834    }
35835    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
35836        match node.0.green.lookup_intern(db).details {
35837            GreenNodeDetails::Token(_) => Some(Self { node }),
35838            GreenNodeDetails::Node { .. } => None,
35839        }
35840    }
35841    fn as_syntax_node(&self) -> SyntaxNode {
35842        self.node.clone()
35843    }
35844    fn stable_ptr(&self) -> Self::StablePtr {
35845        TokenRParenPtr(self.node.0.stable_ptr)
35846    }
35847}
35848impl From<&TokenRParen> for SyntaxStablePtrId {
35849    fn from(node: &TokenRParen) -> Self {
35850        node.stable_ptr().untyped()
35851    }
35852}
35853#[derive(Clone, Debug, Eq, Hash, PartialEq)]
35854pub struct TerminalRParen {
35855    node: SyntaxNode,
35856    children: Arc<[SyntaxNode]>,
35857}
35858impl Terminal for TerminalRParen {
35859    const KIND: SyntaxKind = SyntaxKind::TerminalRParen;
35860    type TokenType = TokenRParen;
35861    fn new_green(
35862        db: &dyn SyntaxGroup,
35863        leading_trivia: TriviaGreen,
35864        token: <<TerminalRParen as Terminal>::TokenType as TypedSyntaxNode>::Green,
35865        trailing_trivia: TriviaGreen,
35866    ) -> Self::Green {
35867        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
35868        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
35869        TerminalRParenGreen(
35870            Arc::new(GreenNode {
35871                kind: SyntaxKind::TerminalRParen,
35872                details: GreenNodeDetails::Node { children, width },
35873            })
35874            .intern(db),
35875        )
35876    }
35877    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
35878        self.token(db).text(db)
35879    }
35880}
35881impl TerminalRParen {
35882    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
35883        Trivia::from_syntax_node(db, self.children[0].clone())
35884    }
35885    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenRParen {
35886        TokenRParen::from_syntax_node(db, self.children[1].clone())
35887    }
35888    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
35889        Trivia::from_syntax_node(db, self.children[2].clone())
35890    }
35891}
35892#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
35893pub struct TerminalRParenPtr(pub SyntaxStablePtrId);
35894impl TerminalRParenPtr {}
35895impl TypedStablePtr for TerminalRParenPtr {
35896    type SyntaxNode = TerminalRParen;
35897    fn untyped(&self) -> SyntaxStablePtrId {
35898        self.0
35899    }
35900    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalRParen {
35901        TerminalRParen::from_syntax_node(db, self.0.lookup(db))
35902    }
35903}
35904impl From<TerminalRParenPtr> for SyntaxStablePtrId {
35905    fn from(ptr: TerminalRParenPtr) -> Self {
35906        ptr.untyped()
35907    }
35908}
35909#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
35910pub struct TerminalRParenGreen(pub GreenId);
35911impl TypedSyntaxNode for TerminalRParen {
35912    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalRParen);
35913    type StablePtr = TerminalRParenPtr;
35914    type Green = TerminalRParenGreen;
35915    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
35916        TerminalRParenGreen(
35917            Arc::new(GreenNode {
35918                kind: SyntaxKind::TerminalRParen,
35919                details: GreenNodeDetails::Node {
35920                    children: vec![
35921                        Trivia::missing(db).0,
35922                        TokenRParen::missing(db).0,
35923                        Trivia::missing(db).0,
35924                    ],
35925                    width: TextWidth::default(),
35926                },
35927            })
35928            .intern(db),
35929        )
35930    }
35931    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
35932        let kind = node.kind(db);
35933        assert_eq!(
35934            kind,
35935            SyntaxKind::TerminalRParen,
35936            "Unexpected SyntaxKind {:?}. Expected {:?}.",
35937            kind,
35938            SyntaxKind::TerminalRParen
35939        );
35940        let children = db.get_children(node.clone());
35941        Self { node, children }
35942    }
35943    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
35944        let kind = node.kind(db);
35945        if kind == SyntaxKind::TerminalRParen {
35946            Some(Self::from_syntax_node(db, node))
35947        } else {
35948            None
35949        }
35950    }
35951    fn as_syntax_node(&self) -> SyntaxNode {
35952        self.node.clone()
35953    }
35954    fn stable_ptr(&self) -> Self::StablePtr {
35955        TerminalRParenPtr(self.node.0.stable_ptr)
35956    }
35957}
35958impl From<&TerminalRParen> for SyntaxStablePtrId {
35959    fn from(node: &TerminalRParen) -> Self {
35960        node.stable_ptr().untyped()
35961    }
35962}
35963#[derive(Clone, Debug, Eq, Hash, PartialEq)]
35964pub struct TokenSemicolon {
35965    node: SyntaxNode,
35966}
35967impl Token for TokenSemicolon {
35968    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
35969        TokenSemicolonGreen(
35970            Arc::new(GreenNode {
35971                kind: SyntaxKind::TokenSemicolon,
35972                details: GreenNodeDetails::Token(text),
35973            })
35974            .intern(db),
35975        )
35976    }
35977    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
35978        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
35979            .clone()
35980    }
35981}
35982#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
35983pub struct TokenSemicolonPtr(pub SyntaxStablePtrId);
35984impl TypedStablePtr for TokenSemicolonPtr {
35985    type SyntaxNode = TokenSemicolon;
35986    fn untyped(&self) -> SyntaxStablePtrId {
35987        self.0
35988    }
35989    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenSemicolon {
35990        TokenSemicolon::from_syntax_node(db, self.0.lookup(db))
35991    }
35992}
35993impl From<TokenSemicolonPtr> for SyntaxStablePtrId {
35994    fn from(ptr: TokenSemicolonPtr) -> Self {
35995        ptr.untyped()
35996    }
35997}
35998#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
35999pub struct TokenSemicolonGreen(pub GreenId);
36000impl TokenSemicolonGreen {
36001    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
36002        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
36003    }
36004}
36005impl TypedSyntaxNode for TokenSemicolon {
36006    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenSemicolon);
36007    type StablePtr = TokenSemicolonPtr;
36008    type Green = TokenSemicolonGreen;
36009    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
36010        TokenSemicolonGreen(
36011            Arc::new(GreenNode {
36012                kind: SyntaxKind::TokenMissing,
36013                details: GreenNodeDetails::Token("".into()),
36014            })
36015            .intern(db),
36016        )
36017    }
36018    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
36019        match node.0.green.lookup_intern(db).details {
36020            GreenNodeDetails::Token(_) => Self { node },
36021            GreenNodeDetails::Node { .. } => {
36022                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenSemicolon)
36023            }
36024        }
36025    }
36026    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
36027        match node.0.green.lookup_intern(db).details {
36028            GreenNodeDetails::Token(_) => Some(Self { node }),
36029            GreenNodeDetails::Node { .. } => None,
36030        }
36031    }
36032    fn as_syntax_node(&self) -> SyntaxNode {
36033        self.node.clone()
36034    }
36035    fn stable_ptr(&self) -> Self::StablePtr {
36036        TokenSemicolonPtr(self.node.0.stable_ptr)
36037    }
36038}
36039impl From<&TokenSemicolon> for SyntaxStablePtrId {
36040    fn from(node: &TokenSemicolon) -> Self {
36041        node.stable_ptr().untyped()
36042    }
36043}
36044#[derive(Clone, Debug, Eq, Hash, PartialEq)]
36045pub struct TerminalSemicolon {
36046    node: SyntaxNode,
36047    children: Arc<[SyntaxNode]>,
36048}
36049impl Terminal for TerminalSemicolon {
36050    const KIND: SyntaxKind = SyntaxKind::TerminalSemicolon;
36051    type TokenType = TokenSemicolon;
36052    fn new_green(
36053        db: &dyn SyntaxGroup,
36054        leading_trivia: TriviaGreen,
36055        token: <<TerminalSemicolon as Terminal>::TokenType as TypedSyntaxNode>::Green,
36056        trailing_trivia: TriviaGreen,
36057    ) -> Self::Green {
36058        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
36059        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
36060        TerminalSemicolonGreen(
36061            Arc::new(GreenNode {
36062                kind: SyntaxKind::TerminalSemicolon,
36063                details: GreenNodeDetails::Node { children, width },
36064            })
36065            .intern(db),
36066        )
36067    }
36068    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
36069        self.token(db).text(db)
36070    }
36071}
36072impl TerminalSemicolon {
36073    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
36074        Trivia::from_syntax_node(db, self.children[0].clone())
36075    }
36076    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenSemicolon {
36077        TokenSemicolon::from_syntax_node(db, self.children[1].clone())
36078    }
36079    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
36080        Trivia::from_syntax_node(db, self.children[2].clone())
36081    }
36082}
36083#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
36084pub struct TerminalSemicolonPtr(pub SyntaxStablePtrId);
36085impl TerminalSemicolonPtr {}
36086impl TypedStablePtr for TerminalSemicolonPtr {
36087    type SyntaxNode = TerminalSemicolon;
36088    fn untyped(&self) -> SyntaxStablePtrId {
36089        self.0
36090    }
36091    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalSemicolon {
36092        TerminalSemicolon::from_syntax_node(db, self.0.lookup(db))
36093    }
36094}
36095impl From<TerminalSemicolonPtr> for SyntaxStablePtrId {
36096    fn from(ptr: TerminalSemicolonPtr) -> Self {
36097        ptr.untyped()
36098    }
36099}
36100#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
36101pub struct TerminalSemicolonGreen(pub GreenId);
36102impl TypedSyntaxNode for TerminalSemicolon {
36103    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalSemicolon);
36104    type StablePtr = TerminalSemicolonPtr;
36105    type Green = TerminalSemicolonGreen;
36106    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
36107        TerminalSemicolonGreen(
36108            Arc::new(GreenNode {
36109                kind: SyntaxKind::TerminalSemicolon,
36110                details: GreenNodeDetails::Node {
36111                    children: vec![
36112                        Trivia::missing(db).0,
36113                        TokenSemicolon::missing(db).0,
36114                        Trivia::missing(db).0,
36115                    ],
36116                    width: TextWidth::default(),
36117                },
36118            })
36119            .intern(db),
36120        )
36121    }
36122    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
36123        let kind = node.kind(db);
36124        assert_eq!(
36125            kind,
36126            SyntaxKind::TerminalSemicolon,
36127            "Unexpected SyntaxKind {:?}. Expected {:?}.",
36128            kind,
36129            SyntaxKind::TerminalSemicolon
36130        );
36131        let children = db.get_children(node.clone());
36132        Self { node, children }
36133    }
36134    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
36135        let kind = node.kind(db);
36136        if kind == SyntaxKind::TerminalSemicolon {
36137            Some(Self::from_syntax_node(db, node))
36138        } else {
36139            None
36140        }
36141    }
36142    fn as_syntax_node(&self) -> SyntaxNode {
36143        self.node.clone()
36144    }
36145    fn stable_ptr(&self) -> Self::StablePtr {
36146        TerminalSemicolonPtr(self.node.0.stable_ptr)
36147    }
36148}
36149impl From<&TerminalSemicolon> for SyntaxStablePtrId {
36150    fn from(node: &TerminalSemicolon) -> Self {
36151        node.stable_ptr().untyped()
36152    }
36153}
36154#[derive(Clone, Debug, Eq, Hash, PartialEq)]
36155pub struct TokenUnderscore {
36156    node: SyntaxNode,
36157}
36158impl Token for TokenUnderscore {
36159    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
36160        TokenUnderscoreGreen(
36161            Arc::new(GreenNode {
36162                kind: SyntaxKind::TokenUnderscore,
36163                details: GreenNodeDetails::Token(text),
36164            })
36165            .intern(db),
36166        )
36167    }
36168    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
36169        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
36170            .clone()
36171    }
36172}
36173#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
36174pub struct TokenUnderscorePtr(pub SyntaxStablePtrId);
36175impl TypedStablePtr for TokenUnderscorePtr {
36176    type SyntaxNode = TokenUnderscore;
36177    fn untyped(&self) -> SyntaxStablePtrId {
36178        self.0
36179    }
36180    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenUnderscore {
36181        TokenUnderscore::from_syntax_node(db, self.0.lookup(db))
36182    }
36183}
36184impl From<TokenUnderscorePtr> for SyntaxStablePtrId {
36185    fn from(ptr: TokenUnderscorePtr) -> Self {
36186        ptr.untyped()
36187    }
36188}
36189#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
36190pub struct TokenUnderscoreGreen(pub GreenId);
36191impl TokenUnderscoreGreen {
36192    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
36193        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
36194    }
36195}
36196impl TypedSyntaxNode for TokenUnderscore {
36197    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenUnderscore);
36198    type StablePtr = TokenUnderscorePtr;
36199    type Green = TokenUnderscoreGreen;
36200    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
36201        TokenUnderscoreGreen(
36202            Arc::new(GreenNode {
36203                kind: SyntaxKind::TokenMissing,
36204                details: GreenNodeDetails::Token("".into()),
36205            })
36206            .intern(db),
36207        )
36208    }
36209    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
36210        match node.0.green.lookup_intern(db).details {
36211            GreenNodeDetails::Token(_) => Self { node },
36212            GreenNodeDetails::Node { .. } => {
36213                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenUnderscore)
36214            }
36215        }
36216    }
36217    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
36218        match node.0.green.lookup_intern(db).details {
36219            GreenNodeDetails::Token(_) => Some(Self { node }),
36220            GreenNodeDetails::Node { .. } => None,
36221        }
36222    }
36223    fn as_syntax_node(&self) -> SyntaxNode {
36224        self.node.clone()
36225    }
36226    fn stable_ptr(&self) -> Self::StablePtr {
36227        TokenUnderscorePtr(self.node.0.stable_ptr)
36228    }
36229}
36230impl From<&TokenUnderscore> for SyntaxStablePtrId {
36231    fn from(node: &TokenUnderscore) -> Self {
36232        node.stable_ptr().untyped()
36233    }
36234}
36235#[derive(Clone, Debug, Eq, Hash, PartialEq)]
36236pub struct TerminalUnderscore {
36237    node: SyntaxNode,
36238    children: Arc<[SyntaxNode]>,
36239}
36240impl Terminal for TerminalUnderscore {
36241    const KIND: SyntaxKind = SyntaxKind::TerminalUnderscore;
36242    type TokenType = TokenUnderscore;
36243    fn new_green(
36244        db: &dyn SyntaxGroup,
36245        leading_trivia: TriviaGreen,
36246        token: <<TerminalUnderscore as Terminal>::TokenType as TypedSyntaxNode>::Green,
36247        trailing_trivia: TriviaGreen,
36248    ) -> Self::Green {
36249        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
36250        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
36251        TerminalUnderscoreGreen(
36252            Arc::new(GreenNode {
36253                kind: SyntaxKind::TerminalUnderscore,
36254                details: GreenNodeDetails::Node { children, width },
36255            })
36256            .intern(db),
36257        )
36258    }
36259    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
36260        self.token(db).text(db)
36261    }
36262}
36263impl TerminalUnderscore {
36264    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
36265        Trivia::from_syntax_node(db, self.children[0].clone())
36266    }
36267    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenUnderscore {
36268        TokenUnderscore::from_syntax_node(db, self.children[1].clone())
36269    }
36270    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
36271        Trivia::from_syntax_node(db, self.children[2].clone())
36272    }
36273}
36274#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
36275pub struct TerminalUnderscorePtr(pub SyntaxStablePtrId);
36276impl TerminalUnderscorePtr {}
36277impl TypedStablePtr for TerminalUnderscorePtr {
36278    type SyntaxNode = TerminalUnderscore;
36279    fn untyped(&self) -> SyntaxStablePtrId {
36280        self.0
36281    }
36282    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalUnderscore {
36283        TerminalUnderscore::from_syntax_node(db, self.0.lookup(db))
36284    }
36285}
36286impl From<TerminalUnderscorePtr> for SyntaxStablePtrId {
36287    fn from(ptr: TerminalUnderscorePtr) -> Self {
36288        ptr.untyped()
36289    }
36290}
36291#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
36292pub struct TerminalUnderscoreGreen(pub GreenId);
36293impl TypedSyntaxNode for TerminalUnderscore {
36294    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalUnderscore);
36295    type StablePtr = TerminalUnderscorePtr;
36296    type Green = TerminalUnderscoreGreen;
36297    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
36298        TerminalUnderscoreGreen(
36299            Arc::new(GreenNode {
36300                kind: SyntaxKind::TerminalUnderscore,
36301                details: GreenNodeDetails::Node {
36302                    children: vec![
36303                        Trivia::missing(db).0,
36304                        TokenUnderscore::missing(db).0,
36305                        Trivia::missing(db).0,
36306                    ],
36307                    width: TextWidth::default(),
36308                },
36309            })
36310            .intern(db),
36311        )
36312    }
36313    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
36314        let kind = node.kind(db);
36315        assert_eq!(
36316            kind,
36317            SyntaxKind::TerminalUnderscore,
36318            "Unexpected SyntaxKind {:?}. Expected {:?}.",
36319            kind,
36320            SyntaxKind::TerminalUnderscore
36321        );
36322        let children = db.get_children(node.clone());
36323        Self { node, children }
36324    }
36325    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
36326        let kind = node.kind(db);
36327        if kind == SyntaxKind::TerminalUnderscore {
36328            Some(Self::from_syntax_node(db, node))
36329        } else {
36330            None
36331        }
36332    }
36333    fn as_syntax_node(&self) -> SyntaxNode {
36334        self.node.clone()
36335    }
36336    fn stable_ptr(&self) -> Self::StablePtr {
36337        TerminalUnderscorePtr(self.node.0.stable_ptr)
36338    }
36339}
36340impl From<&TerminalUnderscore> for SyntaxStablePtrId {
36341    fn from(node: &TerminalUnderscore) -> Self {
36342        node.stable_ptr().untyped()
36343    }
36344}
36345#[derive(Clone, Debug, Eq, Hash, PartialEq)]
36346pub struct TokenXor {
36347    node: SyntaxNode,
36348}
36349impl Token for TokenXor {
36350    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
36351        TokenXorGreen(
36352            Arc::new(GreenNode {
36353                kind: SyntaxKind::TokenXor,
36354                details: GreenNodeDetails::Token(text),
36355            })
36356            .intern(db),
36357        )
36358    }
36359    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
36360        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
36361            .clone()
36362    }
36363}
36364#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
36365pub struct TokenXorPtr(pub SyntaxStablePtrId);
36366impl TypedStablePtr for TokenXorPtr {
36367    type SyntaxNode = TokenXor;
36368    fn untyped(&self) -> SyntaxStablePtrId {
36369        self.0
36370    }
36371    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenXor {
36372        TokenXor::from_syntax_node(db, self.0.lookup(db))
36373    }
36374}
36375impl From<TokenXorPtr> for SyntaxStablePtrId {
36376    fn from(ptr: TokenXorPtr) -> Self {
36377        ptr.untyped()
36378    }
36379}
36380#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
36381pub struct TokenXorGreen(pub GreenId);
36382impl TokenXorGreen {
36383    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
36384        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
36385    }
36386}
36387impl TypedSyntaxNode for TokenXor {
36388    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenXor);
36389    type StablePtr = TokenXorPtr;
36390    type Green = TokenXorGreen;
36391    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
36392        TokenXorGreen(
36393            Arc::new(GreenNode {
36394                kind: SyntaxKind::TokenMissing,
36395                details: GreenNodeDetails::Token("".into()),
36396            })
36397            .intern(db),
36398        )
36399    }
36400    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
36401        match node.0.green.lookup_intern(db).details {
36402            GreenNodeDetails::Token(_) => Self { node },
36403            GreenNodeDetails::Node { .. } => {
36404                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenXor)
36405            }
36406        }
36407    }
36408    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
36409        match node.0.green.lookup_intern(db).details {
36410            GreenNodeDetails::Token(_) => Some(Self { node }),
36411            GreenNodeDetails::Node { .. } => None,
36412        }
36413    }
36414    fn as_syntax_node(&self) -> SyntaxNode {
36415        self.node.clone()
36416    }
36417    fn stable_ptr(&self) -> Self::StablePtr {
36418        TokenXorPtr(self.node.0.stable_ptr)
36419    }
36420}
36421impl From<&TokenXor> for SyntaxStablePtrId {
36422    fn from(node: &TokenXor) -> Self {
36423        node.stable_ptr().untyped()
36424    }
36425}
36426#[derive(Clone, Debug, Eq, Hash, PartialEq)]
36427pub struct TerminalXor {
36428    node: SyntaxNode,
36429    children: Arc<[SyntaxNode]>,
36430}
36431impl Terminal for TerminalXor {
36432    const KIND: SyntaxKind = SyntaxKind::TerminalXor;
36433    type TokenType = TokenXor;
36434    fn new_green(
36435        db: &dyn SyntaxGroup,
36436        leading_trivia: TriviaGreen,
36437        token: <<TerminalXor as Terminal>::TokenType as TypedSyntaxNode>::Green,
36438        trailing_trivia: TriviaGreen,
36439    ) -> Self::Green {
36440        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
36441        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
36442        TerminalXorGreen(
36443            Arc::new(GreenNode {
36444                kind: SyntaxKind::TerminalXor,
36445                details: GreenNodeDetails::Node { children, width },
36446            })
36447            .intern(db),
36448        )
36449    }
36450    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
36451        self.token(db).text(db)
36452    }
36453}
36454impl TerminalXor {
36455    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
36456        Trivia::from_syntax_node(db, self.children[0].clone())
36457    }
36458    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenXor {
36459        TokenXor::from_syntax_node(db, self.children[1].clone())
36460    }
36461    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
36462        Trivia::from_syntax_node(db, self.children[2].clone())
36463    }
36464}
36465#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
36466pub struct TerminalXorPtr(pub SyntaxStablePtrId);
36467impl TerminalXorPtr {}
36468impl TypedStablePtr for TerminalXorPtr {
36469    type SyntaxNode = TerminalXor;
36470    fn untyped(&self) -> SyntaxStablePtrId {
36471        self.0
36472    }
36473    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalXor {
36474        TerminalXor::from_syntax_node(db, self.0.lookup(db))
36475    }
36476}
36477impl From<TerminalXorPtr> for SyntaxStablePtrId {
36478    fn from(ptr: TerminalXorPtr) -> Self {
36479        ptr.untyped()
36480    }
36481}
36482#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
36483pub struct TerminalXorGreen(pub GreenId);
36484impl TypedSyntaxNode for TerminalXor {
36485    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalXor);
36486    type StablePtr = TerminalXorPtr;
36487    type Green = TerminalXorGreen;
36488    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
36489        TerminalXorGreen(
36490            Arc::new(GreenNode {
36491                kind: SyntaxKind::TerminalXor,
36492                details: GreenNodeDetails::Node {
36493                    children: vec![
36494                        Trivia::missing(db).0,
36495                        TokenXor::missing(db).0,
36496                        Trivia::missing(db).0,
36497                    ],
36498                    width: TextWidth::default(),
36499                },
36500            })
36501            .intern(db),
36502        )
36503    }
36504    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
36505        let kind = node.kind(db);
36506        assert_eq!(
36507            kind,
36508            SyntaxKind::TerminalXor,
36509            "Unexpected SyntaxKind {:?}. Expected {:?}.",
36510            kind,
36511            SyntaxKind::TerminalXor
36512        );
36513        let children = db.get_children(node.clone());
36514        Self { node, children }
36515    }
36516    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
36517        let kind = node.kind(db);
36518        if kind == SyntaxKind::TerminalXor { Some(Self::from_syntax_node(db, node)) } else { None }
36519    }
36520    fn as_syntax_node(&self) -> SyntaxNode {
36521        self.node.clone()
36522    }
36523    fn stable_ptr(&self) -> Self::StablePtr {
36524        TerminalXorPtr(self.node.0.stable_ptr)
36525    }
36526}
36527impl From<&TerminalXor> for SyntaxStablePtrId {
36528    fn from(node: &TerminalXor) -> Self {
36529        node.stable_ptr().untyped()
36530    }
36531}
36532#[derive(Clone, Debug, Eq, Hash, PartialEq)]
36533pub struct SyntaxFile {
36534    node: SyntaxNode,
36535    children: Arc<[SyntaxNode]>,
36536}
36537impl SyntaxFile {
36538    pub const INDEX_ITEMS: usize = 0;
36539    pub const INDEX_EOF: usize = 1;
36540    pub fn new_green(
36541        db: &dyn SyntaxGroup,
36542        items: ModuleItemListGreen,
36543        eof: TerminalEndOfFileGreen,
36544    ) -> SyntaxFileGreen {
36545        let children: Vec<GreenId> = vec![items.0, eof.0];
36546        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
36547        SyntaxFileGreen(
36548            Arc::new(GreenNode {
36549                kind: SyntaxKind::SyntaxFile,
36550                details: GreenNodeDetails::Node { children, width },
36551            })
36552            .intern(db),
36553        )
36554    }
36555}
36556impl SyntaxFile {
36557    pub fn items(&self, db: &dyn SyntaxGroup) -> ModuleItemList {
36558        ModuleItemList::from_syntax_node(db, self.children[0].clone())
36559    }
36560    pub fn eof(&self, db: &dyn SyntaxGroup) -> TerminalEndOfFile {
36561        TerminalEndOfFile::from_syntax_node(db, self.children[1].clone())
36562    }
36563}
36564#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
36565pub struct SyntaxFilePtr(pub SyntaxStablePtrId);
36566impl SyntaxFilePtr {}
36567impl TypedStablePtr for SyntaxFilePtr {
36568    type SyntaxNode = SyntaxFile;
36569    fn untyped(&self) -> SyntaxStablePtrId {
36570        self.0
36571    }
36572    fn lookup(&self, db: &dyn SyntaxGroup) -> SyntaxFile {
36573        SyntaxFile::from_syntax_node(db, self.0.lookup(db))
36574    }
36575}
36576impl From<SyntaxFilePtr> for SyntaxStablePtrId {
36577    fn from(ptr: SyntaxFilePtr) -> Self {
36578        ptr.untyped()
36579    }
36580}
36581#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
36582pub struct SyntaxFileGreen(pub GreenId);
36583impl TypedSyntaxNode for SyntaxFile {
36584    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::SyntaxFile);
36585    type StablePtr = SyntaxFilePtr;
36586    type Green = SyntaxFileGreen;
36587    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
36588        SyntaxFileGreen(
36589            Arc::new(GreenNode {
36590                kind: SyntaxKind::SyntaxFile,
36591                details: GreenNodeDetails::Node {
36592                    children: vec![ModuleItemList::missing(db).0, TerminalEndOfFile::missing(db).0],
36593                    width: TextWidth::default(),
36594                },
36595            })
36596            .intern(db),
36597        )
36598    }
36599    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
36600        let kind = node.kind(db);
36601        assert_eq!(
36602            kind,
36603            SyntaxKind::SyntaxFile,
36604            "Unexpected SyntaxKind {:?}. Expected {:?}.",
36605            kind,
36606            SyntaxKind::SyntaxFile
36607        );
36608        let children = db.get_children(node.clone());
36609        Self { node, children }
36610    }
36611    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
36612        let kind = node.kind(db);
36613        if kind == SyntaxKind::SyntaxFile { Some(Self::from_syntax_node(db, node)) } else { None }
36614    }
36615    fn as_syntax_node(&self) -> SyntaxNode {
36616        self.node.clone()
36617    }
36618    fn stable_ptr(&self) -> Self::StablePtr {
36619        SyntaxFilePtr(self.node.0.stable_ptr)
36620    }
36621}
36622impl From<&SyntaxFile> for SyntaxStablePtrId {
36623    fn from(node: &SyntaxFile) -> Self {
36624        node.stable_ptr().untyped()
36625    }
36626}
36627#[derive(Clone, Debug, Eq, Hash, PartialEq)]
36628pub struct TokenEmpty {
36629    node: SyntaxNode,
36630}
36631impl Token for TokenEmpty {
36632    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
36633        TokenEmptyGreen(
36634            Arc::new(GreenNode {
36635                kind: SyntaxKind::TokenEmpty,
36636                details: GreenNodeDetails::Token(text),
36637            })
36638            .intern(db),
36639        )
36640    }
36641    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
36642        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
36643            .clone()
36644    }
36645}
36646#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
36647pub struct TokenEmptyPtr(pub SyntaxStablePtrId);
36648impl TypedStablePtr for TokenEmptyPtr {
36649    type SyntaxNode = TokenEmpty;
36650    fn untyped(&self) -> SyntaxStablePtrId {
36651        self.0
36652    }
36653    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenEmpty {
36654        TokenEmpty::from_syntax_node(db, self.0.lookup(db))
36655    }
36656}
36657impl From<TokenEmptyPtr> for SyntaxStablePtrId {
36658    fn from(ptr: TokenEmptyPtr) -> Self {
36659        ptr.untyped()
36660    }
36661}
36662#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
36663pub struct TokenEmptyGreen(pub GreenId);
36664impl TokenEmptyGreen {
36665    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
36666        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
36667    }
36668}
36669impl TypedSyntaxNode for TokenEmpty {
36670    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenEmpty);
36671    type StablePtr = TokenEmptyPtr;
36672    type Green = TokenEmptyGreen;
36673    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
36674        TokenEmptyGreen(
36675            Arc::new(GreenNode {
36676                kind: SyntaxKind::TokenMissing,
36677                details: GreenNodeDetails::Token("".into()),
36678            })
36679            .intern(db),
36680        )
36681    }
36682    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
36683        match node.0.green.lookup_intern(db).details {
36684            GreenNodeDetails::Token(_) => Self { node },
36685            GreenNodeDetails::Node { .. } => {
36686                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenEmpty)
36687            }
36688        }
36689    }
36690    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
36691        match node.0.green.lookup_intern(db).details {
36692            GreenNodeDetails::Token(_) => Some(Self { node }),
36693            GreenNodeDetails::Node { .. } => None,
36694        }
36695    }
36696    fn as_syntax_node(&self) -> SyntaxNode {
36697        self.node.clone()
36698    }
36699    fn stable_ptr(&self) -> Self::StablePtr {
36700        TokenEmptyPtr(self.node.0.stable_ptr)
36701    }
36702}
36703impl From<&TokenEmpty> for SyntaxStablePtrId {
36704    fn from(node: &TokenEmpty) -> Self {
36705        node.stable_ptr().untyped()
36706    }
36707}
36708#[derive(Clone, Debug, Eq, Hash, PartialEq)]
36709pub struct TerminalEmpty {
36710    node: SyntaxNode,
36711    children: Arc<[SyntaxNode]>,
36712}
36713impl Terminal for TerminalEmpty {
36714    const KIND: SyntaxKind = SyntaxKind::TerminalEmpty;
36715    type TokenType = TokenEmpty;
36716    fn new_green(
36717        db: &dyn SyntaxGroup,
36718        leading_trivia: TriviaGreen,
36719        token: <<TerminalEmpty as Terminal>::TokenType as TypedSyntaxNode>::Green,
36720        trailing_trivia: TriviaGreen,
36721    ) -> Self::Green {
36722        let children: Vec<GreenId> = vec![leading_trivia.0, token.0, trailing_trivia.0];
36723        let width = children.iter().copied().map(|id| id.lookup_intern(db).width()).sum();
36724        TerminalEmptyGreen(
36725            Arc::new(GreenNode {
36726                kind: SyntaxKind::TerminalEmpty,
36727                details: GreenNodeDetails::Node { children, width },
36728            })
36729            .intern(db),
36730        )
36731    }
36732    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
36733        self.token(db).text(db)
36734    }
36735}
36736impl TerminalEmpty {
36737    pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
36738        Trivia::from_syntax_node(db, self.children[0].clone())
36739    }
36740    pub fn token(&self, db: &dyn SyntaxGroup) -> TokenEmpty {
36741        TokenEmpty::from_syntax_node(db, self.children[1].clone())
36742    }
36743    pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia {
36744        Trivia::from_syntax_node(db, self.children[2].clone())
36745    }
36746}
36747#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
36748pub struct TerminalEmptyPtr(pub SyntaxStablePtrId);
36749impl TerminalEmptyPtr {}
36750impl TypedStablePtr for TerminalEmptyPtr {
36751    type SyntaxNode = TerminalEmpty;
36752    fn untyped(&self) -> SyntaxStablePtrId {
36753        self.0
36754    }
36755    fn lookup(&self, db: &dyn SyntaxGroup) -> TerminalEmpty {
36756        TerminalEmpty::from_syntax_node(db, self.0.lookup(db))
36757    }
36758}
36759impl From<TerminalEmptyPtr> for SyntaxStablePtrId {
36760    fn from(ptr: TerminalEmptyPtr) -> Self {
36761        ptr.untyped()
36762    }
36763}
36764#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
36765pub struct TerminalEmptyGreen(pub GreenId);
36766impl TypedSyntaxNode for TerminalEmpty {
36767    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalEmpty);
36768    type StablePtr = TerminalEmptyPtr;
36769    type Green = TerminalEmptyGreen;
36770    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
36771        TerminalEmptyGreen(
36772            Arc::new(GreenNode {
36773                kind: SyntaxKind::TerminalEmpty,
36774                details: GreenNodeDetails::Node {
36775                    children: vec![
36776                        Trivia::missing(db).0,
36777                        TokenEmpty::missing(db).0,
36778                        Trivia::missing(db).0,
36779                    ],
36780                    width: TextWidth::default(),
36781                },
36782            })
36783            .intern(db),
36784        )
36785    }
36786    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
36787        let kind = node.kind(db);
36788        assert_eq!(
36789            kind,
36790            SyntaxKind::TerminalEmpty,
36791            "Unexpected SyntaxKind {:?}. Expected {:?}.",
36792            kind,
36793            SyntaxKind::TerminalEmpty
36794        );
36795        let children = db.get_children(node.clone());
36796        Self { node, children }
36797    }
36798    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
36799        let kind = node.kind(db);
36800        if kind == SyntaxKind::TerminalEmpty {
36801            Some(Self::from_syntax_node(db, node))
36802        } else {
36803            None
36804        }
36805    }
36806    fn as_syntax_node(&self) -> SyntaxNode {
36807        self.node.clone()
36808    }
36809    fn stable_ptr(&self) -> Self::StablePtr {
36810        TerminalEmptyPtr(self.node.0.stable_ptr)
36811    }
36812}
36813impl From<&TerminalEmpty> for SyntaxStablePtrId {
36814    fn from(node: &TerminalEmpty) -> Self {
36815        node.stable_ptr().untyped()
36816    }
36817}
36818#[derive(Clone, Debug, Eq, Hash, PartialEq)]
36819pub struct TokenSingleLineComment {
36820    node: SyntaxNode,
36821}
36822impl Token for TokenSingleLineComment {
36823    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
36824        TokenSingleLineCommentGreen(
36825            Arc::new(GreenNode {
36826                kind: SyntaxKind::TokenSingleLineComment,
36827                details: GreenNodeDetails::Token(text),
36828            })
36829            .intern(db),
36830        )
36831    }
36832    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
36833        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
36834            .clone()
36835    }
36836}
36837#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
36838pub struct TokenSingleLineCommentPtr(pub SyntaxStablePtrId);
36839impl TypedStablePtr for TokenSingleLineCommentPtr {
36840    type SyntaxNode = TokenSingleLineComment;
36841    fn untyped(&self) -> SyntaxStablePtrId {
36842        self.0
36843    }
36844    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenSingleLineComment {
36845        TokenSingleLineComment::from_syntax_node(db, self.0.lookup(db))
36846    }
36847}
36848impl From<TokenSingleLineCommentPtr> for SyntaxStablePtrId {
36849    fn from(ptr: TokenSingleLineCommentPtr) -> Self {
36850        ptr.untyped()
36851    }
36852}
36853#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
36854pub struct TokenSingleLineCommentGreen(pub GreenId);
36855impl TokenSingleLineCommentGreen {
36856    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
36857        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
36858    }
36859}
36860impl TypedSyntaxNode for TokenSingleLineComment {
36861    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenSingleLineComment);
36862    type StablePtr = TokenSingleLineCommentPtr;
36863    type Green = TokenSingleLineCommentGreen;
36864    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
36865        TokenSingleLineCommentGreen(
36866            Arc::new(GreenNode {
36867                kind: SyntaxKind::TokenMissing,
36868                details: GreenNodeDetails::Token("".into()),
36869            })
36870            .intern(db),
36871        )
36872    }
36873    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
36874        match node.0.green.lookup_intern(db).details {
36875            GreenNodeDetails::Token(_) => Self { node },
36876            GreenNodeDetails::Node { .. } => panic!(
36877                "Expected a token {:?}, not an internal node",
36878                SyntaxKind::TokenSingleLineComment
36879            ),
36880        }
36881    }
36882    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
36883        match node.0.green.lookup_intern(db).details {
36884            GreenNodeDetails::Token(_) => Some(Self { node }),
36885            GreenNodeDetails::Node { .. } => None,
36886        }
36887    }
36888    fn as_syntax_node(&self) -> SyntaxNode {
36889        self.node.clone()
36890    }
36891    fn stable_ptr(&self) -> Self::StablePtr {
36892        TokenSingleLineCommentPtr(self.node.0.stable_ptr)
36893    }
36894}
36895impl From<&TokenSingleLineComment> for SyntaxStablePtrId {
36896    fn from(node: &TokenSingleLineComment) -> Self {
36897        node.stable_ptr().untyped()
36898    }
36899}
36900#[derive(Clone, Debug, Eq, Hash, PartialEq)]
36901pub struct TokenSingleLineInnerComment {
36902    node: SyntaxNode,
36903}
36904impl Token for TokenSingleLineInnerComment {
36905    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
36906        TokenSingleLineInnerCommentGreen(
36907            Arc::new(GreenNode {
36908                kind: SyntaxKind::TokenSingleLineInnerComment,
36909                details: GreenNodeDetails::Token(text),
36910            })
36911            .intern(db),
36912        )
36913    }
36914    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
36915        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
36916            .clone()
36917    }
36918}
36919#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
36920pub struct TokenSingleLineInnerCommentPtr(pub SyntaxStablePtrId);
36921impl TypedStablePtr for TokenSingleLineInnerCommentPtr {
36922    type SyntaxNode = TokenSingleLineInnerComment;
36923    fn untyped(&self) -> SyntaxStablePtrId {
36924        self.0
36925    }
36926    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenSingleLineInnerComment {
36927        TokenSingleLineInnerComment::from_syntax_node(db, self.0.lookup(db))
36928    }
36929}
36930impl From<TokenSingleLineInnerCommentPtr> for SyntaxStablePtrId {
36931    fn from(ptr: TokenSingleLineInnerCommentPtr) -> Self {
36932        ptr.untyped()
36933    }
36934}
36935#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
36936pub struct TokenSingleLineInnerCommentGreen(pub GreenId);
36937impl TokenSingleLineInnerCommentGreen {
36938    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
36939        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
36940    }
36941}
36942impl TypedSyntaxNode for TokenSingleLineInnerComment {
36943    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenSingleLineInnerComment);
36944    type StablePtr = TokenSingleLineInnerCommentPtr;
36945    type Green = TokenSingleLineInnerCommentGreen;
36946    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
36947        TokenSingleLineInnerCommentGreen(
36948            Arc::new(GreenNode {
36949                kind: SyntaxKind::TokenMissing,
36950                details: GreenNodeDetails::Token("".into()),
36951            })
36952            .intern(db),
36953        )
36954    }
36955    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
36956        match node.0.green.lookup_intern(db).details {
36957            GreenNodeDetails::Token(_) => Self { node },
36958            GreenNodeDetails::Node { .. } => panic!(
36959                "Expected a token {:?}, not an internal node",
36960                SyntaxKind::TokenSingleLineInnerComment
36961            ),
36962        }
36963    }
36964    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
36965        match node.0.green.lookup_intern(db).details {
36966            GreenNodeDetails::Token(_) => Some(Self { node }),
36967            GreenNodeDetails::Node { .. } => None,
36968        }
36969    }
36970    fn as_syntax_node(&self) -> SyntaxNode {
36971        self.node.clone()
36972    }
36973    fn stable_ptr(&self) -> Self::StablePtr {
36974        TokenSingleLineInnerCommentPtr(self.node.0.stable_ptr)
36975    }
36976}
36977impl From<&TokenSingleLineInnerComment> for SyntaxStablePtrId {
36978    fn from(node: &TokenSingleLineInnerComment) -> Self {
36979        node.stable_ptr().untyped()
36980    }
36981}
36982#[derive(Clone, Debug, Eq, Hash, PartialEq)]
36983pub struct TokenSingleLineDocComment {
36984    node: SyntaxNode,
36985}
36986impl Token for TokenSingleLineDocComment {
36987    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
36988        TokenSingleLineDocCommentGreen(
36989            Arc::new(GreenNode {
36990                kind: SyntaxKind::TokenSingleLineDocComment,
36991                details: GreenNodeDetails::Token(text),
36992            })
36993            .intern(db),
36994        )
36995    }
36996    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
36997        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
36998            .clone()
36999    }
37000}
37001#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
37002pub struct TokenSingleLineDocCommentPtr(pub SyntaxStablePtrId);
37003impl TypedStablePtr for TokenSingleLineDocCommentPtr {
37004    type SyntaxNode = TokenSingleLineDocComment;
37005    fn untyped(&self) -> SyntaxStablePtrId {
37006        self.0
37007    }
37008    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenSingleLineDocComment {
37009        TokenSingleLineDocComment::from_syntax_node(db, self.0.lookup(db))
37010    }
37011}
37012impl From<TokenSingleLineDocCommentPtr> for SyntaxStablePtrId {
37013    fn from(ptr: TokenSingleLineDocCommentPtr) -> Self {
37014        ptr.untyped()
37015    }
37016}
37017#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
37018pub struct TokenSingleLineDocCommentGreen(pub GreenId);
37019impl TokenSingleLineDocCommentGreen {
37020    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
37021        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
37022    }
37023}
37024impl TypedSyntaxNode for TokenSingleLineDocComment {
37025    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenSingleLineDocComment);
37026    type StablePtr = TokenSingleLineDocCommentPtr;
37027    type Green = TokenSingleLineDocCommentGreen;
37028    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
37029        TokenSingleLineDocCommentGreen(
37030            Arc::new(GreenNode {
37031                kind: SyntaxKind::TokenMissing,
37032                details: GreenNodeDetails::Token("".into()),
37033            })
37034            .intern(db),
37035        )
37036    }
37037    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
37038        match node.0.green.lookup_intern(db).details {
37039            GreenNodeDetails::Token(_) => Self { node },
37040            GreenNodeDetails::Node { .. } => panic!(
37041                "Expected a token {:?}, not an internal node",
37042                SyntaxKind::TokenSingleLineDocComment
37043            ),
37044        }
37045    }
37046    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
37047        match node.0.green.lookup_intern(db).details {
37048            GreenNodeDetails::Token(_) => Some(Self { node }),
37049            GreenNodeDetails::Node { .. } => None,
37050        }
37051    }
37052    fn as_syntax_node(&self) -> SyntaxNode {
37053        self.node.clone()
37054    }
37055    fn stable_ptr(&self) -> Self::StablePtr {
37056        TokenSingleLineDocCommentPtr(self.node.0.stable_ptr)
37057    }
37058}
37059impl From<&TokenSingleLineDocComment> for SyntaxStablePtrId {
37060    fn from(node: &TokenSingleLineDocComment) -> Self {
37061        node.stable_ptr().untyped()
37062    }
37063}
37064#[derive(Clone, Debug, Eq, Hash, PartialEq)]
37065pub struct TokenWhitespace {
37066    node: SyntaxNode,
37067}
37068impl Token for TokenWhitespace {
37069    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
37070        TokenWhitespaceGreen(
37071            Arc::new(GreenNode {
37072                kind: SyntaxKind::TokenWhitespace,
37073                details: GreenNodeDetails::Token(text),
37074            })
37075            .intern(db),
37076        )
37077    }
37078    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
37079        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
37080            .clone()
37081    }
37082}
37083#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
37084pub struct TokenWhitespacePtr(pub SyntaxStablePtrId);
37085impl TypedStablePtr for TokenWhitespacePtr {
37086    type SyntaxNode = TokenWhitespace;
37087    fn untyped(&self) -> SyntaxStablePtrId {
37088        self.0
37089    }
37090    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenWhitespace {
37091        TokenWhitespace::from_syntax_node(db, self.0.lookup(db))
37092    }
37093}
37094impl From<TokenWhitespacePtr> for SyntaxStablePtrId {
37095    fn from(ptr: TokenWhitespacePtr) -> Self {
37096        ptr.untyped()
37097    }
37098}
37099#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
37100pub struct TokenWhitespaceGreen(pub GreenId);
37101impl TokenWhitespaceGreen {
37102    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
37103        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
37104    }
37105}
37106impl TypedSyntaxNode for TokenWhitespace {
37107    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenWhitespace);
37108    type StablePtr = TokenWhitespacePtr;
37109    type Green = TokenWhitespaceGreen;
37110    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
37111        TokenWhitespaceGreen(
37112            Arc::new(GreenNode {
37113                kind: SyntaxKind::TokenMissing,
37114                details: GreenNodeDetails::Token("".into()),
37115            })
37116            .intern(db),
37117        )
37118    }
37119    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
37120        match node.0.green.lookup_intern(db).details {
37121            GreenNodeDetails::Token(_) => Self { node },
37122            GreenNodeDetails::Node { .. } => {
37123                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenWhitespace)
37124            }
37125        }
37126    }
37127    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
37128        match node.0.green.lookup_intern(db).details {
37129            GreenNodeDetails::Token(_) => Some(Self { node }),
37130            GreenNodeDetails::Node { .. } => None,
37131        }
37132    }
37133    fn as_syntax_node(&self) -> SyntaxNode {
37134        self.node.clone()
37135    }
37136    fn stable_ptr(&self) -> Self::StablePtr {
37137        TokenWhitespacePtr(self.node.0.stable_ptr)
37138    }
37139}
37140impl From<&TokenWhitespace> for SyntaxStablePtrId {
37141    fn from(node: &TokenWhitespace) -> Self {
37142        node.stable_ptr().untyped()
37143    }
37144}
37145#[derive(Clone, Debug, Eq, Hash, PartialEq)]
37146pub struct TokenNewline {
37147    node: SyntaxNode,
37148}
37149impl Token for TokenNewline {
37150    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
37151        TokenNewlineGreen(
37152            Arc::new(GreenNode {
37153                kind: SyntaxKind::TokenNewline,
37154                details: GreenNodeDetails::Token(text),
37155            })
37156            .intern(db),
37157        )
37158    }
37159    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
37160        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
37161            .clone()
37162    }
37163}
37164#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
37165pub struct TokenNewlinePtr(pub SyntaxStablePtrId);
37166impl TypedStablePtr for TokenNewlinePtr {
37167    type SyntaxNode = TokenNewline;
37168    fn untyped(&self) -> SyntaxStablePtrId {
37169        self.0
37170    }
37171    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenNewline {
37172        TokenNewline::from_syntax_node(db, self.0.lookup(db))
37173    }
37174}
37175impl From<TokenNewlinePtr> for SyntaxStablePtrId {
37176    fn from(ptr: TokenNewlinePtr) -> Self {
37177        ptr.untyped()
37178    }
37179}
37180#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
37181pub struct TokenNewlineGreen(pub GreenId);
37182impl TokenNewlineGreen {
37183    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
37184        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
37185    }
37186}
37187impl TypedSyntaxNode for TokenNewline {
37188    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenNewline);
37189    type StablePtr = TokenNewlinePtr;
37190    type Green = TokenNewlineGreen;
37191    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
37192        TokenNewlineGreen(
37193            Arc::new(GreenNode {
37194                kind: SyntaxKind::TokenMissing,
37195                details: GreenNodeDetails::Token("".into()),
37196            })
37197            .intern(db),
37198        )
37199    }
37200    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
37201        match node.0.green.lookup_intern(db).details {
37202            GreenNodeDetails::Token(_) => Self { node },
37203            GreenNodeDetails::Node { .. } => {
37204                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenNewline)
37205            }
37206        }
37207    }
37208    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
37209        match node.0.green.lookup_intern(db).details {
37210            GreenNodeDetails::Token(_) => Some(Self { node }),
37211            GreenNodeDetails::Node { .. } => None,
37212        }
37213    }
37214    fn as_syntax_node(&self) -> SyntaxNode {
37215        self.node.clone()
37216    }
37217    fn stable_ptr(&self) -> Self::StablePtr {
37218        TokenNewlinePtr(self.node.0.stable_ptr)
37219    }
37220}
37221impl From<&TokenNewline> for SyntaxStablePtrId {
37222    fn from(node: &TokenNewline) -> Self {
37223        node.stable_ptr().untyped()
37224    }
37225}
37226#[derive(Clone, Debug, Eq, Hash, PartialEq)]
37227pub struct TokenMissing {
37228    node: SyntaxNode,
37229}
37230impl Token for TokenMissing {
37231    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
37232        TokenMissingGreen(
37233            Arc::new(GreenNode {
37234                kind: SyntaxKind::TokenMissing,
37235                details: GreenNodeDetails::Token(text),
37236            })
37237            .intern(db),
37238        )
37239    }
37240    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
37241        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
37242            .clone()
37243    }
37244}
37245#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
37246pub struct TokenMissingPtr(pub SyntaxStablePtrId);
37247impl TypedStablePtr for TokenMissingPtr {
37248    type SyntaxNode = TokenMissing;
37249    fn untyped(&self) -> SyntaxStablePtrId {
37250        self.0
37251    }
37252    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenMissing {
37253        TokenMissing::from_syntax_node(db, self.0.lookup(db))
37254    }
37255}
37256impl From<TokenMissingPtr> for SyntaxStablePtrId {
37257    fn from(ptr: TokenMissingPtr) -> Self {
37258        ptr.untyped()
37259    }
37260}
37261#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
37262pub struct TokenMissingGreen(pub GreenId);
37263impl TokenMissingGreen {
37264    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
37265        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
37266    }
37267}
37268impl TypedSyntaxNode for TokenMissing {
37269    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenMissing);
37270    type StablePtr = TokenMissingPtr;
37271    type Green = TokenMissingGreen;
37272    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
37273        TokenMissingGreen(
37274            Arc::new(GreenNode {
37275                kind: SyntaxKind::TokenMissing,
37276                details: GreenNodeDetails::Token("".into()),
37277            })
37278            .intern(db),
37279        )
37280    }
37281    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
37282        match node.0.green.lookup_intern(db).details {
37283            GreenNodeDetails::Token(_) => Self { node },
37284            GreenNodeDetails::Node { .. } => {
37285                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenMissing)
37286            }
37287        }
37288    }
37289    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
37290        match node.0.green.lookup_intern(db).details {
37291            GreenNodeDetails::Token(_) => Some(Self { node }),
37292            GreenNodeDetails::Node { .. } => None,
37293        }
37294    }
37295    fn as_syntax_node(&self) -> SyntaxNode {
37296        self.node.clone()
37297    }
37298    fn stable_ptr(&self) -> Self::StablePtr {
37299        TokenMissingPtr(self.node.0.stable_ptr)
37300    }
37301}
37302impl From<&TokenMissing> for SyntaxStablePtrId {
37303    fn from(node: &TokenMissing) -> Self {
37304        node.stable_ptr().untyped()
37305    }
37306}
37307#[derive(Clone, Debug, Eq, Hash, PartialEq)]
37308pub struct TokenSkipped {
37309    node: SyntaxNode,
37310}
37311impl Token for TokenSkipped {
37312    fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green {
37313        TokenSkippedGreen(
37314            Arc::new(GreenNode {
37315                kind: SyntaxKind::TokenSkipped,
37316                details: GreenNodeDetails::Token(text),
37317            })
37318            .intern(db),
37319        )
37320    }
37321    fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
37322        extract_matches!(&self.node.0.green.lookup_intern(db).details, GreenNodeDetails::Token)
37323            .clone()
37324    }
37325}
37326#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
37327pub struct TokenSkippedPtr(pub SyntaxStablePtrId);
37328impl TypedStablePtr for TokenSkippedPtr {
37329    type SyntaxNode = TokenSkipped;
37330    fn untyped(&self) -> SyntaxStablePtrId {
37331        self.0
37332    }
37333    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenSkipped {
37334        TokenSkipped::from_syntax_node(db, self.0.lookup(db))
37335    }
37336}
37337impl From<TokenSkippedPtr> for SyntaxStablePtrId {
37338    fn from(ptr: TokenSkippedPtr) -> Self {
37339        ptr.untyped()
37340    }
37341}
37342#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
37343pub struct TokenSkippedGreen(pub GreenId);
37344impl TokenSkippedGreen {
37345    pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr {
37346        extract_matches!(&self.0.lookup_intern(db).details, GreenNodeDetails::Token).clone()
37347    }
37348}
37349impl TypedSyntaxNode for TokenSkipped {
37350    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenSkipped);
37351    type StablePtr = TokenSkippedPtr;
37352    type Green = TokenSkippedGreen;
37353    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
37354        TokenSkippedGreen(
37355            Arc::new(GreenNode {
37356                kind: SyntaxKind::TokenMissing,
37357                details: GreenNodeDetails::Token("".into()),
37358            })
37359            .intern(db),
37360        )
37361    }
37362    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
37363        match node.0.green.lookup_intern(db).details {
37364            GreenNodeDetails::Token(_) => Self { node },
37365            GreenNodeDetails::Node { .. } => {
37366                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenSkipped)
37367            }
37368        }
37369    }
37370    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
37371        match node.0.green.lookup_intern(db).details {
37372            GreenNodeDetails::Token(_) => Some(Self { node }),
37373            GreenNodeDetails::Node { .. } => None,
37374        }
37375    }
37376    fn as_syntax_node(&self) -> SyntaxNode {
37377        self.node.clone()
37378    }
37379    fn stable_ptr(&self) -> Self::StablePtr {
37380        TokenSkippedPtr(self.node.0.stable_ptr)
37381    }
37382}
37383impl From<&TokenSkipped> for SyntaxStablePtrId {
37384    fn from(node: &TokenSkipped) -> Self {
37385        node.stable_ptr().untyped()
37386    }
37387}
37388#[derive(Clone, Debug, Eq, Hash, PartialEq)]
37389pub enum TokenNode {
37390    TerminalIdentifier(TerminalIdentifier),
37391    TerminalLiteralNumber(TerminalLiteralNumber),
37392    TerminalShortString(TerminalShortString),
37393    TerminalString(TerminalString),
37394    TerminalAs(TerminalAs),
37395    TerminalConst(TerminalConst),
37396    TerminalElse(TerminalElse),
37397    TerminalEnum(TerminalEnum),
37398    TerminalExtern(TerminalExtern),
37399    TerminalFalse(TerminalFalse),
37400    TerminalFunction(TerminalFunction),
37401    TerminalIf(TerminalIf),
37402    TerminalWhile(TerminalWhile),
37403    TerminalFor(TerminalFor),
37404    TerminalLoop(TerminalLoop),
37405    TerminalImpl(TerminalImpl),
37406    TerminalImplicits(TerminalImplicits),
37407    TerminalLet(TerminalLet),
37408    TerminalMatch(TerminalMatch),
37409    TerminalModule(TerminalModule),
37410    TerminalMut(TerminalMut),
37411    TerminalNoPanic(TerminalNoPanic),
37412    TerminalOf(TerminalOf),
37413    TerminalRef(TerminalRef),
37414    TerminalContinue(TerminalContinue),
37415    TerminalReturn(TerminalReturn),
37416    TerminalBreak(TerminalBreak),
37417    TerminalStruct(TerminalStruct),
37418    TerminalTrait(TerminalTrait),
37419    TerminalTrue(TerminalTrue),
37420    TerminalType(TerminalType),
37421    TerminalUse(TerminalUse),
37422    TerminalPub(TerminalPub),
37423    TerminalAnd(TerminalAnd),
37424    TerminalAndAnd(TerminalAndAnd),
37425    TerminalArrow(TerminalArrow),
37426    TerminalAt(TerminalAt),
37427    TerminalBadCharacters(TerminalBadCharacters),
37428    TerminalColon(TerminalColon),
37429    TerminalColonColon(TerminalColonColon),
37430    TerminalComma(TerminalComma),
37431    TerminalDiv(TerminalDiv),
37432    TerminalDivEq(TerminalDivEq),
37433    TerminalDot(TerminalDot),
37434    TerminalDotDot(TerminalDotDot),
37435    TerminalDotDotEq(TerminalDotDotEq),
37436    TerminalEndOfFile(TerminalEndOfFile),
37437    TerminalEq(TerminalEq),
37438    TerminalEqEq(TerminalEqEq),
37439    TerminalGE(TerminalGE),
37440    TerminalGT(TerminalGT),
37441    TerminalHash(TerminalHash),
37442    TerminalLBrace(TerminalLBrace),
37443    TerminalLBrack(TerminalLBrack),
37444    TerminalLE(TerminalLE),
37445    TerminalLParen(TerminalLParen),
37446    TerminalLT(TerminalLT),
37447    TerminalMatchArrow(TerminalMatchArrow),
37448    TerminalMinus(TerminalMinus),
37449    TerminalMinusEq(TerminalMinusEq),
37450    TerminalMod(TerminalMod),
37451    TerminalModEq(TerminalModEq),
37452    TerminalMul(TerminalMul),
37453    TerminalMulEq(TerminalMulEq),
37454    TerminalNeq(TerminalNeq),
37455    TerminalNot(TerminalNot),
37456    TerminalBitNot(TerminalBitNot),
37457    TerminalOr(TerminalOr),
37458    TerminalOrOr(TerminalOrOr),
37459    TerminalPlus(TerminalPlus),
37460    TerminalPlusEq(TerminalPlusEq),
37461    TerminalQuestionMark(TerminalQuestionMark),
37462    TerminalRBrace(TerminalRBrace),
37463    TerminalRBrack(TerminalRBrack),
37464    TerminalRParen(TerminalRParen),
37465    TerminalSemicolon(TerminalSemicolon),
37466    TerminalUnderscore(TerminalUnderscore),
37467    TerminalXor(TerminalXor),
37468    TerminalEmpty(TerminalEmpty),
37469}
37470#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
37471pub struct TokenNodePtr(pub SyntaxStablePtrId);
37472impl TypedStablePtr for TokenNodePtr {
37473    type SyntaxNode = TokenNode;
37474    fn untyped(&self) -> SyntaxStablePtrId {
37475        self.0
37476    }
37477    fn lookup(&self, db: &dyn SyntaxGroup) -> TokenNode {
37478        TokenNode::from_syntax_node(db, self.0.lookup(db))
37479    }
37480}
37481impl From<TokenNodePtr> for SyntaxStablePtrId {
37482    fn from(ptr: TokenNodePtr) -> Self {
37483        ptr.untyped()
37484    }
37485}
37486impl From<TerminalIdentifierPtr> for TokenNodePtr {
37487    fn from(value: TerminalIdentifierPtr) -> Self {
37488        Self(value.0)
37489    }
37490}
37491impl From<TerminalLiteralNumberPtr> for TokenNodePtr {
37492    fn from(value: TerminalLiteralNumberPtr) -> Self {
37493        Self(value.0)
37494    }
37495}
37496impl From<TerminalShortStringPtr> for TokenNodePtr {
37497    fn from(value: TerminalShortStringPtr) -> Self {
37498        Self(value.0)
37499    }
37500}
37501impl From<TerminalStringPtr> for TokenNodePtr {
37502    fn from(value: TerminalStringPtr) -> Self {
37503        Self(value.0)
37504    }
37505}
37506impl From<TerminalAsPtr> for TokenNodePtr {
37507    fn from(value: TerminalAsPtr) -> Self {
37508        Self(value.0)
37509    }
37510}
37511impl From<TerminalConstPtr> for TokenNodePtr {
37512    fn from(value: TerminalConstPtr) -> Self {
37513        Self(value.0)
37514    }
37515}
37516impl From<TerminalElsePtr> for TokenNodePtr {
37517    fn from(value: TerminalElsePtr) -> Self {
37518        Self(value.0)
37519    }
37520}
37521impl From<TerminalEnumPtr> for TokenNodePtr {
37522    fn from(value: TerminalEnumPtr) -> Self {
37523        Self(value.0)
37524    }
37525}
37526impl From<TerminalExternPtr> for TokenNodePtr {
37527    fn from(value: TerminalExternPtr) -> Self {
37528        Self(value.0)
37529    }
37530}
37531impl From<TerminalFalsePtr> for TokenNodePtr {
37532    fn from(value: TerminalFalsePtr) -> Self {
37533        Self(value.0)
37534    }
37535}
37536impl From<TerminalFunctionPtr> for TokenNodePtr {
37537    fn from(value: TerminalFunctionPtr) -> Self {
37538        Self(value.0)
37539    }
37540}
37541impl From<TerminalIfPtr> for TokenNodePtr {
37542    fn from(value: TerminalIfPtr) -> Self {
37543        Self(value.0)
37544    }
37545}
37546impl From<TerminalWhilePtr> for TokenNodePtr {
37547    fn from(value: TerminalWhilePtr) -> Self {
37548        Self(value.0)
37549    }
37550}
37551impl From<TerminalForPtr> for TokenNodePtr {
37552    fn from(value: TerminalForPtr) -> Self {
37553        Self(value.0)
37554    }
37555}
37556impl From<TerminalLoopPtr> for TokenNodePtr {
37557    fn from(value: TerminalLoopPtr) -> Self {
37558        Self(value.0)
37559    }
37560}
37561impl From<TerminalImplPtr> for TokenNodePtr {
37562    fn from(value: TerminalImplPtr) -> Self {
37563        Self(value.0)
37564    }
37565}
37566impl From<TerminalImplicitsPtr> for TokenNodePtr {
37567    fn from(value: TerminalImplicitsPtr) -> Self {
37568        Self(value.0)
37569    }
37570}
37571impl From<TerminalLetPtr> for TokenNodePtr {
37572    fn from(value: TerminalLetPtr) -> Self {
37573        Self(value.0)
37574    }
37575}
37576impl From<TerminalMatchPtr> for TokenNodePtr {
37577    fn from(value: TerminalMatchPtr) -> Self {
37578        Self(value.0)
37579    }
37580}
37581impl From<TerminalModulePtr> for TokenNodePtr {
37582    fn from(value: TerminalModulePtr) -> Self {
37583        Self(value.0)
37584    }
37585}
37586impl From<TerminalMutPtr> for TokenNodePtr {
37587    fn from(value: TerminalMutPtr) -> Self {
37588        Self(value.0)
37589    }
37590}
37591impl From<TerminalNoPanicPtr> for TokenNodePtr {
37592    fn from(value: TerminalNoPanicPtr) -> Self {
37593        Self(value.0)
37594    }
37595}
37596impl From<TerminalOfPtr> for TokenNodePtr {
37597    fn from(value: TerminalOfPtr) -> Self {
37598        Self(value.0)
37599    }
37600}
37601impl From<TerminalRefPtr> for TokenNodePtr {
37602    fn from(value: TerminalRefPtr) -> Self {
37603        Self(value.0)
37604    }
37605}
37606impl From<TerminalContinuePtr> for TokenNodePtr {
37607    fn from(value: TerminalContinuePtr) -> Self {
37608        Self(value.0)
37609    }
37610}
37611impl From<TerminalReturnPtr> for TokenNodePtr {
37612    fn from(value: TerminalReturnPtr) -> Self {
37613        Self(value.0)
37614    }
37615}
37616impl From<TerminalBreakPtr> for TokenNodePtr {
37617    fn from(value: TerminalBreakPtr) -> Self {
37618        Self(value.0)
37619    }
37620}
37621impl From<TerminalStructPtr> for TokenNodePtr {
37622    fn from(value: TerminalStructPtr) -> Self {
37623        Self(value.0)
37624    }
37625}
37626impl From<TerminalTraitPtr> for TokenNodePtr {
37627    fn from(value: TerminalTraitPtr) -> Self {
37628        Self(value.0)
37629    }
37630}
37631impl From<TerminalTruePtr> for TokenNodePtr {
37632    fn from(value: TerminalTruePtr) -> Self {
37633        Self(value.0)
37634    }
37635}
37636impl From<TerminalTypePtr> for TokenNodePtr {
37637    fn from(value: TerminalTypePtr) -> Self {
37638        Self(value.0)
37639    }
37640}
37641impl From<TerminalUsePtr> for TokenNodePtr {
37642    fn from(value: TerminalUsePtr) -> Self {
37643        Self(value.0)
37644    }
37645}
37646impl From<TerminalPubPtr> for TokenNodePtr {
37647    fn from(value: TerminalPubPtr) -> Self {
37648        Self(value.0)
37649    }
37650}
37651impl From<TerminalAndPtr> for TokenNodePtr {
37652    fn from(value: TerminalAndPtr) -> Self {
37653        Self(value.0)
37654    }
37655}
37656impl From<TerminalAndAndPtr> for TokenNodePtr {
37657    fn from(value: TerminalAndAndPtr) -> Self {
37658        Self(value.0)
37659    }
37660}
37661impl From<TerminalArrowPtr> for TokenNodePtr {
37662    fn from(value: TerminalArrowPtr) -> Self {
37663        Self(value.0)
37664    }
37665}
37666impl From<TerminalAtPtr> for TokenNodePtr {
37667    fn from(value: TerminalAtPtr) -> Self {
37668        Self(value.0)
37669    }
37670}
37671impl From<TerminalBadCharactersPtr> for TokenNodePtr {
37672    fn from(value: TerminalBadCharactersPtr) -> Self {
37673        Self(value.0)
37674    }
37675}
37676impl From<TerminalColonPtr> for TokenNodePtr {
37677    fn from(value: TerminalColonPtr) -> Self {
37678        Self(value.0)
37679    }
37680}
37681impl From<TerminalColonColonPtr> for TokenNodePtr {
37682    fn from(value: TerminalColonColonPtr) -> Self {
37683        Self(value.0)
37684    }
37685}
37686impl From<TerminalCommaPtr> for TokenNodePtr {
37687    fn from(value: TerminalCommaPtr) -> Self {
37688        Self(value.0)
37689    }
37690}
37691impl From<TerminalDivPtr> for TokenNodePtr {
37692    fn from(value: TerminalDivPtr) -> Self {
37693        Self(value.0)
37694    }
37695}
37696impl From<TerminalDivEqPtr> for TokenNodePtr {
37697    fn from(value: TerminalDivEqPtr) -> Self {
37698        Self(value.0)
37699    }
37700}
37701impl From<TerminalDotPtr> for TokenNodePtr {
37702    fn from(value: TerminalDotPtr) -> Self {
37703        Self(value.0)
37704    }
37705}
37706impl From<TerminalDotDotPtr> for TokenNodePtr {
37707    fn from(value: TerminalDotDotPtr) -> Self {
37708        Self(value.0)
37709    }
37710}
37711impl From<TerminalDotDotEqPtr> for TokenNodePtr {
37712    fn from(value: TerminalDotDotEqPtr) -> Self {
37713        Self(value.0)
37714    }
37715}
37716impl From<TerminalEndOfFilePtr> for TokenNodePtr {
37717    fn from(value: TerminalEndOfFilePtr) -> Self {
37718        Self(value.0)
37719    }
37720}
37721impl From<TerminalEqPtr> for TokenNodePtr {
37722    fn from(value: TerminalEqPtr) -> Self {
37723        Self(value.0)
37724    }
37725}
37726impl From<TerminalEqEqPtr> for TokenNodePtr {
37727    fn from(value: TerminalEqEqPtr) -> Self {
37728        Self(value.0)
37729    }
37730}
37731impl From<TerminalGEPtr> for TokenNodePtr {
37732    fn from(value: TerminalGEPtr) -> Self {
37733        Self(value.0)
37734    }
37735}
37736impl From<TerminalGTPtr> for TokenNodePtr {
37737    fn from(value: TerminalGTPtr) -> Self {
37738        Self(value.0)
37739    }
37740}
37741impl From<TerminalHashPtr> for TokenNodePtr {
37742    fn from(value: TerminalHashPtr) -> Self {
37743        Self(value.0)
37744    }
37745}
37746impl From<TerminalLBracePtr> for TokenNodePtr {
37747    fn from(value: TerminalLBracePtr) -> Self {
37748        Self(value.0)
37749    }
37750}
37751impl From<TerminalLBrackPtr> for TokenNodePtr {
37752    fn from(value: TerminalLBrackPtr) -> Self {
37753        Self(value.0)
37754    }
37755}
37756impl From<TerminalLEPtr> for TokenNodePtr {
37757    fn from(value: TerminalLEPtr) -> Self {
37758        Self(value.0)
37759    }
37760}
37761impl From<TerminalLParenPtr> for TokenNodePtr {
37762    fn from(value: TerminalLParenPtr) -> Self {
37763        Self(value.0)
37764    }
37765}
37766impl From<TerminalLTPtr> for TokenNodePtr {
37767    fn from(value: TerminalLTPtr) -> Self {
37768        Self(value.0)
37769    }
37770}
37771impl From<TerminalMatchArrowPtr> for TokenNodePtr {
37772    fn from(value: TerminalMatchArrowPtr) -> Self {
37773        Self(value.0)
37774    }
37775}
37776impl From<TerminalMinusPtr> for TokenNodePtr {
37777    fn from(value: TerminalMinusPtr) -> Self {
37778        Self(value.0)
37779    }
37780}
37781impl From<TerminalMinusEqPtr> for TokenNodePtr {
37782    fn from(value: TerminalMinusEqPtr) -> Self {
37783        Self(value.0)
37784    }
37785}
37786impl From<TerminalModPtr> for TokenNodePtr {
37787    fn from(value: TerminalModPtr) -> Self {
37788        Self(value.0)
37789    }
37790}
37791impl From<TerminalModEqPtr> for TokenNodePtr {
37792    fn from(value: TerminalModEqPtr) -> Self {
37793        Self(value.0)
37794    }
37795}
37796impl From<TerminalMulPtr> for TokenNodePtr {
37797    fn from(value: TerminalMulPtr) -> Self {
37798        Self(value.0)
37799    }
37800}
37801impl From<TerminalMulEqPtr> for TokenNodePtr {
37802    fn from(value: TerminalMulEqPtr) -> Self {
37803        Self(value.0)
37804    }
37805}
37806impl From<TerminalNeqPtr> for TokenNodePtr {
37807    fn from(value: TerminalNeqPtr) -> Self {
37808        Self(value.0)
37809    }
37810}
37811impl From<TerminalNotPtr> for TokenNodePtr {
37812    fn from(value: TerminalNotPtr) -> Self {
37813        Self(value.0)
37814    }
37815}
37816impl From<TerminalBitNotPtr> for TokenNodePtr {
37817    fn from(value: TerminalBitNotPtr) -> Self {
37818        Self(value.0)
37819    }
37820}
37821impl From<TerminalOrPtr> for TokenNodePtr {
37822    fn from(value: TerminalOrPtr) -> Self {
37823        Self(value.0)
37824    }
37825}
37826impl From<TerminalOrOrPtr> for TokenNodePtr {
37827    fn from(value: TerminalOrOrPtr) -> Self {
37828        Self(value.0)
37829    }
37830}
37831impl From<TerminalPlusPtr> for TokenNodePtr {
37832    fn from(value: TerminalPlusPtr) -> Self {
37833        Self(value.0)
37834    }
37835}
37836impl From<TerminalPlusEqPtr> for TokenNodePtr {
37837    fn from(value: TerminalPlusEqPtr) -> Self {
37838        Self(value.0)
37839    }
37840}
37841impl From<TerminalQuestionMarkPtr> for TokenNodePtr {
37842    fn from(value: TerminalQuestionMarkPtr) -> Self {
37843        Self(value.0)
37844    }
37845}
37846impl From<TerminalRBracePtr> for TokenNodePtr {
37847    fn from(value: TerminalRBracePtr) -> Self {
37848        Self(value.0)
37849    }
37850}
37851impl From<TerminalRBrackPtr> for TokenNodePtr {
37852    fn from(value: TerminalRBrackPtr) -> Self {
37853        Self(value.0)
37854    }
37855}
37856impl From<TerminalRParenPtr> for TokenNodePtr {
37857    fn from(value: TerminalRParenPtr) -> Self {
37858        Self(value.0)
37859    }
37860}
37861impl From<TerminalSemicolonPtr> for TokenNodePtr {
37862    fn from(value: TerminalSemicolonPtr) -> Self {
37863        Self(value.0)
37864    }
37865}
37866impl From<TerminalUnderscorePtr> for TokenNodePtr {
37867    fn from(value: TerminalUnderscorePtr) -> Self {
37868        Self(value.0)
37869    }
37870}
37871impl From<TerminalXorPtr> for TokenNodePtr {
37872    fn from(value: TerminalXorPtr) -> Self {
37873        Self(value.0)
37874    }
37875}
37876impl From<TerminalEmptyPtr> for TokenNodePtr {
37877    fn from(value: TerminalEmptyPtr) -> Self {
37878        Self(value.0)
37879    }
37880}
37881impl From<TerminalIdentifierGreen> for TokenNodeGreen {
37882    fn from(value: TerminalIdentifierGreen) -> Self {
37883        Self(value.0)
37884    }
37885}
37886impl From<TerminalLiteralNumberGreen> for TokenNodeGreen {
37887    fn from(value: TerminalLiteralNumberGreen) -> Self {
37888        Self(value.0)
37889    }
37890}
37891impl From<TerminalShortStringGreen> for TokenNodeGreen {
37892    fn from(value: TerminalShortStringGreen) -> Self {
37893        Self(value.0)
37894    }
37895}
37896impl From<TerminalStringGreen> for TokenNodeGreen {
37897    fn from(value: TerminalStringGreen) -> Self {
37898        Self(value.0)
37899    }
37900}
37901impl From<TerminalAsGreen> for TokenNodeGreen {
37902    fn from(value: TerminalAsGreen) -> Self {
37903        Self(value.0)
37904    }
37905}
37906impl From<TerminalConstGreen> for TokenNodeGreen {
37907    fn from(value: TerminalConstGreen) -> Self {
37908        Self(value.0)
37909    }
37910}
37911impl From<TerminalElseGreen> for TokenNodeGreen {
37912    fn from(value: TerminalElseGreen) -> Self {
37913        Self(value.0)
37914    }
37915}
37916impl From<TerminalEnumGreen> for TokenNodeGreen {
37917    fn from(value: TerminalEnumGreen) -> Self {
37918        Self(value.0)
37919    }
37920}
37921impl From<TerminalExternGreen> for TokenNodeGreen {
37922    fn from(value: TerminalExternGreen) -> Self {
37923        Self(value.0)
37924    }
37925}
37926impl From<TerminalFalseGreen> for TokenNodeGreen {
37927    fn from(value: TerminalFalseGreen) -> Self {
37928        Self(value.0)
37929    }
37930}
37931impl From<TerminalFunctionGreen> for TokenNodeGreen {
37932    fn from(value: TerminalFunctionGreen) -> Self {
37933        Self(value.0)
37934    }
37935}
37936impl From<TerminalIfGreen> for TokenNodeGreen {
37937    fn from(value: TerminalIfGreen) -> Self {
37938        Self(value.0)
37939    }
37940}
37941impl From<TerminalWhileGreen> for TokenNodeGreen {
37942    fn from(value: TerminalWhileGreen) -> Self {
37943        Self(value.0)
37944    }
37945}
37946impl From<TerminalForGreen> for TokenNodeGreen {
37947    fn from(value: TerminalForGreen) -> Self {
37948        Self(value.0)
37949    }
37950}
37951impl From<TerminalLoopGreen> for TokenNodeGreen {
37952    fn from(value: TerminalLoopGreen) -> Self {
37953        Self(value.0)
37954    }
37955}
37956impl From<TerminalImplGreen> for TokenNodeGreen {
37957    fn from(value: TerminalImplGreen) -> Self {
37958        Self(value.0)
37959    }
37960}
37961impl From<TerminalImplicitsGreen> for TokenNodeGreen {
37962    fn from(value: TerminalImplicitsGreen) -> Self {
37963        Self(value.0)
37964    }
37965}
37966impl From<TerminalLetGreen> for TokenNodeGreen {
37967    fn from(value: TerminalLetGreen) -> Self {
37968        Self(value.0)
37969    }
37970}
37971impl From<TerminalMatchGreen> for TokenNodeGreen {
37972    fn from(value: TerminalMatchGreen) -> Self {
37973        Self(value.0)
37974    }
37975}
37976impl From<TerminalModuleGreen> for TokenNodeGreen {
37977    fn from(value: TerminalModuleGreen) -> Self {
37978        Self(value.0)
37979    }
37980}
37981impl From<TerminalMutGreen> for TokenNodeGreen {
37982    fn from(value: TerminalMutGreen) -> Self {
37983        Self(value.0)
37984    }
37985}
37986impl From<TerminalNoPanicGreen> for TokenNodeGreen {
37987    fn from(value: TerminalNoPanicGreen) -> Self {
37988        Self(value.0)
37989    }
37990}
37991impl From<TerminalOfGreen> for TokenNodeGreen {
37992    fn from(value: TerminalOfGreen) -> Self {
37993        Self(value.0)
37994    }
37995}
37996impl From<TerminalRefGreen> for TokenNodeGreen {
37997    fn from(value: TerminalRefGreen) -> Self {
37998        Self(value.0)
37999    }
38000}
38001impl From<TerminalContinueGreen> for TokenNodeGreen {
38002    fn from(value: TerminalContinueGreen) -> Self {
38003        Self(value.0)
38004    }
38005}
38006impl From<TerminalReturnGreen> for TokenNodeGreen {
38007    fn from(value: TerminalReturnGreen) -> Self {
38008        Self(value.0)
38009    }
38010}
38011impl From<TerminalBreakGreen> for TokenNodeGreen {
38012    fn from(value: TerminalBreakGreen) -> Self {
38013        Self(value.0)
38014    }
38015}
38016impl From<TerminalStructGreen> for TokenNodeGreen {
38017    fn from(value: TerminalStructGreen) -> Self {
38018        Self(value.0)
38019    }
38020}
38021impl From<TerminalTraitGreen> for TokenNodeGreen {
38022    fn from(value: TerminalTraitGreen) -> Self {
38023        Self(value.0)
38024    }
38025}
38026impl From<TerminalTrueGreen> for TokenNodeGreen {
38027    fn from(value: TerminalTrueGreen) -> Self {
38028        Self(value.0)
38029    }
38030}
38031impl From<TerminalTypeGreen> for TokenNodeGreen {
38032    fn from(value: TerminalTypeGreen) -> Self {
38033        Self(value.0)
38034    }
38035}
38036impl From<TerminalUseGreen> for TokenNodeGreen {
38037    fn from(value: TerminalUseGreen) -> Self {
38038        Self(value.0)
38039    }
38040}
38041impl From<TerminalPubGreen> for TokenNodeGreen {
38042    fn from(value: TerminalPubGreen) -> Self {
38043        Self(value.0)
38044    }
38045}
38046impl From<TerminalAndGreen> for TokenNodeGreen {
38047    fn from(value: TerminalAndGreen) -> Self {
38048        Self(value.0)
38049    }
38050}
38051impl From<TerminalAndAndGreen> for TokenNodeGreen {
38052    fn from(value: TerminalAndAndGreen) -> Self {
38053        Self(value.0)
38054    }
38055}
38056impl From<TerminalArrowGreen> for TokenNodeGreen {
38057    fn from(value: TerminalArrowGreen) -> Self {
38058        Self(value.0)
38059    }
38060}
38061impl From<TerminalAtGreen> for TokenNodeGreen {
38062    fn from(value: TerminalAtGreen) -> Self {
38063        Self(value.0)
38064    }
38065}
38066impl From<TerminalBadCharactersGreen> for TokenNodeGreen {
38067    fn from(value: TerminalBadCharactersGreen) -> Self {
38068        Self(value.0)
38069    }
38070}
38071impl From<TerminalColonGreen> for TokenNodeGreen {
38072    fn from(value: TerminalColonGreen) -> Self {
38073        Self(value.0)
38074    }
38075}
38076impl From<TerminalColonColonGreen> for TokenNodeGreen {
38077    fn from(value: TerminalColonColonGreen) -> Self {
38078        Self(value.0)
38079    }
38080}
38081impl From<TerminalCommaGreen> for TokenNodeGreen {
38082    fn from(value: TerminalCommaGreen) -> Self {
38083        Self(value.0)
38084    }
38085}
38086impl From<TerminalDivGreen> for TokenNodeGreen {
38087    fn from(value: TerminalDivGreen) -> Self {
38088        Self(value.0)
38089    }
38090}
38091impl From<TerminalDivEqGreen> for TokenNodeGreen {
38092    fn from(value: TerminalDivEqGreen) -> Self {
38093        Self(value.0)
38094    }
38095}
38096impl From<TerminalDotGreen> for TokenNodeGreen {
38097    fn from(value: TerminalDotGreen) -> Self {
38098        Self(value.0)
38099    }
38100}
38101impl From<TerminalDotDotGreen> for TokenNodeGreen {
38102    fn from(value: TerminalDotDotGreen) -> Self {
38103        Self(value.0)
38104    }
38105}
38106impl From<TerminalDotDotEqGreen> for TokenNodeGreen {
38107    fn from(value: TerminalDotDotEqGreen) -> Self {
38108        Self(value.0)
38109    }
38110}
38111impl From<TerminalEndOfFileGreen> for TokenNodeGreen {
38112    fn from(value: TerminalEndOfFileGreen) -> Self {
38113        Self(value.0)
38114    }
38115}
38116impl From<TerminalEqGreen> for TokenNodeGreen {
38117    fn from(value: TerminalEqGreen) -> Self {
38118        Self(value.0)
38119    }
38120}
38121impl From<TerminalEqEqGreen> for TokenNodeGreen {
38122    fn from(value: TerminalEqEqGreen) -> Self {
38123        Self(value.0)
38124    }
38125}
38126impl From<TerminalGEGreen> for TokenNodeGreen {
38127    fn from(value: TerminalGEGreen) -> Self {
38128        Self(value.0)
38129    }
38130}
38131impl From<TerminalGTGreen> for TokenNodeGreen {
38132    fn from(value: TerminalGTGreen) -> Self {
38133        Self(value.0)
38134    }
38135}
38136impl From<TerminalHashGreen> for TokenNodeGreen {
38137    fn from(value: TerminalHashGreen) -> Self {
38138        Self(value.0)
38139    }
38140}
38141impl From<TerminalLBraceGreen> for TokenNodeGreen {
38142    fn from(value: TerminalLBraceGreen) -> Self {
38143        Self(value.0)
38144    }
38145}
38146impl From<TerminalLBrackGreen> for TokenNodeGreen {
38147    fn from(value: TerminalLBrackGreen) -> Self {
38148        Self(value.0)
38149    }
38150}
38151impl From<TerminalLEGreen> for TokenNodeGreen {
38152    fn from(value: TerminalLEGreen) -> Self {
38153        Self(value.0)
38154    }
38155}
38156impl From<TerminalLParenGreen> for TokenNodeGreen {
38157    fn from(value: TerminalLParenGreen) -> Self {
38158        Self(value.0)
38159    }
38160}
38161impl From<TerminalLTGreen> for TokenNodeGreen {
38162    fn from(value: TerminalLTGreen) -> Self {
38163        Self(value.0)
38164    }
38165}
38166impl From<TerminalMatchArrowGreen> for TokenNodeGreen {
38167    fn from(value: TerminalMatchArrowGreen) -> Self {
38168        Self(value.0)
38169    }
38170}
38171impl From<TerminalMinusGreen> for TokenNodeGreen {
38172    fn from(value: TerminalMinusGreen) -> Self {
38173        Self(value.0)
38174    }
38175}
38176impl From<TerminalMinusEqGreen> for TokenNodeGreen {
38177    fn from(value: TerminalMinusEqGreen) -> Self {
38178        Self(value.0)
38179    }
38180}
38181impl From<TerminalModGreen> for TokenNodeGreen {
38182    fn from(value: TerminalModGreen) -> Self {
38183        Self(value.0)
38184    }
38185}
38186impl From<TerminalModEqGreen> for TokenNodeGreen {
38187    fn from(value: TerminalModEqGreen) -> Self {
38188        Self(value.0)
38189    }
38190}
38191impl From<TerminalMulGreen> for TokenNodeGreen {
38192    fn from(value: TerminalMulGreen) -> Self {
38193        Self(value.0)
38194    }
38195}
38196impl From<TerminalMulEqGreen> for TokenNodeGreen {
38197    fn from(value: TerminalMulEqGreen) -> Self {
38198        Self(value.0)
38199    }
38200}
38201impl From<TerminalNeqGreen> for TokenNodeGreen {
38202    fn from(value: TerminalNeqGreen) -> Self {
38203        Self(value.0)
38204    }
38205}
38206impl From<TerminalNotGreen> for TokenNodeGreen {
38207    fn from(value: TerminalNotGreen) -> Self {
38208        Self(value.0)
38209    }
38210}
38211impl From<TerminalBitNotGreen> for TokenNodeGreen {
38212    fn from(value: TerminalBitNotGreen) -> Self {
38213        Self(value.0)
38214    }
38215}
38216impl From<TerminalOrGreen> for TokenNodeGreen {
38217    fn from(value: TerminalOrGreen) -> Self {
38218        Self(value.0)
38219    }
38220}
38221impl From<TerminalOrOrGreen> for TokenNodeGreen {
38222    fn from(value: TerminalOrOrGreen) -> Self {
38223        Self(value.0)
38224    }
38225}
38226impl From<TerminalPlusGreen> for TokenNodeGreen {
38227    fn from(value: TerminalPlusGreen) -> Self {
38228        Self(value.0)
38229    }
38230}
38231impl From<TerminalPlusEqGreen> for TokenNodeGreen {
38232    fn from(value: TerminalPlusEqGreen) -> Self {
38233        Self(value.0)
38234    }
38235}
38236impl From<TerminalQuestionMarkGreen> for TokenNodeGreen {
38237    fn from(value: TerminalQuestionMarkGreen) -> Self {
38238        Self(value.0)
38239    }
38240}
38241impl From<TerminalRBraceGreen> for TokenNodeGreen {
38242    fn from(value: TerminalRBraceGreen) -> Self {
38243        Self(value.0)
38244    }
38245}
38246impl From<TerminalRBrackGreen> for TokenNodeGreen {
38247    fn from(value: TerminalRBrackGreen) -> Self {
38248        Self(value.0)
38249    }
38250}
38251impl From<TerminalRParenGreen> for TokenNodeGreen {
38252    fn from(value: TerminalRParenGreen) -> Self {
38253        Self(value.0)
38254    }
38255}
38256impl From<TerminalSemicolonGreen> for TokenNodeGreen {
38257    fn from(value: TerminalSemicolonGreen) -> Self {
38258        Self(value.0)
38259    }
38260}
38261impl From<TerminalUnderscoreGreen> for TokenNodeGreen {
38262    fn from(value: TerminalUnderscoreGreen) -> Self {
38263        Self(value.0)
38264    }
38265}
38266impl From<TerminalXorGreen> for TokenNodeGreen {
38267    fn from(value: TerminalXorGreen) -> Self {
38268        Self(value.0)
38269    }
38270}
38271impl From<TerminalEmptyGreen> for TokenNodeGreen {
38272    fn from(value: TerminalEmptyGreen) -> Self {
38273        Self(value.0)
38274    }
38275}
38276#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
38277pub struct TokenNodeGreen(pub GreenId);
38278impl TypedSyntaxNode for TokenNode {
38279    const OPTIONAL_KIND: Option<SyntaxKind> = None;
38280    type StablePtr = TokenNodePtr;
38281    type Green = TokenNodeGreen;
38282    fn missing(db: &dyn SyntaxGroup) -> Self::Green {
38283        panic!("No missing variant.");
38284    }
38285    fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self {
38286        let kind = node.kind(db);
38287        match kind {
38288            SyntaxKind::TerminalIdentifier => {
38289                TokenNode::TerminalIdentifier(TerminalIdentifier::from_syntax_node(db, node))
38290            }
38291            SyntaxKind::TerminalLiteralNumber => {
38292                TokenNode::TerminalLiteralNumber(TerminalLiteralNumber::from_syntax_node(db, node))
38293            }
38294            SyntaxKind::TerminalShortString => {
38295                TokenNode::TerminalShortString(TerminalShortString::from_syntax_node(db, node))
38296            }
38297            SyntaxKind::TerminalString => {
38298                TokenNode::TerminalString(TerminalString::from_syntax_node(db, node))
38299            }
38300            SyntaxKind::TerminalAs => TokenNode::TerminalAs(TerminalAs::from_syntax_node(db, node)),
38301            SyntaxKind::TerminalConst => {
38302                TokenNode::TerminalConst(TerminalConst::from_syntax_node(db, node))
38303            }
38304            SyntaxKind::TerminalElse => {
38305                TokenNode::TerminalElse(TerminalElse::from_syntax_node(db, node))
38306            }
38307            SyntaxKind::TerminalEnum => {
38308                TokenNode::TerminalEnum(TerminalEnum::from_syntax_node(db, node))
38309            }
38310            SyntaxKind::TerminalExtern => {
38311                TokenNode::TerminalExtern(TerminalExtern::from_syntax_node(db, node))
38312            }
38313            SyntaxKind::TerminalFalse => {
38314                TokenNode::TerminalFalse(TerminalFalse::from_syntax_node(db, node))
38315            }
38316            SyntaxKind::TerminalFunction => {
38317                TokenNode::TerminalFunction(TerminalFunction::from_syntax_node(db, node))
38318            }
38319            SyntaxKind::TerminalIf => TokenNode::TerminalIf(TerminalIf::from_syntax_node(db, node)),
38320            SyntaxKind::TerminalWhile => {
38321                TokenNode::TerminalWhile(TerminalWhile::from_syntax_node(db, node))
38322            }
38323            SyntaxKind::TerminalFor => {
38324                TokenNode::TerminalFor(TerminalFor::from_syntax_node(db, node))
38325            }
38326            SyntaxKind::TerminalLoop => {
38327                TokenNode::TerminalLoop(TerminalLoop::from_syntax_node(db, node))
38328            }
38329            SyntaxKind::TerminalImpl => {
38330                TokenNode::TerminalImpl(TerminalImpl::from_syntax_node(db, node))
38331            }
38332            SyntaxKind::TerminalImplicits => {
38333                TokenNode::TerminalImplicits(TerminalImplicits::from_syntax_node(db, node))
38334            }
38335            SyntaxKind::TerminalLet => {
38336                TokenNode::TerminalLet(TerminalLet::from_syntax_node(db, node))
38337            }
38338            SyntaxKind::TerminalMatch => {
38339                TokenNode::TerminalMatch(TerminalMatch::from_syntax_node(db, node))
38340            }
38341            SyntaxKind::TerminalModule => {
38342                TokenNode::TerminalModule(TerminalModule::from_syntax_node(db, node))
38343            }
38344            SyntaxKind::TerminalMut => {
38345                TokenNode::TerminalMut(TerminalMut::from_syntax_node(db, node))
38346            }
38347            SyntaxKind::TerminalNoPanic => {
38348                TokenNode::TerminalNoPanic(TerminalNoPanic::from_syntax_node(db, node))
38349            }
38350            SyntaxKind::TerminalOf => TokenNode::TerminalOf(TerminalOf::from_syntax_node(db, node)),
38351            SyntaxKind::TerminalRef => {
38352                TokenNode::TerminalRef(TerminalRef::from_syntax_node(db, node))
38353            }
38354            SyntaxKind::TerminalContinue => {
38355                TokenNode::TerminalContinue(TerminalContinue::from_syntax_node(db, node))
38356            }
38357            SyntaxKind::TerminalReturn => {
38358                TokenNode::TerminalReturn(TerminalReturn::from_syntax_node(db, node))
38359            }
38360            SyntaxKind::TerminalBreak => {
38361                TokenNode::TerminalBreak(TerminalBreak::from_syntax_node(db, node))
38362            }
38363            SyntaxKind::TerminalStruct => {
38364                TokenNode::TerminalStruct(TerminalStruct::from_syntax_node(db, node))
38365            }
38366            SyntaxKind::TerminalTrait => {
38367                TokenNode::TerminalTrait(TerminalTrait::from_syntax_node(db, node))
38368            }
38369            SyntaxKind::TerminalTrue => {
38370                TokenNode::TerminalTrue(TerminalTrue::from_syntax_node(db, node))
38371            }
38372            SyntaxKind::TerminalType => {
38373                TokenNode::TerminalType(TerminalType::from_syntax_node(db, node))
38374            }
38375            SyntaxKind::TerminalUse => {
38376                TokenNode::TerminalUse(TerminalUse::from_syntax_node(db, node))
38377            }
38378            SyntaxKind::TerminalPub => {
38379                TokenNode::TerminalPub(TerminalPub::from_syntax_node(db, node))
38380            }
38381            SyntaxKind::TerminalAnd => {
38382                TokenNode::TerminalAnd(TerminalAnd::from_syntax_node(db, node))
38383            }
38384            SyntaxKind::TerminalAndAnd => {
38385                TokenNode::TerminalAndAnd(TerminalAndAnd::from_syntax_node(db, node))
38386            }
38387            SyntaxKind::TerminalArrow => {
38388                TokenNode::TerminalArrow(TerminalArrow::from_syntax_node(db, node))
38389            }
38390            SyntaxKind::TerminalAt => TokenNode::TerminalAt(TerminalAt::from_syntax_node(db, node)),
38391            SyntaxKind::TerminalBadCharacters => {
38392                TokenNode::TerminalBadCharacters(TerminalBadCharacters::from_syntax_node(db, node))
38393            }
38394            SyntaxKind::TerminalColon => {
38395                TokenNode::TerminalColon(TerminalColon::from_syntax_node(db, node))
38396            }
38397            SyntaxKind::TerminalColonColon => {
38398                TokenNode::TerminalColonColon(TerminalColonColon::from_syntax_node(db, node))
38399            }
38400            SyntaxKind::TerminalComma => {
38401                TokenNode::TerminalComma(TerminalComma::from_syntax_node(db, node))
38402            }
38403            SyntaxKind::TerminalDiv => {
38404                TokenNode::TerminalDiv(TerminalDiv::from_syntax_node(db, node))
38405            }
38406            SyntaxKind::TerminalDivEq => {
38407                TokenNode::TerminalDivEq(TerminalDivEq::from_syntax_node(db, node))
38408            }
38409            SyntaxKind::TerminalDot => {
38410                TokenNode::TerminalDot(TerminalDot::from_syntax_node(db, node))
38411            }
38412            SyntaxKind::TerminalDotDot => {
38413                TokenNode::TerminalDotDot(TerminalDotDot::from_syntax_node(db, node))
38414            }
38415            SyntaxKind::TerminalDotDotEq => {
38416                TokenNode::TerminalDotDotEq(TerminalDotDotEq::from_syntax_node(db, node))
38417            }
38418            SyntaxKind::TerminalEndOfFile => {
38419                TokenNode::TerminalEndOfFile(TerminalEndOfFile::from_syntax_node(db, node))
38420            }
38421            SyntaxKind::TerminalEq => TokenNode::TerminalEq(TerminalEq::from_syntax_node(db, node)),
38422            SyntaxKind::TerminalEqEq => {
38423                TokenNode::TerminalEqEq(TerminalEqEq::from_syntax_node(db, node))
38424            }
38425            SyntaxKind::TerminalGE => TokenNode::TerminalGE(TerminalGE::from_syntax_node(db, node)),
38426            SyntaxKind::TerminalGT => TokenNode::TerminalGT(TerminalGT::from_syntax_node(db, node)),
38427            SyntaxKind::TerminalHash => {
38428                TokenNode::TerminalHash(TerminalHash::from_syntax_node(db, node))
38429            }
38430            SyntaxKind::TerminalLBrace => {
38431                TokenNode::TerminalLBrace(TerminalLBrace::from_syntax_node(db, node))
38432            }
38433            SyntaxKind::TerminalLBrack => {
38434                TokenNode::TerminalLBrack(TerminalLBrack::from_syntax_node(db, node))
38435            }
38436            SyntaxKind::TerminalLE => TokenNode::TerminalLE(TerminalLE::from_syntax_node(db, node)),
38437            SyntaxKind::TerminalLParen => {
38438                TokenNode::TerminalLParen(TerminalLParen::from_syntax_node(db, node))
38439            }
38440            SyntaxKind::TerminalLT => TokenNode::TerminalLT(TerminalLT::from_syntax_node(db, node)),
38441            SyntaxKind::TerminalMatchArrow => {
38442                TokenNode::TerminalMatchArrow(TerminalMatchArrow::from_syntax_node(db, node))
38443            }
38444            SyntaxKind::TerminalMinus => {
38445                TokenNode::TerminalMinus(TerminalMinus::from_syntax_node(db, node))
38446            }
38447            SyntaxKind::TerminalMinusEq => {
38448                TokenNode::TerminalMinusEq(TerminalMinusEq::from_syntax_node(db, node))
38449            }
38450            SyntaxKind::TerminalMod => {
38451                TokenNode::TerminalMod(TerminalMod::from_syntax_node(db, node))
38452            }
38453            SyntaxKind::TerminalModEq => {
38454                TokenNode::TerminalModEq(TerminalModEq::from_syntax_node(db, node))
38455            }
38456            SyntaxKind::TerminalMul => {
38457                TokenNode::TerminalMul(TerminalMul::from_syntax_node(db, node))
38458            }
38459            SyntaxKind::TerminalMulEq => {
38460                TokenNode::TerminalMulEq(TerminalMulEq::from_syntax_node(db, node))
38461            }
38462            SyntaxKind::TerminalNeq => {
38463                TokenNode::TerminalNeq(TerminalNeq::from_syntax_node(db, node))
38464            }
38465            SyntaxKind::TerminalNot => {
38466                TokenNode::TerminalNot(TerminalNot::from_syntax_node(db, node))
38467            }
38468            SyntaxKind::TerminalBitNot => {
38469                TokenNode::TerminalBitNot(TerminalBitNot::from_syntax_node(db, node))
38470            }
38471            SyntaxKind::TerminalOr => TokenNode::TerminalOr(TerminalOr::from_syntax_node(db, node)),
38472            SyntaxKind::TerminalOrOr => {
38473                TokenNode::TerminalOrOr(TerminalOrOr::from_syntax_node(db, node))
38474            }
38475            SyntaxKind::TerminalPlus => {
38476                TokenNode::TerminalPlus(TerminalPlus::from_syntax_node(db, node))
38477            }
38478            SyntaxKind::TerminalPlusEq => {
38479                TokenNode::TerminalPlusEq(TerminalPlusEq::from_syntax_node(db, node))
38480            }
38481            SyntaxKind::TerminalQuestionMark => {
38482                TokenNode::TerminalQuestionMark(TerminalQuestionMark::from_syntax_node(db, node))
38483            }
38484            SyntaxKind::TerminalRBrace => {
38485                TokenNode::TerminalRBrace(TerminalRBrace::from_syntax_node(db, node))
38486            }
38487            SyntaxKind::TerminalRBrack => {
38488                TokenNode::TerminalRBrack(TerminalRBrack::from_syntax_node(db, node))
38489            }
38490            SyntaxKind::TerminalRParen => {
38491                TokenNode::TerminalRParen(TerminalRParen::from_syntax_node(db, node))
38492            }
38493            SyntaxKind::TerminalSemicolon => {
38494                TokenNode::TerminalSemicolon(TerminalSemicolon::from_syntax_node(db, node))
38495            }
38496            SyntaxKind::TerminalUnderscore => {
38497                TokenNode::TerminalUnderscore(TerminalUnderscore::from_syntax_node(db, node))
38498            }
38499            SyntaxKind::TerminalXor => {
38500                TokenNode::TerminalXor(TerminalXor::from_syntax_node(db, node))
38501            }
38502            SyntaxKind::TerminalEmpty => {
38503                TokenNode::TerminalEmpty(TerminalEmpty::from_syntax_node(db, node))
38504            }
38505            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "TokenNode"),
38506        }
38507    }
38508    fn cast(db: &dyn SyntaxGroup, node: SyntaxNode) -> Option<Self> {
38509        let kind = node.kind(db);
38510        match kind {
38511            SyntaxKind::TerminalIdentifier => {
38512                Some(TokenNode::TerminalIdentifier(TerminalIdentifier::from_syntax_node(db, node)))
38513            }
38514            SyntaxKind::TerminalLiteralNumber => Some(TokenNode::TerminalLiteralNumber(
38515                TerminalLiteralNumber::from_syntax_node(db, node),
38516            )),
38517            SyntaxKind::TerminalShortString => Some(TokenNode::TerminalShortString(
38518                TerminalShortString::from_syntax_node(db, node),
38519            )),
38520            SyntaxKind::TerminalString => {
38521                Some(TokenNode::TerminalString(TerminalString::from_syntax_node(db, node)))
38522            }
38523            SyntaxKind::TerminalAs => {
38524                Some(TokenNode::TerminalAs(TerminalAs::from_syntax_node(db, node)))
38525            }
38526            SyntaxKind::TerminalConst => {
38527                Some(TokenNode::TerminalConst(TerminalConst::from_syntax_node(db, node)))
38528            }
38529            SyntaxKind::TerminalElse => {
38530                Some(TokenNode::TerminalElse(TerminalElse::from_syntax_node(db, node)))
38531            }
38532            SyntaxKind::TerminalEnum => {
38533                Some(TokenNode::TerminalEnum(TerminalEnum::from_syntax_node(db, node)))
38534            }
38535            SyntaxKind::TerminalExtern => {
38536                Some(TokenNode::TerminalExtern(TerminalExtern::from_syntax_node(db, node)))
38537            }
38538            SyntaxKind::TerminalFalse => {
38539                Some(TokenNode::TerminalFalse(TerminalFalse::from_syntax_node(db, node)))
38540            }
38541            SyntaxKind::TerminalFunction => {
38542                Some(TokenNode::TerminalFunction(TerminalFunction::from_syntax_node(db, node)))
38543            }
38544            SyntaxKind::TerminalIf => {
38545                Some(TokenNode::TerminalIf(TerminalIf::from_syntax_node(db, node)))
38546            }
38547            SyntaxKind::TerminalWhile => {
38548                Some(TokenNode::TerminalWhile(TerminalWhile::from_syntax_node(db, node)))
38549            }
38550            SyntaxKind::TerminalFor => {
38551                Some(TokenNode::TerminalFor(TerminalFor::from_syntax_node(db, node)))
38552            }
38553            SyntaxKind::TerminalLoop => {
38554                Some(TokenNode::TerminalLoop(TerminalLoop::from_syntax_node(db, node)))
38555            }
38556            SyntaxKind::TerminalImpl => {
38557                Some(TokenNode::TerminalImpl(TerminalImpl::from_syntax_node(db, node)))
38558            }
38559            SyntaxKind::TerminalImplicits => {
38560                Some(TokenNode::TerminalImplicits(TerminalImplicits::from_syntax_node(db, node)))
38561            }
38562            SyntaxKind::TerminalLet => {
38563                Some(TokenNode::TerminalLet(TerminalLet::from_syntax_node(db, node)))
38564            }
38565            SyntaxKind::TerminalMatch => {
38566                Some(TokenNode::TerminalMatch(TerminalMatch::from_syntax_node(db, node)))
38567            }
38568            SyntaxKind::TerminalModule => {
38569                Some(TokenNode::TerminalModule(TerminalModule::from_syntax_node(db, node)))
38570            }
38571            SyntaxKind::TerminalMut => {
38572                Some(TokenNode::TerminalMut(TerminalMut::from_syntax_node(db, node)))
38573            }
38574            SyntaxKind::TerminalNoPanic => {
38575                Some(TokenNode::TerminalNoPanic(TerminalNoPanic::from_syntax_node(db, node)))
38576            }
38577            SyntaxKind::TerminalOf => {
38578                Some(TokenNode::TerminalOf(TerminalOf::from_syntax_node(db, node)))
38579            }
38580            SyntaxKind::TerminalRef => {
38581                Some(TokenNode::TerminalRef(TerminalRef::from_syntax_node(db, node)))
38582            }
38583            SyntaxKind::TerminalContinue => {
38584                Some(TokenNode::TerminalContinue(TerminalContinue::from_syntax_node(db, node)))
38585            }
38586            SyntaxKind::TerminalReturn => {
38587                Some(TokenNode::TerminalReturn(TerminalReturn::from_syntax_node(db, node)))
38588            }
38589            SyntaxKind::TerminalBreak => {
38590                Some(TokenNode::TerminalBreak(TerminalBreak::from_syntax_node(db, node)))
38591            }
38592            SyntaxKind::TerminalStruct => {
38593                Some(TokenNode::TerminalStruct(TerminalStruct::from_syntax_node(db, node)))
38594            }
38595            SyntaxKind::TerminalTrait => {
38596                Some(TokenNode::TerminalTrait(TerminalTrait::from_syntax_node(db, node)))
38597            }
38598            SyntaxKind::TerminalTrue => {
38599                Some(TokenNode::TerminalTrue(TerminalTrue::from_syntax_node(db, node)))
38600            }
38601            SyntaxKind::TerminalType => {
38602                Some(TokenNode::TerminalType(TerminalType::from_syntax_node(db, node)))
38603            }
38604            SyntaxKind::TerminalUse => {
38605                Some(TokenNode::TerminalUse(TerminalUse::from_syntax_node(db, node)))
38606            }
38607            SyntaxKind::TerminalPub => {
38608                Some(TokenNode::TerminalPub(TerminalPub::from_syntax_node(db, node)))
38609            }
38610            SyntaxKind::TerminalAnd => {
38611                Some(TokenNode::TerminalAnd(TerminalAnd::from_syntax_node(db, node)))
38612            }
38613            SyntaxKind::TerminalAndAnd => {
38614                Some(TokenNode::TerminalAndAnd(TerminalAndAnd::from_syntax_node(db, node)))
38615            }
38616            SyntaxKind::TerminalArrow => {
38617                Some(TokenNode::TerminalArrow(TerminalArrow::from_syntax_node(db, node)))
38618            }
38619            SyntaxKind::TerminalAt => {
38620                Some(TokenNode::TerminalAt(TerminalAt::from_syntax_node(db, node)))
38621            }
38622            SyntaxKind::TerminalBadCharacters => Some(TokenNode::TerminalBadCharacters(
38623                TerminalBadCharacters::from_syntax_node(db, node),
38624            )),
38625            SyntaxKind::TerminalColon => {
38626                Some(TokenNode::TerminalColon(TerminalColon::from_syntax_node(db, node)))
38627            }
38628            SyntaxKind::TerminalColonColon => {
38629                Some(TokenNode::TerminalColonColon(TerminalColonColon::from_syntax_node(db, node)))
38630            }
38631            SyntaxKind::TerminalComma => {
38632                Some(TokenNode::TerminalComma(TerminalComma::from_syntax_node(db, node)))
38633            }
38634            SyntaxKind::TerminalDiv => {
38635                Some(TokenNode::TerminalDiv(TerminalDiv::from_syntax_node(db, node)))
38636            }
38637            SyntaxKind::TerminalDivEq => {
38638                Some(TokenNode::TerminalDivEq(TerminalDivEq::from_syntax_node(db, node)))
38639            }
38640            SyntaxKind::TerminalDot => {
38641                Some(TokenNode::TerminalDot(TerminalDot::from_syntax_node(db, node)))
38642            }
38643            SyntaxKind::TerminalDotDot => {
38644                Some(TokenNode::TerminalDotDot(TerminalDotDot::from_syntax_node(db, node)))
38645            }
38646            SyntaxKind::TerminalDotDotEq => {
38647                Some(TokenNode::TerminalDotDotEq(TerminalDotDotEq::from_syntax_node(db, node)))
38648            }
38649            SyntaxKind::TerminalEndOfFile => {
38650                Some(TokenNode::TerminalEndOfFile(TerminalEndOfFile::from_syntax_node(db, node)))
38651            }
38652            SyntaxKind::TerminalEq => {
38653                Some(TokenNode::TerminalEq(TerminalEq::from_syntax_node(db, node)))
38654            }
38655            SyntaxKind::TerminalEqEq => {
38656                Some(TokenNode::TerminalEqEq(TerminalEqEq::from_syntax_node(db, node)))
38657            }
38658            SyntaxKind::TerminalGE => {
38659                Some(TokenNode::TerminalGE(TerminalGE::from_syntax_node(db, node)))
38660            }
38661            SyntaxKind::TerminalGT => {
38662                Some(TokenNode::TerminalGT(TerminalGT::from_syntax_node(db, node)))
38663            }
38664            SyntaxKind::TerminalHash => {
38665                Some(TokenNode::TerminalHash(TerminalHash::from_syntax_node(db, node)))
38666            }
38667            SyntaxKind::TerminalLBrace => {
38668                Some(TokenNode::TerminalLBrace(TerminalLBrace::from_syntax_node(db, node)))
38669            }
38670            SyntaxKind::TerminalLBrack => {
38671                Some(TokenNode::TerminalLBrack(TerminalLBrack::from_syntax_node(db, node)))
38672            }
38673            SyntaxKind::TerminalLE => {
38674                Some(TokenNode::TerminalLE(TerminalLE::from_syntax_node(db, node)))
38675            }
38676            SyntaxKind::TerminalLParen => {
38677                Some(TokenNode::TerminalLParen(TerminalLParen::from_syntax_node(db, node)))
38678            }
38679            SyntaxKind::TerminalLT => {
38680                Some(TokenNode::TerminalLT(TerminalLT::from_syntax_node(db, node)))
38681            }
38682            SyntaxKind::TerminalMatchArrow => {
38683                Some(TokenNode::TerminalMatchArrow(TerminalMatchArrow::from_syntax_node(db, node)))
38684            }
38685            SyntaxKind::TerminalMinus => {
38686                Some(TokenNode::TerminalMinus(TerminalMinus::from_syntax_node(db, node)))
38687            }
38688            SyntaxKind::TerminalMinusEq => {
38689                Some(TokenNode::TerminalMinusEq(TerminalMinusEq::from_syntax_node(db, node)))
38690            }
38691            SyntaxKind::TerminalMod => {
38692                Some(TokenNode::TerminalMod(TerminalMod::from_syntax_node(db, node)))
38693            }
38694            SyntaxKind::TerminalModEq => {
38695                Some(TokenNode::TerminalModEq(TerminalModEq::from_syntax_node(db, node)))
38696            }
38697            SyntaxKind::TerminalMul => {
38698                Some(TokenNode::TerminalMul(TerminalMul::from_syntax_node(db, node)))
38699            }
38700            SyntaxKind::TerminalMulEq => {
38701                Some(TokenNode::TerminalMulEq(TerminalMulEq::from_syntax_node(db, node)))
38702            }
38703            SyntaxKind::TerminalNeq => {
38704                Some(TokenNode::TerminalNeq(TerminalNeq::from_syntax_node(db, node)))
38705            }
38706            SyntaxKind::TerminalNot => {
38707                Some(TokenNode::TerminalNot(TerminalNot::from_syntax_node(db, node)))
38708            }
38709            SyntaxKind::TerminalBitNot => {
38710                Some(TokenNode::TerminalBitNot(TerminalBitNot::from_syntax_node(db, node)))
38711            }
38712            SyntaxKind::TerminalOr => {
38713                Some(TokenNode::TerminalOr(TerminalOr::from_syntax_node(db, node)))
38714            }
38715            SyntaxKind::TerminalOrOr => {
38716                Some(TokenNode::TerminalOrOr(TerminalOrOr::from_syntax_node(db, node)))
38717            }
38718            SyntaxKind::TerminalPlus => {
38719                Some(TokenNode::TerminalPlus(TerminalPlus::from_syntax_node(db, node)))
38720            }
38721            SyntaxKind::TerminalPlusEq => {
38722                Some(TokenNode::TerminalPlusEq(TerminalPlusEq::from_syntax_node(db, node)))
38723            }
38724            SyntaxKind::TerminalQuestionMark => Some(TokenNode::TerminalQuestionMark(
38725                TerminalQuestionMark::from_syntax_node(db, node),
38726            )),
38727            SyntaxKind::TerminalRBrace => {
38728                Some(TokenNode::TerminalRBrace(TerminalRBrace::from_syntax_node(db, node)))
38729            }
38730            SyntaxKind::TerminalRBrack => {
38731                Some(TokenNode::TerminalRBrack(TerminalRBrack::from_syntax_node(db, node)))
38732            }
38733            SyntaxKind::TerminalRParen => {
38734                Some(TokenNode::TerminalRParen(TerminalRParen::from_syntax_node(db, node)))
38735            }
38736            SyntaxKind::TerminalSemicolon => {
38737                Some(TokenNode::TerminalSemicolon(TerminalSemicolon::from_syntax_node(db, node)))
38738            }
38739            SyntaxKind::TerminalUnderscore => {
38740                Some(TokenNode::TerminalUnderscore(TerminalUnderscore::from_syntax_node(db, node)))
38741            }
38742            SyntaxKind::TerminalXor => {
38743                Some(TokenNode::TerminalXor(TerminalXor::from_syntax_node(db, node)))
38744            }
38745            SyntaxKind::TerminalEmpty => {
38746                Some(TokenNode::TerminalEmpty(TerminalEmpty::from_syntax_node(db, node)))
38747            }
38748            _ => None,
38749        }
38750    }
38751    fn as_syntax_node(&self) -> SyntaxNode {
38752        match self {
38753            TokenNode::TerminalIdentifier(x) => x.as_syntax_node(),
38754            TokenNode::TerminalLiteralNumber(x) => x.as_syntax_node(),
38755            TokenNode::TerminalShortString(x) => x.as_syntax_node(),
38756            TokenNode::TerminalString(x) => x.as_syntax_node(),
38757            TokenNode::TerminalAs(x) => x.as_syntax_node(),
38758            TokenNode::TerminalConst(x) => x.as_syntax_node(),
38759            TokenNode::TerminalElse(x) => x.as_syntax_node(),
38760            TokenNode::TerminalEnum(x) => x.as_syntax_node(),
38761            TokenNode::TerminalExtern(x) => x.as_syntax_node(),
38762            TokenNode::TerminalFalse(x) => x.as_syntax_node(),
38763            TokenNode::TerminalFunction(x) => x.as_syntax_node(),
38764            TokenNode::TerminalIf(x) => x.as_syntax_node(),
38765            TokenNode::TerminalWhile(x) => x.as_syntax_node(),
38766            TokenNode::TerminalFor(x) => x.as_syntax_node(),
38767            TokenNode::TerminalLoop(x) => x.as_syntax_node(),
38768            TokenNode::TerminalImpl(x) => x.as_syntax_node(),
38769            TokenNode::TerminalImplicits(x) => x.as_syntax_node(),
38770            TokenNode::TerminalLet(x) => x.as_syntax_node(),
38771            TokenNode::TerminalMatch(x) => x.as_syntax_node(),
38772            TokenNode::TerminalModule(x) => x.as_syntax_node(),
38773            TokenNode::TerminalMut(x) => x.as_syntax_node(),
38774            TokenNode::TerminalNoPanic(x) => x.as_syntax_node(),
38775            TokenNode::TerminalOf(x) => x.as_syntax_node(),
38776            TokenNode::TerminalRef(x) => x.as_syntax_node(),
38777            TokenNode::TerminalContinue(x) => x.as_syntax_node(),
38778            TokenNode::TerminalReturn(x) => x.as_syntax_node(),
38779            TokenNode::TerminalBreak(x) => x.as_syntax_node(),
38780            TokenNode::TerminalStruct(x) => x.as_syntax_node(),
38781            TokenNode::TerminalTrait(x) => x.as_syntax_node(),
38782            TokenNode::TerminalTrue(x) => x.as_syntax_node(),
38783            TokenNode::TerminalType(x) => x.as_syntax_node(),
38784            TokenNode::TerminalUse(x) => x.as_syntax_node(),
38785            TokenNode::TerminalPub(x) => x.as_syntax_node(),
38786            TokenNode::TerminalAnd(x) => x.as_syntax_node(),
38787            TokenNode::TerminalAndAnd(x) => x.as_syntax_node(),
38788            TokenNode::TerminalArrow(x) => x.as_syntax_node(),
38789            TokenNode::TerminalAt(x) => x.as_syntax_node(),
38790            TokenNode::TerminalBadCharacters(x) => x.as_syntax_node(),
38791            TokenNode::TerminalColon(x) => x.as_syntax_node(),
38792            TokenNode::TerminalColonColon(x) => x.as_syntax_node(),
38793            TokenNode::TerminalComma(x) => x.as_syntax_node(),
38794            TokenNode::TerminalDiv(x) => x.as_syntax_node(),
38795            TokenNode::TerminalDivEq(x) => x.as_syntax_node(),
38796            TokenNode::TerminalDot(x) => x.as_syntax_node(),
38797            TokenNode::TerminalDotDot(x) => x.as_syntax_node(),
38798            TokenNode::TerminalDotDotEq(x) => x.as_syntax_node(),
38799            TokenNode::TerminalEndOfFile(x) => x.as_syntax_node(),
38800            TokenNode::TerminalEq(x) => x.as_syntax_node(),
38801            TokenNode::TerminalEqEq(x) => x.as_syntax_node(),
38802            TokenNode::TerminalGE(x) => x.as_syntax_node(),
38803            TokenNode::TerminalGT(x) => x.as_syntax_node(),
38804            TokenNode::TerminalHash(x) => x.as_syntax_node(),
38805            TokenNode::TerminalLBrace(x) => x.as_syntax_node(),
38806            TokenNode::TerminalLBrack(x) => x.as_syntax_node(),
38807            TokenNode::TerminalLE(x) => x.as_syntax_node(),
38808            TokenNode::TerminalLParen(x) => x.as_syntax_node(),
38809            TokenNode::TerminalLT(x) => x.as_syntax_node(),
38810            TokenNode::TerminalMatchArrow(x) => x.as_syntax_node(),
38811            TokenNode::TerminalMinus(x) => x.as_syntax_node(),
38812            TokenNode::TerminalMinusEq(x) => x.as_syntax_node(),
38813            TokenNode::TerminalMod(x) => x.as_syntax_node(),
38814            TokenNode::TerminalModEq(x) => x.as_syntax_node(),
38815            TokenNode::TerminalMul(x) => x.as_syntax_node(),
38816            TokenNode::TerminalMulEq(x) => x.as_syntax_node(),
38817            TokenNode::TerminalNeq(x) => x.as_syntax_node(),
38818            TokenNode::TerminalNot(x) => x.as_syntax_node(),
38819            TokenNode::TerminalBitNot(x) => x.as_syntax_node(),
38820            TokenNode::TerminalOr(x) => x.as_syntax_node(),
38821            TokenNode::TerminalOrOr(x) => x.as_syntax_node(),
38822            TokenNode::TerminalPlus(x) => x.as_syntax_node(),
38823            TokenNode::TerminalPlusEq(x) => x.as_syntax_node(),
38824            TokenNode::TerminalQuestionMark(x) => x.as_syntax_node(),
38825            TokenNode::TerminalRBrace(x) => x.as_syntax_node(),
38826            TokenNode::TerminalRBrack(x) => x.as_syntax_node(),
38827            TokenNode::TerminalRParen(x) => x.as_syntax_node(),
38828            TokenNode::TerminalSemicolon(x) => x.as_syntax_node(),
38829            TokenNode::TerminalUnderscore(x) => x.as_syntax_node(),
38830            TokenNode::TerminalXor(x) => x.as_syntax_node(),
38831            TokenNode::TerminalEmpty(x) => x.as_syntax_node(),
38832        }
38833    }
38834    fn stable_ptr(&self) -> Self::StablePtr {
38835        TokenNodePtr(self.as_syntax_node().0.stable_ptr)
38836    }
38837}
38838impl From<&TokenNode> for SyntaxStablePtrId {
38839    fn from(node: &TokenNode) -> Self {
38840        node.stable_ptr().untyped()
38841    }
38842}
38843impl TokenNode {
38844    /// Checks if a kind of a variant of [TokenNode].
38845    pub fn is_variant(kind: SyntaxKind) -> bool {
38846        matches!(
38847            kind,
38848            SyntaxKind::TerminalIdentifier
38849                | SyntaxKind::TerminalLiteralNumber
38850                | SyntaxKind::TerminalShortString
38851                | SyntaxKind::TerminalString
38852                | SyntaxKind::TerminalAs
38853                | SyntaxKind::TerminalConst
38854                | SyntaxKind::TerminalElse
38855                | SyntaxKind::TerminalEnum
38856                | SyntaxKind::TerminalExtern
38857                | SyntaxKind::TerminalFalse
38858                | SyntaxKind::TerminalFunction
38859                | SyntaxKind::TerminalIf
38860                | SyntaxKind::TerminalWhile
38861                | SyntaxKind::TerminalFor
38862                | SyntaxKind::TerminalLoop
38863                | SyntaxKind::TerminalImpl
38864                | SyntaxKind::TerminalImplicits
38865                | SyntaxKind::TerminalLet
38866                | SyntaxKind::TerminalMatch
38867                | SyntaxKind::TerminalModule
38868                | SyntaxKind::TerminalMut
38869                | SyntaxKind::TerminalNoPanic
38870                | SyntaxKind::TerminalOf
38871                | SyntaxKind::TerminalRef
38872                | SyntaxKind::TerminalContinue
38873                | SyntaxKind::TerminalReturn
38874                | SyntaxKind::TerminalBreak
38875                | SyntaxKind::TerminalStruct
38876                | SyntaxKind::TerminalTrait
38877                | SyntaxKind::TerminalTrue
38878                | SyntaxKind::TerminalType
38879                | SyntaxKind::TerminalUse
38880                | SyntaxKind::TerminalPub
38881                | SyntaxKind::TerminalAnd
38882                | SyntaxKind::TerminalAndAnd
38883                | SyntaxKind::TerminalArrow
38884                | SyntaxKind::TerminalAt
38885                | SyntaxKind::TerminalBadCharacters
38886                | SyntaxKind::TerminalColon
38887                | SyntaxKind::TerminalColonColon
38888                | SyntaxKind::TerminalComma
38889                | SyntaxKind::TerminalDiv
38890                | SyntaxKind::TerminalDivEq
38891                | SyntaxKind::TerminalDot
38892                | SyntaxKind::TerminalDotDot
38893                | SyntaxKind::TerminalDotDotEq
38894                | SyntaxKind::TerminalEndOfFile
38895                | SyntaxKind::TerminalEq
38896                | SyntaxKind::TerminalEqEq
38897                | SyntaxKind::TerminalGE
38898                | SyntaxKind::TerminalGT
38899                | SyntaxKind::TerminalHash
38900                | SyntaxKind::TerminalLBrace
38901                | SyntaxKind::TerminalLBrack
38902                | SyntaxKind::TerminalLE
38903                | SyntaxKind::TerminalLParen
38904                | SyntaxKind::TerminalLT
38905                | SyntaxKind::TerminalMatchArrow
38906                | SyntaxKind::TerminalMinus
38907                | SyntaxKind::TerminalMinusEq
38908                | SyntaxKind::TerminalMod
38909                | SyntaxKind::TerminalModEq
38910                | SyntaxKind::TerminalMul
38911                | SyntaxKind::TerminalMulEq
38912                | SyntaxKind::TerminalNeq
38913                | SyntaxKind::TerminalNot
38914                | SyntaxKind::TerminalBitNot
38915                | SyntaxKind::TerminalOr
38916                | SyntaxKind::TerminalOrOr
38917                | SyntaxKind::TerminalPlus
38918                | SyntaxKind::TerminalPlusEq
38919                | SyntaxKind::TerminalQuestionMark
38920                | SyntaxKind::TerminalRBrace
38921                | SyntaxKind::TerminalRBrack
38922                | SyntaxKind::TerminalRParen
38923                | SyntaxKind::TerminalSemicolon
38924                | SyntaxKind::TerminalUnderscore
38925                | SyntaxKind::TerminalXor
38926                | SyntaxKind::TerminalEmpty
38927        )
38928    }
38929}